Pandas Series.mode 入門:データの最頻値を簡単操作
Pandas Series.mode 入門:データの最頻値を簡単操作
PandasのSeries.mode
は、データの最頻値を取得する便利な関数です。統計分析やデータ可視化で役立ち、単一の値だけでなく、複数の最頻値を検出することも可能です。
基本的な使い方
import pandas as pd
# データの準備
data = [1, 2, 3, 1, 2, 4, 5, 1]
s = pd.Series(data)
# 最頻値を取得
mode = s.mode()
print(mode)
このコードを実行すると、以下の出力が得られます。
0 1
dtype: int64
mode
には、1
という値が格納されています。これは、data
のデータの中で最も多く出現する値が1
であることを意味します。
複数の最頻値を取得
dropna
オプションを使用すると、欠損値のあるデータも考慮した最頻値を取得できます。また、drop_duplicates
オプションをFalse
に設定することで、重複を考慮せずにすべての最頻値を取得できます。
# 欠損値のあるデータ
data = [1, 2, 3, 1, None, 4, 5, 1]
s = pd.Series(data)
# 欠損値を含む最頻値を取得
mode = s.mode(dropna=False)
print(mode)
# 重複を考慮したすべての最頻値を取得
mode = s.mode(drop_duplicates=False)
print(mode)
0 1.0
1 NaN
dtype: float64
0 1
1 2
dtype: int64
データ型ごとの挙動
Series.mode
は、データ型によって挙動が異なります。
- 数値データ: 最も頻繁に出現する数値が返されます。
- カテゴリカルデータ: 最も頻繁に出現するカテゴリが返されます。
データの準備
import pandas as pd
# 数値データ
data_num = [1, 2, 3, 1, 2, 4, 5, 1]
s_num = pd.Series(data_num)
# カテゴリカルデータ
data_cat = ['apple', 'banana', 'orange', 'apple', 'grape', 'orange']
s_cat = pd.Series(data_cat)
# 文字列データ
data_str = ['hello', 'world', 'hello', 'python', 'pandas']
s_str = pd.Series(data_str)
# 数値データの最頻値
mode_num = s_num.mode()
print(mode_num)
# カテゴリカルデータの最頻値
mode_cat = s_cat.mode()
print(mode_cat)
# 文字列データの最頻値
mode_str = s_str.mode()
print(mode_str)
欠損値を含むデータの最頻値
# 欠損値を含む数値データ
data_num_na = [1, 2, 3, 1, None, 4, 5, 1]
s_num_na = pd.Series(data_num_na)
# 欠損値を含む最頻値
mode_num_na = s_num_na.mode(dropna=False)
print(mode_num_na)
重複を考慮したすべての最頻値
# 重複を含む数値データ
data_num_dup = [1, 2, 2, 3, 1, 4, 5, 1]
s_num_dup = pd.Series(data_num_dup)
# 重複を考慮したすべての最頻値
mode_num_dup = s_num_dup.mode(drop_duplicates=False)
print(mode_num_dup)
# 数値データの最頻値 (データ型変換)
mode_num_astype = s_num.mode(dtype='float')
print(mode_num_astype)
特定の軸の最頻値
# 行ごとの最頻値
data_frame = pd.DataFrame({'col1': [1, 2, 3, 1, 2, 4], 'col2': ['a', 'b', 'c', 'a', 'b', 'c']})
mode_df_axis = data_frame.mode(axis=0)
print(mode_df_axis)
説明
Pandas.Series.mode の代替方法
collections.Counterの使用
collections.Counter
は、コレクション内の要素の出現回数をカウントする標準ライブラリのクラスです。pandas.Series
のデータに直接適用することで、最頻値を取得できます。
import collections
data = [1, 2, 3, 1, 2, 4, 5, 1]
s = pd.Series(data)
# Counterを使用して最頻値を取得
counter = collections.Counter(s)
mode = counter.most_common(1)[0][0]
print(mode)
利点:
- シンプルでわかりやすいコード
- 軽量で高速
欠点:
- カテゴリカルデータや文字列データには直接適用できない
- 欠損値の扱い方が限定的
scipy.stats.modeの使用
scipy.stats.mode
は、SciPyライブラリの関数で、統計分布の最頻値を計算します。pandas.Series
のデータに直接適用することで、最頻値を取得できます。
import scipy.stats as stats
data = [1, 2, 3, 1, 2, 4, 5, 1]
s = pd.Series(data)
# scipy.stats.modeを使用して最頻値を取得
mode = stats.mode(s)
print(mode)
collections.Counter
よりも処理速度が遅い- SciPyライブラリのインポートが必要
手動による集計
シンプルなデータの場合、ループを使用して手動で最頻値を計算することもできます。
data = [1, 2, 3, 1, 2, 4, 5, 1]
# 最頻値とその出現回数を記録するための変数
mode_val = None
mode_count = 0
# データをループし、出現回数を集計
for value in data:
count = data.count(value)
if count > mode_count:
mode_val = value
mode_count = count
print(mode_val)
- コードフローを完全に制御できる
- 複雑で冗長なコードになりやすい
- 処理速度が遅い
どの方法が最適かは、データの種類、分析の目的、処理速度などの要件によって異なります。
- シンプルで高速な方法が必要な場合は、
collections.Counter
がおすすめです。 - カテゴリカルデータや文字列データ、欠損値を含むデータを扱う場合は、
scipy.stats.mode
がおすすめです。 - コードフローを完全に制御する必要がある場合は、手動による集計がおすすめです。