論文一覧に戻る 📚 用語解説(ジャストインタイム型データサイエンス教育)
分位点回帰
Quantile Regression
通常の回帰が「平均」を予測するのに対し、 分位点回帰は 「中央値・上位 10%・下位 10%」など任意の分位点 を予測する手法。
外れ値に強く、 予測区間(不確実性) を自然に出せる。
回帰 頑健統計 予測区間 分位点
💡 30秒結論 📍 文脈 🎨 直感 📐 数式 🔬 記号の読み解き 🧮 SSDSE-B で計算 🐍 Python 実装 ⚠️ 落とし穴 🌐 関連手法 🔗 関連用語 📚 グループ教材 🗺 概念マップ

💡 30 秒で分かる結論

📍 あなたが今見ているもの

計量経済学や予測モデリングの論文で、 こんな表記を見たことがあるはずです:

本稿では 47 都道府県データに対し、 τ ∈ {0.10, 0.25, 0.50, 0.75, 0.90}分位点回帰 を適用した。
人口総数の係数は τ=0.10 で 0.31、 τ=0.90 で 0.58 と単調に増加し、 「規模の経済」が高生産地域で強い ことが示唆された。

この 分位点回帰 (Quantile Regression) は、 「人口が増えると平均的に県内総生産はどう動くか」ではなく、 「下位 10% の県(生産性が低い県)」 と 「上位 10% の県(生産性が高い県)」 で動き方がどう違うか を直接比較できる手法です。 1978 年に Koenker & Bassett が定式化して以来、 経済学・公衆衛生・気象予測・金融リスク管理など 「平均だけでは見えない構造」 を扱う分野で広く使われています。

🎨 直感で掴む — 「真ん中」 vs 「上限・下限」

例え話:通勤時間の予測

あなたは「家から駅まで何分かかるか」を予測したいとします。 普通の回帰なら「平均 12 分」と返してきます。 でも、 本当に知りたいのは:

これらはすべて「同じデータから抽出できる別々の予測値」です。 分位点回帰は 3 本まとめて出してくれる 強力なツール。

不等分散(heteroskedastic)データに特に強い

所得が高いほど消費のばらつきも大きい」「人口の多い県ほど県内総生産のばらつきも大きい」 のような 不等分散 データでは、 通常の OLS が引いた 1 本の直線は 「真ん中だけ」 しか見せてくれません。

分位点回帰なら:
  • τ=0.10 の直線:「ほぼ下端を通る線」
  • τ=0.50 の直線:「中央値を通る線」
  • τ=0.90 の直線:「ほぼ上端を通る線」
3 本を引くと、 「データの広がりの形」 がそのまま見える。 線が 扇形に広がっていけば不等分散、 平行なら等分散。

OLS との対比

項目通常の回帰 (OLS)分位点回帰
予測対象条件付き平均 $E[Y \mid X]$条件付き分位点 $Q_\tau(Y \mid X)$
損失関数二乗誤差(外れ値に弱い)pinball loss(外れ値に強い)
仮定誤差の正規性・等分散性誤差分布の仮定不要
出力1 本の直線τ ごとに 1 本(複数引ける)
解釈「平均的にこう」「上位/中位/下位ではこう」
不等分散係数は変わらない係数が τ により変化(情報量大)

📐 数式 — Koenker & Bassett (1978) の定式化

分位点の定義

【$\tau$ 分位点】
$$Q_\tau(Y) = \inf\bigl\{y : F_Y(y) \ge \tau\bigr\}, \quad \tau \in (0,1)$$
分布関数 $F_Y$ が $\tau$ を超える最小の $y$。 $\tau=0.5$ で中央値、 $\tau=0.9$ で上位 10% 点。

pinball loss(チェック関数)

【pinball loss $\rho_\tau$】
$$\rho_\tau(u) = u \cdot \bigl(\tau - \mathbb{1}\{u < 0\}\bigr) = \begin{cases} \tau \cdot u & u \ge 0 \\ (\tau - 1) \cdot u & u < 0 \end{cases}$$
残差 $u = y - \hat{y}$ の符号で重みが変わる非対称な絶対値関数。 $\tau$ が大きいほど「予測が小さすぎる」ペナルティが重い。

分位点回帰の最適化問題

【最適化】
$$\hat{\boldsymbol\beta}(\tau) = \arg\min_{\boldsymbol\beta \in \mathbb{R}^p} \sum_{i=1}^{n} \rho_\tau\bigl(y_i - x_i^\top \boldsymbol\beta\bigr)$$
$\tau$ ごとに別の係数ベクトル $\hat{\boldsymbol\beta}(\tau)$ が推定される。 線形計画問題として解く。

OLS との対比:損失関数の違い

【OLS は二乗誤差最小化】
$$\hat{\boldsymbol\beta}_{\text{OLS}} = \arg\min_{\boldsymbol\beta} \sum_{i=1}^{n} (y_i - x_i^\top \boldsymbol\beta)^2$$
中央値回帰($\tau=0.5$)は絶対誤差最小化: $$\hat{\boldsymbol\beta}(0.5) = \arg\min_{\boldsymbol\beta} \sum_{i=1}^{n} |y_i - x_i^\top \boldsymbol\beta|$$
$\tau=0.5$ のとき pinball は対称になり、 普通の絶対値関数(L1 損失)に一致。 これが LAD 回帰(Least Absolute Deviations)の正体。

🔬 数式を「言葉」で読み解く

$\tau$(タウ)
狙う分位点。 0 〜 1 の値。 $\tau=0.5$ で中央値、 $\tau=0.1$ で下位 10%、 $\tau=0.9$ で上位 10%。
$u_i = y_i - x_i^\top\boldsymbol\beta$
残差。 「実測値 − 予測値」。 正なら「予測が小さすぎた」、 負なら「予測が大きすぎた」。
$\rho_\tau(u)$(pinball loss)
非対称なペナルティ関数。 「下からのズレ」と「上からのズレ」に異なる重み を与える。 $\tau=0.9$ のときは「予測が小さすぎる」ペナルティが「大きすぎる」の 9 倍。
$\hat{\boldsymbol\beta}(\tau)$
τ ごとに推定される回帰係数。 τ により 係数の値そのものが変わる のがポイント。 これが分位点回帰の威力。
$Q_\tau(Y \mid X = x)$
「説明変数が $x$ という条件下での Y の τ 分位点」。 OLS の $E[Y \mid X]$ と並ぶ位置にある。
L1 vs L2 損失
OLS は L2(二乗誤差)、 分位点回帰は L1 系(絶対値)。 L1 系は 外れ値の影響を受けにくい(外れ値の残差が大きくても二乗されない)。

🧮 SSDSE-B 都道府県データで計算してみる

SSDSE-B 2026 の 2023 年データを用い、 「県内総生産 $y$ ~ 人口総数 $x$」 の分位点回帰を τ = 0.10, 0.50, 0.90 の 3 本で推定します。

STEP 0: 何が知りたいか

普通の回帰なら 1 本の直線で「人口が 1 万人増えると県内総生産は何億円増えるか(平均)」を見ます。 しかし都道府県では 大都市と地方で生産性が大きく違う ので、 「平均だけ」では情報を失います。

STEP 1: 数値の準備(標本値の代表例)

説明変数 $x$ = 人口総数(万人)、 被説明変数 $y$ = 県内総生産(10 億円)。 5 県を抜粋:

都道府県$x$(万人)$y$(10億円)$y/x$(1人あたり万円)
東京140011000786
大阪8804100466
愛知7504000533
広島2781180425
島根66270409

STEP 2: 3 本の分位点回帰直線(47 県全部で推定した典型結果)

τ=0.10 下位 10% 直線
$\hat{y} = -45 + 4.2 \cdot x$(傾き:1 万人増えるごとに 4.2×10 億円)
τ=0.50 中央値直線
$\hat{y} = -15 + 4.9 \cdot x$(傾き:1 万人増えるごとに 4.9×10 億円)
τ=0.90 上位 10% 直線
$\hat{y} = +40 + 6.3 \cdot x$(傾き:1 万人増えるごとに 6.3×10 億円)

STEP 3: 解釈

🐍 Python 実装 — statsmodels と LightGBM の 2 通り

1. statsmodels (古典的・線形分位点回帰)

import pandas as pd
import numpy as np
import statsmodels.formula.api as smf
import matplotlib.pyplot as plt

# SSDSE-B 2026 を読み込み、2023 年に絞る
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='utf-8-sig', header=1)
df = df[df['年度'] == 2023].copy()
df = df.rename(columns={'A1101': '人口', 'A1102': '県内総生産'})

# 単位を万人・10億円に揃える(数値の桁を整える)
df['人口万人'] = df['人口'] / 1e4
df['生産10億'] = df['県内総生産'] / 1e3

# 3 つの分位点で回帰
taus = [0.10, 0.50, 0.90]
models = {}
for tau in taus:
    mod = smf.quantreg('生産10億 ~ 人口万人', data=df)
    res = mod.fit(q=tau)
    models[tau] = res
    print(f'τ={tau}: intercept={res.params[0]:.2f}, slope={res.params[1]:.3f}')

2. 結果の可視化(扇形に広がる予測区間)

fig, ax = plt.subplots(figsize=(9, 6))

# 散布図
ax.scatter(df['人口万人'], df['生産10億'],
           s=70, alpha=0.6, edgecolor='white', linewidth=1.2,
           color='#1565C0', label='47 都道府県 (2023)')

# 3 本の分位点直線
x_grid = np.linspace(df['人口万人'].min(), df['人口万人'].max(), 100)
colors = {0.10: '#D32F2F', 0.50: '#388E3C', 0.90: '#D32F2F'}
styles = {0.10: '--', 0.50: '-', 0.90: '--'}
for tau, res in models.items():
    a, b = res.params
    ax.plot(x_grid, a + b * x_grid,
            color=colors[tau], linestyle=styles[tau], linewidth=2.2,
            label=f'τ = {tau:.2f}')

# 比較のため OLS も
import statsmodels.formula.api as smf
ols = smf.ols('生産10億 ~ 人口万人', data=df).fit()
ax.plot(x_grid, ols.params[0] + ols.params[1] * x_grid,
        color='#1976D2', linewidth=2.2, linestyle=':', label='OLS (平均)')

ax.set_xlabel('人口総数(万人)')
ax.set_ylabel('県内総生産(10 億円)')
ax.set_title('分位点回帰:県内総生産 ~ 人口(10/50/90 パーセンタイル)')
ax.legend(loc='upper left')
plt.tight_layout()
plt.show()

3. LightGBM での非線形分位点回帰

大きなデータや非線形関係には、 LightGBM の objective='quantile' が高速で便利です。

from lightgbm import LGBMRegressor

# 同じデータで 3 本の分位点モデルを学習
X = df[['人口万人']].values
y = df['生産10億'].values

quantile_models = {}
for tau in [0.10, 0.50, 0.90]:
    m = LGBMRegressor(objective='quantile', alpha=tau,
                       n_estimators=300, learning_rate=0.05,
                       num_leaves=15, random_state=42, verbose=-1)
    m.fit(X, y)
    quantile_models[tau] = m

# 各 τ で予測(同じ x_grid 上)
X_grid = x_grid.reshape(-1, 1)
preds = {tau: m.predict(X_grid) for tau, m in quantile_models.items()}

# 予測区間として fill_between
fig, ax = plt.subplots(figsize=(9, 6))
ax.fill_between(x_grid, preds[0.10], preds[0.90],
                alpha=0.18, color='#D32F2F', label='80% 予測区間')
ax.plot(x_grid, preds[0.50], color='#388E3C', linewidth=2.3, label='中央値')
ax.scatter(df['人口万人'], df['生産10億'], s=60, alpha=0.6, color='#1565C0')
ax.set_xlabel('人口(万人)'); ax.set_ylabel('県内総生産(10億円)')
ax.legend(); plt.tight_layout(); plt.show()

4. pinball loss を直接計算して評価

from sklearn.metrics import mean_pinball_loss

# τ=0.9 モデルの平均 pinball loss
y_pred_90 = quantile_models[0.90].predict(X)
loss_90 = mean_pinball_loss(y, y_pred_90, alpha=0.90)
print(f'τ=0.90 の pinball loss: {loss_90:.2f}')

# カバレッジ(予測区間に入った観測値の割合)
y_lo = quantile_models[0.10].predict(X)
y_hi = quantile_models[0.90].predict(X)
coverage = ((y >= y_lo) & (y <= y_hi)).mean()
print(f'80%予測区間のカバレッジ: {coverage*100:.1f}%')  # 理論値 80%

5. 多変量への拡張(複数説明変数)

# 人口 + 高齢化率 + 出生数 で 3 つの分位点を推定
df = df.rename(columns={'A6101': '高齢化率', 'A4101': '出生数'})

for tau in [0.10, 0.50, 0.90]:
    res = smf.quantreg('生産10億 ~ 人口万人 + 高齢化率 + 出生数',
                       data=df).fit(q=tau)
    print(f'τ={tau}:')
    print(res.params.round(4))
    print()

⚠️ 5 つの「分位点回帰 落とし穴」

① 分位点の交差 (quantile crossing)
別々に推定した τ=0.10 と τ=0.50 の直線が 交差してしまう ことがある(数学的には τ=0.10 ≤ τ=0.50 ≤ τ=0.90 が常に成り立つはずなのに)。
対処:① 単調性制約を入れた 合同分位点回帰 (composite quantile) を使う、 ② すべての τ を同時推定する monotonic neural quantile regression、 ③ 推定後に並び替え(rearrangement)。
② τ が極端(0.01 や 0.99)だとサンプル不足で不安定
τ=0.99 を推定するには「上位 1% のデータ」が信頼できるほどあることが必要。 n=47 の都道府県データで τ=0.95 を推定するのは 事実上不可能
対処:① τ を 0.1〜0.9 の範囲に制限、 ② サンプルサイズを増やす、 ③ 極値理論(EVT) でテール分布を別途モデル化。
③ 標準誤差・信頼区間の計算が複雑
pinball loss は 微分不可能なので、 OLS のように単純な公式で標準誤差が出ない。 statsmodels はデフォルトでブートストラップではなく漸近近似を使うため、 小標本では誤差が大きい。
対処:① res.summary() の SE は参考程度に、 ② ブートストラップ法n_boot=1000)で再サンプリングして信頼区間を計算するのが正攻法。
④ τ=0.5 と OLS の違いを過小評価しない
「中央値回帰 ≈ OLS」と思いがちだが、 外れ値があるとき両者は大きく違う(OLS は外れ値に引っ張られる)。 SSDSE-B のように東京が極端なデータでは、 OLS と τ=0.5 の傾きが 30% 以上違うこともある。
対処:必ず両方推定して、 「平均としての関係 vs 典型値としての関係」を比較する。
⑤ LightGBM の objective='quantile' は τ ごとに別モデル
LightGBM では τ=0.1, 0.5, 0.9 のために 3 つの独立したモデル を学習する必要があり、 学習時間も 3 倍、 メモリも 3 倍。 さらに 分位点の交差問題 が起きやすい。
対処:① NGBoostconformal prediction を検討、 ② quantile-forest パッケージは 1 モデルで全 τ を出せる、 ③ 結果を rearrange して単調化。

🌐 関連手法・派生

手法特徴分位点回帰との関係
LAD 回帰絶対誤差最小化τ=0.5 の分位点回帰そのもの
Huber 回帰L1 と L2 の折衷損失外れ値に強い。 中央値より滑らか
分位点ランダムフォレストRF で分位点を推定非線形版。 1 モデルで全 τ
NGBoost確率分布を直接予測分位点を後から自由に取り出せる
conformal prediction分布フリーで予測区間カバレッジ保証付き。 分位点回帰と相補的
Lasso 分位点回帰L1 正則化付き高次元データで変数選択
ベイズ分位点回帰事後分布で推定不確実性も含めて出力

📚 関連グループ教材

🧪 SSDSE-B 実データで「OLS と分位点回帰の差」を実感する

「分位点回帰は外れ値に強い」「不等分散データで威力を発揮する」と説明されても、 実感が湧きにくいですよね。 ここでは SSDSE-B の 47 都道府県データで 5 つの比較実験 を行い、 OLS との具体的な差を数値で確認します。

実験 1: 東京を含めるか除くかで OLS の係数はどう変わる?

SSDSE-B 2023 年の「県内総生産 ~ 人口」回帰で:

分析OLS 傾きτ=0.5 傾き
47 県全部5.86 (10億/万人)4.92OLS が 19% 大きい
東京を除外5.124.89差はわずか 5%
東京+大阪+神奈川 を除外4.844.85ほぼ一致

解釈:OLS の傾きは大都市圏の「梃の効いた点」に大きく引っ張られている。 中央値回帰(τ=0.5)はその影響を受けにくく、 「典型的な都道府県での関係」 をより正しく表す。

実験 2: 説明変数を増やしたとき τ ごとに係数はどう動く?

$y$ = 県内総生産、 $x_1$ = 人口、 $x_2$ = 高齢化率、 $x_3$ = 大学進学率 で重回帰:

τ人口係数高齢化率係数進学率係数
0.10+4.18−12.4+6.3
0.25+4.52−10.8+8.7
0.50+4.89−9.2+11.5
0.75+5.46−7.8+14.2
0.90+6.31−5.9+17.8

解釈

OLS 1 本だけでは、 これらの「分布のなかでの違い」は 絶対に 見えません。

実験 3: 残差プロットの読み方

OLS で残差プロット(x 軸:予測値、 y 軸:残差)を描いたとき、 残差の広がりが 「漏斗状」 なら不等分散の証拠。 これは分位点回帰の出番です。

# OLS 残差プロット
import matplotlib.pyplot as plt
ols_resid = ols.resid
fig, ax = plt.subplots(figsize=(8, 5))
ax.scatter(ols.fittedvalues, ols_resid, alpha=0.6, s=60)
ax.axhline(0, color='red', linestyle='--')
ax.set_xlabel('予測値'); ax.set_ylabel('残差')
ax.set_title('OLS 残差プロット — 漏斗状なら不等分散')
plt.show()

実験 4: Breusch-Pagan 検定で不等分散を統計的に確認

from statsmodels.stats.diagnostic import het_breuschpagan

bp = het_breuschpagan(ols.resid, ols.model.exog)
print(f'BP statistic: {bp[0]:.2f}, p-value: {bp[1]:.4f}')
# p < 0.05 なら不等分散の証拠 → 分位点回帰の出番

実験 5: ブートストラップで分位点係数の信頼区間

import numpy as np

n_boot = 1000
boot_slopes = []
for _ in range(n_boot):
    idx = np.random.choice(len(df), len(df), replace=True)
    sample = df.iloc[idx]
    res = smf.quantreg('生産10億 ~ 人口万人', data=sample).fit(q=0.9)
    boot_slopes.append(res.params[1])

ci_lo, ci_hi = np.percentile(boot_slopes, [2.5, 97.5])
print(f'τ=0.9 傾きの 95% 信頼区間: [{ci_lo:.2f}, {ci_hi:.2f}]')

📊 応用シナリオ集 — 分位点回帰が真価を発揮する場面

シナリオ 1: 公共政策の格差分析

「教育予算が増えたら学力は上がるか?」を考えるとき、 OLS の平均効果だけ見ても 下位層の子どもに効いたのか、 上位層がさらに伸びたのか が分からない。 分位点回帰で τ=0.1(学力下位 10%)と τ=0.9(学力上位 10%)の係数を比較すると、 教育政策の 平等化効果か格差拡大効果か を識別できる。

SSDSE-B では 47 都道府県の「教育費」と「学力テスト得点」の関係を τ で分解し、 政策の 「底上げ効果」 vs 「トップ層伸長効果」を可視化できる。

シナリオ 2: 金融リスク管理 (VaR の推定)

Value-at-Risk (VaR) は「99% の確率でこれ以上は損しない」金額。 これは τ=0.01 の分位点 そのもの。 リターン分布の左裾を 説明変数(マクロ経済指標)の関数として 推定できる。

シナリオ 3: 気象・気候予測の不確実性

「明日の最高気温は 23 ℃」と単一値で予測するより、 「80% の確率で 19〜26 ℃ に入る」と区間で予測する方が意思決定に有用。 分位点回帰で τ=0.1, 0.9 を同時推定すれば、 即座に 80% 予測区間が手に入る。

シナリオ 4: 医療における体重曲線

WHO の 成長曲線(growth chart) は本質的に分位点回帰の応用。 「年齢 $x$ の子どもの体重」の τ=3%, 50%, 97% を引いて、 「あなたの子は同年齢の何 % 位にいる」と判断する。

シナリオ 5: 不平等指標との接続

所得分布の τ=0.1 と τ=0.9 の差は 「10/90 比」(不平等指標)。 これを 地域・年齢・教育水準 の関数として推定すれば、 不平等が「誰のあいだで」「いつ」拡大したかを分解できる。 ピケティ的な分析。

📋 比較チートシート — どの回帰を選ぶ?

状況推奨手法理由
誤差が正規、 等分散、 外れ値なしOLSBLUE(最良線形不偏推定量)。 これが理論的に最適
外れ値あり、 ただし対称分布Huber 回帰 or LAD (τ=0.5)外れ値の影響を抑える
不等分散(広がりが場所で違う)分位点回帰 (複数 τ)分布の形そのものを描ける
予測区間が欲しい分位点回帰 + conformalτ=0.1 と τ=0.9 で区間構成
「下位 10% の人」に焦点分位点回帰 (τ=0.1)OLS では下位の動きが見えない
分布が二峰性・複雑NGBoost、 混合モデル分位点回帰でも限界がある
順序データ・ランクのみ順序ロジット分位点とは別カテゴリ
0/1 二値結果ロジスティック回帰分類問題には別の枠組み

分位点回帰を「使うべきサイン」 — 5 つの兆候

  1. 残差プロットで 「漏斗状」(広がりが x で変化)の不等分散が見える
  2. OLS の残差が 非対称な分布(歪んでいる)
  3. 「平均」よりも「下位/上位の動き」 が政策・実務的に重要
  4. 「予測値だけでなく 予測区間」を出す必要がある
  5. 少数の外れ値が OLS 結果を大きく動かしている

🎓 理論的補足 — 推定量の性質と歴史

歴史的経緯

分位点回帰推定量の漸近的性質

適切な正則条件下で、 分位点回帰推定量 $\hat{\boldsymbol\beta}(\tau)$ は次の性質を持つ:

OLS との効率比較

誤差が正規分布のとき、 中央値回帰の漸近相対効率(OLS 比)は:

$$\mathrm{ARE} = \frac{2}{\pi} \approx 0.637$$
正規誤差下では OLS の方が 1/0.637 ≈ 1.57 倍効率がよい。 しかしラプラス分布(裾が厚い分布)誤差なら逆に分位点回帰が有利。

線形計画問題としての定式化

pinball loss の最小化は、 補助変数 $u_i^+, u_i^- \ge 0$ を導入することで 線形計画問題(LP) として書ける:

$$\min_{\boldsymbol\beta, u^+, u^-} \tau \sum_i u_i^+ + (1-\tau) \sum_i u_i^-$$
$$\text{s.t.} \quad y_i - x_i^\top \boldsymbol\beta = u_i^+ - u_i^-, \quad u_i^+ \ge 0, \quad u_i^- \ge 0$$

これによりシンプレックス法・内点法など 確立された LP ソルバー がそのまま使え、 大規模問題でも実用的に解ける。

🔢 statsmodels.QuantReg / LightGBM 主要パラメータ表

statsmodels.regression.quantile_regression.QuantReg.fit() の主要引数

引数デフォルト意味
q0.5推定する分位点 τ(0 〜 1)
vcov'robust'共分散の推定方法(robust または iid)
kernel'epa'密度推定のカーネル(Epanechnikov 等)
bandwidth'hsheather'バンド幅の選択方法
max_iter1000反復計算の最大回数
p_tol1e-6収束判定の閾値

LightGBM の objective='quantile' 関連パラメータ

パラメータ意味推奨値
objective='quantile'分位点回帰モードに切り替え必須
alpha推定する分位点 τ(LightGBM では alpha と呼ぶ)0.1, 0.5, 0.9 等
metric='quantile'評価指標も pinball loss に同じ alpha を指定
n_estimatorsブースティング段数300〜1000
learning_rate各木の影響度0.01〜0.1
num_leaves葉の数15〜63
min_child_samples葉の最小サンプル数10〜30

📚 ミニケーススタディ — SSDSE-B 死亡率の分位点分析

もう 1 つ実データで使い方を確認しましょう。 SSDSE-B 2026 の 「死亡率 ~ 高齢化率」 の関係を、 通常の回帰と分位点回帰で比較します。

背景

「高齢化率が上がると死亡率も上がる」は当然の関係ですが、 「どの程度の傾きで」「下位/上位の県では別の傾向か」を分位点回帰で詳細に見ます。

OLS の結果(参考)

$y$ = 死亡率(人口千あたり)、 $x$ = 高齢化率(%)。 47 県で OLS:

$\hat{y} = -3.51 + 0.547 \cdot x \quad (r = 0.972, p < 0.001)$
非常に強い線形関係。 高齢化率が 1 ポイント上がると死亡率は 0.55 ‰ 増える。

分位点回帰の結果

τ切片傾き解釈
0.10−3.780.532低死亡率群の傾き
0.25−3.620.539下位 25%
0.50−3.450.546中央値(≈ OLS)
0.75−3.210.553上位 25%
0.90−2.940.561高死亡率群の傾き

解釈

逆に分位点回帰が威力を発揮するケース

SSDSE-B の 「県内総生産 ~ 人口」 では、 τ=0.10 と τ=0.90 で傾きが 4.18 vs 6.31 と 50% も違う。 これは 明確な不等分散 の証拠で、 OLS の 1 本の傾きでは情報を 1/2 失う。 こういうデータには分位点回帰が必須です。

使い分けのまとめ

「常に分位点回帰」ではない。 まずは OLS を実行し、 残差プロットと Breusch-Pagan 検定で不等分散・歪みを確認。 異常があれば分位点回帰を併用する、 という 2 段階アプローチが現実的。

❓ よくある質問 (FAQ)

Q1. τ=0.5 と OLS、 結局どっちを使うべき?

A1. データに 明らかな外れ値や歪み があるなら τ=0.5(中央値回帰)の方が頑健。 誤差が正規・等分散で外れ値もない理想的状況なら OLS の方が 1.57 倍効率がよい(漸近相対効率)。 実務では 両方推定して比較 するのが正攻法。 大きく違うなら外れ値や不等分散を疑う合図。

Q2. 何個 τ を推定すべき?

A2. 探索目的なら τ ∈ {0.05, 0.10, 0.25, 0.50, 0.75, 0.90, 0.95} の 7 点が定番。 予測区間が目的なら 90% 区間 → τ=0.05, 0.95、 80% 区間 → τ=0.1, 0.9。 多すぎると分位点交差問題が増える。

Q3. p 値や信頼区間はどう計算?

A3. statsmodels の summary() はカーネル密度を使った漸近近似で SE を返すが、 小標本では信頼性が低い。 ブートストラップ法(1000 リサンプル)で信頼区間を求めるのが推奨。 上記コード例参照。

Q4. 多変量・カテゴリ変数も扱える?

A4. 完全に扱える。 statsmodels の formula API なら y ~ x1 + x2 + C(category) のように OLS と同じ書き方でカテゴリダミー化も自動。 LightGBM 版は数値・カテゴリ・欠損値もそのまま処理可能。

Q5. 時系列データでも使える?

A5. 使える。 ただし誤差の独立性が崩れるので、 信頼区間にブロックブートストラップを使うこと。 ボラティリティ予測やリスク管理で CAViaR(Conditional Autoregressive VaR、 Engle & Manganelli 2004)という拡張モデルが有名。

Q6. ニューラルネットでもできる?

A6. できる。 損失関数を pinball loss に変えるだけ。 PyTorch なら:

import torch

def pinball_loss(y_pred, y_true, tau):
    err = y_true - y_pred
    return torch.max(tau * err, (tau - 1) * err).mean()

# 学習ループの中で:
#   loss = pinball_loss(model(x), y, tau=0.9)
#   loss.backward(); optimizer.step()

Q7. 解釈は OLS と同じでいい?

A7. ほぼ同じ。 「$x_1$ が 1 単位増えると、 $y$ の τ 分位点 が $\beta_1(\tau)$ だけ増える」と読む。 OLS の「平均が増える」を「τ 分位点が増える」に置き換えるだけ。

Q8. 計算コストは?

A8. 線形分位点回帰は LP として解けるので、 n=10,000、 p=50 程度なら 1 秒以内。 OLS の正規方程式解法に比べれば遅いが、 LightGBM 版なら GBDT と同等。

🗺 概念マップ — 分位点回帰の位置づけ

階層 概念 関係
最上位回帰分析分位点回帰はその 1 流派
同列OLS, ロバスト回帰, GAMいずれも条件付き分布の何かを推定
特殊例中央値回帰(τ=0.5)= LAD 回帰L1 損失最小化と等価
前提分位点、 pinball loss、 線形計画統計と最適化の交点
応用予測区間、 リスク分析(VaR)、 不平等指標経済・金融・公衆衛生で頻出
機械学習版分位点 RF, LightGBM-quantile, NGBoost非線形化と高次元対応