【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として返されます。

Python
 
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()はそれらすべてを返します。

Python
 
# 複数の最頻値がある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)に最頻値が算出されます。

Python
 
# サンプル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を指定することで、行ごとに最頻値を算出できます。

Python
 
# 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): 205がそれぞれ1回ずつなので、両方が最頻値。

  • 3行目 (インデックス2): 105がそれぞれ1回ずつなので、両方が最頻値。

結果のDataFrameは、元のDataFrameの行インデックスがそのまま行になり、各行の最頻値が列として格納されます。


 

mode()の注意点と活用ヒント

 

  • データ型: mode()は数値、文字列、カテゴリなど、様々なデータ型に対して機能します。

  • NaN(欠損値)の扱い: デフォルトではNaNは最頻値の計算から除外されます。NaN自体を最頻値として扱いたい場合は、事前にNaNを適切な値で埋める必要があります。

  • 複数最頻値の処理: 複数の最頻値が返されることを考慮して、その後の処理を設計する必要があります。例えば、最初の最頻値だけを使いたい場合は、df.mode().iloc[0]のようにインデックスで指定できます。

  • 大量データのパフォーマンス: 非常に大量のユニークな値を持つ列に対してmode()を実行すると、処理に時間がかかる場合があります。


 

まとめ

 

Pandasのmode()メソッドは、DataFrameやSeries内のデータから、行または列ごとの最頻値を効率的に取得するための強力なツールです。カテゴリカルデータの代表値の把握、データの特徴分析、複数最頻値の特定など、様々なデータ分析の場面でその真価を発揮します。axis引数を使いこなすことで、行方向と列方向の両方で柔軟に最頻値を算出できます。このmode()メソッドを積極的に活用し、あなたのデータから最も一般的な傾向を素早く見つけ出しましょう!