Pythonで最頻値(mode)を計算

Python

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などが使える。

参考サイト:Pythonでmode(最頻値)を算出する最良の方法

コメント

タイトルとURLをコピーしました