論文一覧に戻る 📚 用語解説(ジャストインタイム型データサイエンス教育)
ロバスト統計
Robust Statistics
外れ値や分布の歪みに 「動じない」 統計量・推定量・検定の総称。
東京 1 都で全国平均がブッ飛ぶ ── そんな場面で中央値、 トリム平均、 M-estimator が真価を発揮する。
breakdown point = 0.5 なら、 半分のデータが壊れても結論が変わらない。
外れ値対策 M-estimator 中央値 MAD

🔖 キーワード索引

本ページで扱う中核キーワードを 「概念 / 推定量 / 評価指標 / 派生手法 / 実装ライブラリ」 の 5 系統で索引化した。 チップをクリックすると該当セクションへ移動する。 別名(Aliases)は丸括弧で併記。

ロバスト統計 (Robust Statistics) 外れ値 (Outlier) ブレイクダウン点 (BP) 影響関数 (Influence Function) M 推定量 (M-estimator) MM 推定量 (MM-estimator) 中央値 (Median) MAD (Median Absolute Deviation) トリム平均 (Trimmed Mean) Huber 損失 (Huber Loss) Tukey biweight RANSAC LMS 回帰 (Least Median of Squares) MCD (Minimum Covariance Determinant) statsmodels.robust sklearn.linear_model.HuberRegressor

別名 (Aliases): ロバスト推定、 抗外れ値統計、 R 推定、 高ブレイクダウン点推定、 などの呼び方が文献では混在する。 本ページでは 「ロバスト統計 = 外れ値や分布の歪みに対して結論が大きく変わらない推定・検定の総称」 として扱う。

🧭 現場での意思決定フロー

「ロバスト統計を使うべきか」は 4 つの判断軸で決まる。 単に外れ値が "見える" だけで M 推定に飛びつくと、 効率(標準誤差)を 1〜2 割犠牲にする可能性がある。 まず分布と業務要件を整理した上で、 以下のフローで段階的に判断する。

判断軸 1: データ生成過程(DGP)が正規からどの程度ずれているか

SSDSE-B-2026 の都道府県人口は、 東京・大阪・愛知が右側に長い裾を持つ重尾分布である。 シャピロ–ウィルク検定で p<0.001、 歪度=2.22、 尖度=7.95。 こうしたケースでは平均は東京 1 県に引きずられ「全国平均=265 万人 (> 中央値 155 万人の 1.71 倍)」となる。 ここで平均を使うと「平均より下=下位 35 県」という直感に反する読みになり、 報告の説得力を失う。 中央値 155 万人 + 第 1・3 四分位 103 万 / 264 万を併記すれば、 読者は「中位の県の規模感」と「ばらつき」を同時に得られる。

判断軸 2: 外れ値が「測定誤差」か「重要な少数派」か

外れ値=ゴミという思い込みは危険である。 たとえば医療費の右裾は 高額長期入院患者という臨床上重要なグループ を含む。 ここでロバスト推定で押し込めると、 政策議論で必要な「上位 5% の負担分布」が消える。 ロバスト統計は 「結論を平均値で要約したいが、 外れ値の存在は別途報告する」 という二段構えで使うのが正しい。

判断軸 3: 推定の用途(記述統計 / 推論 / 予測)

記述(県の典型を示す)→ 中央値 + IQR で十分。 推論(処置効果の検定)→ Wilcoxon 順位和検定など分布フリー手法、 もしくは Huber-White SE。 予測(回帰モデル)→ HuberRegressor / RANSAC / Theil–Sen。 用途に合わせて 3 系統を切り替える。

判断軸 4: サンプルサイズ n

n=47 県のような小標本では、 ロバスト推定の漸近理論(n→∞)が頼りにくい。 ブートストラップ 1,000 回で M 推定量の信頼区間を構築するのが現実的。 大標本(n>1,000)なら理論 SE をそのまま使ってよい。

判断軸使う推定量SSDSE-B 想定シナリオ
DGP が重尾中央値・MAD・Huber県人口・延べ宿泊者数
外れ値が政策上重要平均 + 分位点 (q90, q99)転入者数・着工建築物数
回帰で外れ値耐性必要HuberRegressor / RANSAC総人口 vs 出生数 の県横断回帰
小標本 + 非対称分布Wilcoxon + ブートストラップ47 県のグループ間比較

この 4 軸表を最初に当てはめれば、 「とりあえず平均」も「とりあえず中央値」も避けられる。 結論を 1 つの統計量で要約するのではなく、 分布の形・外れ値・用途・n の 4 軸を全て言語化してから推定量を選ぶ 習慣がロバスト統計の本質である。

📈 感度分析プロトコル

ロバスト統計を「使う」のではなく、 結果が 外れ値に対してどの程度安定か を体系的に検証するのが感度分析(Sensitivity Analysis)である。 SSDSE-B-2026 の県データで 5 段階のプロトコルを示す。

ステップ 1: 全データで通常の推定量を計算

県人口 47 件で平均=265 万、 中央値=155 万、 標準偏差=280 万、 MAD=62 万。 平均と中央値の差 110 万、 SD と MAD の比 4.5 が 「分布が歪んでいる証拠」 となる。

ステップ 2: 上位 / 下位 5% を順次除外し再推定

トリム率 α を 0%, 5%, 10%, 20% と段階的に変えて平均(トリム平均)を計算。 α=0: 265 万 → α=5: 232 万 → α=10: 211 万 → α=20: 169 万。 単調減少が緩むのが「真の中心」の目安である。

ステップ 3: 外れ値除外前後で回帰係数の比較

総人口 X に対する延べ宿泊者数 Y(G7101)の OLS 回帰係数 β=4.11(宿泊/人)。 東京を除外すると β=2.94、 上位 3 県除外で β=2.61。 ここまで動くなら HuberRegressor で全データを使うのが正解。 β=3.97 (Huber) に落ち着く。

ステップ 4: ブートストラップで信頼区間

中央値の 95% CI を 10,000 回のブートストラップで構築。 [148 万, 178 万] が得られたら、 「県の中位的人口は 150〜180 万の範囲」と政策議論で使える表現が確定する。

ステップ 5: 結果のレポート

必ず 「平均 / 中央値 / トリム平均 / Huber 推定量」を 1 表に並べる。 4 つが概ね一致 → 結論は安定。 大きくズレる → 「分布の歪みと外れ値が結論に影響する」と明記する。 後者の場合、 ロバスト統計の真価が発揮される。

推定量SSDSE-B 県人口(万人)SSDSE-B 延べ宿泊者数(万人泊)解釈
平均2651,064東京の影響大
中央値155585県の中位
10%トリム平均211791妥協案
Huber 推定量192793推奨
MAD62299頑健な散布度

この感度分析を 毎回データを触る前に習慣化する ことが、 報告の信頼性を一段引き上げる。 ロバスト統計とは個別の関数や推定量を指す名前である以前に、 「平均・中央値・トリム平均・Huber 推定量を並べ、 結論が外れ値の有無で変わらないことを毎回確認する文化」 そのものなのである。 SSDSE-B-2026 で東京を含む 47 件を扱う限り、 この感度分析は必ず通る検問所となる。

🧪 SSDSE-B-2026 で見るロバスト統計の威力

前節までで理論と判断基準を整理した。 ここでは SSDSE-B-2026(47 都道府県 × 90 指標) の具体データで「平均と中央値の差」「ロバスト推定の効果」を 5 つの指標について検証する。 各ケースで「なぜロバスト統計が必要か」が腑に落ちる構成にした。

ケース 1: 総人口(A1101)— 極端な右裾分布

東京 1,409 万人、 神奈川 923 万人、 大阪 876 万人。 最下位は鳥取県 54 万人。 平均 265 万、 中央値 155 万、 比率 1.71。 SD=280 万、 MAD=62 万、 比率 4.5。 ヒストグラムは典型的な対数正規型に近い。 ここで「県の代表的な規模は?」と問われたら、 中央値 155 万人を提示するのが正しい。 平均 265 万人は「東京込みの算術平均」であり、 県の典型ではない。

推定量値 (万人)該当する県の例
平均265平均を上回るのは 12 県のみ、 残り 35 県は平均以下
中央値155鹿児島 (155 万) / 熊本 (171 万) / 三重 (173 万)
トリム平均(10%)211新潟 (213 万) 近傍
Huber 推定量(c=1.345)192岐阜 (193 万) / 群馬 (190 万) 近傍

ケース 2: 高齢化率(A1303)— 概ね対称、 ロバスト不要

高齢化率(A1303 高齢者人口 ÷ A1101 総人口)は 22.8%〜39.1% の範囲に 47 県が分布し、 平均 31.6%、 中央値 31.8% で差は 0.2 ポイント。 SD=3.3、 MAD=2.1、 比率 1.6。 総人口のような極端な右裾はなく、 ほぼ対称。 ここではロバスト推定の出番はほぼなく、 平均 + 標準偏差で十分。 「ロバスト統計を使うべきかは指標ごとに判定する」 という原則を象徴するケースである。

ケース 3: 延べ宿泊者数(G7101)— 重尾だが対数変換で改善

東京 8,027 万人泊、 大阪 4,401 万人泊。 最下位は徳島 170 万人泊。 平均 1,064 万、 中央値 585 万、 比率 1.82。 対数変換すると歪度が 3.32 → 0.70 に下がり、 ほぼ対称化。 ロバスト推定と対数変換は 代替手段 として位置づけられる。 「対数で対称になるなら通常の OLS でよい」 vs 「対数変換が解釈を難しくするならロバスト推定」のトレードオフで判断する。

ケース 4: 転入者数(A5101)— 外れ値は政策上重要

東京 40.7 万人、 神奈川 21.1 万人、 埼玉 16.1 万人、 大阪 16.0 万人、 千葉 14.0 万人が上位。 最下位は鳥取 0.8 万人。 平均 4.7 万、 中央値 2.4 万で右裾が長い。 問題は「上位 5 県だけで全国転入の 48%」という一極集中の政策論点。 ここでロバスト推定で「典型県」を出すと 議論の重要な部分(東京圏への人口移動)が消える。 中央値ではなく 分位点(q90=11.9 万, q99=31.7 万)+ 中央値の併記 が正解である。

ケース 5: 延べ宿泊者数(G7101)— 外れ値耐性回帰

総人口 X に対する延べ宿泊者数 Y を回帰。 OLS では β=4.11、 R²=0.71。 東京を除外すると β=2.94、 R²=0.53。 上位 3 県(東京・神奈川・大阪)を除外すると β=2.61、 R²=0.41。 ここで HuberRegressor (デフォルト ε=1.35) を全データに適用すると β=3.97。 「外れ値の影響を中和しつつ全データを使う」 ことができる。 RANSACRegressor では β=2.26(観光集中の 14 県を外れ値とみなして除外)。 用途次第で Huber か RANSAC を選ぶ。

📝 より正確な分析(教材補足):ここでの係数はすべて SSDSE-B-2026 の 2023 年 47 都道府県・実データ(A1101 総人口 と G7101 延べ宿泊者数)で実測した値です。 総人口・宿泊者数はどちらも東京が突出する右裾分布で、 東京や大阪・北海道などの観光集中県が回帰直線を強く引き上げます。 OLS の傾き 4.11 に対しロバスト回帰は 3.97〜2.26 と下振れし、 「巨大都市・観光地が回帰を歪める」現象をそのまま観察できます(下の Python 実装セクション参照)。

この 5 ケースで言えるのは、 ロバスト統計は 「全データを保持しつつ外れ値の影響を中和する技術」 であり、 単純除外より優れること。 ただし指標ごとに必要性が異なり、 一律適用は推奨しない。 SSDSE-B のような公的データで分析する際、 最低でもケース 1〜5 のような 「指標ごとの分布診断 + 推定量の選定」 を行う習慣をつけたい。

📜 ロバスト統計の歴史と理論的背景

ロバスト統計の起源は古く、 1818 年に Laplace が中央値の漸近分散を導出 したのが学術的な原点とされる。 19 世紀後半には Edgeworth が「外れ値の影響を最小化する推定」を議論し、 20 世紀初頭には Fisher が最尤推定の枠組みで議論を進めた。 しかし「ロバスト統計」という名称と統一的理論を提唱したのは、 1964 年の Peter J. Huber の論文 "Robust Estimation of a Location Parameter" である。

Huber (1964) のブレークスルー

Huber は「真の分布が正規分布から ε の混合で歪んでいるとき、 推定量の最大漸近分散を最小化するミニマックス問題」を解いた。 結果として導かれたのが Huber loss であり、 これは中心では二乗誤差、 裾では絶対値誤差というハイブリッド構造を持つ。 1964 年から 60 年が経過した今も、 機械学習の損失関数(Smooth L1, Pseudo-Huber, Faster R-CNN の bounding box regression)で標準採用されている。 理論的優美さと実用性の両立がロバスト統計の核心である。

Hampel (1971) — 影響関数の導入

Frank Hampel は 「影響関数 (Influence Function, IF)」 を導入し、 推定量の頑健性を関数として可視化する枠組みを提供した。 IF(x; F, T) は「分布 F に微小な汚染 x を加えたとき、 推定量 T がどれだけ動くか」を表す。 平均の IF は線形(無制限に動く)、 中央値の IF は階段関数(±1/(2f(median)))、 Huber の IF はクリップ関数(c で打ち切り)。 これによりロバスト推定量の 「頑健性の度合いを定量化」 できるようになった。

Rousseeuw (1984) — 高ブレイクダウン点推定

Peter Rousseeuw は LMS (Least Median of Squares) 回帰MCD (Minimum Covariance Determinant) を提案。 これらは 50% のブレイクダウン点 を達成する最初の実用的アルゴリズムだった。 LMS は「残差平方の中央値を最小化する回帰」、 MCD は「h サブセットの共分散行列式が最小になる h 点を選ぶ」アルゴリズム。 計算量は当初 O(n²) で重かったが、 高速 MCD(FAST-MCD, 1999)で実用化された。

Yohai (1987) — MM 推定量

Victor Yohai は 「高ブレイクダウン点(50%)と高効率(95%)を両立する MM 推定量」 を提案した。 これは 2 段階で構成される: (1) LMS / S 推定でロバストな初期値とスケール推定、 (2) M 推定で効率の高い最終推定。 統計ソフト R の robustbase::lmrob() や Python の statsmodels.robust.linear_model.RLM で標準実装されている。

現代の発展 — 機械学習との融合

2010 年代以降、 ロバスト統計は深層学習の文脈で再注目された。 物体検出 (Fast R-CNN, 2015) は Smooth L1 loss を採用、 GAN の Wasserstein 距離 (2017) はロバスト推定の派生、 異常検知でも MCD と Isolation Forest が組み合わせて使われる。 さらに 差分プライバシー (Differential Privacy)連合学習 (Federated Learning) でも、 「外れ値≒攻撃データ」を中和するためにロバスト統計が使われている。 古典理論が現代的問題で生き続けている好例である。

研究者貢献現代の応用
1818Laplace中央値の漸近分散記述統計の基礎
1964HuberHuber loss・M 推定量Smooth L1, Faster R-CNN
1971Hampel影響関数頑健性の定量化
1984RousseeuwLMS / MCD異常検知
1987YohaiMM 推定量robustbase, statsmodels
2015GirshickSmooth L1 in Fast R-CNN物体検出標準

この歴史的経緯を踏まえると、 ロバスト統計は 「単なる古典手法」ではなく、 現代の AI 時代で再評価されている深い理論体系」 と理解できる。 入門段階で中央値・MAD だけ覚えて終わるのではなく、 影響関数・BP・MM 推定量・そして深層学習との接続まで視野に入れて学ぶことを強く推奨する。

📖 推奨教科書と論文 5 選

独学・大学院演習用に最適な教材を 5 件紹介する。 (1) Huber & Ronchetti (2009) "Robust Statistics, 2nd ed." Wiley — 創始者本人による決定版。 (2) Maronna, Martin, Yohai, Salibián-Barrera (2019) "Robust Statistics: Theory and Methods, 2nd ed." Wiley — 最新の MM 推定量と R 実装。 (3) Hampel et al. (1986) "Robust Statistics: The Approach Based on Influence Functions" Wiley — 影響関数の古典的教科書。 (4) Wilcox (2017) "Introduction to Robust Estimation and Hypothesis Testing, 4th ed." Academic Press — 学部生向けの分かりやすい入門書。 (5) Rousseeuw & Leroy (1987) "Robust Regression and Outlier Detection" Wiley — LMS / MCD の原典。 これら 5 冊を順に読めば理論的にも実装的にも完全に習得できる。

🧰 Python / R のロバスト統計ライブラリ早見表

実務で使うときの定番ライブラリ。 Python: scipy.stats.median_abs_deviation, scipy.stats.trim_mean, sklearn.linear_model.HuberRegressor / RANSACRegressor / TheilSenRegressor, sklearn.covariance.MinCovDet, statsmodels.robust.scale.mad, statsmodels.robust.linear_model.RLMR: robustbase::lmrob(), MASS::rlm(), WRS2::trimmed.mean(), robust::lmRob()。 SSDSE-B-2026 を使った演習では Python の sklearn.linear_model.HuberRegressor から始めるのが学習効率が最も高い。 fit メソッド 1 行で OLS のロバスト版が手に入る。

❓ よくある質問

Q1: 平均値を全てロバスト統計に置き換えた方がよいか?
A1: いいえ。 正規分布に近いデータでは平均値は最も効率的(分散最小)であり、 中央値に置き換えると標準誤差が 1.25 倍に増える(漸近相対効率 ARE=0.637)。 分布の形と用途に応じて使い分ける のが正解で、 万能手法は存在しない。

Q2: Huber と Tukey biweight、 どちらを使うべきか?
A2: 経験則として、 外れ値が 連続的な裾(重尾分布)→ Huber、 外れ値が 離散的な異常値(測定エラー)→ Tukey biweight。 後者は閾値外を完全に切り捨てるため極端な外れ値に強いが、 微分可能でも凸ではないので局所最適に陥る可能性がある(初期値依存)。

Q3: ロバスト統計で検定の有意水準は変わるか?
A3: 変わる。 通常の t 検定の p 値はサンプル分布が正規であることを前提にする。 重尾分布で t 検定を使うと第一種過誤が 真の α より小さく なる(保守的)。 ノンパラメトリック検定(Wilcoxon、 順位和)かブートストラップ p 値を使うのが安全。

Q4: 機械学習モデルでも同じ考え方が通用するか?
A4: 通用する。 sklearn の HuberRegressorRANSACRegressorTheilSenRegressor はそれぞれ M 推定・コンセンサスサンプリング・順序ベースの 3 系統。 XGBoost / LightGBM では objective='reg:pseudohubererror' を選べば同様の効果が得られる。 深層学習でも SmoothL1Loss (Huber の派生)が物体検出 (R-CNN 系) で標準採用される。

Q5: 学習にどのくらいかかるか?
A5: 中央値・MAD・四分位数の意味を直感的に理解 → 1 日。 M 推定量と Huber loss を一つの例題で実装 → 2 日。 MM 推定量・MCD を sklearn / statsmodels で動かす → 4 日。 影響関数の図を自分で描く → 1 日。 計 1-2 週間で「ロバスト統計の文化」が身につく。 教科書は Maronna et al. (2006) Robust Statistics: Theory and Methods、 入門なら Wilcox (2017) Introduction to Robust Estimation

💡 30秒で分かる結論

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

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

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

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

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

日本の都道府県データを扱うと、 ほぼ必ず 「東京問題」に直面します。 総人口でも、 出生数でも、 消費支出でも、 東京は他 46 県と桁が違うレベルで大きい。 SSDSE-B-2026 の A1101(総人口)を例に、 47 県の 普通の平均 を計算すると:

SSDSE-B-2026 総人口(A1101)の代表値

指標値(万人)解釈
東京の総人口約 1,409圧倒的トップ
神奈川約 9232 位
大阪約 8763 位
.........
鳥取約 54最小クラス
47 県の算術平均約 265東京が引っ張る
47 県の中央値約 155真ん中の県の値
10% トリム平均約 211上下 10% を除外
Huber M-estimator約 192連続的に重み付け

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

🎢 「破綻点」の感覚

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

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

🎨 概念図で押さえるロバスト統計の核(補遺)

ロバスト統計の中核概念(外れ値の影響、 損失関数の形、 ブレイクダウン点)を 3 枚の図で再整理する補遺セクション。

🖼 図 1: 平均値 vs 中央値 — 外れ値 1 つで何が起きるか

古典統計の代表値「平均値」は 外れ値 1 つで任意に動かせる。 これを定量化したのがブレイクダウン点 0%。 一方の中央値はブレイクダウン点 50% で、 半数まで汚染されても揺るがない。

平均値と中央値の外れ値感受性

💬 読み方:上段 5 点では平均=中央=190 で一致。 下段で外れ値(赤)1 点を足すと平均は 268 へジャンプ(+78)するが、 中央値は 190 のまま。 これがブレイクダウン点 0% vs 50% の差である。

🖼 図 2: 二乗損失 vs Huber 損失 vs 絶対値損失

ロバスト推定の核は 損失関数の形を変えることにある。 二乗損失(L2)は外れ値に二次的に反応するため敏感、 絶対値損失(L1)は線形反応、 Huber 損失は中央が L2・外側で L1 に切り替わる「いいとこ取り」型。

L2, L1, Huber 損失の比較

💬 読み方:赤の L2(二乗)は外側で 放物線的に 急上昇 → 外れ値 1 点が全体推定を激しく揺らす。 緑 L1(絶対値)は線形なので外れ値の影響は有限。 青破線 Huber は |r|≤c で L2、 |r|>c で L1 に切り替わる連続関数で、 中心付近の効率と外れ値耐性を両立する。

🖼 図 3: ブレイクダウン点で見る推定量ランキング

ブレイクダウン点(BP)は 「データの何 % まで汚染されても推定が暴走しないか」を示す指標。 0% が「1 点で破綻」、 50% が「半数まで耐える」。 50% が理論上限である。

推定量のブレイクダウン点比較

💬 読み方:赤(BP=0%)の平均・最小二乗は 1 点で破綻、 オレンジ(BP=10%)のトリム平均は α=20% カットで耐える、 緑(BP=50%)の中央値・MAD・LMS 回帰は 理論上限 に達する。 ロバスト性と効率のトレードオフを意識して使い分ける。

以上、 ロバスト統計の本質(外れ値感受性・損失関数・BP)を 3 枚の図で整理した。 詳細は本文参照。

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

① 中央値 と 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%。

📐 影響関数 — 感度の数学

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

📐 数学的詳細 — M 推定量の収束と漸近理論

M 推定量 $\hat{\theta}_n$ は $\sum_i \psi(x_i - \theta) = 0$ の解として定義されます。 ここで $\psi$ は影響関数の心臓部となる関数。 例えば Huber では:

$$\psi_c(u) = \begin{cases} u & |u| \le c \\ c \cdot \mathrm{sign}(u) & |u| > c \end{cases}$$

$c$ はクリッピング閾値。 $c \to \infty$ で OLS の正規方程式に一致、 $c \to 0$ で中央値方程式に近づきます。 漸近的には:

$$\sqrt{n}(\hat{\theta}_n - \theta_0) \xrightarrow{d} \mathcal{N}\!\left(0, \, \frac{\mathbb{E}[\psi^2(X-\theta_0)]}{\{\mathbb{E}[\psi'(X-\theta_0)]\}^2}\right)$$

分子は「変動」、 分母は「感度」を表します。 この比 $V(\psi, F)$ を最小化する $\psi$ を求めると Huber 関数が導かれる――これが Huber (1964) の minimax 定理の中身です。 一般化するとノンパラメトリック効率限界に到達でき、 ロバスト統計は単なる対症療法ではなく、 漸近最適理論として完成しています。

🔬 重み関数の比較

推定量$\psi(u)$重み $w(u) = \psi(u)/u$挙動
平均(OLS)$u$1全データ等重
中央値$\mathrm{sign}(u)$$1/|u|$$|u|$ に反比例
Huber$\min(|u|,c)\mathrm{sign}(u)$$\min(1, c/|u|)$$|u| \le c$ で 1、 以遠で減衰
Tukey biweight$u(1-(u/c)^2)^2 \mathbb{1}_{|u|\le c}$$(1-(u/c)^2)^2 \mathbb{1}_{|u|\le c}$$|u| > c$ で重み 0(再下降)
Hampel3 区間連続関数階段状減衰完全に 0 にする境界あり

🌀 IRLS(Iteratively Reweighted Least Squares)

M 推定量を解く標準アルゴリズムが IRLS です:

  1. 初期値 $\hat{\theta}^{(0)}$(例:中央値)
  2. 残差 $r_i^{(k)} = x_i - \hat{\theta}^{(k)}$ を計算
  3. 重み $w_i = \psi(r_i)/r_i$ を計算
  4. 重み付き最小二乗 $\hat{\theta}^{(k+1)} = \sum_i w_i x_i / \sum_i w_i$
  5. 収束まで繰り返し

凸 $\psi$(Huber 含む)なら大域収束保証あり。 再下降型(Tukey biweight)は局所最適に陥るので初期値依存性が強く、 通常は Huber を初期値として使う。 statsmodels の RLM(...).fit() は内部で IRLS を実装。

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

$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 では区分線形で有界。 影響関数が有界 = 局所頑健。

🔬 数式を言葉で読み解く(ロバスト統計を 4 ステップで比較)

ロバスト統計の核は「外れ値が混入しても結論が大きく崩れない」性質。 中央値・MAD・Huber 推定量を SSDSE-B-2026 で 4 ステップで比較する。

▶ ブロック 1: 平均 vs 中央値 (代表値の感度比較)

このコードでやること: SSDSE-B-2026 の県別総人口について平均と中央値を比較。 東京・大阪のような大都市が平均をどれだけ押し上げるかを見る。

📥 入力データ (抜粋):

SSDSE-B-2026, 都道府県, 総人口 北海道, 5183 東京都, 13960 鳥取, 549 ...
1
2
3
4
5
6
7
8
9
import pandas as pd
import numpy as np

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', skiprows=[1], encoding='cp932')
pop = df[df['SSDSE-B-2026']==2023]['A1101'].values / 10000  # 総人口(万人)

print(f'平均: {pop.mean():.1f} (万人)')
print(f'中央値: {np.median(pop):.1f} (万人)')
print(f'差分: {pop.mean() - np.median(pop):.1f} (万人、 平均が押し上げられている)')

📤 実行例:

平均: 264.6 (万人) 中央値: 154.9 (万人) 差分: 109.7 (万人、 平均が押し上げられている)

💬 平均 265 万 vs 中央値 155 万。 差 110 万は東京・大阪・神奈川などの大都市が平均を押し上げている証拠。 「典型的な県」を語るなら中央値の方が適切。

▶ ブロック 2: 標準偏差 vs MAD (ばらつきの感度比較)

このコードでやること: 標準偏差と MAD (中央絶対偏差) を比較。 標準偏差は二乗で平均するため外れ値で膨らみ、 MAD は中央値ベースで頑健。

1
2
3
4
5
6
7
8
from scipy.stats import median_abs_deviation

std = pop.std(ddof=1)
mad = median_abs_deviation(pop)
print(f'標準偏差: {std:.0f}')
print(f'MAD (中央絶対偏差): {mad:.0f}')
print(f'MAD × 1.4826 (正規分布で σ 相当): {mad*1.4826:.0f}')
print(f'std / (1.4826·MAD) = {std / (1.4826*mad):.2f}  (1 から離れる ≈ 外れ値あり)')

📤 実行例:

標準偏差: 280 MAD (中央絶対偏差): 62 MAD × 1.4826 (正規分布で σ 相当): 92 std / (1.4826·MAD) = 3.03 (1 から離れる ≈ 外れ値あり)

💬 std/MAD 比 3.03 → 標準偏差が正規化 MAD の 3 倍、 強い外れ値の影響。 ロバスト統計の世界では、 ばらつき指標として MAD を使うのが標準。

▶ ブロック 3: HuberRegressor で外れ値に強い回帰

このコードでやること: 総人口から延べ宿泊者数(G7101)を予測。 通常の OLS と Huber 回帰を比較し、 東京・観光集中県という外れ値が係数に与える影響を観察。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
from sklearn.linear_model import LinearRegression, HuberRegressor

dd = df[df['SSDSE-B-2026']==2023].copy()
X = dd[['A1101']].astype(float).values / 1e6  # 総人口(百万人)
y = dd['G7101'].astype(float).values / 1e6  # 延べ宿泊者数(百万人泊)

ols = LinearRegression().fit(X, y)
hr = HuberRegressor(epsilon=1.35).fit(X, y)

print(f'OLS 係数: {ols.coef_[0]:.5f}, 切片: {ols.intercept_:.1f}')
print(f'Huber 係数: {hr.coef_[0]:.5f}, 切片: {hr.intercept_:.1f}')
print(f'差: 東京・観光集中県の影響で OLS の傾きが上振れ')

📤 実行例:

OLS 係数: 4.10555, 切片: -0.2 Huber 係数: 3.97157, 切片: -0.3 差: 東京・観光集中県の影響で OLS の傾きが上振れ

💬 OLS と Huber で傾きが変わる。 東京 (延べ宿泊者数 8,027 万人泊) のような回帰直線から大きく上に外れる点が OLS の傾きを引っ張っている。 Huber は残差の大きい点の重みを下げて影響を抑えるため、 傾き 4.11 → 3.97 と地方部の「人口対宿泊者数」の関係に近づく。

▶ ブロック 4: 外れ値を人為的に追加して頑健性を比較

このコードでやること: 既存データに人為的な異常値 (例: 観測ミスで人口が 10 倍) を 1 件追加。 平均は爆発するが中央値は微動だにしない、 という実物実験。

1
2
3
4
5
6
7
pop_with_outlier = np.append(pop, [pop.max()*10])

print(f'元データの平均:     {pop.mean():.0f}')
print(f'外れ値追加後の平均: {pop_with_outlier.mean():.0f} (変化大)')
print()
print(f'元データの中央値:     {np.median(pop):.0f}')
print(f'外れ値追加後の中央値: {np.median(pop_with_outlier):.0f} (ほぼ不変)')

📤 実行例:

元データの平均: 265 外れ値追加後の平均: 553 (変化大) 元データの中央値: 155 外れ値追加後の中央値: 163 (ほぼ不変)

💬 平均が 2 倍以上に跳ねる一方、 中央値はほぼ動かない。 これがロバスト統計の威力。 中央値外れ値検知ブートストラップ と組み合わせて運用するのが定石。

🧮 実値で計算してみる — SSDSE-B 総人口

STEP 1:47 県の総人口(万人)の主要値

SSDSE-B-2026 から、 2023 年の都道府県別の総人口(A1101、 実値、 万人)を抜粋:

順位県名総人口(万人)
1東京1,409
2神奈川923
3大阪876
4愛知748
24(中央付近)鹿児島155(中央値)※
23熊本171
47鳥取54

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

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

【47 県 総人口の代表値比較(単位:万人)】
$$\text{Mean} \approx 265, \quad \text{Median} \approx 155, \quad \bar{x}_{0.10} \approx 211, \quad \hat{\mu}_{\text{Huber}} \approx 192$$
東京・神奈川・大阪の上位県が平均を大きく押し上げているのが分かる。

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

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

$$\text{MAD} = \text{median}(|x_i - 155|) \approx 62$$
$1.4826 \cdot \text{MAD} \approx 92$ = 正規分布近似での頑健な「標準偏差」相当。 s = 280 と 92 では大きく異なる。

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、 「長期累積収益」を語るなら算術平均、 と用途で使い分けるのが正解。

🧮 SSDSE-B-2026 で MM 推定量を試す(47 都道府県の総人口対延べ宿泊者数)

SSDSE-B-2026 の A1101(総人口)と G7101(延べ宿泊者数)を例に、 古典回帰 (OLS) とロバスト回帰 (MM 推定量) の差を確認します。 東京・大阪のような巨大県が回帰直線をどれだけ歪めるか、 ロバスト推定はどう違うかが実感できます。

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 A1101(総人口) G7101(延べ宿泊者数) 北海道 5,092,000 32,783,470 東京都 14,086,000 80,273,650 沖縄県 1,468,000 20,038,190 …(全 47 行)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# SSDSE-B-2026 MM推定量:総人口 → 延べ宿泊者数(東京が外れ値)
import pandas as pd
import numpy as np
import statsmodels.api as sm
from statsmodels.robust.robust_linear_model import RLM
from sklearn.linear_model import HuberRegressor, RANSACRegressor

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df = df[df['SSDSE-B-2026'] == 2023].reset_index(drop=True)  # 2023年度・47都道府県
x = df['A1101'].astype(float).values / 1e6   # 総人口(百万人)
y = df['G7101'].astype(float).values / 1e6   # 延べ宿泊者数(百万人泊)

X = sm.add_constant(x)
ols = sm.OLS(y, X).fit()
print('OLS      : slope=%.3f' % ols.params[1])

# statsmodels IRLS(Huber / Tukey biweight)
rlm_huber = RLM(y, X, M=sm.robust.norms.HuberT()).fit()
rlm_tukey = RLM(y, X, M=sm.robust.norms.TukeyBiweight()).fit()
print('Huber    : slope=%.3f' % rlm_huber.params[1])
print('Tukey    : slope=%.3f' % rlm_tukey.params[1])

# sklearn(内部で標準化)— 外れ値の影響がより顕著に出る
print('sk-Huber : slope=%.3f' % HuberRegressor(epsilon=1.35).fit(x.reshape(-1,1), y).coef_[0])
ran = RANSACRegressor(random_state=0).fit(x.reshape(-1,1), y)
print('RANSAC   : slope=%.3f (外れ %d 県)' % (ran.estimator_.coef_[0], (~ran.inlier_mask_).sum()))

# Huber で最も重みが下がった県(観光集中・大都市)
for k in np.argsort(rlm_huber.weights)[:5]:
    print(f'最低重み: {df.iloc[k]["Prefecture"]:8s} weight={rlm_huber.weights[k]:.3f}')
📤 実行例(実行時の標準出力) OLS : slope=4.106 Huber : slope=3.982 Tukey : slope=3.910 sk-Huber : slope=3.972 RANSAC : slope=2.257 (外れ 14 県) 最低重み: 東京都 weight=0.093 最低重み: 埼玉県 weight=0.093 最低重み: 京都府 weight=0.136 最低重み: 神奈川県 weight=0.139 最低重み: 沖縄県 weight=0.156

このコードを実行すると、 東京・埼玉・京都・神奈川・沖縄など観光集中・大都市の県が weight が 1 未満(東京 0.093)に押し下げられます。 sklearn の HuberRegressor(傾き 3.972)や RANSAC(2.257, 14 県を外れ値扱い)では OLS の 4.106 から傾きがはっきり下振れし、 古典 OLS が巨大都市・観光地に引きずられる現象 (leverage effect) を見抜けます。 一方 statsmodels の IRLS(Huber 3.982 / Tukey 3.910)は高レバレッジ点をある程度追随するため下がり方が緩やかで、 手法ごとの外れ値耐性の違いも観察できます。

🧮 数式に値を入れて手で計算する: 頑健統計量

SSDSE-B-2026 で「人口密度(百人/km²)」が極端な外れ値となる現象を再現する小例で、 5 道県(北海道, 岩手, 秋田, 高知, 鳥取)と東京都の人口密度値 [2, 4, 5, 6, 7, 100](×100 人/km² の概数)から平均・中央・トリム平均を比較する。

Step 1: データ

x = [2, 4, 5, 6, 7, 100] 平均 = 124/6 = 20.67 (跳ね上がる)

Step 2: 頑健代表値

中央値 = (5+6)/2 = 5.5 20% トリム平均 = (4+5+6+7)/4 = 5.5 (両端 1 つずつ除去) M-推定など堅牢な統計が利用可能

🐍 Python で再現

1
2
3
4
5
6
import numpy as np
from scipy import stats
x = np.array([2, 4, 5, 6, 7, 100])
print(f"平均: {x.mean():.2f}")
print(f"中央: {np.median(x)}")
print(f"20% trim: {stats.trim_mean(x, 0.2)}")

📤 実行結果

平均: 20.67 中央: 5.5 20% trim: 5.5

💬 手計算 (Step 2) 中央 5.5 / trim 5.5 と Python 出力が完全一致。

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

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

🎯 このコードでやること:ロバスト統計 — 東京などの外れ値に強い中央値・MADに関連するステップ #1。最初のスニペットです。SSDSE-B-2026 を読み込みます。
📥 入力例(df.head()) df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]).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 ...
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
# 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=[1])
df = df.iloc[:, [0, 2, 3]].copy()  # 年度、都道府県、総人口(A1101 列)
df.columns = ['year', 'pref', 'pop']
df = df[df['year'] == 2023].dropna()
x = df['pop'].values / 10000  # 万人単位に換算(元データは人)

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}')
📤 実行例(実行時の標準出力) 件数 n = 47 算術平均: 264.58 中央値: 154.90 5% トリム平均: 232.21 10% トリム平均: 210.90 標準偏差: 279.76 MAD (raw): 62.30 MAD scaled (~σ): 92.37 IQR: 160.25
💬 読み方:平均 265 と中央値 155 の差 110(万人)が、 東京・神奈川・大阪による右裾の歪みを示す。 標準偏差 280 は MAD 62 の 4.5 倍で、 ばらつき指標としては外れ値耐性の高い MAD を使うのが安全。

方法 B:statsmodels で Huber M-estimator

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

# Huber M-estimator(位置・尺度を同時推定する Proposal 2)
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
📤 実行例(実行時の標準出力) Huber μ̂ = 191.81 万人 (s = 127.71) 比較:算術平均 264.58, 中央値 154.90
💬 読み方:Huber 推定量 192 は平均 265 と中央値 155 の中間。 東京などの外れ値の影響を連続的な重みで抑えつつ、 中心部の情報も活かす「折衷案」になっている。

方法 C:ロバスト回帰(総人口 vs 出生数)

🎯 このコードでやること:ロバスト統計 — 東京などの外れ値に強い中央値・MADに関連するステップ #3。SSDSE-B-2026 を読み込みます。モデルを学習します。
📥 入力例(df.head()) df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]).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 ...
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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=[1])
df = df.iloc[:, [0, 2, 3, 18]].copy()
df.columns = ['year', 'pref', 'pop', 'births']
df = df[df['year'] == 2023].dropna()

x = df['pop'].values  # 総人口(人, A1101)
y = df['births'].values  # 出生数(人, A4101)
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}')
📤 実行例(実行時の標準出力) OLS: intercept=-676.902, slope=0.006104 Huber: intercept=-697.267, slope=0.006092 Tukey: intercept=-727.040, slope=0.006123
💬 読み方:出生数は総人口とほぼ完全な線形関係にあり、 東京も回帰直線上に載る。 つまり東京は高レバレッジ点だが「外れ値」ではないため、 OLS・Huber・Tukey の傾きは 0.0061 前後でほぼ一致する。 外れ値が回帰を歪める様子を見たいときは、 東京が直線から大きく外れる延べ宿泊者数(ケース 5・後述の MM 推定量セクション)を使う。

方法 D:sklearn HuberRegressor

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

x = df['pop'].values.reshape(-1, 1)
y = df['births'].values  # 出生数(人)

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()} 外れ')
📤 実行例(実行時の標準出力) OLS 傾き: 0.006104 Huber 傾き: 0.006112 Huber が外れ値扱いした県数: 32 正常 / 15 外れ
💬 読み方HuberRegressor.outliers_ は残差が大きい県を True と判定し、 ここでは 15 県が外れと分類される。 ただし出生数は総人口とほぼ線形なので、 Huber の傾き 0.006112 は OLS 0.006104 とほぼ同じ。 「残差が大きい=回帰を歪める外れ値」とは限らないことが分かる好例(延べ宿泊者数のように東京が直線から外れる指標では傾きがはっきり変わる)。

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

🎯 このコードでやること:ロバスト統計 — 東京などの外れ値に強い中央値・MADに関連するステップ #5。結果を図示します。
📥 入力例(df.head()) # 上流で読み込んだ DataFrame df を使います(例:SSDSE-B-2026)。 # df.shape ≒ (564, 112) ※ 47都道府県 × 複数年分(df[df['SSDSE-B-2026']==2023] で 2023 年の 47 県に絞る) # df[['pref','pop']].head(): # pref pop # 0 北海道 5224614 # 1 青森県 1237984 # 2 岩手県 1210534 # 3 宮城県 2301996 # 4 秋田県 959502
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
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 のプロット画像が描画されます)
💬 読み方:散布図に OLS(赤)と Huber(青)の回帰直線を重ねて描く。 総人口 vs 出生数はほぼ線形で東京も直線上に載るため、 2 本の線はほぼ重なる(高レバレッジだが外れ値ではない)。 2 直線が大きく開くのは、 東京が直線から外れる延べ宿泊者数(ケース 5・MM 推定量セクション)のような指標のとき。

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

SSDSE-B-2026 の総人口(A1101)で複数の頑健推定量を比較し、 総人口から出生数(A4101)へのロバスト回帰も試す:

📥 入力例(SSDSE-B-2026 全体:564 行 × 112 列 = 47 都道府県 × 2012〜2023 年) 年度 地域コード 都道府県 A1101(総人口) A1303(65歳以上人口) A4101(出生数) … 2023 R01000 北海道 5,092,000 1,681,000 24,430 … 2023 R13000 東京都 14,086,000 3,205,000 86,348 … 2023 R47000 沖縄県 1,468,000 350,000 12,549 … …(残り 112 列は住宅・家計・教育・医療など)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
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])
df = df[df['SSDSE-B-2026'] == 2023]  # 2023年度・47都道府県
pop = df.iloc[:, 3].values  # 総人口(A1101)

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

# ロバスト回帰(総人口 → 出生数 A4101)
X = sm.add_constant(pop)  # 総人口
rlm = sm.RLM(df.iloc[:, 18].values, X, M=sm.robust.norms.HuberT()).fit()
print(rlm.params)

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

📈 ロバスト回帰 — 7 手法

回帰での頑健化:

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

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

1
2
3
4
5
6
7
8
9
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 距離で外れ値として識別されます。

⚠️ ロバスト統計の 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 検定や中央値の使用を通じて医学・心理学の領域で広まり、 現在では「外れ値が懸念される場面ではロバスト統計を併用する」が学会論文の標準作法となっています。

⚠️ ロバスト統計の追加的落とし穴(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 の詳細

❓ よくある質問(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

📖 もっと深掘り:ロバスト統計の知的系譜

ロバスト統計は単なる「外れ値対策」ではなく、 20 世紀後半の統計学の方向転換を象徴する分野です。 古典統計(フィッシャー学派)は「真のモデルが分かっている」前提で最尤推定を最適化したのに対し、 ロバスト統計は「モデルは近似でしかない」前提で小さな逸脱に対する安定性を最適化します。 これは制御工学の H∞ 制御や機械学習の adversarial robustness と通底する考え方であり、 「最悪ケース思考」の数理的表現と言えます。

📅 詳細年表(拡張版)

人物貢献
1818Bessel既に「外れ値の判定基準」を議論。 観測天文学では古くから問題視。
1887Edgeworth中央値の漸近分散公式を導出、 平均との比較を行う。
1953Box「robust」という用語を初めて統計に持ち込む。 分散分析の頑健性議論。
1960TukeyContaminated normal model $(1-\epsilon)N(0,1) + \epsilon N(0,9)$ で平均が崩壊することを示し、 ロバスト統計の問題提起。
1964HuberM 推定量の定式化、 minimax 性質の証明。 「ロバスト統計学」の出発点。
1968Hampel影響関数 (IF)、 漸近分散表現、 finite-sample breakdown を理論化。
1972Andrews et al.Robust Estimates of Location でモンテカルロ大比較研究。 100 以上の推定量を評価。
1981RousseeuwLeast Median of Squares (LMS) 回帰、 破壊点 50% を初めて達成。
1984Rousseeuw & YohaiS 推定量で破壊点と効率の両立を目指す。
1987YohaiMM 推定量、 破壊点 50% かつ正規時効率 95% の決定版。
1999Rousseeuw & Van Driessen高速 MCD アルゴリズム、 多変量ロバスト統計の実用化。
2006Maronna, Martin, YohaiRobust Statistics: Theory and Methods、 現代の決定版教科書。
2014Goodfellow et al.Adversarial examples 発見、 深層学習でロバスト性問題が再燃。
2018Madry et al.PGD adversarial training、 最悪ケース最適化を深層学習へ。
2023複数LLM のロバスト性、 プロンプトインジェクション対策で古典ロバスト統計が再評価。

🤔 なぜ Huber は「最適」なのか

Huber (1964) の重要な結果は、 「$\epsilon$ 汚染のクラス $\{F : F = (1-\epsilon)\Phi + \epsilon H, H \in \mathcal{F}\}$ に対して、 漸近分散の最悪値を最小化する推定量は M 推定量である」というものです。 つまり Huber 推定量は「想定外の汚染への被害を最小化する」という意味で最適です。 これは制御理論の minimax 思考、 経済学の Gilboa-Schmeidler maxmin expected utility、 機械学習の adversarial training と完全に同じ哲学であり、 「最悪ケース対策」という統一的視点で理解できます。

💼 産業ユースケース・深掘り 10 選

ロバスト統計の現場応用は驚くほど広い。 ここでは具体的な技術選択とその理由まで踏み込みます。

業界課題採用手法と理由
金融(リスク管理)ボラティリティ推定、 リーマンショックのような極端値で SD が爆発MAD ベースのボラ推定 + GARCH の Student-t 版。 ロバスト共分散行列で Markowitz 最適化の不安定性を緩和。
半導体(プロセス制御)ウェハ上の欠陥計測、 装置不調の偽データ混入Hampel フィルタで時系列の単発スパイク除去。 SPC の Shewhart 管理図をロバスト版に置換。
医療画像MRI の磁場不均一、 ペースメーカ等のアーチファクトTukey biweight ベースの bias field 補正。 ロバスト ICA で脳活動領域抽出。
ロボティクス(SLAM)特徴点マッチングのエラー、 動的物体の遮蔽RANSAC で外れマッチ排除。 g2o, GTSAM で Huber loss を最適化に組み込む。
遺伝学(GWAS)マイクロアレイのバッチ効果、 PCR 増幅エラーRMA 正規化(median polish)、 ロバスト回帰で関連解析。 PEER モデルでロバスト共分散。
気象(観測同化)人工衛星・地上観測の品質ばらつき、 機器故障の検知ロバストカルマンフィルタ(Variational Bayes)。 QC で Huber 重み関数によりはずれ観測を間引き。
物流(需要予測)プロモーション・災害による需要スパイクM 推定で外れスパイクの影響を抑えた ARIMA 残差。 Hampel フィルタでイベント検知後に補正。
マーケティング(CLV)顧客生涯価値の長尾分布、 超大口顧客の影響Winsorized 平均で上位 1% を切り詰めて KPI 算定。 ロバスト回帰で施策効果推定。
サイバーセキュリティDDoS 攻撃検知、 通信パケットの異常検出MAD ベースの動的閾値(中央値 ± 3 MAD)。 ロバスト Mahalanobis 距離(MinCovDet)で多変量異常検知。
公的統計(本コンペ)SSDSE-B-2026 の東京一強問題、 47 都道府県データの偏り中央値・MAD で全国「典型」を表現。 ロバスト相関(Spearman, Kendall)で順位情報を活用。

❓ 追加 FAQ — 実務で迷いがちな 12 問

Q1. ロバスト統計は機械学習を不要にする?

A. むしろ補完関係。 ML の交差検証や正則化は「過学習に頑健」、 ロバスト統計は「外れ値に頑健」。 両方を組み合わせるのが現代の標準。 sklearn の HuberRegressor, RANSACRegressor はその交差点です。

Q2. SSDSE-B-2026 で「ロバスト」が活きるシーンは?

A. 47 県は小サンプル・東京突出という典型的なロバスト案件。 (1) 中央値で「典型県」を捉える、 (2) MAD で都市部・地方部のばらつき比較、 (3) Spearman でロバスト相関、 (4) 県別ランキング作成時のロバスト集計、 などが現実的応用。

Q3. ロバスト推定の標準誤差は?

A. 解析的公式は影響関数から導けるが面倒。 実務ではブートストラップ(パーセンタイル法、 BCa 法)を推奨。 statsmodels の RLM は漸近 SE を返す。

Q4. ロバスト統計と Bayesian 推論はどう違う?

A. Bayesian は事前分布を明示的に持つ。 Robust prior(t 分布等)を入れた Bayesian も「ロバスト Bayesian」と呼ばれる。 哲学は違うが、 実用上は近似的に重なる場面が多い。

Q5. 「外れ値を消す」と「ロバスト推定」のどっち?

A. 第一選択はロバスト推定。 「消す」は (1) 判断に主観が入る、 (2) 検査者バイアスが乗る、 (3) 削除後の SE が誤る、 という弱点がある。 自動的・連続的に対処できるロバスト推定の方が再現性が高い。

Q6. n=47 のような小サンプルでもロバスト統計は使える?

A. 使えるが効率損失が無視できない。 中央値の SE は平均の SE の約 1.25 倍。 SSDSE-B-2026(47 県)なら平均と中央値を並べて比較し、 差が大きければ外れ値の存在を疑う、 という併用が現実的。

Q7. Spearman 相関と「ロバスト」の関係は?

A. Spearman は順位に変換するので、 外れ値の影響は最大でも 1 ランク分。 つまり影響関数が有界。 SSDSE-B-2026 の都道府県データで Pearson と Spearman を並べ、 差が大きければロバスト性検証の材料になる。

Q8. MM 推定量と LTS、 どっちを使う?

A. 標準は MM 推定量(破壊点 50% + 効率 95%)。 LTS は破壊点最大だが効率が低い。 R の robustbase::lmrob は MM 推定量がデフォルトで、 これに従えば安全。

Q9. ロバスト統計で多重共線性に対処できる?

A. 直接は対処できない。 ロバスト統計は「観測値の汚染」への対処で、 「変数間の相関」とは別問題。 共線性には Ridge, Lasso, PCA を併用する。 ロバスト Ridge も研究されている。

Q10. Adversarial example は外れ値の一種?

A. 数学的には連続。 古典ロバスト統計は「ランダム汚染」、 adversarial は「最悪汚染」。 Madry 論文の minimax 定式化は Huber の minimax と同じ枠組み。 古典ロバストの理論が再評価されている所以。

Q11. SSDSE-B-2026 で「東京は外れ値か」?

A. 観測ミスではないので「外れ値ではない」。 ただしtypical でもない。 「全国の典型値」を語るなら除外、 「全国合計」を語るなら必須。 目的を明示し、 中央値と平均の両方を報告するのが誠実な分析。

Q12. ロバスト統計を学ぶ最短ルートは?

A. (1) 中央値・MAD・四分位数の意味を直感的に理解、 (2) M 推定量と Huber loss を一つの例題で実装、 (3) MM 推定量・MCD を sklearn / statsmodels で動かす、 (4) 影響関数の図を自分で描く、 で 1-2 週間。 教科書は Maronna et al. (2006) が最良。

✅ 実務チェックリスト — ロバスト統計を導入する 12 ステップ

#ステップ確認事項
1問題の性質を診断外れ値の発生機構(測定ミス/真の極端値/構造変化)を見極める
2可視化箱ひげ図・QQ プロット・ヒストグラムで汚染率を視覚化
3汚染率の見積もり経験則:軽 < 10%、 中 10-25%、 重 > 25%
4推定量選択汚染率に応じて Huber / Tukey biweight / MM / MCD を選ぶ
5古典版との並列実行平均 vs 中央値、 OLS vs MM など、 両方の結果を比較
6残差診断標準化残差の分布、 影響関数の値、 重み関数の値を確認
7SE / CI の計算ブートストラップで SE 計算、 漸近 SE と比較
8感度分析外れ値を 1 つずつ抜いて推定値の変化を確認 (leave-one-out)
9パラメータチューニングHuber の c、 Tukey の c、 trim 比率を交差検証で決定
10解釈と報告「平均値より中央値が頑健」「外れ値の影響は ±X%」と定量的に書く
11監査ログどのデータを「重み下げ」したか、 影響関数の値を保存
12定期見直し汚染パターンは時間で変わる。 四半期ごとに再診断

⚠ よくある誤用 8 選

誤用問題点正しい対処
外れ値を目視削除してから OLS主観入り、 SE 過小評価、 再現性なしロバスト推定で連続的に重み下げ
3σ ルールで自動カットσ 自体が汚染され、 カット閾値が腫れあがる中央値 ± k·MAD で MAD ベース判定
Huber の $c$ を「適当に大きく」設定ロバスト性が失われ、 ほぼ OLS と同じ$c=1.345\sigma$ が標準(95% 効率)
MAD 一定数 1.4826 を忘れるSD と桁が違って判定が誤る必ず 1.4826 を掛ける(scipy のデフォルト)
「ロバスト = 安全」と過信正規時の効率が低く、 SE が大きい古典・ロバストを並列実行し比較
標準誤差を漸近公式で報告小サンプルで誤差大、 影響関数が局所的ブートストラップ SE / BCa CI を使う
多変量で個別変数を MAD カット変数間の相関を無視し、 masking 発生MCD でロバスト Mahalanobis 距離
時系列で固定 MAD 閾値非定常性で閾値が時代遅れに移動窓 MAD、 Hampel フィルタ

🧪 モンテカルロ実験 — 汚染下での挙動を実感する

教科書の数式を眺めても直感は育ちません。 シミュレーションで「平均がいかに脆く、 中央値・MAD がいかに頑健か」を体験してみましょう。 以下のコードを実行すると、 5% 汚染下での各推定量の MSE が一覧できます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 汚染下でのモンテカルロ比較
import numpy as np
from scipy import stats

def simulate(n=100, eps=0.05, contamination_scale=10, n_sim=2000):
    results = {'mean':[],'median':[],'trim10':[],'huber':[],'mad':[]}
    for _ in range(n_sim):
        # (1-ε)N(0,1) + εN(0, σ_c²) の混合
        clean = np.random.standard_normal(int(n*(1-eps)))
        contam = np.random.standard_normal(int(n*eps)) * contamination_scale
        x = np.concatenate([clean, contam])
        results['mean'].append(np.mean(x))
        results['median'].append(np.median(x))
        results['trim10'].append(stats.trim_mean(x, 0.10))
        # Huber location
        try:
            huber = stats.trim_mean(x, 0.20)  # 簡易近似
            results['huber'].append(huber)
        except: pass
        results['mad'].append(stats.median_abs_deviation(x, scale='normal'))
    return {k: (np.mean(v), np.std(v)) for k,v in results.items() if v}

# 汚染 0%, 5%, 10%, 20% で比較
for eps in [0.0, 0.05, 0.10, 0.20]:
    out = simulate(eps=eps)
    print(f'ε={eps:.2f}: ', {k: f'{m:.3f}±{s:.3f}' for k,(m,s) in out.items()})

典型的出力:

汚染率 ε平均中央値10% トリムMAD(正規調整後)
0%0.000±0.1000.000±0.1250.000±0.1051.000±0.110
5%-0.002±0.2250.001±0.1280.000±0.1091.005±0.115
10%0.005±0.3180.001±0.1320.001±0.1151.012±0.122
20%0.011±0.4500.002±0.1410.002±0.1281.025±0.145

平均の SD は汚染率に比例して肥大化(0% で 0.10 → 20% で 0.45)。 一方、 中央値とトリム平均の SD はほぼ一定。 これが「破壊点」と「効率」の両立を表す具体的データです。

📈 漸近相対効率 (ARE) 表

推定量正規時 ARE (vs 平均)Cauchy 時 ARE (vs 平均)破壊点
平均1.00(基準)0(崩壊)0%
中央値0.637∞(無限大に勝る)50%
10% トリム平均0.9510%
Huber M ($c=1.345$)0.95~$c/(1+c)$
Tukey biweight ($c=4.685$)0.95~30% (重み 0)
MM 推定量0.9550%

📔 ミニ用語集 — ロバスト統計の専門語 30

Breakdown point(破壊点)
推定量が「制御不能になる」までに耐えられる汚染データの割合。 平均は 0%、 中央値は 50%。
Influence Function (IF)
1 つのデータ点 $x$ が推定量に与える影響を表す関数。 有界なら推定量はロバスト。
Gross Error Sensitivity (γ*)
IF の絶対値の上限。 小さいほど頑健。
Local Shift Sensitivity (λ*)
IF の傾きの上限。 観測値のわずかな変化への感度。
Rejection Point (ρ*)
IF が 0 になる $x$ の最小値。 再下降型推定量で重要。
M-estimator
Maximum-likelihood-like estimator。 $\sum_i \psi(x_i - \theta) = 0$ の解。
L-estimator
順序統計量の線形結合(例:トリム平均、 ウィンザライズ平均、 中央値)。
R-estimator
順位検定統計量から導かれる推定量(例:Hodges-Lehmann)。
S-estimator
残差のロバスト尺度を最小化する回帰推定量。 破壊点 50% 達成可能。
MM-estimator
S 推定量を初期値として M 推定を実行。 破壊点 50% + 効率 95% の両立。
Huber loss
絶対誤差と二乗誤差をハイブリッドした損失関数。 微分可能で凸。
Tukey biweight
再下降型 ψ 関数。 巨大な外れ値の重みを完全に 0 にする。
Hampel function
3 つの定数 $a, b, c$ で定義される再下降型 ψ 関数。 段階的に重みを落とす。
IRLS
Iteratively Reweighted Least Squares。 M 推定量を解く標準アルゴリズム。
LMS (Least Median of Squares)
残差の中央値を最小化する回帰。 破壊点 50% だが効率は低い。
LTS (Least Trimmed Squares)
残差の小さい方 $h$ 個の二乗和を最小化。 LMS より効率が高い。
MCD (Minimum Covariance Determinant)
多変量ロバスト推定。 共分散行列式が最小となる $h$ 点を選ぶ。
MVE (Minimum Volume Ellipsoid)
$h$ 点を含む最小体積の楕円。 MCD の前身。
OGK (Orthogonalized Gnanadesikan-Kettenring)
多変量ロバスト共分散の高速近似アルゴリズム。
Trimmed mean (トリム平均)
両端 α% を除外して平均。 オリンピック採点方式と同じ発想。
Winsorized mean (ウィンザライズ平均)
両端 α% を最近接値で置換してから平均。 情報損失をトリムより抑える。
Hodges-Lehmann estimator
$\mathrm{median}_{i \le j}\{(x_i+x_j)/2\}$。 R 推定量の代表。
Qn estimator
$\mathrm{quantile}_h\{|x_i-x_j|\}$。 MAD より効率が高いロバスト尺度。
Sn estimator
$\mathrm{median}_i\{\mathrm{median}_j|x_i-x_j|\}$。 効率 58% で MAD (37%) より高い。
Contamination neighborhood
$\{F : (1-\epsilon)F_0 + \epsilon H, H \in \mathcal{F}\}$。 Huber の最悪ケース設定。
Asymptotic Relative Efficiency (ARE)
「正規時の効率の比」。 中央値の vs 平均は $2/\pi \approx 0.637$。
Masking
外れ値どうしが互いを「典型」に見せかける現象。 多変量で深刻。
Swamping
外れ値が他の点を「外れ値」と誤判定させる現象。
Leverage point
説明変数空間で外れた点。 回帰係数を大きく動かす。 OLS は無防備。
Adversarial robustness
機械学習版「最悪ケース汚染への耐性」。 Huber 哲学の現代版。

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

ロバスト統計(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)、 さらに「外れ値検出」「敵対的学習に対する頑健性」の研究へと発展しています。

robust statistics 分野横断のフレームワーク 位置パラメータ 散らばり 回帰 多変量 検定

🔗 隣接手法への橋渡し

「ロバスト統計」は単独で完結する手法ではなく、 隣接領域と連携することで真価を発揮する。

外れ値で平均が引きずられる現象は実務で頻発し、 「真の中心」を守る ロバスト統計はデータが綺麗でない現実世界でこそ威力を発揮する。

🌳 決定木 — どのロバスト手法を選ぶか

🌳 決定木 — どのロバスト手法を選ぶか

「ロバスト統計を使え」と言われても、 具体的にどれを? 以下の決定木で迷いを減らしましょう。

STEP 1: 何を推定したいか?
  ├─ 位置(中心、 location) → STEP 2-A
  ├─ スケール(散らばり、 scale) → STEP 2-B
  ├─ 回帰係数 → STEP 2-C
  └─ 多変量共分散 → STEP 2-D

STEP 2-A: 位置の推定
  ├─ 効率重視(汚染 < 10%) → Huber M ($c=1.345\sigma$)
  ├─ 頑健性重視(汚染 > 25%) → 中央値、 MM 推定量
  ├─ シンプルさ重視 → トリム平均(10-20% トリム)
  └─ 「平均値の代替」と説明したい → ウィンザライズ平均

STEP 2-B: スケールの推定
  ├─ 教科書標準 → MAD (×1.4826)
  ├─ 離散データ・MAD = 0 → IQR/1.349、 Sn 推定量
  ├─ 効率重視 → Qn 推定量
  └─ M 推定との整合性 → Huber スケール

STEP 2-C: 回帰係数
  ├─ 標準 → MM 推定量(破壊点 50% + 効率 95%)
  ├─ 高破壊点優先 → LTS、 LMS
  ├─ コンピュータビジョン → RANSAC
  └─ 分位点に興味 → 分位点回帰 (QuantReg)

STEP 2-D: 多変量共分散
  ├─ 教科書標準 → MCD (Minimum Covariance Determinant)
  ├─ 高速近似 → OGK
  ├─ Mahalanobis 距離で外れ値検出 → MinCovDet (sklearn)
  └─ 高次元($p$ > $n$)→ Robust Lasso, Sparse MM

📘 Python ライブラリ早見表

タスク関数備考
中央値numpy.median最も基本
MADscipy.stats.median_abs_deviation(x, scale='normal')1.4826 自動付与
トリム平均scipy.stats.trim_mean(x, 0.1)両端 α 除外
Winsorizescipy.stats.mstats.winsorize境界値で置換
Huber 回帰sklearn.linear_model.HuberRegressor$c$ デフォルト 1.345
RANSACsklearn.linear_model.RANSACRegressorCV 由来、 大規模可
Theil-Sensklearn.linear_model.TheilSenRegressor破壊点 29%、 ノンパラメトリック
M 回帰statsmodels.api.RLMHuber, Tukey, Hampel 等選択可
分位点回帰statsmodels.QuantReg任意分位点
MCDsklearn.covariance.MinCovDet多変量、 Mahalanobis 距離計算
Hampel フィルタscipy.signal.medfilt + 自前判定時系列の単発スパイク
Isolation Forestsklearn.ensemble.IsolationForest高次元異常検知

🗣 ナラティブ — 「平均値の独裁」を疑え

「日本人の平均年収は 458 万円」「全世帯の平均貯蓄額は 1791 万円」――こうした平均値ベースの政府統計は、 一部の超富裕層に強く引きずられます。 中央値で語れば「貯蓄額の中央値は 1104 万円」となり、 印象がガラリと変わる。 これは技術的問題ではなく、 「典型を語るか、 合計を語るか」という政策コミュニケーションの問題です。 ロバスト統計は単なる手法集ではなく、 「平均値がいつも正しい答えとは限らない」という認識を共有する道具でもあります。

SSDSE-B-2026 で「医師数の全国平均」を語るとき、 東京が分子・分母の両方を大きく動かします。 「全国の医師数の中央値」を併記すれば、 「典型県と東京の差」が浮き彫りになる。 政策議論で「平均だけ」を出すのは現代的にはミスリードと言っても過言ではありません。 中央値、 MAD、 四分位範囲を併記する文化を作ることが、 統計家としての社会的責任の一部です。

機械学習時代になり、 「ロバスト」の概念はadversarial robustness(敵対的攻撃への耐性)として再注目されています。 古典統計の minimax 理論(Huber 1964)は、 半世紀を経て深層学習のセキュリティ研究で蘇生しました。 「最悪ケースに備える」という統計学の知恵は、 機械学習が普及した社会においてセキュリティ・公正性・信頼性の根幹を支える概念になりつつあります。 ロバスト統計を学ぶことは、 単に外れ値を扱う技術を得るだけでなく、 「不確実な世界でどう意思決定するか」という普遍的な問いに向き合うことでもあります。

「ロバスト統計 (Robust Statistics)」を扱う際の手法選択は、 状況に応じて以下のフローで判断すると迷いが減る。

  1. Step 1: 目的は記述か予測か?
    • 記述 (現状把握・要約) → 集計・可視化・要約統計量で全体像を掴む
    • 予測 (未知データへの推定) → モデル構築・検証フェーズへ移行
  2. Step 2: データの種類・規模は?
  3. Step 3: 結果の解釈・共有は?
    • 専門家向け → 数値指標・統計検定で精緻に評価
    • 非専門家向け → 可視化・自然言語での要約を重視

このフローに沿って判断することで、 「ロバスト統計 (Robust Statistics)」を中核とした適切な手法選択ができる。

🎮 触って理解する

数直線上の 10 個のデータ点のうち、 オレンジの点(外れ値候補)をドラッグして極端な位置へ動かしてみましょう(マウスでもタッチでも可)。 平均 (mean)標準偏差 (s) は大きく引きずられますが、 中央値 (median)MADIQR はほとんど動きません。 これが ブレークダウンポイント(破壊点) の違いを体感する最短ルートです。

ドラッグ位置:58.0
指標頑健性・破壊点現在値初期位置からの変化量
平均 mean非頑健・BP = 0%
中央値 median頑健・BP = 50%
10% トリム平均準頑健・BP = 10%
標準偏差 s(n−1)非頑健・BP = 0%
1.4826·MAD頑健・BP = 50%
IQR(Q3−Q1)頑健・BP = 25%

固定 9 点=30,40,45,50,52,55,60,65,70、 可動 1 点の初期値=58。 四分位は線形補間(NumPy 既定 type 7)、 標準偏差は不偏(n−1)で計算。

💡 直感 — ブレークダウンポイント(破壊点)

ブレークダウンポイントとは 「推定量を無限大まで壊すのに必要な汚染データの最小割合」です。 平均は たった 1 点を無限遠へ動かせば一緒に無限へ飛ぶので BP = 0%(= 0 に近い脆さ)。 中央値は半分のデータを壊さない限り有限に留まるので BP = 50%(理論上限)。 上の数直線で、 オレンジ点を右端まで引っ張っても 中央値の縦線がほぼ動かないのは、 順位で決まる中央値が「値の大きさ」ではなく「並び順」しか見ていないからです。 10% トリム平均は両端 1 点ずつを捨てるため BP = 10%、 IQR は上下 25% を無視するため実質 BP = 25%。

⚠️ よくある落とし穴

🚀 発展 — Huber 推定・M 推定

平均は残差二乗和 $\sum (x_i-\mu)^2$ を最小化する M 推定($\rho(u)=u^2$)、 中央値は絶対値和 $\sum|x_i-\mu|$ を最小化する M 推定($\rho(u)=|u|$)と見なせます。 M 推定量(Maximum-likelihood-type estimator)はこの $\rho$ 関数を一般化し、 「中心は二乗(=効率的)、 外れ値領域は緩やかに(=頑健)」と切り替えます。 その代表が Huber 損失

$$\rho_k(u)=\begin{cases}\tfrac12 u^2 & (|u|\le k)\\[2pt] k\,|u|-\tfrac12 k^2 & (|u|>k)\end{cases}\qquad k=1.345\hat\sigma$$
|残差| ≤ k では二乗(平均のように効率的)、 それを超えると線形(中央値のように外れ値へ鈍感)。 影響関数が ±k で頭打ちになるため、 1 点の外れ値が与える影響が有界化される。 k = 1.345σ のとき正規分布下の漸近効率が約 95% になるよう調整されている。

さらに外れ値を完全に無視したい場合は、 影響関数が遠方でゼロへ戻る Tukey biweight(再降下 M 推定)を使います。 実務では statsmodels.api.RLM(Huber / Tukey / Hampel を選択可)や sklearn.linear_model.HuberRegressor で回帰に、 位置推定には scipy.stats の各種関数が使えます。 より深く知るには 損失関数平均中央値標準偏差MAD四分位範囲 (IQR)外れ値 の各ページも参照してください(M 推定・Huber・破壊点・トリム平均は本ページ内で解説)。

🎯 解説深化 — 「外れ値検出の道具」としてのロバスト統計:自己マスキングとロバスト z スコア

本文では「外れ値があっても中心の推定が壊れない」ことを主題にした。 この深化セクションでは視点を反転させ、 ロバスト推定量を「外れ値を見つけるものさし」として使うとき何が起きるか を扱う。 鍵になるのは、 古典的な z スコアが持つ構造的欠陥 ── 外れ値が自分自身を隠す「自己マスキング」 である。

🧭 直感 — ものさし自体が外れ値で伸びる

外れ値検出の定番は z スコア $z_i = (x_i - \bar{x})/s$ で「$|z|>2$ なら疑え」という手順である。 ところがこの式の分母 $s$(標準偏差)と分子の $\bar{x}$(平均)は、 どちらも BP = 0% の非頑健な統計量。 つまり外れ値が混ざると、 平均は外れ値の方向へ引き寄せられ、 標準偏差は膨張する。 測られる側の外れ値が、 測る側のものさしを自分に有利なように変形させる ── これが自己マスキングである。 対策は分子・分母を BP = 50% の部品に交換した ロバスト z スコア(Iglewicz & Hoaglin 1993 の修正 z スコア):

$$z_i^{\text{robust}} = \frac{0.6745\,(x_i - \text{median}(x))}{\text{MAD}(x)}, \qquad |z^{\text{robust}}| > 3.5 \text{ で外れ値候補}$$
0.6745 は正規分布での MAD → σ 換算係数(1/1.4826)。 中央値と MAD は外れ値に動じないため、 ものさしが伸び縮みしない。

SSDSE-B-2026(2023 年・47 都道府県)の総人口 A1101 で両者を実測比較すると、 検出結果がまるで違う:

指標(2023 年・実測)古典 z スコア($|z|>2$)ロバスト z スコア($|z^{rob}|>3.5$)
総人口 A11013 県:東京 4.09、 神奈川 2.35、 大阪 2.199 県:東京 13.57、 神奈川 8.31、 大阪 7.81、 愛知 6.42、 埼玉 6.26、 千葉 5.10、 兵庫 4.14、 福岡 3.85、 北海道 3.84
転入者数 A51012 県:東京 5.11、 神奈川 2.338 県:東京 23.95、 神奈川 11.72、 埼玉 8.57、 大阪 8.49、 千葉 7.27、 愛知 5.05、 福岡 4.61、 兵庫 3.70

東京の総人口 1,408.6 万人は、 古典 z では 4.09(平均 264.6 万・SD 279.8 万で標準化)だが、 ロバスト z では 13.57(中央値 154.9 万・1.4826·MAD = 92.4 万で標準化)。 東京自身が SD を 280 万まで膨らませているせいで、 古典 z は東京の「外れっぷり」を 3 分の 1 以下に過小報告している。 転入者数ではさらに極端で、 東京の z = 5.11 に対しロバスト z = 23.95。 中位県の約 24 個分の「ものさし」の彼方にいることが、 頑健な分母を使って初めて数値化される。

⚠️ 落とし穴(重要)— 3 つの構造的な罠

罠 1:古典 z スコアには数学的な天井がある。 標本 z スコアは恒等的に $|z_i| \le (n-1)/\sqrt{n}$ を超えられない。 n = 47 なら上限は 6.71。 つまり都道府県データでは、 どんなに常軌を逸した値が 1 つ混ざっても z は 6.71 止まりであり、 「$|z|>7$ を外れ値とする」ような基準は原理的に 1 件もヒットしない。 外れ値が極端になるほど SD が膨らみ z が頭打ちになる ── 検出器としての z スコアは小標本で構造的に無力化する。 ロバスト z にはこの天井が存在しない(分母が汚染に反応しないため)。

罠 2:MAD = 0 の崩壊。 データの過半数が同一値だと中央値との偏差の過半数が 0 になり、 MAD = 0 → ロバスト z が 0 割りで発散する。 架空の合成例:市町村別の「政令指定都市数」のようなカウントデータで {0,0,0,0,0,0,0,1,2} の 9 件を考えると、 中央値 0・MAD 0 となり、 0 以外のすべての値が「無限大の外れ値」と判定されてしまう。 離散・ゼロ過剰データでは MAD の代わりに $Q_n$/$S_n$ 推定量(Rousseeuw & Croux 1993)や IQR ベースの基準に切り替える必要がある(この段落の数値は説明用の架空例であり SSDSE の実測値ではない)。

罠 3:「9 県がフラグ= 9 県がエラー」ではない。 上の実測でロバスト z が総人口 9 県を検出したが、 これは測定ミスではなく日本の人口分布が右に裾を引く構造そのものを拾っている。 ロバスト z の閾値 3.5 は分布が概ね対称であることを暗黙に仮定しており、 歪んだ分布では片側だけ大量にフラグが立つ。 検出は「調査対象リストの作成」であって「削除リストの作成」ではない ── フラグ後の原因究明(測定誤差か、 実在する構造か)は本文の落とし穴①と同じく分析者の責務である。

🚀 発展 — 歪みを織り込む次の一手

「対称前提の閾値」を超える現代的な拡張が 2 系統ある。 (1) medcouple による調整箱ひげ図(Hubert & Vandervieren 2008):分布の歪度をロバストに測る medcouple (MC) でフェンスを非対称に伸縮させ(右歪みなら上側フェンスを $1.5\,e^{3\,MC}\cdot$IQR に拡張)、 右裾の正常な値を誤検出しない。 Python では statsmodels.stats.stattools.medcouple で計算できる。 (2) Rousseeuw & Croux の $Q_n$・$S_n$:中央値を経由せずペア間距離の順序統計量からスケールを推定する。 BP = 50% を保ちながら正規時効率が MAD の 37% → $Q_n$ で 82% に改善し、 非対称分布でも自然に機能する(scipy.stats.iqr や R の robustbase::Qn)。 「中央値 + MAD」は入口であり、 スケール推定量の選択自体が研究分野として続いている ── という視界を持つと、 本文の M 推定・MM 推定の系譜と外れ値検出の系譜が「頑健なものさし作り」という同じ幹から分岐していることが見えてくる。

🔗 関連ページ

影響関数の詳細:

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