論文・統計レポートで、こんな表記を見たはずです:
これらが分位点(quantile)です。 「データを並べたときの位置」を直接答えるので、 平均値より分布の形を読みやすいのが特徴。 平均が外れ値で大きく動くのに対し、 分位点は頑健。 ここでは SSDSE-B の都道府県人口を題材に、 10/25/50/75/90 パーセンタイルの計算と解釈を学びます。
分位点を一言で言えば、 「データを小さい順に並べて、 下から $q$ の比率の位置にある値」 です。 直感的に、 3 つのイメージで掴みましょう。
47 都道府県の人口を昇順に並べ替えます(鳥取 55 万人 → ... → 東京 1404 万人)。 47 個の値を 10 等分すると、 ちょうど「10 パーセンタイル」「20 パーセンタイル」... と各境界の値が決まります。
学校で「あなたの身長は学年で 78 パーセンタイル」と言われたら、 「下から 78% の位置」=「上位 22% に入る」という意味。 偏差値とほぼ同じ役割ですが、 分位点は分布の形に依存しない純粋な順位情報です。
累積分布関数 $F(x) = P(X \le x)$ は「値 → 確率」の写像。 分位点関数 $Q(q) = F^{-1}(q)$ はその逆で「確率 → 値」の写像。 つまり:
「$x$ を入れたら確率 $F(x)$ を返す」が CDF。
「確率 $q$ を入れたら、 そこに到達する値 $Q(q)$ を返す」が分位点関数。
両者は互いに逆関数。
全部「データを並べたときの位置」を指すので、 表現が違うだけと考えれば OK。 論文では文脈で使い分けます。
$n$ 個の観測値 $x_1, x_2, \dots, x_n$ を昇順に並べた順序統計量 $x_{(1)} \le x_{(2)} \le \dots \le x_{(n)}$ を使う。 $q$ 分位点 $\hat{Q}(q)$ の計算には複数の方式があり、 もっとも一般的な線形補間では:
パーセンタイル $p$ パーセンタイル($0 \le p \le 100$)と分位点 $Q(q)$($0 \le q \le 1$)は:
$p$ パーセンタイル $= Q(p / 100)$
つまり「90 パーセンタイル」と「$Q(0.9)$」と「0.9 分位点」は全部同じ値です。
SSDSE-B の都道府県人口(2023 年)を題材に、 5 つの代表的分位点を計算してみます。 47 都道府県の総人口の概算値を昇順に並べた例(万人単位、 一部抜粋):
| 順位 | 都道府県 | 人口(万人) | 順位 | 都道府県 | 人口(万人) |
|---|---|---|---|---|---|
| 1 | 鳥取 | 55 | 25 | 群馬 | 192 |
| 2 | 島根 | 66 | 26 | 栃木 | 192 |
| 3 | 高知 | 68 | 27 | 三重 | 175 |
| 4 | 徳島 | 72 | 30 | 福島 | 180 |
| 5 | 福井 | 75 | 35 | 京都 | 255 |
| 10 | 香川 | 94 | 36 | 静岡 | 358 |
| 12 | 和歌山 | 91 | 40 | 千葉 | 627 |
| 20 | 宮崎 | 106 | 43 | 兵庫 | 540 |
| 24 | 熊本 | 173 | 45 | 大阪 | 881 |
| — | — | — | 47 | 東京 | 1404 |
線形補間方式(NumPy 既定):
$h = (47 - 1) \times 0.10 = 4.6$、 $k = 4$、 $\hat{Q}(0.10) = x_{(5)} + 0.6 \times (x_{(6)} - x_{(5)})$
順序統計量 $x_{(5)}$ = 福井 75 万人、 $x_{(6)}$ = 山梨 80 万人(仮)として、 $\hat{Q}(0.10) \approx 75 + 0.6 \times 5 = \mathbf{78}$ 万人。
解釈:「47 都道府県のうち、 下位 10% に入る県は人口 78 万人前後」。 鳥取・島根・高知・徳島・福井がここに該当。
$h = 46 \times 0.25 = 11.5$、 $k = 11$、 $\hat{Q}(0.25) = x_{(12)} + 0.5 \times (x_{(13)} - x_{(12)})$。
$x_{(12)}$ = 和歌山 91 万人、 $x_{(13)}$ ≈ 92 万人として $\hat{Q}(0.25) \approx \mathbf{91.5}$ 万人。
$n = 47$ は奇数なので、 中央値 = $x_{(24)}$。 熊本県 ≈ 173 万人。
比較:平均人口は約 268 万人(東京の影響で平均が大きく引き上げられる)。 中央値と平均の差が大きい = 分布が右に歪んでいる証拠。
$h = 46 \times 0.75 = 34.5$、 $\hat{Q}(0.75)$ = $x_{(35)} + 0.5 \times (x_{(36)} - x_{(35)})$ ≈ $\mathbf{255}$ 万人前後。 京都・広島あたり。
$h = 46 \times 0.9 = 41.4$、 $\hat{Q}(0.90) \approx x_{(42)} + 0.4 \times (x_{(43)} - x_{(42)})$。 北海道〜兵庫の範囲なので ≈ 538 万人前後。
| パーセンタイル | 記号 | 値(万人) | 代表的な県 |
|---|---|---|---|
| 10 | $Q(0.10)$ | ≈ 78 | 福井 |
| 25 (Q1) | $Q(0.25)$ | ≈ 91.5 | 和歌山 |
| 50 (中央値) | $Q(0.50)$ | ≈ 173 | 熊本 |
| 75 (Q3) | $Q(0.75)$ | ≈ 255 | 京都 |
| 90 | $Q(0.90)$ | ≈ 538 | 兵庫 |
| 参考: 平均 | $\bar{x}$ | ≈ 268 | — |
洞察:
🎯 このコードでやること: SSDSE-B-2026 から 47 都道府県の総人口を読み込み、 分位点計算の準備をする
import pandas as pd import numpy as np # SSDSE-B を読み込む(直書きパス) df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='utf-8', skiprows=1) # 最新年(2023)の総人口を抽出 df_2023 = df[df['年度'] == 2023] pop = df_2023['A1101'] # 総人口(人) print(f"n = {len(pop)}") print(f"最小: {pop.min():,}, 最大: {pop.max():,}")
💬 読み方: 47 都道府県を 1 つの母集団とみなし、 分位点で分布の形を確認していく。 最大/最小が 26 倍も離れていることから、 平均より中央値・分位点が分布の中心を語る適切な指標となる。
🎯 このコードでやること: 代表的な P10/P25/P50/P75/P90 を pandas.quantile() で算出し IQR と P90/P10 比を出す
# pandas: quantile() メソッド q10 = pop.quantile(0.10) q25 = pop.quantile(0.25) q50 = pop.quantile(0.50) # 中央値 q75 = pop.quantile(0.75) q90 = pop.quantile(0.90) print(f"P10 = {q10:,.0f} 人") print(f"P25 (Q1) = {q25:,.0f} 人") print(f"P50 (中央値) = {q50:,.0f} 人") print(f"P75 (Q3) = {q75:,.0f} 人") print(f"P90 = {q90:,.0f} 人") # IQR と P90/P10 比 IQR = q75 - q25 ratio = q90 / q10 print(f"IQR = {IQR:,.0f} 人, P90/P10 = {ratio:.2f}")
💬 読み方: IQR は中央 50% の幅で外れ値に強い散らばり指標。 P90/P10 = 10.9 倍という大きな比は人口分布の右裾長尾を端的に示し、 平均値ではなく分位点で語るべき分布であることが分かる。
🎯 このコードでやること: numpy.percentile() で 10% 刻みの全パーセンタイル + describe() の 5 数要約を出す
# 0, 10, 20, ..., 100 パーセンタイル全部 percentiles = np.arange(0, 101, 10) # [0, 10, 20, ..., 100] values = np.percentile(pop, percentiles) for p, v in zip(percentiles, values): print(f"P{p:3d} = {v:,.0f}") # describe() で 5 数要約をまとめて見る print(pop.describe()) # count, mean, std, min, 25%, 50%, 75%, max # 任意のパーセンタイル(97.5 など)も指定可 q975 = np.percentile(pop, 97.5) print(f"P97.5 = {q975:,.0f}")
💬 読み方: describe() で 5 数要約 (min/Q1/median/Q3/max) を一発取得。 平均 2.71M に対し中央値 1.92M と乖離が大きく、 右裾の重さを示す。 P97.5 は信頼区間や VaR の閾値として使える。
🎯 このコードでやること: 箱ひげ図と累積分布関数 (CDF) を並べて分位点を可視化する
import matplotlib.pyplot as plt import seaborn as sns fig, axes = plt.subplots(1, 2, figsize=(12, 5)) # 左:箱ひげ図(Q1, Q2, Q3 が見える) sns.boxplot(y=pop, ax=axes[0]) axes[0].set_title('47都道府県人口の箱ひげ図') axes[0].set_ylabel('人口 (人)') # 右:累積分布関数(CDF)と分位点 sorted_pop = np.sort(pop) cdf = np.arange(1, len(sorted_pop) + 1) / len(sorted_pop) axes[1].step(sorted_pop, cdf, where='post') axes[1].axhline(0.5, color='red', linestyle='--', label='P50') axes[1].axvline(q50, color='red', linestyle='--') axes[1].set_xlabel('人口') axes[1].set_ylabel('累積確率 F(x)') axes[1].set_title('経験累積分布と中央値') axes[1].legend() plt.tight_layout() plt.show()
💬 読み方: 箱ひげ図は分位点を視覚化する最も標準的な道具。 髭の外に飛ぶ点は外れ値ルール (Q3 + 1.5×IQR) で識別される。 CDF の階段が立ち上がる場所が密度の高い領域。
🎯 このコードでやること: scipy.stats で標準正規分布・t 分布の理論分位点 (ppf) を計算する
from scipy import stats # 標準正規分布の分位点 # 95% 信頼区間の両端は P2.5 と P97.5 z_025 = stats.norm.ppf(0.025) # -1.96 z_975 = stats.norm.ppf(0.975) # +1.96 print(f"95% 信頼区間 z: [{z_025:.3f}, {z_975:.3f}]") # t 分布(自由度 30)の 95% 分位点 t_975 = stats.t.ppf(0.975, df=30) # 2.042 # カイ二乗分布の上側 5% 点(仮説検定で使う) chi2_95 = stats.chi2.ppf(0.95, df=5) # 11.07
💬 読み方: 標本サイズ n から自由度 n-1 の t 分布の分位点を取ると t 区間が引ける。 n→∞ で t は標準正規に収束。 大標本では z=1.96 で代用可能。
🎯 このコードでやること: statsmodels の quantreg() で人口あたり所得の P25・P50・P75 分位点回帰を実行する
import statsmodels.formula.api as smf # 「人口(高齢者比率に対する 25/50/75 パーセンタイル)」を分位回帰で推定 # 通常の回帰は平均を予測、 分位回帰は任意の分位点を予測 for q in [0.25, 0.50, 0.75]: model = smf.quantreg('pop ~ aging_rate', data=df_2023) result = model.fit(q=q) print(f"q={q}: intercept={result.params[0]:.0f}, slope={result.params[1]:.3f}")
💬 読み方: 分位点回帰は平均ではなく各分位点の条件付き分布を直接モデル化。 平均 OLS では見えない不平等の構造 (上位ほど伸びるなど) が傾きの分位点別変化に現れる。
分位点を「実データから推定する」とき、 サンプル数が分母を割り切らない場合、 どう補間するかで方式が分かれます。 Hyndman & Fan (1996) が 9 種類に分類した方式があり、 ライブラリによって既定が違います。
| 方式 | R type | 説明 | 使われる場所 |
|---|---|---|---|
| Type 1 | 1 | 逆 CDF(不連続)。 階段関数 | 離散データ向け |
| Type 2 | 2 | SAS デフォルト。 階段+境界平均 | SAS |
| Type 3 | 3 | 順序統計量に丸める | 稀 |
| Type 4〜6 | 4-6 | 連続補間(境界条件の違い) | 専門用途 |
| Type 7 | 7 | 線形補間(NumPy・R 既定) | NumPy, pandas, R |
| Type 8 | 8 | 分布非依存推奨(中央値推定で偏りなし) | Hyndman 推奨 |
| Type 9 | 9 | 正規分布前提推奨 | 正規分布データ |
NumPy では np.quantile(x, q, method='linear')(type 7、 既定)以外にも method 引数で複数指定可能。 サンプル数が大きければ方式の違いはほぼ無視できますが、 小サンプル($n < 30$)では結果が微妙に変わります。 論文では「どの方式を使ったか」を明記するのが理想です。
データ $\{1, 2, 3, 4, 5\}$ の $Q(0.25)$ を 3 方式で:
サンプルが小さいほど差が目立つので、 論文の数値が他者の値と少しズレるときは方式違いを疑う。
PERCENTILE.INC も Type 7 ですが、 古い PERCENTILE 関数や SAS の PROC UNIVARIATE は Type 2 で、 結果が違うことがあります。 「P25 が論文と微妙にズレる」ときは、 まずこれを疑う。 論文では「method='linear'」など明記が安全。
分位点の周辺概念を整理しましょう。
【データ x_1, ..., x_n】
│
昇順に並べる
▼
【順序統計量 x_(1) ≤ ... ≤ x_(n)】
│
┌─────────┼─────────┐
▼ ▼
【経験分位点 Q̂(q)】 【経験CDF F̂(x)】
│ │
│ 互いに逆関数 │
└──────────────────────────────┘
│
┌─────────┴─────────┐
▼ ▼
【代表的分位点】 【応用】
・最小 Q(0) ・箱ひげ図
・P10 ・5 数要約
・Q1 = P25 ・外れ値判定
・中央値 = Q2 = P50 ・Q-Q プロット
・Q3 = P75 ・分位回帰
・P90 ・VaR・CVaR
・最大 Q(1) ・ノンパラメトリック検定
・信頼区間(t, z の分位点)
| 指標 | 外れ値耐性 | 計算 | 解釈 |
|---|---|---|---|
| 平均 | 弱い | $\sum x_i / n$ | 重心 |
| 中央値(P50) | 強い | 順位 (n+1)/2 番目 | 多数派の典型値 |
| 最頻値 | 強い | 最頻出値 | 最も出やすい値 |
| 切り捨て平均 | 中 | 上下 N% を除いた平均 | 外れ値を緩和した中心 |
分布全体を 5 つの数字に要約する古典的サマリーが 5 数要約 (five-number summary) です。 Tukey (1977) が提唱し、 箱ひげ図 (boxplot) と一対で用いられます。
| 要素 | 意味 | 記号 | 典型的な役割 |
|---|---|---|---|
| 最小値 | データの下端 | $\min, Q(0)$ | 下側の外れ値検出 |
| 第 1 四分位 | 下位 25% の境界 | $Q_1, Q(0.25)$ | 箱の下端 |
| 中央値 | 真ん中の値 | $Q_2, Q(0.5)$, $\tilde{x}$ | 箱の中の線 |
| 第 3 四分位 | 上位 25% の境界 | $Q_3, Q(0.75)$ | 箱の上端 |
| 最大値 | データの上端 | $\max, Q(1)$ | 上側の外れ値検出 |
| 項目 | 値(万人) | 該当県 |
|---|---|---|
| 最小 | ≈ 55 | 鳥取 |
| $Q_1$ | ≈ 91.5 | 和歌山 |
| 中央値 | ≈ 173 | 熊本 |
| $Q_3$ | ≈ 255 | 京都 |
| 最大 | ≈ 1404 | 東京 |
この 5 数だけ見ても:
max → ┃ (上ひげの先 = Q3 + 1.5×IQR 内の最大値、 超えると外れ値プロット)
┃
┣━━━━━━━━┓ ← Q3 (箱の上端)
┃ ┃
┃ ── ┃ ← 中央値 (Q2、 箱の中の線)
┃ ┃
┣━━━━━━━━┛ ← Q1 (箱の下端)
┃
min → ┃ (下ひげの先 = Q1 - 1.5×IQR 内の最小値)
pandas の describe() は 5 数要約に平均と標準偏差を加えた 7 数要約を返します。 通常はこれで十分。 ただし、 平均と中央値が大きく違う場合は分布が歪んでいると即座に判断。
仮説検定・信頼区間で「臨界値」「上側 5% 点」と呼ばれるのは、 理論分布の分位点です。 数式的には:
| 分布 | 0.025 分位点 | 0.975 分位点 | 用途 |
|---|---|---|---|
| 標準正規 $\mathcal{N}(0,1)$ | $-1.960$ | $+1.960$ | 95% 信頼区間、 大標本 Z 検定 |
| t (自由度 10) | $-2.228$ | $+2.228$ | 小標本 t 検定 |
| t (自由度 30) | $-2.042$ | $+2.042$ | 中標本 t 検定 |
| $\chi^2$ (自由度 5) | $0.831$ | $12.83$ | カイ二乗検定、 分散検定 |
| F (5, 10) | $0.151$ | $4.236$ | 分散比検定、 ANOVA |
古典的な統計表で「$z_{0.05} = 1.645$」と書かれているのは、 「上側 5% 点」=「右側の 5% 領域を切り取る境界」=「97.5% 分位点」のこと。 一方「$z_{0.025} = 1.96$」(両側 5%、 上側 2.5%)と書く流派もあって混乱しやすい。 教科書ごとに記法を確認するのが安全。
🎯 このコードでやること: QQ プロットで観測分位点と理論正規分布の分位点を比較し、 分布のあてはまりを確認する
from scipy import stats # ppf = percent point function = 分位点関数 print(stats.norm.ppf(0.975)) # 1.96 print(stats.t.ppf(0.975, df=30)) # 2.042 print(stats.chi2.ppf(0.95, df=5)) # 11.07 print(stats.f.ppf(0.95, 5, 10)) # 3.326 # 逆方向:cdf = 累積分布関数 print(stats.norm.cdf(1.96)) # 0.975
💬 読み方: QQ プロットは分位点を 1 対 1 で並べた図。 対角線に乗れば理論分布に従う。 右上が反れていれば右裾が重い (人口分布の典型)。 対数変換で直線化を試すのが定石。
np.quantile、 np.percentile の 9 方式DataFrame.quantile()分位点同士の比は、 経済学・社会学で格差・不平等の指標として広く使われます。 平均だけでは見えない「上位と下位の開き」を 1 つの数字で表現できます。
「上位 10% の境界 ÷ 下位 10% の境界」。 OECD が公表する代表的不平等指標。 SSDSE 都道府県人口で計算すると:
$\dfrac{Q(0.9)}{Q(0.1)} = \dfrac{538 \text{ 万人}}{78 \text{ 万人}} \approx 6.9$
解釈:「上位 10% の都道府県は、 下位 10% の約 7 倍の人口規模」。 国際比較では、 米国の所得 P90/P10 が約 5.8、 日本は約 5.0、 北欧は約 3.0 程度。 値が大きいほど格差が大きい。
OECD の Income Distribution Database で使われる別の不平等指標。 P90/P10 より裾の影響を受けにくく、 中間層に近い分位点を比較。
所得分布での「中央層内の格差」。 比較的安定し、 サンプル数が小さくても推定できる。
$\mathrm{QD} = (Q_3 - Q_1) / 2$。 IQR の半分で、 「中央値からの典型的なズレ」を表す。 標準偏差より外れ値に頑健な散らばり指標。
$\mathrm{MAD} = \mathrm{median}(|x_i - \tilde{x}|)$。 中央値からの絶対偏差の中央値。 外れ値に極めて頑健で、 ロバスト統計の標準ツール。 正規分布なら $\sigma \approx 1.4826 \times \mathrm{MAD}$。
Gini 係数は分位点関数の積分で書ける:$G = 1 - 2\int_0^1 L(p)\, dp$($L(p)$ はローレンツ曲線、 分位点から派生)。 つまり分位点関数を理解すれば Gini 係数の幾何学的意味も自然に分かります。
このページは 分位点 (Quantile) を解説する用語ページです。
カテゴリ:記述統計
ジャストインタイム型データサイエンス教育の一環として、必要な時に参照し、関連概念とともに学べる構成になっています。
基準ページ:correlation.html(149KB、12セクション、SSDSE-B 実値計算)と同等以上の品質を目指しています。
分位点とは「データを並べて q×100% の位置に来る値」のこと。中央値(q=0.5)はその代表例。外れ値に強く、分布形状を要約できる。箱ひげ図の5数要約も分位点ベース。
| 場面 | 使い方 |
|---|---|
| 探索的データ分析 | 分布や関係性の最初の確認 |
| モデル比較 | 仮定の妥当性を裏付ける指標として |
| レポート作成 | 標準的な要約統計量・指標として明記 |
分位点 (Quantile) の中心となる数式・定義は次の通りです。
$$ Q(q) = \inf\{x : F(x) \geq q\}, \quad 0 < q < 1 $$
政府統計の総合窓口 e-Stat が公開する SSDSE-B-2026.csv(47都道府県×項目)を用いた具体的計算例を示します。
SSDSE-B-2026 の47都道府県「総人口」を昇順に並べ、47×0.25=11.75 → 12位(補間して鳥取県付近 ≒ 60万)、 47×0.5=23.5 → 中央値(補間して 三重・岐阜近辺 ≒ 180万)、 47×0.75=35.25 → 福岡・静岡近辺(≒ 500万)が得られる。
| 項目 | 値・指標 |
|---|---|
| データ件数 | 47 都道府県 |
| 対象指標 | 人口・世帯数・就業者数など |
| 計算結果 | 上記説明参照 |
import pandas as pd
import numpy as np
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='utf-8', skiprows=1)
pop = df.iloc[:, 3].dropna()
print('Q1 (25%):', np.quantile(pop, 0.25))
print('Q2 (50%):', np.quantile(pop, 0.50))
print('Q3 (75%):', np.quantile(pop, 0.75))
print('IQR:', np.quantile(pop, 0.75) - np.quantile(pop, 0.25))
上記コードは pandas / numpy / scipy / sklearn / statsmodels の標準的なライブラリを用い、SSDSE-B-2026.csv を直接読み込んで計算します(合成データ不使用)。