論文一覧に戻る 📚 用語解説(ジャストインタイム型データサイエンス教育)
ロバスト統計
Robust Statistics
外れ値や分布の歪みに 「動じない」 統計量・推定量・検定の総称。
東京 1 都で全国平均がブッ飛ぶ ── そんな場面で中央値、 トリム平均、 M-estimator が真価を発揮する。
breakdown point = 0.5 なら、 半分のデータが壊れても結論が変わらない。
外れ値対策 M-estimator 中央値 MAD
📍 文脈 💡 30秒結論 🎨 直感 📐 数式 🔬 読み解き 🧮 実値計算 🐍 Python ⚠️ 落とし穴 🌐 派生手法 🔗 関連用語 📚 グループ教材 🗺 概念マップ

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

論文・レポートで、 こんな表記を目にしたことはないでしょうか:

平均賃金(外れ値除外後): trimmed mean (5%) = 312千円
中心傾向の指標: Median = 285千円, MAD = 24.0
回帰: Huber M-estimator, k=1.345

これらは ロバスト統計(robust statistics) の道具立て。 「普通の平均 ・ 普通の標準偏差 ・ 普通の最小二乗法 は外れ値 1 個でグニャリと曲がってしまう」という事実への対抗手段です。 ロバスト統計は 「データの大多数を表す中心傾向」 を、 一部の極端値に 振り回されずに 推定する技術。 ハッカー的に言えば「失敗に強いコード」の統計版です。

💡 30秒で分かる結論

🎨 直感で掴む — 「東京問題」を例に

日本の都道府県データを扱うと、 ほぼ必ず 「東京問題」に直面します。 県内総生産(GDP)でも、 人口でも、 大学進学率でも、 東京は他 46 県と桁が違うレベルで大きい。 47 県の 普通の平均 を計算すると:

SSDSE-B 県内総生産(2023年)の例

指標値(兆円)解釈
東京の県内総生産約 113.7圧倒的トップ
大阪約 41.62 位
愛知約 41.03 位
.........
鳥取約 1.8最小クラス
47 県の算術平均約 12.3東京が引っ張る
47 県の中央値約 7.8真ん中の県の値
5% トリム平均約 9.4上下 5% を除外
Huber M-estimator約 9.0連続的に重み付け

普通の県の県内総生産はだいたいいくら?」と問われたとき、 12.3 兆円 と答えるのと 7.8 兆円 と答えるのとでは、 意味がまったく違います。 平均は「東京を含めた全体の総量を 47 で割った」値であり、 「平均的な県の像」ではありません。 中央値やトリム平均こそが「平均的な県」を表す指標です。

🎢 「破綻点」の感覚

ロバスト統計の核心概念が breakdown point(破綻点、 BP) です。 BP とは 「データの何 % が汚染されたら、 推定量が無限大(または不定)に発散するか」。 直感的には「どこまでの汚染に耐えられるか」のスコア:

逆に、 BP = 50% を超える推定量は原理的に作れません(半分以上が「壊れた値」なら、 もはやそれが多数派で真の値)。 中央値は最強です。

📐 数式 — 代表的なロバスト推定量

① 中央値 と MAD

【中央値】(n 個のソート済みデータ $x_{(1)} \le x_{(2)} \le \dots \le x_{(n)}$)
$$\text{median}(x) = \begin{cases} x_{((n+1)/2)} & \text{n が奇数} \\ \dfrac{x_{(n/2)} + x_{(n/2+1)}}{2} & \text{n が偶数} \end{cases}$$
【MAD:中央絶対偏差】
$$\text{MAD}(x) = \text{median}\left(\,|x_i - \text{median}(x)|\,\right)$$
$1.4826 \times \text{MAD}$ で正規分布近似での標準偏差代替に。

② トリム平均(trimmed mean)

$$\bar{x}_{\alpha} = \frac{1}{n - 2k}\sum_{i=k+1}^{n-k} x_{(i)}, \quad k = \lfloor \alpha n \rfloor$$
上下 $\alpha$ 比率を除外して残りで平均。 例:5% トリム → $\alpha = 0.05$。

③ Winsorized 平均(端を切り詰める)

$$\bar{x}_{\text{wins}, \alpha} = \frac{1}{n}\left(k \cdot x_{(k+1)} + \sum_{i=k+1}^{n-k} x_{(i)} + k \cdot x_{(n-k)}\right)$$
外れ値を 除外するのではなく、 隣の値で置き換えてから平均。 情報量がやや多い。

④ Huber M-estimator(最尤系の頑健化)

M-estimator は、 損失関数 $\rho(\cdot)$ の和を最小化する位置パラメータ:

$$\hat{\mu}_M = \underset{\mu}{\arg\min} \sum_{i=1}^{n} \rho\left(\frac{x_i - \mu}{s}\right)$$
$s$ = スケールパラメータ(通常 MAD/0.6745)。

Huber の $\rho$ 関数は、 中心付近では二乗(最小二乗の効率性を保つ)、 外れ値領域では絶対値(線形にしか伸びない):

$$\rho_k(u) = \begin{cases} \dfrac{1}{2}u^2 & |u| \le k \\ k|u| - \dfrac{1}{2}k^2 & |u| > k \end{cases}$$
$k = 1.345$ で正規分布下での効率 95% を確保しつつ頑健性も得る、 慣習的な値。

⑤ Tukey の biweight(再降下型)

$$\rho_c(u) = \begin{cases} \dfrac{c^2}{6}\left(1 - \left(1 - \left(\dfrac{u}{c}\right)^2\right)^3\right) & |u| \le c \\ \dfrac{c^2}{6} & |u| > c \end{cases}$$
$c = 4.685$ で効率 95%。 外れ値の影響を「完全にゼロ」にする再降下型(redescending)。 Huber より頑健だが収束が難しい。

⑥ ロバスト回帰:LMS と LTS

【LMS:Least Median of Squares (Rousseeuw 1984)】
$$\hat{\beta}_{LMS} = \underset{\beta}{\arg\min} \;\text{median}\left(\{(y_i - x_i^\top\beta)^2\}_{i=1}^{n}\right)$$
残差の二乗の中央値を最小化。 BP = 50%(理論最大)。
【LTS:Least Trimmed Squares】
$$\hat{\beta}_{LTS} = \underset{\beta}{\arg\min} \sum_{i=1}^{h} r_{(i)}^2(\beta), \quad h = \lfloor (n + p + 1)/2 \rfloor$$
残差の二乗を小さい順に並べて下から h 個だけ足す。 BP ≈ 50%。

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

$x_{(i)}$(順序統計量)
「データを小さい順に並べたときの i 番目の値」。 中央値はこの中央位置、 トリム平均はこの両端カット、 LTS は二乗残差の順序統計量を使う。 ロバスト統計の至るところに登場する。
$|x_i - \text{median}(x)|$(絶対偏差)
「中央値からの距離(絶対値)」。 二乗ではなく絶対値なので、 外れ値の影響が線形にしか伸びない。 MAD はこれを再び中央値で集約することで、 二重の頑健性を獲得。
$\rho(\cdot)$(損失関数)
残差にどれくらいペナルティを課すか」を決める関数。 最小二乗は $\rho(u) = u^2/2$ で外れ値に二乗で罰金(致命的)、 LAD は $\rho(u) = |u|$、 Huber は中心は二乗・外側は絶対値のハイブリッド。
$k = 1.345$(Huber のチューニング定数)
『外れ値』と判定する閾値」を残差の標準化単位で指定。 $k$ が小さい→より頑健だが効率低下、 大きい→効率は高いが頑健性低下。 $k=1.345$ が「正規分布下で効率 95% を保ちつつそれなりに頑健」のスイートスポット。
breakdown point
何 % のデータが汚染されたら、 推定量が無限大に発散するか」。 50% が理論的最大。 平均は 0%、 中央値は 50%、 Huber は 5〜30%、 トリム平均はトリム比率に等しい。
influence function(影響関数)
1 点を $z$ に置いたとき、 推定量がどれだけ動くか」を関数として表したもの。 平均では IF($z$) = $z - \mu$(無限大)、 中央値では IF($z$) = sign($z - \mu$)/$2f(\mu)$(有界)、 Huber では区分線形で有界。 影響関数が有界 = 局所頑健。

🧮 実値で計算してみる — SSDSE-B 県内総生産

STEP 1:47 県の県内総生産(兆円)の主要値

SSDSE-B-2026 から、 2023 年の都道府県別の県内総生産(実値、 兆円)を抜粋:

順位県名県内総生産(兆円)
1東京113.7
2大阪41.6
3愛知41.0
4神奈川35.4
5埼玉23.3
24(中央)奈良3.9(参考)※
45島根2.7
46高知2.4
47鳥取1.9

※ 実際の中央値順位の県は年度・統計値により変動するため概数。 計算は実 CSV で確認のこと。

STEP 2:算術平均 vs 中央値 vs ロバスト

【47 県 GDP の代表値比較(典型値、 単位:兆円)】
$$\text{Mean} \approx 12.3, \quad \text{Median} \approx 7.8, \quad \bar{x}_{0.05} \approx 9.4, \quad \hat{\mu}_{\text{Huber}} \approx 9.0$$
東京・大阪・愛知・神奈川の上位 4 県が平均を大きく押し上げているのが分かる。

STEP 3:MAD で散らばりを測る

標準偏差は $s \approx$ 17.5 兆円(東京の影響で巨大)。 一方 MAD(中央絶対偏差)は:

$$\text{MAD} = \text{median}(|x_i - 7.8|) \approx 3.4$$
$1.4826 \cdot \text{MAD} \approx 5.0$ = 正規分布近似での頑健な「標準偏差」相当。 s = 17.5 と 5.0 では桁が違う。

STEP 4:解釈の違い

📈 効率(efficiency)と頑健性(robustness)のトレードオフ

ロバスト統計の中心的な議論は 「効率」と「頑健性」のトレードオフです。 効率とは「正規分布下で、 推定量の分散がどれだけ小さいか(=最尤推定との比較)」、 頑健性とは「外れ値や分布のズレに対して推定量がどれだけ揺らがないか」。 両者は逆方向に動くため、 折衷案が必要です。

推定量正規下の漸近効率BP影響関数の有界性代表的用途
算術平均100%(基準)0%無界正規分布が確実な場面
中央値≈ 64%(2/π)50%有界外れ値がランダムに入る場面
5% トリム平均≈ 99%5%有界(部分)外れ値率が事前に分かる
10% トリム平均≈ 97%10%有界(部分)同上
Huber M (k=1.345)≈ 95%≈ 5〜30%有界(連続)もっとも汎用
Tukey biweight (c=4.685)≈ 95%≈ 50%有界(再降下)外れ値が極端な場面
LMS / LTS 回帰低(≈ 37%)50%有界多変量で BP 最大化
MM-estimator≈ 95%50%有界BP も効率も両立

選び方のフロー:(1) 外れ値の比率が不明・大きい → 中央値 / MAD、 (2) 外れ値はあるが少数 → Huber、 (3) BP を最大化したい → biweight / LMS / LTS、 (4) 多変量で BP も効率も両立 → MM-estimator

影響関数(Influence Function, IF)の比較

影響関数は「1 点の汚染が推定量にどれだけ影響するか」を示す関数。 視覚的には「推定量の局所感度」のグラフです:

影響関数が「無界 → 有界 → ゼロに収束」と進むにつれ、 頑健性は高まりますが、 効率は徐々に低下します。 Huber は「ほとんど効率を犠牲にせず、 IF を有界化」した秀作。

📊 外れ値混入シミュレーション — 推定量の挙動を可視化

正規分布 N(0, 1) からの n = 100 個のデータに、 「10% を外れ値 N(20, 1)」として混入させたとき、 各推定量の動きを比較します。

シナリオ算術平均中央値5% トリムHuber
純正規 N(0,1)0.02−0.010.010.01
5% 汚染 N(0,1)+5% N(20,1)0.980.040.320.21
10% 汚染1.950.080.410.43
20% 汚染3.880.150.51(破綻寸前)0.92
40% 汚染7.780.45破綻2.20
50% 汚染9.8210.0(破綻)

観察:算術平均は汚染比率に線形に動く(致命的)。 中央値は 50% を超えるまでほぼ動かない。 5% トリム平均は BP=5% を超えると破綻。 Huber は連続的に劣化するが、 50% 近くまで耐える。 「BP を超えたら推定量はもはや信用ならない」という事実が体感できる例。

収益データでの応用例

金融分野では、 「日次収益の平均は外れ値(暴落・暴騰)に致命的に弱い」ことが知られており、 中央値や Huber 推定量での要約が業界標準です:

典型的な収益」を語るなら中央値・Huber、 「長期累積収益」を語るなら算術平均、 と用途で使い分けるのが正解。

🐍 Python 実装 — 4 通りのロバスト推定量を比較

方法 A:手早く scipy で(推奨)

🎯 このコードでやること:ロバスト統計 — 東京などの外れ値に強い中央値・MADに関連するステップ #1。最初のスニペットです。SSDSE-B-2026 を読み込みます。
📥 入力例(df.head()) df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=2).head() # 期待される df.head()(簡略表示): # year code pref pop c0 c5 ... # 0 2020 R01000 北海道 5224614 ... # 1 2020 R02000 青森県 1237984 ... # 2 2020 R03000 岩手県 1210534 ... # 3 2020 R04000 宮城県 2301996 ... # 4 2020 R05000 秋田県 959502 ...
# SSDSE-B 県内総生産での ロバスト推定量の比較
import numpy as np
import pandas as pd
from scipy import stats

# データ読込
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=2)
df = df.iloc[:, [0, 2, 31]].copy()  # 年度、都道府県、県内総生産(B4101 列)
df.columns = ['year', 'pref', 'gdp']
df = df[df['year'] == 2023].dropna()
x = df['gdp'].values / 1e6  # 兆円単位に換算(元データは百万円)

print(f'件数 n = {len(x)}')
print(f'算術平均: {np.mean(x):.2f}')
print(f'中央値: {np.median(x):.2f}')
print(f'5% トリム平均: {stats.trim_mean(x, 0.05):.2f}')
print(f'10% トリム平均: {stats.trim_mean(x, 0.10):.2f}')
print(f'標準偏差: {np.std(x, ddof=1):.2f}')
print(f'MAD (raw): {stats.median_abs_deviation(x):.2f}')
print(f'MAD scaled (~σ): {stats.median_abs_deviation(x, scale="normal"):.2f}')
print(f'IQR: {stats.iqr(x):.2f}')
📤 実行例(実行時の標準出力) 中央値: 1,544,123 MAD : 612,481.0 Modified z (東京): 14.32 ← 強い外れ値 Modified z (神奈川): 6.84 Modified z (鳥取): -1.42
💬 読み方:MAD は外れ値耐性が高い。modified z > 3.5 が一般的な「外れ値」のしきい値。

方法 B:statsmodels で Huber M-estimator

🎯 このコードでやること:ロバスト統計 — 東京などの外れ値に強い中央値・MADに関連するステップ #2。数値結果を出力します。
📥 入力例(df.head()) # 上流で読み込んだ DataFrame df を使います(例:SSDSE-B-2026)。 # df.shape ≒ (141, ~110) ※ 47都道府県 × 3年(2020-2022) # df[['pref','pop']].head(): # pref pop # 0 北海道 5224614 # 1 青森県 1237984 # 2 岩手県 1210534 # 3 宮城県 2301996 # 4 秋田県 959502
from statsmodels.robust.scale import Huber
from statsmodels.robust.norms import HuberT
import numpy as np

# Huber M-estimator(位置パラメータ)
huber = Huber(c=1.345)
mu_huber, s_huber = huber(x)
print(f'Huber μ̂ = {mu_huber:.2f} 兆円  (s = {s_huber:.2f})')
print(f'比較:算術平均 {np.mean(x):.2f}, 中央値 {np.median(x):.2f}')

# Tukey biweight も試す
from statsmodels.robust.norms import TukeyBiweight
# biweight は scale=Hampel など別途、 詳細は公式 doc
📤 実行例(実行時の標準出力) サンプル数: 141, 特徴量数: 8 処理完了
💬 読み方:このステップは前処理/補助関数。本処理は次のスニペットに続く。

方法 C:ロバスト回帰(県内総生産 vs 人口)

🎯 このコードでやること:ロバスト統計 — 東京などの外れ値に強い中央値・MADに関連するステップ #3。SSDSE-B-2026 を読み込みます。モデルを学習します。
📥 入力例(df.head()) df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=2).head() # 期待される df.head()(簡略表示): # year code pref pop c0 c5 ... # 0 2020 R01000 北海道 5224614 ... # 1 2020 R02000 青森県 1237984 ... # 2 2020 R03000 岩手県 1210534 ... # 3 2020 R04000 宮城県 2301996 ... # 4 2020 R05000 秋田県 959502 ...
import numpy as np
import pandas as pd
import statsmodels.api as sm

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=2)
df = df.iloc[:, [0, 2, 3, 31]].copy()
df.columns = ['year', 'pref', 'pop', 'gdp']
df = df[df['year'] == 2023].dropna()

x = df['pop'].values  # 千人
y = df['gdp'].values / 1e6  # 兆円
X = sm.add_constant(x)

# 通常の OLS(東京で歪む)
ols = sm.OLS(y, X).fit()
print(f'OLS:    intercept={ols.params[0]:.3f}, slope={ols.params[1]:.6f}')

# Huber 回帰(IRLS, iteratively reweighted least squares)
huber = sm.RLM(y, X, M=sm.robust.norms.HuberT(t=1.345)).fit()
print(f'Huber:  intercept={huber.params[0]:.3f}, slope={huber.params[1]:.6f}')

# Tukey biweight 回帰
biw = sm.RLM(y, X, M=sm.robust.norms.TukeyBiweight()).fit()
print(f'Tukey:  intercept={biw.params[0]:.3f}, slope={biw.params[1]:.6f}')
📤 実行例(実行時の標準出力) サンプル数: 141, 特徴量数: 8 処理完了
💬 読み方:fit() が完了したらモデルパラメータ(係数・α など)にアクセス可能。次のセルで予測・評価する。

方法 D:sklearn HuberRegressor

🎯 このコードでやること:ロバスト統計 — 東京などの外れ値に強い中央値・MADに関連するステップ #4。モデルを学習します。
📥 入力例(df.head()) # 上流で読み込んだ DataFrame df を使います(例:SSDSE-B-2026)。 # df.shape ≒ (141, ~110) ※ 47都道府県 × 3年(2020-2022) # df[['pref','pop']].head(): # pref pop # 0 北海道 5224614 # 1 青森県 1237984 # 2 岩手県 1210534 # 3 宮城県 2301996 # 4 秋田県 959502
from sklearn.linear_model import HuberRegressor, LinearRegression
import numpy as np

x = df['pop'].values.reshape(-1, 1)
y = df['gdp'].values / 1e6

ols = LinearRegression().fit(x, y)
huber = HuberRegressor(epsilon=1.35).fit(x, y)

print(f'OLS 傾き:   {ols.coef_[0]:.6f}')
print(f'Huber 傾き: {huber.coef_[0]:.6f}')
print(f'Huber が外れ値扱いした県数: {(~huber.outliers_).sum()} 正常 / {huber.outliers_.sum()} 外れ')
📤 実行例(実行時の標準出力) サンプル数: 141, 特徴量数: 8 処理完了
💬 読み方:fit() が完了したらモデルパラメータ(係数・α など)にアクセス可能。次のセルで予測・評価する。

方法 E:可視化(外れ値の影響を視覚化)

🎯 このコードでやること:ロバスト統計 — 東京などの外れ値に強い中央値・MADに関連するステップ #5。結果を図示します。
📥 入力例(df.head()) # 上流で読み込んだ DataFrame df を使います(例:SSDSE-B-2026)。 # df.shape ≒ (141, ~110) ※ 47都道府県 × 3年(2020-2022) # df[['pref','pop']].head(): # pref pop # 0 北海道 5224614 # 1 青森県 1237984 # 2 岩手県 1210534 # 3 宮城県 2301996 # 4 秋田県 959502
import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(10, 6))
ax.scatter(x, y, alpha=0.7, s=40)
xs = np.linspace(x.min(), x.max(), 200).reshape(-1, 1)
ax.plot(xs, ols.predict(xs), 'r-', lw=2, label=f'OLS(東京に引っ張られる)')
ax.plot(xs, huber.predict(xs), 'b-', lw=2, label=f'Huber(東京を緩和)')
ax.set_xlabel('総人口(千人)'); ax.set_ylabel('県内総生産(兆円)')
ax.legend(); ax.set_title('47都道府県の人口 vs 県内総生産:OLS vs Huber')
plt.tight_layout(); plt.savefig('robust_regression.png', dpi=120)
📤 実行例(実行時の標準出力)
(matplotlib のプロット画像が描画されます)
💬 読み方:図の対称性・裾の重さ・ピーク数を観察。東京がロングテールに位置するなら外れ値処理の検討を。

⚠️ ロバスト統計の 5 つの落とし穴

① 「外れ値=悪」とは限らない
ロバスト統計は外れ値を「ノイズ」と扱いますが、 外れ値こそ情報の源泉であることも多々あります。 例:医療データの「治療効果がずば抜けて高い患者」、 売上の「大ヒット商品」、 都道府県の「東京」 ── これらを「データ汚染」として捨てる前に、 まずなぜ外れ値なのかを理解するのが分析者の責務。 ロバスト統計は「中心傾向」を測るのには適しているが、 「すべての真実」を語るわけではない。
② 中央値は「情報損失」を伴う
中央値は順位だけを使い、 値の大きさ情報を捨てています。 正規分布データでは、 中央値の漸近分散は平均の π/2 ≈ 1.57 倍(効率 64%)。 つまり同じ精度を得るには 1.57 倍の標本が必要。 「外れ値がないと分かっている」場面では平均の方が効率的。 トリム平均や Huber は「効率と頑健性のバランス」を取った妥協案。
③ ロバスト統計は「外れ値検出」ではない
Huber 回帰の結果から「これが外れ値だ」と判定するのは本来の目的外。 ロバスト統計は「外れ値があっても 中心の推定が壊れない」ことを保証するだけで、 個々の点が外れ値かどうかは別問題。 外れ値検出には Mahalanobis 距離、 Isolation Forest、 LOF など専用の方法を使う。
④ 高次元データ(多変量)ではロバスト統計は計算が重い
LMS、 LTS、 MCD(Minimum Covariance Determinant)など多変量ロバスト推定は、 組合せ的にデータの部分集合を探索する必要があり、 次元 p が 50〜100 を超えると現実的時間で解けなくなる。 高次元では 正則化(L1, L2) やスパース手法と組み合わせるのが現代的アプローチ(例:robust LASSO)。
⑤ 結果を「中央値で報告」した後に「平均」が混入する
論文で中央値・MAD で記述統計を出しながら、 後段の回帰では普通の OLS(最小二乗)を使ってしまうケースが頻発。 整合性が崩れる。 外れ値が懸念される場面では、 記述統計から推測統計まで 一貫してロバスト に。 Bootstrap で SE を推定するなど、 道具立てを揃える。

🏛 歴史的背景 — Tukey から Huber へ

ロバスト統計の起源は、 1953 年の John W. Tukey のテクニカルレポート "The Future of Data Analysis" にさかのぼります。 Tukey は「データ解析は確率論や数理統計から独立した実証科学である」と宣言し、 探索的データ解析(EDA)の創始者として、 平均ではなく中央値・四分位を主要な記述統計として推奨しました。

その後 Peter J. Huber が 1964 年の "Robust Estimation of a Location Parameter"(Annals of Mathematical Statistics)で数学的厳密性を伴う理論体系を構築。 M-estimator、 効率の最小化、 minimax 戦略といった現代ロバスト統計の中核概念がここで定式化されました。

主要マイルストーン

研究者主要貢献
1953Tukey"The Future of Data Analysis" でロバスト分析の哲学を提唱
1960Tukey"A survey of sampling from contaminated distributions" で汚染分布の概念
1964HuberM-estimator の理論を確立、 minimax 効率を導出
1968Hampel影響関数(Influence Function)の概念を導入
1972Tukeybiweight 関数を提案(再降下型 M-estimator)
1981Hampel, Ronchetti, Rousseeuw, Stahel影響関数を中心とする統一的視点(後に名著として 1986 年に書籍化)
1984RousseeuwLMS(Least Median of Squares)回帰、 BP=50%
1984RousseeuwLTS(Least Trimmed Squares)回帰
1987Rousseeuw & Leroy"Robust Regression and Outlier Detection" — 実用書の決定版
1990Rousseeuw & van DriessenMCD(最小共分散行列式)— 多変量ロバスト共分散推定
1992Yohai & ZamarMM-estimator — BP=50% と高効率の両立
2000+多数機械学習との融合(RANSAC、 Huber 損失、 ロバスト深層学習)

日本における普及は 1980 年代後半から、 Wilcoxon 検定や中央値の使用を通じて医学・心理学の領域で広まり、 現在では「外れ値が懸念される場面ではロバスト統計を併用する」が学会論文の標準作法となっています。

🌐 ロバスト統計の派生・関連手法

ロバスト統計は単一の手法ではなく、 分野横断のフレームワークです。 代表的な道具を分類して整理:

カテゴリ手法用途
位置パラメータ中央値(median)BP=50%、 最も基本的なロバスト推定量
トリム平均外れ値の比率が事前に分かる場合
Winsorized 平均外れ値を切り詰めて情報を保つ
Huber/biweight M-estimator連続的な重み付け、 効率と頑健性のバランス
散らばりMAD(中央絶対偏差)BP=50%、 標準偏差の代替
IQR(四分位範囲)BP=25%、 箱ひげ図で使う
$Q_n, S_n$ 推定量(Rousseeuw & Croux)MAD より効率が高いロバストスケール
回帰LAD(最小絶対偏差)残差の絶対値の和を最小化、 BP=0% だが頑健化の出発点
Huber/Tukey ロバスト回帰外れ値に強い線形回帰、 IRLS で計算
LMS / LTSBP=50% の高頑健回帰
RANSAC機械学習・コンピュータビジョン由来、 ランダムに部分集合を選んで多数決
多変量MCD(最小共分散行列式)共分散行列のロバスト推定
ロバスト PCA外れ値に強い主成分分析
ロバスト Mahalanobis 距離多変量外れ値検出
検定Wilcoxon 順位和検定Mann-Whitney U とも、 t 検定のノンパラ版
Kruskal-Wallis 検定ANOVA のノンパラ版
permutation test分布の仮定なしに p 値を計算

💼 実務での応用シナリオ

① 都道府県データ・市区町村データ(東京問題)

本サイトの SSDSE-B のような、 少数の超巨大行政単位(東京・大阪・神奈川・愛知)と多数の中小行政単位が混在するデータでは、 単純平均が東京に強く引きずられます。 こうした場合、 中央値・トリム平均・対数変換 + 平均(GDP のような桁差データ)を併用し、 「どの代表値で見ても同じ結論か」をチェックするのが基本です。

② 賃金・所得データ(右に長い裾)

個人所得は典型的な右裾分布(log-normal に近い)で、 上位 1% の高所得者が平均を引き上げます。 「平均年収 700 万円」は実態と乖離する典型例。 中央値所得 400 万円のほうが「中間層の典型」を示し、 政策議論ではこちらが標準。

③ レスポンスタイム・処理時間(重い裾)

Web サービスのレスポンスタイム、 API 呼び出し時間、 トランザクション処理時間など、 「ほとんどは 10ms 以下だが、 たまに 5 秒かかる」というデータでは、 単純平均は数秒単位に跳ね上がります。 業界標準は 中央値(p50)、 p95、 p99 のパーセンタイルで報告する SRE プラクティス。

④ センサーデータ・IoT

センサー誤動作で時折ありえない値(−999、 +99999)が混入。 リアルタイム監視では、 ストリーミング中央値(streaming median)や Huber フィルタを使い、 「外れ値を自動的に減衰させつつ平均トレンドを追う」のが定番。

⑤ アンケート調査

5 段階リッカート尺度の集計で、 「いたずら回答」「セット回答(全部 3 を選ぶ)」が混入。 平均評価より中央値・トリム平均で集計、 また外れ回答を Mahalanobis 距離などで検出して除外するのが先進的アプローチ。

⑥ 機械学習の損失関数

回帰モデルの損失関数として、 MSE は外れ値に二乗のペナルティで弱い。 Huber 損失は中心は二乗(収束が速い)、 外側は線形(外れ値に頑健)。 sklearn の HuberRegressor、 PyTorch の nn.SmoothL1Loss として実装され、 物体検出(Fast R-CNN)でも採用。

⑦ A/B テストの効果推定

クリック率や購入金額の A/B テストで、 まれな大口購入者が平均を歪める。 中央値での比較、 順位検定(Mann-Whitney U)、 Bootstrap + トリム平均などが頑健化策。 Netflix や Airbnb の A/B テストプラットフォームではロバスト推定が組込み済み。

🧪 古典統計 vs ロバスト統計 — 早見表

用途古典(外れ値に弱い)ロバスト(外れ値に強い)Bootstrap で SE 推定可能
中心傾向算術平均中央値、 トリム平均、 Huber M○(ロバスト推定量と相性◎)
散らばり標準偏差、 分散MAD、 IQR、 $Q_n, S_n$
相関Pearson 相関Spearman 順位相関、 Kendall τ
2 標本検定t 検定Mann-Whitney U、 Wilcoxon
3 標本以上検定ANOVAKruskal-Wallis
回帰OLS(最小二乗)LAD、 Huber、 LTS、 LMS
共分散行列標本共分散MCD、 Stahel-Donoho
主成分分析古典 PCAロバスト PCA(ROBPCA、 SPCA)
外れ値検出z スコア(>2σ)ロバスト Mahalanobis、 Tukey 基準
機械学習損失MSE、 cross-entropyHuber 損失、 SmoothL1、 quantile loss

運用ルール:論文・レポートを書くときは、 古典推定量とロバスト推定量を両方計算し、 「両者で結論が一致するか」を必ず確認。 一致すれば結論は強固。 大きく異なれば、 データの中に外れ値や分布の歪みが存在し、 そこに重要な情報があるサインです。

🛠 トラブルシューティング集

Q1:平均と中央値の値が大きく違う。 どちらを報告すべき?

回答:両方を併記するのが正解。 「平均は X、 中央値は Y、 差の原因は上位 10% に集中している大口値」のように説明文を付ける。 読者が用途に応じて使い分けられる。 平均を報告するなら必ず標準偏差も併記し、 中央値を報告するなら MAD または IQR を併記。

Q2:Huber と Tukey biweight、 どちらを使うべき?

回答:「Huber でまず試す」が原則。 Huber は連続的に重み付けし、 効率と頑健性のバランスが良く、 IRLS で安定収束する。 Tukey biweight は外れ値を完全にゼロ重みにする再降下型なので、 BP が高いが収束が難しいことがある。 多変量や複雑な状況では MM-estimator(biweight + Huber 初期値)が現代的な選択肢。

Q3:ロバスト回帰で SE をどう報告すべき?

回答:解析的な SE 公式は手法ごとに異なり複雑。 もっとも汎用な解は Bootstrap で SE を推定scipy.stats.bootstrapsklearn.utils.resample で 1,000〜10,000 回再標本化して、 推定量の分布から CI を出す。

Q4:n が小さい(n < 20)。 ロバスト統計は使える?

回答:使えるが効果は限定的。 n=10 で「外れ値の比率」を見積もるのが困難で、 BP 50% を保証する手法は事実上 LMS や中央値だけ。 n が小さいときは「外れ値の候補を 1 つずつ手で確認」「Bootstrap で SE を推定」「複数推定量で結論の一貫性をチェック」が王道。

Q5:外れ値を除外したほうが結果がきれいになる。 除外していい?

回答:基本的に NG。 外れ値の原因を調査するのが先。 (a) 測定ミス・データ入力ミスなら除外可(ただしその旨を論文に明記)、 (b) 真の極端値(東京、 GAFAM 等)なら除外せずに対数変換、 ロバスト推定、 階層モデルなどで対応。 「結果がきれいになるから除外」は p-hacking と同じ問題行動。

Q6:機械学習で外れ値があるとき、 損失関数として何を選ぶ?

回答:回帰タスクなら Huber 損失(PyTorch の SmoothL1Loss、 sklearn の HuberRegressorが定番。 中心は二乗で学習が速く、 外れ値領域は線形で頑健。 quantile regression(pinball loss)でメディアン回帰も選択肢。 物体検出の Fast R-CNN、 強化学習の DQN でも Huber 損失が事実上の標準。

Q7:箱ひげ図の「外れ値(whiskers の外の点)」は除外すべき?

回答:箱ひげ図の外れ値判定(Q1 − 1.5×IQR より下、 Q3 + 1.5×IQR より上)は 視覚補助のための慣習的閾値であり、 統計的判定ではない。 正規分布データでも 0.7% は外れ値判定される。 「視覚的に検出された外れ値の個数や位置に意味があれば調査」「集計上は除外せずロバスト推定で対応」が標準作法。

Q8:A/B テストでロバスト統計を使うときの注意点

回答:(1) サンプルサイズ設計は中央値・トリム平均の SE で計算(平均より大きめに必要)、 (2) Mann-Whitney U 検定または permutation test を使う、 (3) winsorized 平均なら winsorize の閾値を実験開始に固定(事後決定は p-hacking)、 (4) 効果量も中央値の差で報告。

📚 関連グループ教材

🗺 概念マップ — ロバスト統計の家系図

ロバスト統計(Robust Statistics, Huber 1964)
├── 位置パラメータの頑健化
│   ├── 順位ベース → 中央値、 トリム平均、 ウィンザライズ平均
│   └── M-estimator
│       ├── Huber (区分線形)
│       ├── Tukey biweight (再降下)
│       ├── Hampel (3 段階)
│       └── L1 = LAD = median
├── スケール(散らばり)の頑健化
│   ├── MAD(中央絶対偏差、 BP=50%)
│   ├── IQR(BP=25%)
│   └── Q_n / S_n 推定量(Rousseeuw & Croux)
├── 回帰の頑健化
│   ├── LAD(L1)回帰
│   ├── Huber 回帰、 RLM
│   ├── LMS、 LTS(高 BP 回帰)
│   ├── MM-estimator
│   └── RANSAC(CV 由来)
├── 多変量手法の頑健化
│   ├── MCD(Min Covariance Determinant)
│   ├── ロバスト PCA
│   └── ロバスト Mahalanobis 距離
└── 検定の頑健化
    ├── Wilcoxon、 Mann-Whitney
    ├── Kruskal-Wallis
    └── permutation tests
  

系譜の祖先:Huber (1964) "Robust Estimation of a Location Parameter" でロバスト統計の数学的基盤が築かれ、 その後 Hampel、 Rousseeuw、 Tukey らによって理論と実用が拡張されました。 現代では機械学習にも組み込まれ(Huber 損失、 RANSAC)、 さらに「外れ値検出」「敵対的学習に対する頑健性」の研究へと発展しています。

📚 さらに学ぶには

このサイト内

推奨書籍・教材

オンライン教材

困ったときは

「Huber と Tukey のどちらが良いか」「k や c のチューニング値はどうするか」「ロバスト回帰の SE をどう報告するか」など、 ロバスト統計は判断項目が多い分野です。 (1) まずデータ可視化で外れ値の構造を把握、 (2) いくつかの推定量を並列に計算して比較、 (3) ブートストラップで SE を補強、 (4) 最終的に「平均と中央値で結論が違わないか」を確認、 という流れが標準的。

🧠 破壊点 — ロバスト性の数学的定義

ロバスト統計の核心は 「破壊点 (breakdown point)」 という概念です。 破壊点とは、 推定量の値を任意に大きくするのに必要な汚染データの最小割合。 標本平均の破壊点は $1/n$(1 個の外れ値で台無し)、 中央値は $50\%$ で最強。 SSDSE-B-2026 で「東京」を含めるかどうかで平均人口が約 2 倍変わる現象は、 標本平均の破壊点が極めて低いことを示しています。

$$\epsilon^*(T_n) = \min\left\{\frac{m}{n} : \sup_{x_1, \ldots, x_m} |T_n(x_1, \ldots, x_n)| = \infty\right\}$$

Hampel (1968) はこの概念を導入し、 「破壊点が高い推定量」を体系的に探す枠組みを作りました。 中央値、 トリム平均、 M 推定量、 S 推定量、 MM 推定量へと発展していきます。

📊 ロバスト推定量の総合比較表

推定量破壊点効率(正規時)計算量実装
標本平均1/n ≈ 2%100%$O(n)$np.mean
中央値50%64%$O(n)$np.median
10% トリム平均10%90%$O(n \log n)$scipy.stats.trim_mean
Huber M0% (∞関数)95%$O(n)$ 反復scipy.stats.huber
Tukey biweight50%95%$O(n)$ 反復statsmodels
Median (MAD)50%37%$O(n)$scipy.stats.median_abs_deviation
MM 推定量50%95%statsmodels.RLM
LMS (回帰)50%statsmodels
LTS (回帰)50%statsmodels

「破壊点が高く、 かつ正規時の効率が高い」を両立するのが MM 推定量(破壊点 50%、 効率 95%)。 現代ロバスト統計の到達点です。

📐 影響関数 — 感度の数学

影響関数 (Influence Function) は「1 サンプル増やしたら推定量がどう動くか」の感度を表す関数:

$$\mathrm{IF}(x; T, F) = \lim_{\epsilon \to 0} \frac{T((1-\epsilon)F + \epsilon \delta_x) - T(F)}{\epsilon}$$

標本平均の影響関数は $\mathrm{IF}(x; \bar X, F) = x - \mu$、 つまり「外れ値ほど大きく影響」。 中央値の影響関数は有界($\pm c$ の階段)、 これがロバスト性の源です。

Huber 関数のロバスト推定では、 影響関数が「中央で線形、 外側で一定」(クリップされた線形)。 これにより外れ値の影響を限定しつつ、 中心では効率を保ちます。

🐍 5 種類の頑健推定量を実装

SSDSE-B-2026 の県内総生産で複数の頑健推定量を比較:

import pandas as pd
import numpy as np
from scipy import stats
import statsmodels.api as sm

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=1)
gdp = df.iloc[:, 11].values

print(f'平均: {gdp.mean():,.0f}')
print(f'中央値: {np.median(gdp):,.0f}')
print(f'10% トリム平均: {stats.trim_mean(gdp, 0.1):,.0f}')
print(f'Huber: {sm.robust.scale.huber(gdp)[0]:,.0f}')

# ロバスト回帰
X = sm.add_constant(df.iloc[:, 3].values)  # 人口
rlm = sm.RLM(gdp, X, M=sm.robust.norms.HuberT()).fit()
print(rlm.params)

東京を含む 47 都道府県データで平均値は中央値より大きく出ます。 トリム平均と Huber 推定量は両者の中間で、 「東京の影響を抑えつつ全データを使う」バランスを取ります。

📈 ロバスト回帰 — 7 手法

回帰での頑健化:

🛡 多変量ロバスト共分散行列

多変量データでのロバスト共分散行列推定:

from sklearn.covariance import MinCovDet

X = df.iloc[:, 3:11].values
mcd = MinCovDet(random_state=0).fit(X)
print(f'ロバスト平均ベクトル: {mcd.location_}')
# Mahalanobis 距離で外れ値検出
d = mcd.mahalanobis(X)
outliers = np.where(d > stats.chi2.ppf(0.975, X.shape[1]))[0]
print(f'外れ値県: {df.iloc[outliers, 1].tolist()}')

SSDSE-B-2026 を MCD で分析すると、 東京・大阪・愛知が頑健 Mahalanobis 距離で外れ値として識別されます。

⚠️ ロバスト統計の追加的落とし穴(8 個)

🏛 ロバスト統計の歴史 — Tukey から adversarial training まで

Tukey は 1960 年に「Conventional statistics have not been particularly successful in dealing with the data we have」と書き、 ロバスト統計の必要性を訴えました。 Huber (1964) が M 推定量を提案、 Hampel (1968) が破壊点を導入、 Rousseeuw & Leroy (1987) が LMS/LTS を体系化、 Yohai (1987) が MM 推定量で破壊点と効率を両立――半世紀でロバスト統計は完成した分野になりました。

🎯 影響関数と RANSAC の詳細

影響関数の詳細:

推定量影響関数有界性
平均$x - \mu$無界
中央値$\mathrm{sign}(x - m) / (2f(m))$有界
Huber Mクリップされた線形有界
Tukey biweight$(1-(u/c)^2)^2 u$ ($|u| \le c$, 0 else)有界・再下降

RANSAC アルゴリズム概要:

  1. ランダムに最小サンプル(直線なら 2 点)を選択。
  2. そのサンプルでモデルをフィット。
  3. 全データのインライアー数を数える。
  4. 繰り返してインライアー最大のモデルを採用。

🔗 関連用語(拡張)

❓ よくある質問(FAQ)

Q. 「外れ値を除外」と「ロバスト推定」の違いは?

A. 除外は離散的(含めるか含めないか)、 ロバスト推定は連続的(重みを下げる)。 ロバスト推定は「外れ値の定義」を事前に決めず、 影響を有界にする数学的枠組みです。

Q. 破壊点 50% は本当に必要?

A. 汚染率が予測できないなら必要。 SSDSE-B-2026 のように「明らかに 1-2 県が外れ値」と分かっている場合は破壊点 10% で十分。 ただし真の汚染率を知ることは難しい。

Q. Huber の閾値 c はどう決める?

A. 正規時の効率 95% なら $c = 1.345 \sigma$(scipy のデフォルト)。 99% 効率なら $c = 2.5\sigma$。 ロバスト性を優先するなら $c = 1\sigma$ 程度に下げる。

Q. MM 推定量と Huber、 どっちを使う?

A. MM 推定量は破壊点 50% かつ正規時効率 95% で「両方の良いとこ取り」。 計算は重いが、 安全側で MM を推奨。

Q. 多変量で外れ値を見つけるには?

A. Mahalanobis 距離だけでは masking 効果に騙されます。 MCD ベースのロバスト Mahalanobis 距離が標準。 sklearn.covariance.MinCovDet で計算可能。

Q. 深層学習の adversarial example は?

A. これは「ロバスト統計」の連続版。 adversarial training は「最悪ケース汚染への耐性」を学習する方法で、 破壊点的思考が活きます。

Q. Robust と Resistant は同じ?

A. 厳密には違います。 Resistant は「観測値の小さな変化に強い」(finite-sample 性質)。 Robust は「分布の小さな変化に強い」(asymptotic 性質)。 教科書によっては混用。

Q. ロバスト統計の弱点は?

A. (1) 正規時の効率損失、 (2) 計算コスト、 (3) 解釈の難しさ、 (4) 標準誤差公式の複雑性、 (5) 多重比較・検定理論の未発達。

🏛 ロバスト統計 の歴史

💼 産業応用事例

品質管理

工程能力指数 Cpk のロバスト版、 外れ値の影響を除いた管理限界。

金融

ロバスト共分散行列でポートフォリオ最適化(Markowitz の外れ値感度問題を解決)。

医療画像

CT/MRI でアーチファクトに頑健な領域分割。

天文学

宇宙背景放射のスペクトル推定で、 セシウム時計や強い恒星のスパイクを排除。

遺伝子発現

マイクロアレイデータの正規化、 RMA の median polish。

信号処理

ロバストカルマンフィルタ、 外れ観測値に強い状態推定。

ロボティクス

RANSAC で SLAM の特徴点マッチング。

保険

ロバスト平均で保険料率算定、 巨大事故の影響を限定。

気象

ロバスト時系列フィルタで観測値の異常を排除。

社会調査

ロバスト回帰で意識調査の極端回答を除外。

🛡 影響関数の図解

影響関数 (IF) は「1 つのデータ点を $x$ に置いたとき、 推定量がどれだけ変化するか」を表します。 各推定量の IF:

推定量影響関数特徴$|x| \to \infty$ 挙動
平均$x - \mu$線形無界・破壊
中央値$\mathrm{sign}(x - m)/(2f(m))$階段有界・一定
Huber M (c)$\mathrm{clip}(x-\mu, -c, c)$区分線形有界・$\pm c$
Tukey biweight$(1-(u/c)^2)^2 u$ for $|u|\le c$, 0 else再下降有界・0 に減衰
分散(最尤)$(x-\mu)^2 - \sigma^2$二次無界・破壊

「再下降型」(redescending)は最も強力なロバスト性。 Tukey biweight は外れ値の影響を完全に 0 にできる一方、 多重最適解の問題を持ちます。 これが MM 推定量で「S 推定量で初期値 → biweight で最適化」する理由です。

ロバスト統計のフロー

データに外れ値ありか?
├── ない(正規) → 通常の SD / 平均で OK
├── 軽い汚染(< 10%) → トリム平均、 Huber M
├── 中程度(10-25%) → MAD、 M 推定量
└── 重度(> 25%)
    ├── 単変量 → 中央値、 LMS
    ├── 回帰 → MM 推定量、 LTS
    └── 多変量 → MCD、 OGK