最頻値 (モード)

最頻値 (モード)

最頻値 (モード)

 ある標本の中で最も頻繁に現れる値を 最頻値 (モード) といいます。たとえば
 

[1, 2, 5, 5, 5, 8, 8, 12, 19]

においては要素 5 が最も多く含まれているので、最頻値は 5 となります。Python では statistics.mode() を使って標本の最頻値を取得できます。

import statistics

x = [1, 2, 5, 5, 5, 8, 8, 12, 19]

# xの最頻値
mode_x = statistics.mode(x)

print("xの最頻値: {:d}".format(mode_x))
データの最頻値: 5

 SciPy パッケージには、多次元配列の指定軸に沿った最頻値と頻度を取得できる scipy.stats.mode() が用意されています (詳細については記事の後半を参照してください)。
 

statistics.mode()

 statistics.mode(data) は data の最頻値 (モード) を返します。

# PYTHON_STATISTICS_MODE-1

import statistics

x = [0, 1, 0, 2, 0, 0, 1, 1]

# xの最頻値
mode_x = statistics.mode(x)

print("xの最頻値: {:d}".format(mode_x))
データの最頻値: 0

 最頻値が一意に定まらないデータを渡すと、StatisticsError を送出します。

# PYTHON_STATISTICS_MODE-2

y = [2, 3, 6, 6, 7, 10, 10, 15, 15]

# データの最頻値
mode_x = statistics.mode(y)

print("データの最頻値: {:.1f}".format(mode_y))
StatisticsError: no unique mode; found 3 equally common values

 statistics.mode() に文字列を渡せば、単語や文章に最も多く含まれる文字を知ることができます。

# PYTHON_STATISTICS_MODE-3

my_str = "NumPy is a Base N-dimensional array package."

# my_strに最も多く含まれている文字を取得
statistics.mode(my_str)
'a'

 

scipy.stats.mode()

 scipy.stats.mode() は指定軸に沿った最頻値 (モード) と頻度を返します。

scipy.stats.mode(a, axis=0, nan_policy='propagate')

 最頻値の候補が複数ある場合、その中の最小値を返します。
 例として、次のような 3 行 5 列の 2 次元配列を用意します。

# PYTHON_SCIPY_MODE-1

import numpy as np
from scipy import stats

x = np.array([[4, 1, 4, 2, 5],
              [2, 1, 1, 2, 5],
              [1, 1, 5, 1, 1]])

 axis=0 (デフォルト設定) のときは、列ごとの最頻値を返します

# PYTHON_SCIPY_MODE-2

# 列ごとの最頻値と頻度
mode_1, count_1 = stats.mode(x, axis=0)

print("列ごとの最頻値と頻度:\n{0}\n{1}".format(mode_1, count_1))
列ごとの最頻値と頻度:
[[1 1 1 2 5]]
[[1 3 1 2 2]]

 axis=1 ならば行ごとに最頻値を返します。

# PYTHON_SCIPY_MODE-3

# 行ごとの最頻値と頻度
mode_2, count_2 = stats.mode(x, axis=1)

print("行ごとの最頻値と頻度:\n{0}\n\n{1}".format(mode_2, count_2))
行ごとの最頻値と頻度:
[[4]
 [1]
 [1]]

[[2]
 [2]
 [4]]

 axis=None を指定すると、すべての要素を対象に最頻値を求めます。

# PYTHON_SCIPY_MODE-4

# 全要素の最頻値と頻度
mode_3, count_3 = stats.mode(x, axis=None)

print("全要素の最頻値と頻度:\n{0}\n{1}".format(mode_3, count_3))
全要素の最頻値と頻度:
[1]
[7]