breakdown point = 0.5 なら、 半分のデータが壊れても結論が変わらない。本ページで扱う中核キーワードを 「概念 / 推定量 / 評価指標 / 派生手法 / 実装ライブラリ」 の 5 系統で索引化した。 チップをクリックすると該当セクションへ移動する。 別名(Aliases)は丸括弧で併記。
別名 (Aliases): ロバスト推定、 抗外れ値統計、 R 推定、 高ブレイクダウン点推定、 などの呼び方が文献では混在する。 本ページでは 「ロバスト統計 = 外れ値や分布の歪みに対して結論が大きく変わらない推定・検定の総称」 として扱う。
「ロバスト統計を使うべきか」は 4 つの判断軸で決まる。 単に外れ値が "見える" だけで M 推定に飛びつくと、 効率(標準誤差)を 1〜2 割犠牲にする可能性がある。 まず分布と業務要件を整理した上で、 以下のフローで段階的に判断する。
SSDSE-B-2026 の都道府県人口は、 東京・大阪・愛知が右側に長い裾を持つ重尾分布である。 シャピロ–ウィルク検定で p<0.001、 歪度=2.22、 尖度=7.95。 こうしたケースでは平均は東京 1 県に引きずられ「全国平均=265 万人 (> 中央値 155 万人の 1.71 倍)」となる。 ここで平均を使うと「平均より下=下位 35 県」という直感に反する読みになり、 報告の説得力を失う。 中央値 155 万人 + 第 1・3 四分位 103 万 / 264 万を併記すれば、 読者は「中位の県の規模感」と「ばらつき」を同時に得られる。
外れ値=ゴミという思い込みは危険である。 たとえば医療費の右裾は 高額長期入院患者という臨床上重要なグループ を含む。 ここでロバスト推定で押し込めると、 政策議論で必要な「上位 5% の負担分布」が消える。 ロバスト統計は 「結論を平均値で要約したいが、 外れ値の存在は別途報告する」 という二段構えで使うのが正しい。
記述(県の典型を示す)→ 中央値 + IQR で十分。 推論(処置効果の検定)→ Wilcoxon 順位和検定など分布フリー手法、 もしくは Huber-White SE。 予測(回帰モデル)→ HuberRegressor / RANSAC / Theil–Sen。 用途に合わせて 3 系統を切り替える。
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 段階のプロトコルを示す。
県人口 47 件で平均=265 万、 中央値=155 万、 標準偏差=280 万、 MAD=62 万。 平均と中央値の差 110 万、 SD と MAD の比 4.5 が 「分布が歪んでいる証拠」 となる。
トリム率 α を 0%, 5%, 10%, 20% と段階的に変えて平均(トリム平均)を計算。 α=0: 265 万 → α=5: 232 万 → α=10: 211 万 → α=20: 169 万。 単調減少が緩むのが「真の中心」の目安である。
総人口 X に対する延べ宿泊者数 Y(G7101)の OLS 回帰係数 β=4.11(宿泊/人)。 東京を除外すると β=2.94、 上位 3 県除外で β=2.61。 ここまで動くなら HuberRegressor で全データを使うのが正解。 β=3.97 (Huber) に落ち着く。
中央値の 95% CI を 10,000 回のブートストラップで構築。 [148 万, 178 万] が得られたら、 「県の中位的人口は 150〜180 万の範囲」と政策議論で使える表現が確定する。
必ず 「平均 / 中央値 / トリム平均 / Huber 推定量」を 1 表に並べる。 4 つが概ね一致 → 結論は安定。 大きくズレる → 「分布の歪みと外れ値が結論に影響する」と明記する。 後者の場合、 ロバスト統計の真価が発揮される。
| 推定量 | SSDSE-B 県人口(万人) | SSDSE-B 延べ宿泊者数(万人泊) | 解釈 |
|---|---|---|---|
| 平均 | 265 | 1,064 | 東京の影響大 |
| 中央値 | 155 | 585 | 県の中位 |
| 10%トリム平均 | 211 | 791 | 妥協案 |
| Huber 推定量 | 192 | 793 | 推奨 |
| MAD | 62 | 299 | 頑健な散布度 |
この感度分析を 毎回データを触る前に習慣化する ことが、 報告の信頼性を一段引き上げる。 ロバスト統計とは個別の関数や推定量を指す名前である以前に、 「平均・中央値・トリム平均・Huber 推定量を並べ、 結論が外れ値の有無で変わらないことを毎回確認する文化」 そのものなのである。 SSDSE-B-2026 で東京を含む 47 件を扱う限り、 この感度分析は必ず通る検問所となる。
前節までで理論と判断基準を整理した。 ここでは SSDSE-B-2026(47 都道府県 × 90 指標) の具体データで「平均と中央値の差」「ロバスト推定の効果」を 5 つの指標について検証する。 各ケースで「なぜロバスト統計が必要か」が腑に落ちる構成にした。
東京 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 万) 近傍 |
高齢化率(A1303 高齢者人口 ÷ A1101 総人口)は 22.8%〜39.1% の範囲に 47 県が分布し、 平均 31.6%、 中央値 31.8% で差は 0.2 ポイント。 SD=3.3、 MAD=2.1、 比率 1.6。 総人口のような極端な右裾はなく、 ほぼ対称。 ここではロバスト推定の出番はほぼなく、 平均 + 標準偏差で十分。 「ロバスト統計を使うべきかは指標ごとに判定する」 という原則を象徴するケースである。
東京 8,027 万人泊、 大阪 4,401 万人泊。 最下位は徳島 170 万人泊。 平均 1,064 万、 中央値 585 万、 比率 1.82。 対数変換すると歪度が 3.32 → 0.70 に下がり、 ほぼ対称化。 ロバスト推定と対数変換は 代替手段 として位置づけられる。 「対数で対称になるなら通常の OLS でよい」 vs 「対数変換が解釈を難しくするならロバスト推定」のトレードオフで判断する。
東京 40.7 万人、 神奈川 21.1 万人、 埼玉 16.1 万人、 大阪 16.0 万人、 千葉 14.0 万人が上位。 最下位は鳥取 0.8 万人。 平均 4.7 万、 中央値 2.4 万で右裾が長い。 問題は「上位 5 県だけで全国転入の 48%」という一極集中の政策論点。 ここでロバスト推定で「典型県」を出すと 議論の重要な部分(東京圏への人口移動)が消える。 中央値ではなく 分位点(q90=11.9 万, q99=31.7 万)+ 中央値の併記 が正解である。
総人口 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 を選ぶ。
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 は「真の分布が正規分布から ε の混合で歪んでいるとき、 推定量の最大漸近分散を最小化するミニマックス問題」を解いた。 結果として導かれたのが Huber loss であり、 これは中心では二乗誤差、 裾では絶対値誤差というハイブリッド構造を持つ。 1964 年から 60 年が経過した今も、 機械学習の損失関数(Smooth L1, Pseudo-Huber, Faster R-CNN の bounding box regression)で標準採用されている。 理論的優美さと実用性の両立がロバスト統計の核心である。
Frank Hampel は 「影響関数 (Influence Function, IF)」 を導入し、 推定量の頑健性を関数として可視化する枠組みを提供した。 IF(x; F, T) は「分布 F に微小な汚染 x を加えたとき、 推定量 T がどれだけ動くか」を表す。 平均の IF は線形(無制限に動く)、 中央値の IF は階段関数(±1/(2f(median)))、 Huber の IF はクリップ関数(c で打ち切り)。 これによりロバスト推定量の 「頑健性の度合いを定量化」 できるようになった。
Peter Rousseeuw は LMS (Least Median of Squares) 回帰 と MCD (Minimum Covariance Determinant) を提案。 これらは 50% のブレイクダウン点 を達成する最初の実用的アルゴリズムだった。 LMS は「残差平方の中央値を最小化する回帰」、 MCD は「h サブセットの共分散行列式が最小になる h 点を選ぶ」アルゴリズム。 計算量は当初 O(n²) で重かったが、 高速 MCD(FAST-MCD, 1999)で実用化された。
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) でも、 「外れ値≒攻撃データ」を中和するためにロバスト統計が使われている。 古典理論が現代的問題で生き続けている好例である。
| 年 | 研究者 | 貢献 | 現代の応用 |
|---|---|---|---|
| 1818 | Laplace | 中央値の漸近分散 | 記述統計の基礎 |
| 1964 | Huber | Huber loss・M 推定量 | Smooth L1, Faster R-CNN |
| 1971 | Hampel | 影響関数 | 頑健性の定量化 |
| 1984 | Rousseeuw | LMS / MCD | 異常検知 |
| 1987 | Yohai | MM 推定量 | robustbase, statsmodels |
| 2015 | Girshick | Smooth L1 in Fast R-CNN | 物体検出標準 |
この歴史的経緯を踏まえると、 ロバスト統計は 「単なる古典手法」ではなく、 現代の AI 時代で再評価されている深い理論体系」 と理解できる。 入門段階で中央値・MAD だけ覚えて終わるのではなく、 影響関数・BP・MM 推定量・そして深層学習との接続まで視野に入れて学ぶことを強く推奨する。
独学・大学院演習用に最適な教材を 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: 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.RLM。 R: 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 の HuberRegressor、 RANSACRegressor、 TheilSenRegressor はそれぞれ 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。
論文・レポートで、 こんな表記を目にしたことはないでしょうか:
これらは ロバスト統計(robust statistics) の道具立て。 「普通の平均 ・ 普通の標準偏差 ・ 普通の最小二乗法 は外れ値 1 個でグニャリと曲がってしまう」という事実への対抗手段です。 ロバスト統計は 「データの大多数を表す中心傾向」 を、 一部の極端値に 振り回されずに 推定する技術。 ハッカー的に言えば「失敗に強いコード」の統計版です。
日本の都道府県データを扱うと、 ほぼ必ず 「東京問題」に直面します。 総人口でも、 出生数でも、 消費支出でも、 東京は他 46 県と桁が違うレベルで大きい。 SSDSE-B-2026 の A1101(総人口)を例に、 47 県の 普通の平均 を計算すると:
| 指標 | 値(万人) | 解釈 |
|---|---|---|
| 東京の総人口 | 約 1,409 | 圧倒的トップ |
| 神奈川 | 約 923 | 2 位 |
| 大阪 | 約 876 | 3 位 |
| ... | ... | ... |
| 鳥取 | 約 54 | 最小クラス |
| 47 県の算術平均 | 約 265 | 東京が引っ張る |
| 47 県の中央値 | 約 155 | 真ん中の県の値 |
| 10% トリム平均 | 約 211 | 上下 10% を除外 |
| Huber M-estimator | 約 192 | 連続的に重み付け |
「普通の県の総人口はだいたいどれくらい?」と問われたとき、 265 万人 と答えるのと 155 万人 と答えるのとでは、 意味がまったく違います。 平均は「東京を含めた全体の総量を 47 で割った」値であり、 「平均的な県の像」ではありません。 中央値やトリム平均こそが「平均的な県」を表す指標です。
ロバスト統計の核心概念が breakdown point(破綻点、 BP) です。 BP とは 「データの何 % が汚染されたら、 推定量が無限大(または不定)に発散するか」。 直感的には「どこまでの汚染に耐えられるか」のスコア:
逆に、 BP = 50% を超える推定量は原理的に作れません(半分以上が「壊れた値」なら、 もはやそれが多数派で真の値)。 中央値は最強です。
ロバスト統計の中核概念(外れ値の影響、 損失関数の形、 ブレイクダウン点)を 3 枚の図で再整理する補遺セクション。
古典統計の代表値「平均値」は 外れ値 1 つで任意に動かせる。 これを定量化したのがブレイクダウン点 0%。 一方の中央値はブレイクダウン点 50% で、 半数まで汚染されても揺るがない。
💬 読み方:上段 5 点では平均=中央=190 で一致。 下段で外れ値(赤)1 点を足すと平均は 268 へジャンプ(+78)するが、 中央値は 190 のまま。 これがブレイクダウン点 0% vs 50% の差である。
ロバスト推定の核は 損失関数の形を変えることにある。 二乗損失(L2)は外れ値に二次的に反応するため敏感、 絶対値損失(L1)は線形反応、 Huber 損失は中央が L2・外側で L1 に切り替わる「いいとこ取り」型。
💬 読み方:赤の L2(二乗)は外側で 放物線的に 急上昇 → 外れ値 1 点が全体推定を激しく揺らす。 緑 L1(絶対値)は線形なので外れ値の影響は有限。 青破線 Huber は |r|≤c で L2、 |r|>c で L1 に切り替わる連続関数で、 中心付近の効率と外れ値耐性を両立する。
ブレイクダウン点(BP)は 「データの何 % まで汚染されても推定が暴走しないか」を示す指標。 0% が「1 点で破綻」、 50% が「半数まで耐える」。 50% が理論上限である。
💬 読み方:赤(BP=0%)の平均・最小二乗は 1 点で破綻、 オレンジ(BP=10%)のトリム平均は α=20% カットで耐える、 緑(BP=50%)の中央値・MAD・LMS 回帰は 理論上限 に達する。 ロバスト性と効率のトレードオフを意識して使い分ける。
以上、 ロバスト統計の本質(外れ値感受性・損失関数・BP)を 3 枚の図で整理した。 詳細は本文参照。
M-estimator は、 損失関数 $\rho(\cdot)$ の和を最小化する位置パラメータ:
Huber の $\rho$ 関数は、 中心付近では二乗(最小二乗の効率性を保つ)、 外れ値領域では絶対値(線形にしか伸びない):
影響関数 (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 推定量 $\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(再下降) |
| Hampel | 3 区間連続関数 | 階段状減衰 | 完全に 0 にする境界あり |
M 推定量を解く標準アルゴリズムが IRLS です:
凸 $\psi$(Huber 含む)なら大域収束保証あり。 再下降型(Tukey biweight)は局所最適に陥るので初期値依存性が強く、 通常は Huber を初期値として使う。 statsmodels の RLM(...).fit() は内部で IRLS を実装。
ロバスト統計の核は「外れ値が混入しても結論が大きく崩れない」性質。 中央値・MAD・Huber 推定量を SSDSE-B-2026 で 4 ステップで比較する。
このコードでやること: SSDSE-B-2026 の県別総人口について平均と中央値を比較。 東京・大阪のような大都市が平均をどれだけ押し上げるかを見る。
📥 入力データ (抜粋):
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} (万人、 平均が押し上げられている)') |
📤 実行例:
💬 平均 265 万 vs 中央値 155 万。 差 110 万は東京・大阪・神奈川などの大都市が平均を押し上げている証拠。 「典型的な県」を語るなら中央値の方が適切。
このコードでやること: 標準偏差と 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 から離れる ≈ 外れ値あり)') |
📤 実行例:
💬 std/MAD 比 3.03 → 標準偏差が正規化 MAD の 3 倍、 強い外れ値の影響。 ロバスト統計の世界では、 ばらつき指標として MAD を使うのが標準。
このコードでやること: 総人口から延べ宿泊者数(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 と Huber で傾きが変わる。 東京 (延べ宿泊者数 8,027 万人泊) のような回帰直線から大きく上に外れる点が OLS の傾きを引っ張っている。 Huber は残差の大きい点の重みを下げて影響を抑えるため、 傾き 4.11 → 3.97 と地方部の「人口対宿泊者数」の関係に近づく。
このコードでやること: 既存データに人為的な異常値 (例: 観測ミスで人口が 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} (ほぼ不変)') |
📤 実行例:
💬 平均が 2 倍以上に跳ねる一方、 中央値はほぼ動かない。 これがロバスト統計の威力。 中央値・外れ値検知・ブートストラップ と組み合わせて運用するのが定石。
SSDSE-B-2026 から、 2023 年の都道府県別の総人口(A1101、 実値、 万人)を抜粋:
| 順位 | 県名 | 総人口(万人) |
|---|---|---|
| 1 | 東京 | 1,409 |
| 2 | 神奈川 | 923 |
| 3 | 大阪 | 876 |
| 4 | 愛知 | 748 |
| 24(中央付近) | 鹿児島 | 155(中央値)※ |
| 23 | 熊本 | 171 |
| 47 | 鳥取 | 54 |
※ 実際の中央値順位の県は年度・統計値により変動するため概数。 計算は実 CSV で確認のこと。
標準偏差は $s \approx$ 280 万人(東京の影響で巨大)。 一方 MAD(中央絶対偏差)は:
ロバスト統計の中心的な議論は 「効率」と「頑健性」のトレードオフです。 効率とは「正規分布下で、 推定量の分散がどれだけ小さいか(=最尤推定との比較)」、 頑健性とは「外れ値や分布のズレに対して推定量がどれだけ揺らがないか」。 両者は逆方向に動くため、 折衷案が必要です。
| 推定量 | 正規下の漸近効率 | 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。
影響関数は「1 点の汚染が推定量にどれだけ影響するか」を示す関数。 視覚的には「推定量の局所感度」のグラフです:
影響関数が「無界 → 有界 → ゼロに収束」と進むにつれ、 頑健性は高まりますが、 効率は徐々に低下します。 Huber は「ほとんど効率を犠牲にせず、 IF を有界化」した秀作。
正規分布 N(0, 1) からの n = 100 個のデータに、 「10% を外れ値 N(20, 1)」として混入させたとき、 各推定量の動きを比較します。
| シナリオ | 算術平均 | 中央値 | 5% トリム | Huber |
|---|---|---|---|---|
| 純正規 N(0,1) | 0.02 | −0.01 | 0.01 | 0.01 |
| 5% 汚染 N(0,1)+5% N(20,1) | 0.98 | 0.04 | 0.32 | 0.21 |
| 10% 汚染 | 1.95 | 0.08 | 0.41 | 0.43 |
| 20% 汚染 | 3.88 | 0.15 | 0.51(破綻寸前) | 0.92 |
| 40% 汚染 | 7.78 | 0.45 | 破綻 | 2.20 |
| 50% 汚染 | 9.82 | 10.0(破綻) | — | — |
観察:算術平均は汚染比率に線形に動く(致命的)。 中央値は 50% を超えるまでほぼ動かない。 5% トリム平均は BP=5% を超えると破綻。 Huber は連続的に劣化するが、 50% 近くまで耐える。 「BP を超えたら推定量はもはや信用ならない」という事実が体感できる例。
金融分野では、 「日次収益の平均は外れ値(暴落・暴騰)に致命的に弱い」ことが知られており、 中央値や Huber 推定量での要約が業界標準です:
「典型的な収益」を語るなら中央値・Huber、 「長期累積収益」を語るなら算術平均、 と用途で使い分けるのが正解。
SSDSE-B-2026 の A1101(総人口)と G7101(延べ宿泊者数)を例に、 古典回帰 (OLS) とロバスト回帰 (MM 推定量) の差を確認します。 東京・大阪のような巨大県が回帰直線をどれだけ歪めるか、 ロバスト推定はどう違うかが実感できます。
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}') |
このコードを実行すると、 東京・埼玉・京都・神奈川・沖縄など観光集中・大都市の県が 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² の概数)から平均・中央・トリム平均を比較する。
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)}") |
💬 手計算 (Step 2) 中央 5.5 / trim 5.5 と Python 出力が完全一致。
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}') |
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 |
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}') |
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()} 外れ') |
HuberRegressor.outliers_ は残差が大きい県を True と判定し、 ここでは 15 県が外れと分類される。 ただし出生数は総人口とほぼ線形なので、 Huber の傾き 0.006112 は OLS 0.006104 とほぼ同じ。 「残差が大きい=回帰を歪める外れ値」とは限らないことが分かる好例(延べ宿泊者数のように東京が直線から外れる指標では傾きがはっきり変わる)。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) |
SSDSE-B-2026 の総人口(A1101)で複数の頑健推定量を比較し、 総人口から出生数(A4101)へのロバスト回帰も試す:
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 推定量は両者の中間で、 「東京の影響を抑えつつ全データを使う」バランスを取ります。
回帰での頑健化:
多変量データでのロバスト共分散行列推定:
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 距離で外れ値として識別されます。
ロバスト統計の起源は、 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 戦略といった現代ロバスト統計の中核概念がここで定式化されました。
| 年 | 研究者 | 主要貢献 |
|---|---|---|
| 1953 | Tukey | "The Future of Data Analysis" でロバスト分析の哲学を提唱 |
| 1960 | Tukey | "A survey of sampling from contaminated distributions" で汚染分布の概念 |
| 1964 | Huber | M-estimator の理論を確立、 minimax 効率を導出 |
| 1968 | Hampel | 影響関数(Influence Function)の概念を導入 |
| 1972 | Tukey | biweight 関数を提案(再降下型 M-estimator) |
| 1981 | Hampel, Ronchetti, Rousseeuw, Stahel | 影響関数を中心とする統一的視点(後に名著として 1986 年に書籍化) |
| 1984 | Rousseeuw | LMS(Least Median of Squares)回帰、 BP=50% |
| 1984 | Rousseeuw | LTS(Least Trimmed Squares)回帰 |
| 1987 | Rousseeuw & Leroy | "Robust Regression and Outlier Detection" — 実用書の決定版 |
| 1990 | Rousseeuw & van Driessen | MCD(最小共分散行列式)— 多変量ロバスト共分散推定 |
| 1992 | Yohai & Zamar | MM-estimator — BP=50% と高効率の両立 |
| 2000+ | 多数 | 機械学習との融合(RANSAC、 Huber 損失、 ロバスト深層学習) |
日本における普及は 1980 年代後半から、 Wilcoxon 検定や中央値の使用を通じて医学・心理学の領域で広まり、 現在では「外れ値が懸念される場面ではロバスト統計を併用する」が学会論文の標準作法となっています。
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 推定量で破壊点と効率を両立――半世紀でロバスト統計は完成した分野になりました。
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 と通底する考え方であり、 「最悪ケース思考」の数理的表現と言えます。
| 年 | 人物 | 貢献 |
|---|---|---|
| 1818 | Bessel | 既に「外れ値の判定基準」を議論。 観測天文学では古くから問題視。 |
| 1887 | Edgeworth | 中央値の漸近分散公式を導出、 平均との比較を行う。 |
| 1953 | Box | 「robust」という用語を初めて統計に持ち込む。 分散分析の頑健性議論。 |
| 1960 | Tukey | Contaminated normal model $(1-\epsilon)N(0,1) + \epsilon N(0,9)$ で平均が崩壊することを示し、 ロバスト統計の問題提起。 |
| 1964 | Huber | M 推定量の定式化、 minimax 性質の証明。 「ロバスト統計学」の出発点。 |
| 1968 | Hampel | 影響関数 (IF)、 漸近分散表現、 finite-sample breakdown を理論化。 |
| 1972 | Andrews et al. | Robust Estimates of Location でモンテカルロ大比較研究。 100 以上の推定量を評価。 |
| 1981 | Rousseeuw | Least Median of Squares (LMS) 回帰、 破壊点 50% を初めて達成。 |
| 1984 | Rousseeuw & Yohai | S 推定量で破壊点と効率の両立を目指す。 |
| 1987 | Yohai | MM 推定量、 破壊点 50% かつ正規時効率 95% の決定版。 |
| 1999 | Rousseeuw & Van Driessen | 高速 MCD アルゴリズム、 多変量ロバスト統計の実用化。 |
| 2006 | Maronna, Martin, Yohai | Robust Statistics: Theory and Methods、 現代の決定版教科書。 |
| 2014 | Goodfellow et al. | Adversarial examples 発見、 深層学習でロバスト性問題が再燃。 |
| 2018 | Madry et al. | PGD adversarial training、 最悪ケース最適化を深層学習へ。 |
| 2023 | 複数 | LLM のロバスト性、 プロンプトインジェクション対策で古典ロバスト統計が再評価。 |
Huber (1964) の重要な結果は、 「$\epsilon$ 汚染のクラス $\{F : F = (1-\epsilon)\Phi + \epsilon H, H \in \mathcal{F}\}$ に対して、 漸近分散の最悪値を最小化する推定量は M 推定量である」というものです。 つまり Huber 推定量は「想定外の汚染への被害を最小化する」という意味で最適です。 これは制御理論の minimax 思考、 経済学の Gilboa-Schmeidler maxmin expected utility、 機械学習の adversarial training と完全に同じ哲学であり、 「最悪ケース対策」という統一的視点で理解できます。
ロバスト統計の現場応用は驚くほど広い。 ここでは具体的な技術選択とその理由まで踏み込みます。
| 業界 | 課題 | 採用手法と理由 |
|---|---|---|
| 金融(リスク管理) | ボラティリティ推定、 リーマンショックのような極端値で 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)で順位情報を活用。 |
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) が最良。
| # | ステップ | 確認事項 |
|---|---|---|
| 1 | 問題の性質を診断 | 外れ値の発生機構(測定ミス/真の極端値/構造変化)を見極める |
| 2 | 可視化 | 箱ひげ図・QQ プロット・ヒストグラムで汚染率を視覚化 |
| 3 | 汚染率の見積もり | 経験則:軽 < 10%、 中 10-25%、 重 > 25% |
| 4 | 推定量選択 | 汚染率に応じて Huber / Tukey biweight / MM / MCD を選ぶ |
| 5 | 古典版との並列実行 | 平均 vs 中央値、 OLS vs MM など、 両方の結果を比較 |
| 6 | 残差診断 | 標準化残差の分布、 影響関数の値、 重み関数の値を確認 |
| 7 | SE / CI の計算 | ブートストラップで SE 計算、 漸近 SE と比較 |
| 8 | 感度分析 | 外れ値を 1 つずつ抜いて推定値の変化を確認 (leave-one-out) |
| 9 | パラメータチューニング | Huber の c、 Tukey の c、 trim 比率を交差検証で決定 |
| 10 | 解釈と報告 | 「平均値より中央値が頑健」「外れ値の影響は ±X%」と定量的に書く |
| 11 | 監査ログ | どのデータを「重み下げ」したか、 影響関数の値を保存 |
| 12 | 定期見直し | 汚染パターンは時間で変わる。 四半期ごとに再診断 |
| 誤用 | 問題点 | 正しい対処 |
|---|---|---|
| 外れ値を目視削除してから 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.100 | 0.000±0.125 | 0.000±0.105 | 1.000±0.110 |
| 5% | -0.002±0.225 | 0.001±0.128 | 0.000±0.109 | 1.005±0.115 |
| 10% | 0.005±0.318 | 0.001±0.132 | 0.001±0.115 | 1.012±0.122 |
| 20% | 0.011±0.450 | 0.002±0.141 | 0.002±0.128 | 1.025±0.145 |
平均の SD は汚染率に比例して肥大化(0% で 0.10 → 20% で 0.45)。 一方、 中央値とトリム平均の SD はほぼ一定。 これが「破壊点」と「効率」の両立を表す具体的データです。
| 推定量 | 正規時 ARE (vs 平均) | Cauchy 時 ARE (vs 平均) | 破壊点 |
|---|---|---|---|
| 平均 | 1.00(基準) | 0(崩壊) | 0% |
| 中央値 | 0.637 | ∞(無限大に勝る) | 50% |
| 10% トリム平均 | 0.95 | 大 | 10% |
| Huber M ($c=1.345$) | 0.95 | 大 | ~$c/(1+c)$ |
| Tukey biweight ($c=4.685$) | 0.95 | 大 | ~30% (重み 0) |
| MM 推定量 | 0.95 | 大 | 50% |
ロバスト統計(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)、 さらに「外れ値検出」「敵対的学習に対する頑健性」の研究へと発展しています。
「ロバスト統計」は単独で完結する手法ではなく、 隣接領域と連携することで真価を発揮する。
外れ値で平均が引きずられる現象は実務で頻発し、 「真の中心」を守る ロバスト統計はデータが綺麗でない現実世界でこそ威力を発揮する。
「ロバスト統計を使え」と言われても、 具体的にどれを? 以下の決定木で迷いを減らしましょう。
| タスク | 関数 | 備考 |
|---|---|---|
| 中央値 | numpy.median | 最も基本 |
| MAD | scipy.stats.median_abs_deviation(x, scale='normal') | 1.4826 自動付与 |
| トリム平均 | scipy.stats.trim_mean(x, 0.1) | 両端 α 除外 |
| Winsorize | scipy.stats.mstats.winsorize | 境界値で置換 |
| Huber 回帰 | sklearn.linear_model.HuberRegressor | $c$ デフォルト 1.345 |
| RANSAC | sklearn.linear_model.RANSACRegressor | CV 由来、 大規模可 |
| Theil-Sen | sklearn.linear_model.TheilSenRegressor | 破壊点 29%、 ノンパラメトリック |
| M 回帰 | statsmodels.api.RLM | Huber, Tukey, Hampel 等選択可 |
| 分位点回帰 | statsmodels.QuantReg | 任意分位点 |
| MCD | sklearn.covariance.MinCovDet | 多変量、 Mahalanobis 距離計算 |
| Hampel フィルタ | scipy.signal.medfilt + 自前判定 | 時系列の単発スパイク |
| Isolation Forest | sklearn.ensemble.IsolationForest | 高次元異常検知 |
「日本人の平均年収は 458 万円」「全世帯の平均貯蓄額は 1791 万円」――こうした平均値ベースの政府統計は、 一部の超富裕層に強く引きずられます。 中央値で語れば「貯蓄額の中央値は 1104 万円」となり、 印象がガラリと変わる。 これは技術的問題ではなく、 「典型を語るか、 合計を語るか」という政策コミュニケーションの問題です。 ロバスト統計は単なる手法集ではなく、 「平均値がいつも正しい答えとは限らない」という認識を共有する道具でもあります。
SSDSE-B-2026 で「医師数の全国平均」を語るとき、 東京が分子・分母の両方を大きく動かします。 「全国の医師数の中央値」を併記すれば、 「典型県と東京の差」が浮き彫りになる。 政策議論で「平均だけ」を出すのは現代的にはミスリードと言っても過言ではありません。 中央値、 MAD、 四分位範囲を併記する文化を作ることが、 統計家としての社会的責任の一部です。
機械学習時代になり、 「ロバスト」の概念はadversarial robustness(敵対的攻撃への耐性)として再注目されています。 古典統計の minimax 理論(Huber 1964)は、 半世紀を経て深層学習のセキュリティ研究で蘇生しました。 「最悪ケースに備える」という統計学の知恵は、 機械学習が普及した社会においてセキュリティ・公正性・信頼性の根幹を支える概念になりつつあります。 ロバスト統計を学ぶことは、 単に外れ値を扱う技術を得るだけでなく、 「不確実な世界でどう意思決定するか」という普遍的な問いに向き合うことでもあります。
「ロバスト統計 (Robust Statistics)」を扱う際の手法選択は、 状況に応じて以下のフローで判断すると迷いが減る。
このフローに沿って判断することで、 「ロバスト統計 (Robust Statistics)」を中核とした適切な手法選択ができる。
数直線上の 10 個のデータ点のうち、 オレンジの点(外れ値候補)をドラッグして極端な位置へ動かしてみましょう(マウスでもタッチでも可)。 平均 (mean) と 標準偏差 (s) は大きく引きずられますが、 中央値 (median)・MAD・IQR はほとんど動きません。 これが ブレークダウンポイント(破壊点) の違いを体感する最短ルートです。
| 指標 | 頑健性・破壊点 | 現在値 | 初期位置からの変化量 |
|---|---|---|---|
| 平均 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%。
×1.4826(= 1/Φ⁻¹(0.75))を掛けます。 上の表もスケール補正済みの値です。平均は残差二乗和 $\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 損失:
さらに外れ値を完全に無視したい場合は、 影響関数が遠方でゼロへ戻る Tukey biweight(再降下 M 推定)を使います。 実務では statsmodels.api.RLM(Huber / Tukey / Hampel を選択可)や sklearn.linear_model.HuberRegressor で回帰に、 位置推定には scipy.stats の各種関数が使えます。 より深く知るには 損失関数、 平均、 中央値、 標準偏差、 MAD、 四分位範囲 (IQR)、 外れ値 の各ページも参照してください(M 推定・Huber・破壊点・トリム平均は本ページ内で解説)。
本文では「外れ値があっても中心の推定が壊れない」ことを主題にした。 この深化セクションでは視点を反転させ、 ロバスト推定量を「外れ値を見つけるものさし」として使うとき何が起きるか を扱う。 鍵になるのは、 古典的な z スコアが持つ構造的欠陥 ── 外れ値が自分自身を隠す「自己マスキング」 である。
外れ値検出の定番は z スコア $z_i = (x_i - \bar{x})/s$ で「$|z|>2$ なら疑え」という手順である。 ところがこの式の分母 $s$(標準偏差)と分子の $\bar{x}$(平均)は、 どちらも BP = 0% の非頑健な統計量。 つまり外れ値が混ざると、 平均は外れ値の方向へ引き寄せられ、 標準偏差は膨張する。 測られる側の外れ値が、 測る側のものさしを自分に有利なように変形させる ── これが自己マスキングである。 対策は分子・分母を BP = 50% の部品に交換した ロバスト z スコア(Iglewicz & Hoaglin 1993 の修正 z スコア):
SSDSE-B-2026(2023 年・47 都道府県)の総人口 A1101 で両者を実測比較すると、 検出結果がまるで違う:
| 指標(2023 年・実測) | 古典 z スコア($|z|>2$) | ロバスト z スコア($|z^{rob}|>3.5$) |
|---|---|---|
総人口 A1101 | 3 県:東京 4.09、 神奈川 2.35、 大阪 2.19 | 9 県:東京 13.57、 神奈川 8.31、 大阪 7.81、 愛知 6.42、 埼玉 6.26、 千葉 5.10、 兵庫 4.14、 福岡 3.85、 北海道 3.84 |
転入者数 A5101 | 2 県:東京 5.11、 神奈川 2.33 | 8 県:東京 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 個分の「ものさし」の彼方にいることが、 頑健な分母を使って初めて数値化される。
罠 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) | 有界・再下降 |