【Pandasデータ分析】quantile()でデータの分布を深く理解!分位数・パーセンタイルを簡単取得 📈


 

データ分析において、データの中心傾向(平均値や中央値)だけでなく、その分布を理解することは非常に重要です。データがどのように広がっているか、特定の割合のデータがどの値以下に収まっているかを知ることで、より深い洞察を得られます。ここで活躍するのが、**分位数(Quantile)パーセンタイル(Percentile)**といった統計量です。

Pandasの**quantile()メソッド**は、DataFrameやSeriesの数値データに対して、これらの分位数やパーセンタイルを効率的に計算するための強力なツールです。この記事では、quantile()メソッドの基本的な使い方から、その意味、そして知っておくと便利な応用例まで、短いサンプルコードと丁寧な解説を交えてご紹介します。


 

分位数・パーセンタイルとは?なぜデータ分析に必要なのか?

 

  • 分位数(Quantile): データを等しい数に分割する点のことです。例えば、データを4等分する点を**四分位数(Quartile)**と呼びます(第1四分位数、中央値、第3四分位数)。

  • パーセンタイル(Percentile): データを100等分する点のことです。例えば、25パーセンタイルは、データを小さい方から並べたときに25%の位置にある値を示します。分位数はパーセンタイルの特殊なケースとも言えます。

なぜこれらの統計量がデータ分析に必要なのか?

  • 分布の把握: 平均値だけでは分からないデータの広がりや偏り(歪み)を把握できます。

    • 例: 平均年収は高いが、中央値は低い場合、一部の富裕層が平均値を押し上げている可能性を示唆します。

  • 外れ値の特定: 第1四分位数と第3四分位数を使って、外れ値(異常値)の範囲を定義できます。

  • 相対的な位置の評価: 個々のデータポイントが全体の中でどの位置にあるのか(例: 「私のテストの点数は上位10%に入っているか?」)を評価できます。

  • 性能評価や閾値設定: サービスのレスポンスタイムの90パーセンタイルを監視し、ほとんどのユーザーが快適に利用できる閾値を設定する、といった用途に利用されます。


 

1. quantile()メソッドの基本的な使い方

 

quantile()メソッドは、引数qに0から1までの数値を指定することで、対応する分位数を計算します。

 

Seriesの分位数を取得する

 

Seriesに対してquantile()を適用すると、そのSeries内の値の分位点が計算されます。

Python
 
import pandas as pd
import numpy as np

# サンプルSeriesの作成 (社員の給与データ)
s_salary = pd.Series([300, 450, 500, 320, 600, 480, 750, 380, 550, 420])
print("元のSeries (給与):\n", s_salary)

# 中央値 (50パーセンタイル / 第2四分位数) を取得
median_salary = s_salary.quantile(0.5)
print(f"\n給与の中央値: {median_salary}万円")

# 第1四分位数 (25パーセンタイル) を取得
q1_salary = s_salary.quantile(0.25)
print(f"給与の第1四分位数 (25パーセンタイル): {q1_salary}万円")

# 第3四分位数 (75パーセンタイル) を取得
q3_salary = s_salary.quantile(0.75)
print(f"給与の第3四分位数 (75パーセンタイル): {q3_salary}万円")

解説:

  1. s_salary.quantile(0.5): データの小さい方から数えて50%の位置にある値、つまり中央値を取得します。

  2. s_salary.quantile(0.25): 25%の位置にある値(第1四分位数)を取得します。

  3. s_salary.quantile(0.75): 75%の位置にある値(第3四分位数)を取得します。

 

複数の分位数を一度に取得する

 

q引数に分位数のリストを渡すことで、複数の分位数を一度に計算し、Seriesとして結果を受け取ることができます。

Python
 
# 25, 50, 75パーセンタイルを一度に取得 (四分位数)
quartiles_salary = s_salary.quantile([0.25, 0.5, 0.75])
print("\n給与の四分位数:\n", quartiles_salary)

# 10, 90パーセンタイルを取得
percentiles_10_90 = s_salary.quantile([0.1, 0.9])
print("\n給与の10・90パーセンタイル:\n", percentiles_10_90)

 

2. DataFrameの分位数を取得する

 

DataFrameに対してquantile()を適用すると、デフォルトで列ごとに分位数が計算されます。

 

列ごとの分位数を取得 (axis=0 またはデフォルト)

 

DataFrameの各数値列において、それぞれの中央値や四分位数などを知りたい場合に利用します。

Python
 
# サンプルDataFrameの作成 (商品別売上・利益データ)
df_sales = pd.DataFrame({
    '売上': [1000, 1500, 800, 2000, 1200, 1100, 900, 1800],
    '利益': [150, 200, 100, 300, 180, 160, 120, 250],
    '在庫': [50, 30, 70, 20, 40, 60, 80, 25]
})
print("\n元のDataFrame:\n", df_sales)

# 各列の中央値 (50パーセンタイル) を取得
df_median = df_sales.quantile(0.5)
print("\n各列の中央値:\n", df_median)

# 各列の四分位数を取得
df_quartiles = df_sales.quantile([0.25, 0.5, 0.75])
print("\n各列の四分位数:\n", df_quartiles)

解説:

  • df_sales.quantile(0.5): 各数値列('売上', '利益', '在庫')の中央値をそれぞれ計算します。

  • df_sales.quantile([0.25, 0.5, 0.75]): 結果はDataFrameとして返され、行インデックスが指定した分位数、列が元のDataFrameの列名となります。

 

行ごとの分位数を取得 (axis=1)

 

あまり一般的ではありませんが、行ごと(例: 各月の売上、利益、在庫の分布)に分位数を計算したい場合はaxis=1を指定します。

Python
 
# 各行の中央値を取得
df_row_median = df_sales.quantile(0.5, axis=1)
print("\n各行の中央値:\n", df_row_median)

 

3. 分位数の計算方法 (interpolation引数)

 

quantile()は、データセットの要素数によっては、ちょうど指定したパーセンタイルに当たる値が存在しない場合があります。そのような場合、Pandasはデフォルトで線形補間('linear')を用いて分位数を計算します。interpolation引数でこの挙動を制御できます。

  • 'linear' (デフォルト): 線形補間。

  • 'lower': 指定したパーセンタイルに最も近い、それ以下の値。

  • 'higher': 指定したパーセンタイルに最も近い、それ以上の値。

  • 'nearest': 指定したパーセンタイルに最も近い値。

  • 'midpoint': lowerhigherの平均値。

Python
 
s_odd_len = pd.Series([1, 2, 3, 4, 5])

print("\nSeries (要素数奇数):\n", s_odd_len)
print("中央値 (linear, デフォルト):", s_odd_len.quantile(0.5, interpolation='linear')) # 3.0
print("中央値 (lower):", s_odd_len.quantile(0.5, interpolation='lower'))     # 3
print("中央値 (higher):", s_odd_len.quantile(0.5, interpolation='higher'))   # 3
print("中央値 (nearest):", s_odd_len.quantile(0.5, interpolation='nearest')) # 3
print("中央値 (midpoint):", s_odd_len.quantile(0.5, interpolation='midpoint')) # 3.0

s_even_len = pd.Series([1, 2, 3, 4])
print("\nSeries (要素数偶数):\n", s_even_len)
print("中央値 (linear, デフォルト):", s_even_len.quantile(0.5, interpolation='linear')) # 2.5
print("中央値 (lower):", s_even_len.quantile(0.5, interpolation='lower'))     # 2
print("中央値 (higher):", s_even_len.quantile(0.5, interpolation='higher'))   # 3
print("中央値 (nearest):", s_even_len.quantile(0.5, interpolation='nearest')) # 2 (or 3, depends on rounding)
print("中央値 (midpoint):", s_even_len.quantile(0.5, interpolation='midpoint')) # 2.5

解説:

データセットの要素数が奇数か偶数か、そして指定するqの値によって、各補間方法が異なる結果を返すことがあります。特に’linear’は、正確な中間点が存在しない場合に最も自然な値を返します。


 

まとめ

 

Pandasのquantile()メソッドは、DataFrameやSeriesの数値データから分位数やパーセンタイルを計算するための非常に便利なツールです。データの分布を深く理解し、平均値や中央値だけでは見えないデータの広がりや偏りを把握するのに不可欠です。

  • q引数: 0から1までの数値を指定し、特定のパーセンタイルを取得。リストを渡すことで複数のパーセンタイルを一度に取得可能。

  • axis引数: DataFrameで列ごと(デフォルト)または行ごとに分位数を計算。

  • interpolation引数: データにぴったり合う値がない場合の補間方法を指定。

これらの機能を使いこなすことで、データ探索、外れ値の特定、パフォーマンス評価、閾値設定など、様々なデータ分析タスクの精度と効率を向上させることができます。ぜひquantile()メソッドを積極的に活用し、あなたのデータからより深い洞察を引き出しましょう。