【Pandasデータ分析】median()でデータの中央値を瞬時に把握!歪んだ分布の傾向を掴む 📊
データ分析において、データの中心的な傾向を把握することは非常に重要です。平均値は最も一般的に使われる指標ですが、外れ値の影響を受けやすいという弱点があります。ここで、外れ値に強く、データの「真ん中」を示す指標として活躍するのが**中央値(Median)**です。
Pandasの**median()メソッド**は、DataFrameやSeriesの数値データに対して、この中央値を効率的に計算するための強力なツールです。データの分布が歪んでいる場合(例えば、所得データや不動産価格のように一部の非常に高い値が存在する場合)、平均値よりも中央値の方がより実態に近い代表値となります。この記事では、median()メソッドの基本的な使い方から、その意味、そして知っておくと便利な応用例まで、短いサンプルコードと丁寧な解説を交えてご紹介します。
中央値(Median)とは?なぜデータ分析に必要なのか?
中央値とは、データを小さい方から大きい方へと順番に並べたときに、ちょうど真ん中に位置する値のことです。
-
データ数が奇数の場合: 中央に位置する値がそのまま中央値になります。
-
データ数が偶数の場合: 中央に位置する2つの値の平均が中央値になります。
なぜデータ分析で中央値が必要なのでしょうか?
-
外れ値に強い: 平均値と異なり、データに極端に大きい値や小さい値(外れ値)が含まれていても、中央値はそれらの影響をほとんど受けません。これにより、データのよりロバスト(頑健)な中心傾向を示します。
-
例: 会社の従業員の平均年収は社長の非常に高い年収に引っ張られる可能性がありますが、中央年収は大多数の従業員の実態に近い値を示します。
-
-
歪んだ分布の把握: 所得、資産、不動産価格など、多くの場合、実際の社会経済データは正規分布ではなく、特定の方向に歪んだ(偏った)分布を示すことが多いです。このような場合に、中央値はデータの「典型的な値」として平均値よりも適切です。
-
データの可視化や解釈の補助: ヒストグラムや箱ひげ図と組み合わせて使うことで、データの分布全体をより深く理解するのに役立ちます。
1. median()メソッドの基本的な使い方
median()メソッドは、Seriesに対して直接、またはDataFrameに対して列方向(デフォルト)や行方向を指定して使用できます。
Seriesの中央値を取得する
Seriesにmedian()を適用すると、そのSeries内の数値データの中央値が単一のスカラ値として返されます。
import pandas as pd
import numpy as np
# サンプルSeriesの作成 (社員の年齢データ、奇数個)
s_ages_odd = pd.Series([25, 30, 22, 45, 33])
print("元のSeries (年齢、奇数個):\n", s_ages_odd)
# Seriesの中央値を取得
median_age_odd = s_ages_odd.median()
print(f"\n年齢の中央値 (奇数個): {median_age_odd}")
# サンプルSeriesの作成 (社員の年齢データ、偶数個)
s_ages_even = pd.Series([25, 30, 22, 45, 33, 28])
print("\n元のSeries (年齢、偶数個):\n", s_ages_even)
# Seriesの中央値を取得
median_age_even = s_ages_even.median()
print(f"年齢の中央値 (偶数個): {median_age_even}")
解説:
-
s_ages_odd.median():[22, 25, 30, 33, 45]と並び替えられ、中央の30が中央値となります。 -
s_ages_even.median():[22, 25, 28, 30, 33, 45]と並び替えられ、中央の2つの値28と30の平均(28+30)/2 = 29.0が中央値となります。
2. DataFrameの列ごとの中央値を取得する
DataFrameにmedian()を適用すると、デフォルトで列ごと(axis=0)に中央値が算出されます。
# サンプルDataFrameの作成 (地域別売上と顧客満足度)
df_data = pd.DataFrame({
'東京売上': [100, 150, 80, 200, 120, 180],
'大阪売上': [110, 160, 90, 180, 130, 220],
'満足度スコア': [3.5, 4.0, 2.0, 5.0, 3.0, 4.5],
'地域': ['関東', '関西', '関東', '関西', '関東', '関西'] # 文字列列
})
print("\n元のDataFrame:\n", df_data)
# DataFrameの数値列ごとの中央値
median_columns = df_data.median()
print("\nDataFrameの数値列ごとの中央値:\n", median_columns)
解説:
-
df_data.median(): DataFrame内の数値列('東京売上','大阪売上','満足度スコア')に対して中央値を計算します。文字列列('地域')は自動的に無視されます。 -
結果はSeriesとして返され、インデックスが元の列名、値がその列の中央値となります。
3. DataFrameの行ごとの中央値を取得する
axis=1を指定することで、DataFrameの行ごとに中央値を算出できます。
# DataFrameの行ごとの中央値 (数値データのみを対象)
df_numeric_only = df_data[['東京売上', '大阪売上', '満足度スコア']]
median_rows = df_numeric_only.median(axis=1)
print("\nDataFrameの行ごとの中央値:\n", median_rows)
解説:
df_numeric_only.median(axis=1): 各行に存在する数値の中から中央値を計算します。例えば、1行目(インデックス0)の場合、[100, 110, 3.5]の中央値が計算されます。
4. 欠損値(NaN)の扱い
median()メソッドは、デフォルトで欠損値(NaN)を無視して中央値を計算します。これは、skipna=Trueがデフォルト設定であるためです。
# NaNを含むSeries
s_nan = pd.Series([10, 20, np.nan, 30, 15, np.nan, 25])
print("\nNaNを含むSeries:\n", s_nan)
# NaNを無視して中央値を計算 (デフォルト)
median_with_nan_skip = s_nan.median()
print(f"NaNを無視した中央値: {median_with_nan_skip}")
# NaNを含めて中央値を計算 (NaNがある場合はNaNを返す)
median_with_nan_keep = s_nan.median(skipna=False)
print(f"NaNを含めた中央値 (NaNがあればNaN): {median_with_nan_keep}")
解説:
-
skipna=True(デフォルト): NaNを除外して、残りの有効な数値だけから中央値を計算します。 -
skipna=False: NaNが存在する場合、計算結果をNaNとします。
まとめ
Pandasのmedian()メソッドは、DataFrameやSeriesの数値データから中央値を効率的に計算するための非常に便利なツールです。特に、外れ値の影響を受けにくい頑健な代表値として、データの分布が歪んでいる場合にその真価を発揮します。
-
Series:
.median()で中央値を取得。 -
DataFrame: デフォルトで列ごとに中央値を取得。
axis=1で業ごとに取得。 -
NaNの扱い: デフォルトで無視されるが、
skipna=Falseで制御可能。
これらの機能を使いこなすことで、データ探索の精度を高め、平均値だけでは見落としてしまうようなデータの「真の姿」を把握できるようになります。ぜひmedian()メソッドを積極的に活用し、あなたのデータからより深い洞察を引き出しましょう。

