【Pandasデータ分析】DataFrame・Seriesの行・列ごとの最頻値を取得するmode()メソッド 📈
データ分析において、カテゴリカルデータや数値データの中から**最も頻繁に出現する値(最頻値、モード)**を把握することは非常に重要です。例えば、「最も売れている商品カテゴリ」「顧客の最も多い年齢層」「投票で最も多く選ばれた選択肢」といった情報を知りたい場合に役立ちます。
Pandasの**mode()メソッド**は、DataFrameやSeriesの行または列ごとに、この最頻値を効率的に取得するための便利なツールです。この記事では、mode()メソッドの基本的な使い方から、知っておくと便利な応用例まで、短いサンプルコードと丁寧な解説を交えてご紹介します。
mode()メソッドとは?なぜ最頻値が必要なのか?
mode()メソッドは、DataFrameまたはSeries内の各列(または各行)において、最も多く出現する値を返します。データに複数の最頻値がある場合(例: 1, 2, 2, 3, 3 の最頻値は2と3)、mode()はそれらすべてを返します。
なぜ最頻値が必要なのでしょうか?
-
カテゴリデータの代表値: 質的データ(カテゴリデータ)の場合、平均値や中央値は意味をなしませんが、最頻値はそのデータの「典型的な」カテゴリを示す重要な代表値となります。
-
データの特徴把握: データセット内でどの値が最も一般的であるかを一目で把握できます。
-
マーケティング分析: 消費者の嗜好や行動パターン(例: 最も選ばれる色、サービスなど)を特定するのに役立ちます。
-
データクレンジング: データ入力の誤りや傾向(例: 誤って入力されやすい値)を発見する手がかりになることがあります。
mode()メソッドの基本的な使い方
mode()メソッドは、Seriesに対して直接、またはDataFrameに対して列方向(デフォルト)や行方向を指定して使用できます。
Seriesの最頻値を取得する
Seriesにmode()を適用すると、そのSeries内の最頻値がSeriesとして返されます。
import pandas as pd
import numpy as np
# サンプルSeriesの作成 (性別データ)
s_gender = pd.Series(['男性', '女性', '男性', '男性', '女性', 'その他'])
print("オリジナルSeries:\n", s_gender)
# Seriesの最頻値を取得
mode_gender = s_gender.mode()
print("\nSeriesの最頻値:\n", mode_gender)
解説:
s_gender.mode()を実行すると、’男性’が3回出現し最も多いため、Series([男性])が返されます。結果がSeriesになるのは、複数の最頻値が存在する可能性があるためです。
複数の最頻値が存在する場合
Seriesに複数の最頻値がある場合、mode()はそれらすべてを返します。
# 複数の最頻値があるSeries
s_multi_mode = pd.Series([1, 2, 2, 3, 3, 4])
print("\n複数の最頻値があるSeries:\n", s_multi_mode)
mode_multi = s_multi_mode.mode()
print("\n複数の最頻値:\n", mode_multi)
解説:
この例では2と3がそれぞれ2回出現し、どちらも最頻値なので、両方がSeriesとして返されます。
DataFrameの列ごとの最頻値を取得する
DataFrameにmode()を適用すると、デフォルトで列ごと(axis=0)に最頻値が算出されます。
# サンプルDataFrameの作成
df = pd.DataFrame({
'商品カテゴリ': ['家電', '食品', '家電', '衣料', '家電', '食品', '食品'],
'評価': [5, 4, 5, 3, 5, 4, 4],
'購入回数': [1, 2, 1, 1, 3, 2, 2]
})
print("\nオリジナルDataFrame:\n", df)
# DataFrameの列ごとの最頻値
mode_columns = df.mode()
print("\nDataFrameの列ごとの最頻値:\n", mode_columns)
解説:
-
'商品カテゴリ'列では'家電'と'食品'がそれぞれ3回出現し、どちらも最頻値なので両方が返されます。 -
'評価'列では'5'と'4'がそれぞれ3回出現し、どちらも最頻値なので両方が返されます。 -
'購入回数'列では'1'と'2'がそれぞれ3回出現し、どちらも最頻値なので両方が返されます。
結果のDataFrameは、元のDataFrameの列がそのまま列になり、最頻値が格納されます。複数の最頻値がある列は、複数の行にわたって表示されます。
DataFrameの行ごとの最頻値を取得する
axis=1を指定することで、行ごとに最頻値を算出できます。
# DataFrameの行ごとの最頻値 (数値データで例示)
df_numeric = pd.DataFrame({
'A': [10, 20, 10],
'B': [5, 5, 10],
'C': [10, 20, 5]
})
print("\n数値DataFrame:\n", df_numeric)
mode_rows = df_numeric.mode(axis=1)
print("\nDataFrameの行ごとの最頻値:\n", mode_rows)
解説:
-
df_numeric.mode(axis=1): 各行に存在する値の中から最頻値を計算します。 -
1行目 (インデックス0):
10が2回出現。 -
2行目 (インデックス1):
20と5がそれぞれ1回ずつなので、両方が最頻値。 -
3行目 (インデックス2):
10と5がそれぞれ1回ずつなので、両方が最頻値。
結果のDataFrameは、元のDataFrameの行インデックスがそのまま行になり、各行の最頻値が列として格納されます。
mode()の注意点と活用ヒント
-
データ型:
mode()は数値、文字列、カテゴリなど、様々なデータ型に対して機能します。 -
NaN(欠損値)の扱い: デフォルトではNaNは最頻値の計算から除外されます。NaN自体を最頻値として扱いたい場合は、事前にNaNを適切な値で埋める必要があります。
-
複数最頻値の処理: 複数の最頻値が返されることを考慮して、その後の処理を設計する必要があります。例えば、最初の最頻値だけを使いたい場合は、
df.mode().iloc[0]のようにインデックスで指定できます。 -
大量データのパフォーマンス: 非常に大量のユニークな値を持つ列に対して
mode()を実行すると、処理に時間がかかる場合があります。
まとめ
Pandasのmode()メソッドは、DataFrameやSeries内のデータから、行または列ごとの最頻値を効率的に取得するための強力なツールです。カテゴリカルデータの代表値の把握、データの特徴分析、複数最頻値の特定など、様々なデータ分析の場面でその真価を発揮します。axis引数を使いこなすことで、行方向と列方向の両方で柔軟に最頻値を算出できます。このmode()メソッドを積極的に活用し、あなたのデータから最も一般的な傾向を素早く見つけ出しましょう!

