Pythonで最頻値を計算するにはいくつか方法がある。このページでは2つの方法を紹介する。
Scipy.stats.modeを使う方法
まずはScipyの統計モジュール stats を使う方法。参考:scipy.stats.mode
scipy.stats.mode(A):配列Aに対して最頻値とその度数(出現した頻度)を出力する。
最頻値が複数ある場合は最小の値を返す。
import scipy.stats as stats
import numpy as np
A = np.array([5,5,5,2,2,9])
mo, count = stats.mode(A) #最頻値と度数をmoとcountの2つの変数で受け取る
print(mo)
print(count)
#[5]
#[3]
print(stats.mode(A)) #stats.mode自体の出力形式
#ModeResult(mode=array([5]), count=array([3]))
A = np.array([5,5,5,2,2,2,9,1])#最頻値が複数あるときは最小値を返す
mo, count = stats.mode(A)
print(mo)
print(count)
#[2]
#[3]
入力\( A=(a_1,\ldots, a_n)\)が多次元配列のとき、つまり成分\(a_i\)自体がベクトルや行列などのときは、numpy.sumなどと同じようにaxisを指定してやれば各行や列での最頻値を取れる。
A = np.array([[5,5,4],[3,5,1],[1,5,3]])
mo, count = stats.mode(A) #デフォルトはaxis=0
print(mo)
print(count)
#[[1 5 1]]
#[[1 3 1]]
mo, count = stats.mode(A,axis=1)
print(mo)
print(count)
#[[5]
# [1]
# [1]]
#[[2]
# [1]
# [1]]
mo, count = stats.mode(A,axis=None)
print(mo)
print(count)
#[5]
#[4]
Statistics.modeを使う方法
次にPythonにデフォルトで入っているStatisticsモジュールを使う方法。
参考サイト:statistics—数理統計関数
scipy.stats.mode(A)で単純に配列Aの最頻値だけを出力する。
A = np.array([5,5,5,2,2,9,1])
statistics.mode(A)
#5
最頻値が複数ある場合、Python3.8以降では最初に現れたものを出力する。Python3.7以前ではエラーが出てしまう。
A = np.array([5,5,5,2,2,2,9,1])
statistics.mode(A)
#5 (Python3.8のとき)
# StatisticsError: no unique mode; found 2 equally common values(Python3.7のとき)
statistics.multimode(Python3.8以降で搭載された)を使えば複数の最頻値を出力する
最大や最小のどれか1つを取りたければこれにmaxやminを使えばよい。
statistics.multimode(A)
#[5,2]
max(statistics.multimode(A))
#5
多次元配列ではエラーがでる。
A = np.array([[5,5,4],[3,5,1],[1,5,3]])
statistics.mode(A)
# TypeError: unhashable type: 'numpy.ndarray'
その他
他にもPandasで読み込んだデータならpandas.Series.modeなどが使える。
コメント