【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内の値の分位点が計算されます。
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}万円")
解説:
-
s_salary.quantile(0.5): データの小さい方から数えて50%の位置にある値、つまり中央値を取得します。 -
s_salary.quantile(0.25): 25%の位置にある値(第1四分位数)を取得します。 -
s_salary.quantile(0.75): 75%の位置にある値(第3四分位数)を取得します。
複数の分位数を一度に取得する
q引数に分位数のリストを渡すことで、複数の分位数を一度に計算し、Seriesとして結果を受け取ることができます。
# 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の各数値列において、それぞれの中央値や四分位数などを知りたい場合に利用します。
# サンプル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を指定します。
# 各行の中央値を取得
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':lowerとhigherの平均値。
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()メソッドを積極的に活用し、あなたのデータからより深い洞察を引き出しましょう。

