このページでは統計の基本となる最頻値について全部で5つの求め方を紹介します。
Pythonを使って最頻値を求めてみます。
様々なモジュールを使って最頻値を求めていきたいときに思い出してもらえたら嬉しいです。
これまでのPythonの知識で頑張ります。
プログラムは自分で入力して理解を進めていきましょう!
最頻値は平均・中央値と並んでデータの中心を知る上で重要な指標だと感じます。
この記事を参考に扱う情報やデータの型に合わせて、柔軟に最頻値を求めることができるようになっていただければと思います。
最頻値について数学的な取り扱い方を知りたい方は以下の記事も参考にしてください。
最頻値を求める5つの方法
Pythonで最頻値を求める場合、5つの方法があります。
- 最頻値の求め方通りにcount関数を使用して求める方法
- statistics.mode関数を使用して求める方法
- numpy.bincount関数, numpy.argmax関数を使用して求める方法
- numpy.unique関数, numpy.argmax関数を使用して求める方法
- pandas.DataFrame.mode関数を使用して求める方法
それぞれ順番に説明していきます。
最頻値の求め方通りにcount関数を使用して求める
最頻値の求め方通りにPython標準の関数のみを使って計算します。
count関数を用いると、リスト内での要素の数を簡単に求めることが出来ます。
これを利用することで、一番多く出現するデータを更新していきます。
score = [48, 52, 46, 48, 53, 58, 52, 48, 51, 63, 48, 52, 43, 41, 51]
# 最大の出現回数
max = 0
for n in score:
#取り出したデータと等しいデータの数を数える
num = score.count(n)
#これまでのmaxよりも多い出現回数ならmd, maxを更新
if num > max:
max = num
#最頻値を更新
md = n
print("最頻値は", md, "です。")
#実行結果 : 最頻値は 48 です。
statistics.mode関数を使用して求める
statisticsモジュールをインポートし、statistics.mode関数を使って求めます。
import statistics #statisticsモジュールをインポート
score = [48, 52, 46, 48, 53, 58, 52, 48, 51, 63, 48, 52, 43, 41, 51]
#statistics.mode()を用いる。
md = statistics.mode(score)
print("最頻値は", md, "です。")
#実行結果 : 最頻値は 48 です。
numpy.bincount関数, numpy.argmax関数を使用して求める
numpyモジュールをインポートし、numpy.bincount関数とnumpy.argmax関数を使って求めます。
numpy.bincount関数は0以上の整数ごとに各値の出現回数を取得する関数です。
また、numpy.argmax関数は配列の最大値となるもののインデックスを返す関数です。
import numpy as np #numpyモジュールをインポート
score = [48, 52, 46, 48, 53, 58, 52, 48, 51, 63, 48, 52, 43, 41, 51]
#各値の出現回数を取得、0以上の整数ごとの各値の出現回数をカウント
count = np.bincount(score)
#最も頻度が多い数(インデックス)をargmax関数で取得
md = np.argmax(count)
print("最頻値は", md, "です。")
#実行結果 : 最頻値は 48 です。
numpy.unique関数, numpy.argmax関数を使用して求める
numpyモジュールをインポートし、numpy.unique関数とnumpy.argmax関数を使って求めます。
numpy.unique関数は重複の無い配列に変換する関数です。
return_counts=Trueでそれぞれの値の頻度も返すことができます。
また、numpy.argmax関数は配列の最大値となるもののインデックスを返す関数です。
import numpy as np #numpyモジュールをインポート
score = [48, 52, 46, 48, 53, 58, 52, 48, 51, 63, 48, 52, 43, 41, 51]
#重複の無い配列に変換、return_counts=Trueでそれぞれの値の頻度も返す
unique, freq = np.unique(score, return_counts=True)
print(unique) #重複の無い配列に変換
#実行結果 : [41 43 46 48 51 52 53 58 63]
print(freq) #上記uniqueの出現頻度をそれぞれ表示
#実行結果 : [1 1 1 4 2 3 1 1 1]
#freqの最も頻度が多い数のインデックスを取得して、該当の数をuniqueから取得
md = unique[np.argmax(freq)]
print("最頻値は", md, "です。")
#実行結果 : 最頻値は 48 です。
pandas.DataFrame.mode関数を使用して求める
pandasモジュールをインポートし、pandasのデータ形式DataFrameのmode関数を使って求めます。
import pandas as pd #pandasモジュールをインポート
#Datafreme型のデータを準備
score = pd.DataFrame([48, 52, 46, 48, 53, 58, 52, 48, 51, 63, 48, 52, 43, 41, 51])
#pandas.mode関数を用いる。
#score[n]で平均を求めたい列を指定。
md = score[0].mode()
#md[0]を指定することで最頻値のみ取得、指定しない場合はDataFreme型で返される
print("最頻値は", md[0], "です。")
#実行結果 : 最頻値は 48 です。
なるほど!
本当にたくさんの方法で最頻値を求めることができるんですね。
自分が最頻値を求めたい元データによって使い分けるのが良いと思います!
最後のpandas.mode()は表形式のデータで行や列ごとに最頻値を求められるから、多次元のデータを分析したいときには良く使いますね!
まとめ
最頻値を求める方法も用いるモジュールによって様々です。
自身が分析したいデータに合わせて使い分けることができれば、様々な状況で最頻値を求めることができるようになると思います。
また、平均・中央値を求めるよりも最頻値を求める際に用いる関数やアルゴリズムは複雑だと感じます。
参考のコードを見返していただき、理解を深めていただけたらと思います。
そして、最頻値についてきちんと学びたいと感じた方は以下の参考記事を見ていただけたらと思います。
このサイトの記事一覧へは以下へアクセス!
コメント