論文一覧に戻る 📚 用語解説(ジャストインタイム型データサイエンス教育)
中央絶対偏差
Median Absolute Deviation (MAD)
外れ値に強い「ばらつき」の指標。 平均からのズレではなく 「中央値からのズレの絶対値」を、 もう一度中央値で集約する。
標準偏差より頑健で、ロバスト統計の標準ツール。
ロバスト統計 記述統計 外れ値耐性 分散の代替

🔖 キーワード索引

30秒結論 直感 数式定義 1.4826 倍補正 記号読み解き SSDSE 計算 MAD vs 標準偏差 Python 実装 外れ値判定 落とし穴 関連用語

MAD (Median Absolute Deviation、 中央絶対偏差) は外れ値に頑健な散布度指標。 標準偏差が外れ値 1 つで容易に揺らぐのに対し、 MAD は中央値ベースなので 50% 近くのデータが外れ値でも安定する。 SSDSE-B-2026 の都道府県人口のように分布が右に強く歪む場面で標準偏差と MAD を併記すると、 「分布の本当の散らばり」が見える。

MAD中央絶対偏差頑健統計外れ値耐性MADn (×1.4826)中央値標準偏差との比較IQRmodified Z-scorebreakdown point

これらは「MAD の計算 → 標準偏差との比較 → 外れ値検出への応用」 を構成する中核キーワード。

💡 30 秒で分かる結論

🍰 まずはやさしく

データのばらつきを測る道具です。

極端な値に惑わされずに分析するために使います。

テストで一人だけ点数が高い人がいても安心です。

この章ではMADの結論を短くまとめます。

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

🍰 まずはやさしく

現実のデータを見るための眼鏡のようなものです。

典型的なばらつきを正しく捉えるために使います。

人口の多い県が混ざった統計などで役立ちます。

ここではMADが使われる場面を具体的に見ます。

論文や統計レポートで、 こんな表記を見たはずです:

「47 都道府県の総人口(A1101, 2023 年度)の中央値は約 154.9 万人、 MAD は約 62.3 万人
東京都・神奈川県を含む大都市県を外れ値として扱った場合、 通常の標準偏差 約 280 万人 と比べ、
MAD を使うと典型的な県のばらつきがより素直に表現できる」

この「MAD」が中央絶対偏差。 平均と標準偏差は東京・大阪のような少数の極端値で大きく引っ張られますが、 中央値と MAD は 「典型的な値」と「典型的なばらつき」 を頑健に捉えます。 外れ値が混じる現実のデータで、 「全体の輪郭」を見るための標準ツールです。

🎨 直感で掴む — 「ズレの中央値」

🍰 まずはやさしく

ズレの大きさを並べて真ん中を見る方法です。

計算に使う数字を入れ替えて、安定感を出すために使います。

スマホの利用時間など、個人差が大きいデータに便利です。

ここではMADがどう計算されるか直感的に学びます。

標準偏差は「平均からのズレの二乗」を平均して、 最後に平方根を取ります。 MAD はその「平均」を 「中央値」 に、 「二乗」を 「絶対値」 に置き換えただけ。

ステップ標準偏差 ($\sigma$)MAD
(1) 中心を取る 平均 $\bar{x}$ 中央値 $\tilde{x}$
(2) ズレを測る $(x_i - \bar{x})^2$(二乗) $|x_i - \tilde{x}|$(絶対値)
(3) ズレを集約する 平均 中央値
(4) 最後の処理 平方根を取る 1.4826 倍(必要なら)

「平均」「二乗」「平均」と計 3 回外れ値の影響を受けるのが標準偏差。 「中央値」「絶対値」「中央値」と3 回とも頑健なのが MAD。 これが MAD の強さの源泉です。

SSDSE-B でのイメージ

47 都道府県の総人口(A1101, 2023 年度)を考えます。 多くの県が 50〜300 万人の範囲に集まる中で、 東京都は 1400 万人を超える「超外れ値」。 標準偏差は東京都 1 県の存在で大きく膨らみますが、 MAD は東京都がどれだけ大きかろうと中央値からの順位でしか効かないので影響を受けません。

🎨 概念図で押さえる

MAD(中央絶対偏差)の本質を 3 つの図で押さえる。 左から「分布上の MAD と SD の差」「外れ値耐性の比較」「正規化定数 1.4826 の役割」。

① 中央値からの絶対偏差
中央値 |x_i − median| の中央値 = MAD
② 外れ値への耐性比較
SD 外れ値 1 個で 4 倍に膨張 MAD 外れ値あっても安定
③ 正規化定数 1.4826
N(0, σ²) MAD ≈ 0.6745 σ ⇒ σ̂ = 1.4826 × MAD

💬 ①は MAD が「中央値からのズレ」の代表値、 ②は SD と比較して MAD が外れ値に頑健、 ③は正規分布なら 1.4826 倍で SD と単位を合わせられることを示す。

🎨 概念図でもう一段押さえる MAD の本質

MAD を 3 枚で総まとめ。 ① MAD と SD の計算過程の対比、 ② 外れ値 1 件の効果 (SD は跳ねるが MAD は動かない)、 ③ ブレークダウン点 50% の意味。

MAD 概念図1: SD と MAD の計算過程対比 MAD 概念図2: 外れ値で SD 3倍 / MAD 不変 MAD 概念図3: ブレークダウン点 50% の意味

SD: 二乗→平均→平方根 MAD: 絶対値→中央値 (xi - 平均)² 平均をとる √ で単位を戻す 二乗で外れ値が爆発的に効く |xi - 中央値| 絶対値の中央値 そのまま (× 1.4826 で SD 換算) 外れ値の効きは中央値で打ち消される
図 A: SD は「二乗 → 平均」、 MAD は「絶対値 → 中央値」。 二乗が無いことが外れ値耐性の源。
外れ値 1 件で SD は +3 倍、 MAD は不変 外れ値 SD: 3.2 → 9.8 (+3 倍) 二乗で外れ値が支配 → ばらつき過大評価 MAD: 2.1 → 2.1 (不変) 中央値は外れ値で動かない → 安定
図 B: 同じデータに外れ値 1 件を足すだけで、 SD は約 3 倍に跳ね上がるが MAD はまったく動かない。
ブレークダウン点: 推定量が壊れる外れ値割合 50% 0% 推定量 平均/SD: 0% 1 点で壊れる 中央値/MAD: 50% 過半数まで頑健 Huber: 〜30% 調整可 トリム平均 α 依存
図 C: ブレークダウン点 = 推定量が「壊れる」外れ値比率。 中央値・MAD は理論上限 50% で最高クラスに頑健。

💬 ①計算過程が「絶対値→中央値」なので二乗が無い、 ②外れ値 1 件で SD は爆発するが MAD は動かない、 ③ブレークダウン点 50% は推定量の最高クラス頑健性 — この 3 つで MAD の本質が掴める。

📝 理解度チェック・典型ワークフロー・事例 — MAD

中央絶対偏差(MAD)について、 理解度を確認する練習問題、 実務での典型ワークフロー、 SSDSE-B-2026 を用いた事例を順に整理する。 これらを自分で実装すれば「なぜ頑健統計が必要か」が体得できる。

📝 理解度チェック

  1. 練習問題 1: MAD と SD の違いを「外れ値感受性」「効率性」「数式的扱いやすさ」の 3 観点で説明せよ。
  2. 練習問題 2: 正規分布の MAD を 1.4826 倍すると SD の不偏推定値になる理由を、 標準正規分布の中央絶対偏差が約 0.6745 になる事実から導け。
  3. 練習問題 3: SSDSE-B-2026 の都道府県人口(東京都が極端な外れ値)について、 SD と MAD×1.4826 がどれくらいズレるかを計算し、 ズレの理由を説明せよ。
  4. 練習問題 4: 外れ値判定で「median ± 3×MAD」を使うとき、 SD ベースの「mean ± 3σ」と比較してどちらの境界が外側にあるかを、 外れ値が存在するデータで検証せよ。
  5. 練習問題 5: MAD が 0 になるデータ例を具体的に作り、 その場合の対処(IQR、 エントロピー、 標本分散の併用)を述べよ。

🛠 典型ワークフロー

実務で MAD を散布度や外れ値判定に使うときの標準的な手順は以下の通り。

  1. 分布形状の確認: まずヒストグラム・箱ひげ図でデータの分布を視覚化する。 多峰分布・極端な歪みがあれば中央値の代表性を再考。
  2. 中央値とパーセンタイルの計算: 中央値・第 1 四分位・第 3 四分位を算出し、 IQR も併記する。
  3. MAD の計算: $\mathrm{MAD} = \mathrm{median}(|x_i - \mathrm{median}(x)|)$ を計算。 Python なら scipy.stats.median_abs_deviation。
  4. SD との比較: 正規仮定下での比較なら MAD×1.4826 を使う。 SD との差が大きいほど外れ値の影響が大きい。
  5. 外れ値の特定: $|x_i - \mathrm{median}|/\mathrm{MAD} > 3$ となる点を「ロバスト外れ値」として抽出。 SD ベースとの違いを確認。
  6. 感度分析: 外れ値を除外した場合と除外しない場合で結論が変わるか確認。 変わる場合は「両方の結果を併記」が原則。
  7. 結論報告: 中央値 ± MAD、 平均値 ± SD、 IQR の 3 セットを並記し、 「どの散布度を見ているか」を明示する。

📊 事例: SSDSE-B-2026 都道府県人口の散布度

SSDSE-B-2026 の都道府県人口データ(N=47)は、 東京都(約 1409 万人)と鳥取県(約 54 万人)の間に 25 倍以上の差がある。 このデータで散布度を測ると以下のような違いが生じる。

指標値(概算)特性
平均値約 265 万人東京都に大きく引っ張られる
中央値約 155 万人外れ値の影響を受けない
標準偏差(SD)約 280 万東京都・大阪府で大きく膨らむ
MAD約 62 万外れ値に頑健
MAD × 1.4826約 92 万正規仮定下の SD 推定
IQR約 160 万第 1-第 3 四分位の幅

SD(約 280 万)と MAD×1.4826(約 92 万)の差が 3 倍ある — これは「外れ値が SD を大きく膨らませている」明確なサイン。 都道府県データのように一部の極端値(東京都・神奈川県・大阪府)が分布を歪めるケースでは、 MAD ベースの散布度の方が「典型的な都道府県のばらつき」を素直に表現する。

📌 適用シーン別の使い分け

💬 MAD は「外れ値が混じった現実のデータ」で散布度を測るための実用的な道具。 純粋な正規分布なら SD で良いが、 現実のデータは多くの場合純粋ではない。 SD だけで散布度を語ると、 一部の極端値に判断を支配される。 MAD・IQR を併用すると、 データの真の姿が立体的に見えてくる。

📐 数式 — MAD の定義

🍰 まずはやさしく

MADを計算するためのルールです。

正確な数値としてばらつきを出すために使います。

部活の記録など、数字で厳密に比べたい時に役立ちます。

ここではMADの数式と計算の手順を読み解きます。

$n$ 個の観測 $x_1, x_2, \dots, x_n$ に対して:

【MAD の定義】
$$\mathrm{MAD}(x) = \mathrm{median}_i\!\left(\left|\,x_i - \mathrm{median}_j(x_j)\,\right|\right)$$
「中央値からの距離 $|x_i - \tilde{x}|$ を 47 県ぶん計算し、 その中央値を取る」

標準偏差との一致性補正

$x$ が正規分布 $N(\mu, \sigma^2)$ に従うとき、 MAD と $\sigma$ の関係:

【一致性補正】
$$\sigma \approx 1.4826 \times \mathrm{MAD}$$
$1.4826 = 1 / \Phi^{-1}(0.75)$。 標準正規の上 4 分の 1 点(0.6745)の逆数。

つまり「正規分布なら MAD を 1.4826 倍すれば $\sigma$ になる」。 多くのライブラリで、 MAD 計算時にこの係数を掛けてくれます。 これを正規化 MAD(NMAD)と呼ぶことも。

MAD 標準化(Modified z-score)

【Modified z-score(ロバスト z 値)】
$$M_i = \frac{0.6745 \cdot (x_i - \tilde{x})}{\mathrm{MAD}(x)}$$
通常の z 値 $z_i = (x_i - \bar{x})/\sigma$ のロバスト版。 $|M_i| > 3.5$ なら外れ値と判定するのが定石(Iglewicz & Hoaglin, 1993)。

📐 MAD の理論的性質

正規分布での性質

$X \sim \mathcal{N}(\mu, \sigma^2)$ のとき、 $|X - \mu|$ は半正規分布(folded normal)に従い、 その中央値は $\sigma \Phi^{-1}(0.75) = 0.6745\sigma$。 これが「$\mathrm{MAD} \to 0.6745 \sigma$ in probability」の根拠です。

漸近分散

$$\sqrt{n}(\hat{\mathrm{MAD}} - 0.6745\sigma) \xrightarrow{d} \mathcal{N}(0, \sigma^2 V)$$

ここで $V \approx 0.367$(正規時)。 つまり SD の漸近分散 $\sigma^2/2$ と比較して、 MAD の効率は $0.5 / 0.367 \times 0.6745^2 \approx 0.37 = 37\%$ になります。

破壊点

MAD の破壊点は 50%。 つまりデータの 50% を任意の値に変えても MAD は有界。 これは中央値の破壊点と一致します。

影響関数

$$\mathrm{IF}(x; \mathrm{MAD}, F) = \frac{\mathrm{sign}(|x - \mu| - \mathrm{MAD})}{4f(\mu + \mathrm{MAD})}$$

影響関数は有界で階段状。 「外れ値の影響は中央値の半分」というロバスト性を持ちます。

離散データでの修正

整数値データでは MAD = 0 が頻発します。 対策として:

📖 もっと深掘り — MAD の知的系譜(拡張版)

Median Absolute Deviation(MAD)は「最も古く、 最もシンプルなロバスト散布度」と言える指標です。 ガウスが Theoria Motus Corporum Coelestium (1809) で最小二乗法を確立した時から、 既に「外れ値を扱うべき特異点」という問題は天文学者の間で意識されていました。 MAD は標準偏差のロバスト版兄弟として 20 世紀の統計学の重要な発見の 1 つです。

📅 詳細年表

人物貢献
1816Gauss"Bestimmung der Genauigkeit der Beobachtungen" で「probable error」を議論、 中央値ベース散布の先駆け。
1903Karl Pearson"On the Probable Errors of Frequency Constants" で標準偏差・平均偏差を比較。
1920Fisher"Mathematical Foundations of Theoretical Statistics" で MAE/MAD の効率を議論。
1960Tukey"Survey of Sampling from Contaminated Distributions" で SD の崩壊を実証、 MAD を再評価。
1972Andrews et al."Robust Estimates of Location" でモンテカルロ比較、 MAD の安定性を確認。
1981Huber教科書 "Robust Statistics" で MAD を Huber M 推定の標準スケール推定量と位置付ける。
1983Hampel et al."Influence Functions" で MAD の影響関数を導出、 漸近分散を整理。
1993Rousseeuw & Croux"Alternatives to the Median Absolute Deviation" で Sn, Qn 推定量を提案、 MAD の効率の弱点を改善。
2000s複数機械学習・データマイニングで「MAD ベース外れ値検出」が標準実装に。
2013Leys et al."Detecting outliers: Do not use SD" 論文、 心理学界で MAD ベース判定の啓蒙。
2020s複数時系列異常検知(Hampel フィルタ)、 サイバーセキュリティで MAD 閾値が業界標準に。

🤔 なぜ 1.4826 という数字なのか — 詳細導出

正規分布 $\mathcal{N}(0, \sigma^2)$ で MAD を計算すると、 $|X - \mu|$ の中央値は $\sigma \cdot \Phi^{-1}(0.75)$ になります。 ここで $\Phi^{-1}(0.75) \approx 0.6745$ は標準正規分布の 75% 分位点。 つまり MAD $\approx 0.6745 \sigma$ なので、 $\sigma$ を回復するには:

$$\hat{\sigma} = \frac{\mathrm{MAD}}{0.6745} = 1.4826 \cdot \mathrm{MAD}$$

この $1.4826 = 1/\Phi^{-1}(0.75)$ は「MAD を SD と桁を合わせる定数」。 scipy の scale='normal' オプションで自動付与されます。 別の分布(指数分布、 t 分布、 etc.)では別の定数が必要なので、 MAD の値だけ報告するのは危険。 「MAD(正規分布調整後)」と明記する文化を推奨します。

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

業界課題MAD の活躍
サイバーセキュリティ通信量異常、 DDoS 検知中央値 ± 3·MAD でリアルタイム閾値、 SD ベースより誤警報少
金融高頻度取引、 価格急変検知MAD でロバストボラ、 リーマンショック時も SD 爆発を回避
医療画像CT/MRI のノイズ推定MAD ベースのウェーブレット閾値処理 (Donoho)、 デノイジング標準
半導体製造ウェハ上の欠陥計測、 装置不調検知Hampel フィルタで時系列単発スパイク除去、 装置メンテナンス予測
気象観測観測機器の故障検知GPS 観測の QC で MAD 閾値、 機器故障を自動排除
遺伝子発現マイクロアレイの正規化MAD ベースの dynamic range 正規化、 RMA の median polish
ニューロサイエンス脳波 (EEG) のアーチファクト除去MAD で「異常チャネル」を自動検出、 ICA 前処理
天文学CCD 画像の宇宙線ヒット除去MAD ベースの sigma clipping、 LSST 等の自動パイプライン
心理学反応時間 (RT) の外れ値処理Leys (2013) 以降、 SD ベースに代わり MAD ベースが推奨
SSDSE 解析47 都道府県の散布度「東京を除いた典型的なばらつき」を MAD で表現、 政策のためのロバスト要約

❓ 追加 FAQ — MAD で迷う 12 問

Q1. MAD は中央値からの距離?それとも平均からの距離?

A. 標準的には中央値からの距離。 平均からの距離だと MAD 自身がロバストでなくなる。 scipy の median_abs_deviation はデフォルトで中央値ベース。

Q2. MAD = 0 になったら?

A. 整数データや多くの値が同じ場合に頻発。 (1) IQR/1.349 で代替、 (2) Sn 推定量を使う、 (3) jitter を加える、 (4) MAD を使わず別のロバスト散布度(Qn 等)に切り替える。

Q3. 1.4826 を掛け忘れたらどうなる?

A. SD と比べて約 2/3 倍に小さく出る。 「3σ ルール」を MAD で適用するなら必ず 1.4826 を掛ける必要があります。 scipy の scale='normal' オプションで自動付与可能。

Q4. MAD ベース外れ値判定の「k」はいくつ?

A. 標準は $k=3$ (中央値 ± 3·MAD 外を外れ値)。 ただし Leys (2013) は文脈依存性を強調し、 $k=2.5$ から $k=3.5$ の範囲を推奨。 異常検知用途では $k=2.5$ で感度高め、 報告用なら $k=3.5$ で保守的に。

Q5. SSDSE-B-2026 で MAD を計算する例は?

A. scipy.stats.median_abs_deviation(df['A1101'], scale='normal') で 47 都道府県の総人口の MAD を計算。 SD と並べて報告すれば「東京都を含めるか除くか」の議論に直結する。

Q6. MAD は何個の外れ値まで耐えられる?

A. 破壊点 50% なので、 n=47 のうち 23 個までは耐える。 これは平均(破壊点 0%)と対照的。 SSDSE-B-2026 でも数県を強引に大きくしても MAD はほぼ動かない。

Q7. MAD と IQR、 どっちを使う?

A. 似た情報を伝える。 MAD(×1.4826)は SD と直接比較できる、 IQR/1.349 は箱ひげ図と整合する。 教科書的標準は MAD、 視覚化と一緒なら IQR。

Q8. Sn, Qn 推定量との違いは?

A. MAD の効率は 37%、 Sn は 58%、 Qn は 82%。 効率を求めるなら Qn が有利。 ただし Qn は計算量が大きく $O(n \log n)$。 普及度では MAD が圧倒。

Q9. 多変量に MAD を拡張するには?

A. 各変数で MAD を計算するだけだと variables 間の相関を無視。 MCD (Minimum Covariance Determinant) でロバスト共分散行列を推定し、 Mahalanobis 距離をロバスト化する。 sklearn の MinCovDet で実装。

Q10. MAD の標準誤差は?

A. 漸近的に $\sqrt{n}(\hat{\mathrm{MAD}} - 0.6745\sigma) \to \mathcal{N}(0, V \sigma^2)$, $V \approx 0.367$ (正規時)。 実用上はブートストラップで CI を計算するのが安全。

Q11. 時系列に MAD を使うには?

A. 移動窓 (rolling) MAD が標準。 scipy.signal.medfilt で中央値フィルタ、 残差の MAD で異常検知。 これが Hampel フィルタの基本。

Q12. MAD と SD は併用すべき?

A. はい。 両方報告し、 大きく違えば外れ値の存在を示唆。 MAD/SD 比は「正規性の目安」にも使え、 $\approx 1$ なら正規、 $\ll 1$ なら重い裾の分布、 $\gg 1$ なら離散的・段階的なデータ。

✅ MAD 実装チェックリスト 12 項目

#ステップ確認事項
1データ確認連続値か離散値か、 サンプルサイズ、 欠損
2中央値計算np.median(x)
3絶対偏差np.abs(x - np.median(x))
4MAD 計算scipy.stats.median_abs_deviation(x, scale='normal')
51.4826 確認scale='normal' が掛かっているか確認
6SD と比較MAD/SD 比で外れ値の存在を診断
7外れ値判定中央値 ± k·MAD(k=2.5-3.5)
8MAD = 0 対処離散データなら Sn 推定量、 IQR/1.349 に切替
9標準誤差ブートストラップで CI を求める
10可視化箱ひげ図、 中央値 ± k·MAD の帯を描く
11解釈「散布度のロバスト指標」と明記
12報告書での書式「Median (MAD)」形式で SD と並列に

📐 数学的詳細 — MAD の漸近理論

MAD の理論は影響関数を介して理解できます。 任意の絶対連続分布 $F$、 中位数 $\mu$、 密度 $f$ について:

$$\mathrm{MAD}(F) = F^{-1}(0.75) - F^{-1}(0.25) \text{ の半分(中央値ベース)}$$

影響関数は:

$$\mathrm{IF}(x; \mathrm{MAD}, F) = \frac{\mathrm{sign}(|x - \mu| - \mathrm{MAD}(F))}{4 f(\mu + \mathrm{MAD}(F))}$$

これは有界で、 $|x| \to \infty$ で一定値に飽和します。 つまり「巨大な外れ値が 1 つ入っても MAD は有界量しか動かない」――これが破壊点 50% の数学的裏付けです。

📊 効率(ARE)の詳細表

推定量正規時 ARE破壊点計算量
標準偏差 (SD)1.00(基準)0%$O(n)$
IQR/1.3490.3725%$O(n \log n)$
MAD(×1.4826)0.3750%$O(n \log n)$
Sn0.5850%$O(n^2)$ もしくは $O(n \log n)$
Qn0.8250%$O(n \log n)$ — Croux & Rousseeuw (1992)
τ 推定量0.95調整可$O(n)$ 反復

教科書的に「MAD の効率は 37%」と言われますが、 これは「全データが正規分布」という非現実的な仮定の下での話です。 実データで外れ値が混じっていれば SD は崩壊するので、 「実効的な効率」は MAD の方が圧倒的に高い、 というのが現代統計のコンセンサスです。

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

$x_i$
$i$ 番目の観測値(例:兵庫県の総人口 約 537 万人)
$\tilde{x} = \mathrm{median}(x_j)$
「外側の」中央値。 47 県の総人口をソートして真ん中の値を取る。 平均と違い、 東京都・大阪府が極端でも動かない。
$x_i - \tilde{x}$
「中央値からのズレ」。 平均ではなく中央値を中心に測ることがポイント。
$|x_i - \tilde{x}|$
絶対値。 二乗ではないので、 大きなズレが極端に強調されない。
$\mathrm{median}_i(|\ldots|)$
「内側」の中央値。 47 個のズレの絶対値をもう一度ソートして真ん中を取る。 これで集約も頑健に。
1.4826
正規分布のとき MAD を $\sigma$ に揃えるためのスケーリング係数。 必要なら掛ける。

中央値 → 絶対値 → 中央値、 と三段階すべてが頑健な計算なので、 MAD は外れ値に対して極めて強いのです。

🔬 シミュレーション:標準偏差 vs MAD の頑健性

「外れ値の比率を変えたとき、 標準偏差と MAD がどう動くか」をシミュレーションで確認します。

① 目的:総人口(A1101)に「巨大な外れ値」を何県ぶん混ぜると、 SD と MAD がどう壊れるかを 0〜25 県まで走査し、 破壊点 50% を実証する。
② 橋渡し:SSDSE-B-2026 を cp932・skiprows=[1] で読み、 先頭列(年度)で 2023 を選ぶと 47 都道府県 × 1 年になる。 その A1101(総人口)の 47 値を base とし、 小さい順に k 県を「基準最大値×100」の巨大値に置換して汚染する。
③ コード
📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 A1101(総人口) 北海道 5,092,000 東京都 14,086,000 沖縄県 1,468,000 …(全 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
import numpy as np
import pandas as pd
from scipy.stats import median_abs_deviation
import matplotlib.pyplot as plt

# SSDSE-B-2026 → 2023 年度・47 都道府県の総人口(A1101)を base に
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df = df[df.iloc[:, 0] == 2023]          # 先頭列 'SSDSE-B-2026' が年度
base = df['A1101'].to_numpy(dtype=float)

contam_rates = np.arange(0, 26, 1)  # 0〜25 県(最大 53%)を汚染
sd_list, mad_list = [], []

for k in contam_rates:
    arr = base.copy()
    # 小さい順に k 県を「巨大な外れ値」に置換
    idx = np.argsort(arr)[:k]
    arr[idx] = base.max() * 100
    sd_list.append(arr.std(ddof=1))
    mad_list.append(median_abs_deviation(arr, scale='normal'))

fig, ax = plt.subplots(figsize=(9, 5))
ax.plot(contam_rates, sd_list, 'r-o', label='SD')
ax.plot(contam_rates, mad_list, 'g-s', label='MAD (×1.4826)')
ax.set_xlabel('# contaminated prefectures')
ax.set_ylabel('Spread estimate (persons)')
ax.legend()
ax.set_title('Robustness of SD vs MAD under contamination')
plt.tight_layout(); plt.show()
📤 実行結果(sd_list / mad_list 抜粋) k= 0 : SD= 2,797,551 MAD= 923,661 k= 1 : SD= 205,091,649 MAD= 1,040,787 k=10 : SD= 581,421,708 MAD= 1,731,679 k=23 : SD= 709,628,564 MAD= 18,587,384 k=24 : SD= 709,569,951 MAD= 0
💬 ④ 読み取り:外れ値 1 県で SD は約 73 倍(280 万→2 億)に爆発するが、 MAD は 1.13 倍にしか動かない。 24 県(>50%)を汚染して初めて中央値が外れ値に飲み込まれ、 MAD が 0 に崩壊する — これが「破壊点 50%」の実証。

予想される結果

これが「MAD は最大 50% の汚染に耐える」の数値的証明。 実データでこの実験を行うことで、 ロバスト統計の威力を体感できます。

📜 MAD の歴史的背景

🆚 MAD の競合:他の頑健スケール推定量

「外れ値に強いばらつき指標」は MAD だけではありません。 主要な競合を一覧します:

推定量定義崩壊点正規分布での効率備考
MAD $\mathrm{median}(|x_i - \tilde{x}|)$ 50% 37% 最頻使用、 単純
IQR $Q_3 - Q_1$ 25% 37% 箱ひげ図の幅
Sn 推定量 $\mathrm{median}_i \mathrm{median}_j |x_i - x_j|$ 50% 58% MAD より効率高
Qn 推定量 $\{|x_i - x_j|; i < j\}$ の 1/4 点 50% 82% 最高効率、 ペアワイズ
Trimmed SD 上下 $\alpha$% をトリムした SD $\alpha$% 調整可 柔軟、 慎重に α を選ぶ
τ-推定量 反復重み付け SD 50% 95% 計算重い、 性能最高

使い分けの指針

SSDSE-B のような小規模データ($n = 47$)では、 計算コストの差はほぼないため Sn / Qn を使うのもおすすめ。 ただし解釈の単純さでは MAD が圧勝

🔬 シミュレーション — SD vs MAD の頑健性

MAD のシミュレーション実験:

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 A1101(総人口) 北海道 5,092,000 東京都 14,086,000 沖縄県 1,468,000 …(全 47 行)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
import numpy as np
import pandas as pd
from scipy import stats

# SSDSE-B 風の合成(教育目的)— 実際は SSDSE-B を直接使う
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
data = df[df.iloc[:, 0] == 2023]['A1101'].to_numpy(dtype=float)  # 総人口

# 1) 元データの SD / MAD
sd_orig = data.std(ddof=1)
mad_orig = 1.4826 * stats.median_abs_deviation(data)
print(f'元: SD={sd_orig:,.0f}, MAD={mad_orig:,.0f}')

# 2) 1 値を 10 倍にして外れ値を作る
data2 = data.copy()
data2[0] = data[0] * 10
sd2 = data2.std(ddof=1)
mad2 = 1.4826 * stats.median_abs_deviation(data2)
print(f'汚染: SD={sd2:,.0f} ({sd2/sd_orig:.1f}倍), MAD={mad2:,.0f} ({mad2/mad_orig:.1f}倍)')

典型結果:1 個の外れ値で SD は 2-3 倍に膨張、 MAD はほぼ不変。 これが MAD のロバスト性の実証です。

🔬 MAD の理論的背景 — なぜ 1.4826 なのか

MAD の実務利用で頻繁に登場する係数「1.4826」は、 正規分布の理論から導かれる。 この理論的背景を理解しておくと、 MAD と SD の換算がブラックボックスでなくなり、 他の頑健統計量への応用も見通しが良くなる。

📐 標準正規分布の中央絶対偏差

標準正規分布 $N(0,1)$ から無作為に得たデータ $Z$ について、 中央絶対偏差は $\mathrm{median}(|Z|) = \Phi^{-1}(0.75) \approx 0.6745$。 これは「分布の中央 50% が ±0.6745 の範囲に入る」という事実から導かれる(標準正規の第 3 四分位点)。

一般の正規分布 $N(\mu, \sigma^2)$ の場合、 MAD = $\sigma \times 0.6745$ となる。 これを逆に解くと $\sigma = \mathrm{MAD} / 0.6745 = \mathrm{MAD} \times 1.4826$ となり、 「MAD に 1.4826 を掛けると正規分布での SD(の漸近的不偏推定値)になる」という関係が得られる。

📐 漸近相対効率(ARE)の意味

MAD の SD に対する漸近相対効率は約 37%。 これは「同じ精度で散布度を推定するのに、 MAD では SD の約 2.7 倍のサンプルが必要」という意味。 効率性で劣るが、 外れ値耐性の高さがこれを補う。 純粋な正規分布データなら SD を使うべきだが、 外れ値が混じる実データでは MAD の方が真の散布度に近い推定値を出すことが多い。

📐 ブレークダウンポイント

頑健統計の重要な概念である「ブレークダウンポイント」は、 「推定量を破綻させるのに必要な外れ値の最小割合」を表す。 SD のブレークダウンポイントは 0%(1 つの極端値で破綻する)、 中央値・MAD は 50%(半数の極端値まで耐える)。 この理論的な強さが、 MAD を「最も頑健な散布度指標の 1 つ」にしている。

📐 他の頑健散布度との関係

💬 MAD は頑健統計の「入門用ツール」として最も使われているが、 効率性をさらに上げたいなら S_n や Q_n を検討する価値がある。 ただし計算の複雑さや解釈の直感性で MAD に軍配が上がることが多く、 「まず MAD、 必要に応じて高度な頑健統計量へ」が実務の定石。

📊 散布度指標の比較 — MAD vs SD vs IQR vs 範囲

散布度を測る指標は MAD だけではない。 SD(標準偏差)・IQR(四分位範囲)・範囲(max - min)・分散・変動係数など多数あり、 それぞれが異なる場面で活躍する。 ここでは代表的な散布度指標を「外れ値感受性」「効率性」「直感的解釈」「数学的扱いやすさ」の 4 軸で比較し、 どう使い分けるかを整理する。

📊 各散布度指標の特性比較

指標 定義 外れ値感受性 効率性(正規分布下) 主な用途
範囲max − min極めて高い概略確認
分散$\sum(x-\bar x)^2/(n-1)$高い最高理論計算・ANOVA
SD(標準偏差)$\sqrt{\text{分散}}$高い最高統計検定・記述統計
IQRQ3 − Q1低い箱ひげ図・外れ値判定
MADmedian(|x − median|)極めて低い37%(漸近)頑健統計・異常検知
変動係数(CV)SD / 平均高い単位なしスケール無関係比較

💡 使い分けの指針

💬 散布度指標は「データの真の姿のどの側面を見たいか」で選ぶもの。 1 つだけでなく、 SD と MAD、 IQR を並べることで、 単一指標では見えない歪み・外れ値の影響が立体的に見える。 「散布度は 1 つの数字で語れない」という前提を持つことが、 データを誠実に扱う第一歩。

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

SSDSE-B-2026 の A1101(総人口)47 県(2023 年度)の MAD を手計算で追います。

実データ方針:以下の数値はすべて SSDSE-B-2026(cp932・skiprows=[1]・2023 年度・47 都道府県)の A1101(総人口)を実際に集計した実測値です。 総人口は東京都が突出する右裾分布なので、 「中央値・MAD は典型県のばらつき、 平均・SD は東京都に引っ張られる」という MAD の効きどころがそのまま観察できます。

ステップ 1:中央値 $\tilde{x}$ を求める

47 県の総人口をソートすると、 真ん中(24 番目)の県は鹿児島県の約 154.9 万人。 正確には:

STEP 1 総人口の中央値
$\tilde{x} = \mathrm{median}(\mathrm{A1101}) = \mathbf{1{,}549{,}000 \text{ 人}}$
(SSDSE-B-2026, 2023 年度・47 都道府県で実値計算)

ステップ 2:各県のズレ $|x_i - \tilde{x}|$ を計算

都道府県$x_i$(万人)$x_i - \tilde{x}$(万人)$|x_i - \tilde{x}|$(万人)
東京都1408.6+1253.71253.7
神奈川県922.9+768.0768.0
大阪府876.3+721.4721.4
愛知県747.7+592.8592.8
奈良県129.6−25.325.3
島根県65.0−89.989.9
鳥取県53.7−101.2101.2
…(残り 40 県)…

ステップ 3:絶対偏差の中央値を取る

STEP 2 47 個の絶対偏差をソートして真ん中
47 個の $|x_i - \tilde{x}|$ をソートすると、 中央値(24 番目)は
$\mathrm{MAD} = \mathbf{623{,}000 \text{ 人}}$(約 62.3 万人)

ステップ 4:標準偏差と比べてみる

指標解釈
平均 $\bar{x}$約 264.6 万人東京都・大阪府が引っ張り上げる
中央値 $\tilde{x}$154.9 万人「典型的な県」の実像
標準偏差 $\sigma$約 279.8 万人東京都 1 県でほぼ決まる
MAD62.3 万人典型的な県のばらつき
$1.4826 \times \mathrm{MAD}$≈92.4 万人外れ値除外後の「擬似 $\sigma$」

解釈:標準偏差 約 280 万人 vs MAD 由来の擬似 $\sigma$ 約 92 万人 — 3 倍の差! 「都道府県の総人口の典型的なばらつきは何人か」と聞かれたら、 標準偏差は東京都 1 県の影響を全面に押し出して 280 万人と答え、 MAD は外れ値を抑えて 60〜90 万人と答えます。 どちらが「正しい」かは目的次第ですが、 「典型的な県の姿」を知りたいなら MAD が圧倒的に妥当。

🧮 1.4826 という数字はどこから来たか

「MAD を $\sigma$ に変換するには 1.4826 を掛ければよい」 — このマジックナンバーの正体を導出します。

導出

標準正規分布 $X \sim N(0, 1)$ について:

  1. 中央値 $\mathrm{median}(X) = 0$(対称なので明らか)
  2. $|X|$ の中央値は何か? ⇒ $P(|X| \le m) = 0.5$ となる $m$ を求める
  3. $P(-m \le X \le m) = 0.5$ より、 $P(X \le m) - P(X \le -m) = 0.5$
  4. 対称性より $P(X \le m) - (1 - P(X \le m)) = 0.5 \Rightarrow P(X \le m) = 0.75$
  5. つまり $m = \Phi^{-1}(0.75) = 0.6745$

よって標準正規では MAD = 0.6745。 一般の $N(\mu, \sigma^2)$ では:

$$\mathrm{MAD}(X) = 0.6745\sigma \quad \Longleftrightarrow \quad \sigma = \frac{1}{0.6745} \mathrm{MAD} = 1.4826 \, \mathrm{MAD}$$
この $1/\Phi^{-1}(0.75) \approx 1.4826$ が一致性補正係数。

他の分布での補正係数

分布MAD と SD の関係補正係数
正規分布$\mathrm{MAD} = 0.6745\sigma$1.4826
ラプラス分布$\mathrm{MAD} = b \ln 2 \approx 0.693 b$, $\sigma = b\sqrt{2}$$\sqrt{2}/\ln 2 \approx 2.041$
一様分布 $[0,1]$$\mathrm{MAD} = 0.25$, $\sigma = 1/\sqrt{12}$$1/(\sqrt{12} \cdot 0.25) \approx 1.155$
指数分布 $\mathrm{Exp}(\lambda)$非対称なので注意場面依存

教訓:1.4826 は 「正規分布の場合」に限定された数字。 他の分布では別の補正係数を使うか、 MAD そのものを報告する方が誤解を生まない。

🎯 SSDSE-B 都道府県データでの MAD 完全ワークフロー

「47 都道府県の総人口(A1101, 2023 年度)の分布を、 ロバスト統計で要約する」フル工程:

ステップ 1:データ読み込みと基本統計

① 目的:総人口(A1101)の基本統計を平均・中央値・SD・MAD・IQR まで一気に並べ、 「平均寄り」と「中央値寄り」の指標の食い違いを可視化する。
② 橋渡し:cp932・skiprows=[1] で読み、 先頭列(年度)で 2023 を選ぶと 47 都道府県 × 1 年。 その A1101pop として使う。
③ コード
📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 A1101(総人口) 北海道 5,092,000 東京都 14,086,000 沖縄県 1,468,000 …(全 47 行)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import pandas as pd
import numpy as np
from scipy.stats import median_abs_deviation

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df = df[df.iloc[:, 0] == 2023]        # 先頭列 'SSDSE-B-2026' が年度
pop = df['A1101'].to_numpy(dtype=float)  # A1101 = 総人口

# 基本統計
print(f"n        = {len(pop)}")
print(f"Mean     = {pop.mean():,.0f}")
print(f"Median   = {np.median(pop):,.0f}")
print(f"SD       = {pop.std(ddof=1):,.0f}")
print(f"MAD (raw)= {median_abs_deviation(pop):,.0f}")
print(f"MAD×1.48 = {median_abs_deviation(pop, scale='normal'):,.0f}")
print(f"IQR      = {np.percentile(pop, 75) - np.percentile(pop, 25):,.0f}")
📤 実行結果 n = 47 Mean = 2,645,809 Median = 1,549,000 SD = 2,797,551 MAD (raw)= 623,000 MAD×1.48 = 923,661 IQR = 1,602,500
💬 ④ 読み取り:平均 264.6 万人 > 中央値 154.9 万人(右裾ぶんだけ平均が上振れ)。 SD 279.8 万人は MAD×1.4826=92.4 万人の 3 倍で、 外れ値が SD を膨らませていることが数値で分かる。

ステップ 2:標準偏差 vs MAD の感受性テスト

① 目的:東京都を「除く/10 倍にする」二つの操作で、 SD と MAD のどちらが揺れるかを直接比べる。
② 橋渡し:直前で作った pop(総人口 47 値)と df['Prefecture'] を使う。
③ コード
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 「東京都を除いたとき」「東京都を 10 倍にしたとき」を比較
mask_tokyo = df['Prefecture'].values == '東京都'
pop_no_tokyo = pop[~mask_tokyo]
pop_tokyo10 = pop.copy()
pop_tokyo10[mask_tokyo] *= 10

print("           SD            MAD")
print(f"Original :  {pop.std():>10,.0f}   {median_abs_deviation(pop):>10,.0f}")
print(f"−Tokyo   :  {pop_no_tokyo.std():>10,.0f}   {median_abs_deviation(pop_no_tokyo):>10,.0f}")
print(f"Tokyo×10 :  {pop_tokyo10.std():>10,.0f}   {median_abs_deviation(pop_tokyo10):>10,.0f}")

# 結果:SD は東京都 1 県だけで数倍動く、 MAD は不変
📤 実行結果 SD MAD Original : 2,767,630 623,000 −Tokyo : 2,217,942 588,500 Tokyo×10 : 20,100,992 623,000
💬 ④ 読み取り:東京都を 10 倍にすると SD は約 7 倍(280 万→2010 万)に跳ねるが、 MAD は 623,000 のまま完全に不変。 中央値ベースだから極端値の大きさに一切反応しない。

ステップ 3:可視化で確認

① 目的:総人口の分布ヒストグラムと、 「中央値±2 MAD-σ」「平均±2 SD」の帯を重ねて、 どちらの帯が典型県を素直に囲むかを見る。
② 橋渡し:直前の pop(総人口 47 値)を使う。 描画のため matplotlib を読み込む。
③ コード
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import matplotlib.pyplot as plt

fig, axes = plt.subplots(1, 2, figsize=(14, 5))

# 左:分布全体(東京都込み)
axes[0].hist(pop, bins=20, color='steelblue', edgecolor='white')
axes[0].axvline(pop.mean(), color='red', lw=2, label=f'Mean = {pop.mean()/1e6:.2f}M')
axes[0].axvline(np.median(pop), color='green', lw=2, label=f'Median = {np.median(pop)/1e6:.2f}M')
axes[0].legend(); axes[0].set_title('Population (with Tokyo)')

# 右:±MAD と ±SD の比較
axes[1].scatter(range(47), sorted(pop), color='gray', alpha=0.6)
mid = np.median(pop); mad = median_abs_deviation(pop, scale='normal'); sd = pop.std()
axes[1].axhspan(mid - 2*mad, mid + 2*mad, alpha=0.2, color='green', label='±2 MAD-σ')
axes[1].axhspan(pop.mean() - 2*sd, pop.mean() + 2*sd, alpha=0.2, color='red', label='±2 SD')
axes[1].legend(); axes[1].set_title('SD vs MAD intervals')
plt.tight_layout(); plt.show()
📤 実行結果(帯の範囲) 中央値±2 MAD-σ : [ -298,322 , 3,396,322 ] 幅 約 370 万 平均 ±2 SD : [-2,889,452 , 8,181,069 ] 幅 約 1107 万
💬 ④ 読み取り:平均±2 SD の帯は幅 1100 万人超で下限がマイナスに突き抜け、 典型県を囲むには広すぎる。 中央値±2 MAD-σ の帯(幅 約 370 万)の方が大多数の県を素直に囲み、 上位大都市だけを外側に置く。

ステップ 4:MAD ベースの標準化(外れ値検出)

① 目的:Modified z-score $M_i=0.6745(x_i-\tilde{x})/\mathrm{MAD}$ で、 総人口の「ロバスト外れ値」県を $|M|>3.5$ 基準で抽出する。
② 橋渡し:直前の popdf(Prefecture, A1101 列)を使う。
③ コード
1
2
3
4
5
6
7
8
9
# Modified z-score で外れ値検出
median = np.median(pop)
mad = median_abs_deviation(pop)
df['mod_z'] = 0.6745 * (pop - median) / mad

# |M| > 3.5 のものを外れ値として表示
outliers = df[np.abs(df['mod_z']) > 3.5].sort_values('mod_z', ascending=False)
print("Outlier prefectures by MAD:")
print(outliers[['Prefecture', 'A1101', 'mod_z']])
📤 実行結果 Outlier prefectures by MAD: Prefecture A1101 mod_z 東京都 14086000 13.57 神奈川県 9229000 8.31 大阪府 8763000 7.81 愛知県 7477000 6.42 埼玉県 7331000 6.26 千葉県 6257000 5.10 兵庫県 5370000 4.14 福岡県 5103000 3.85 北海道 5092000 3.84
💬 ④ 読み取り:$|M|>3.5$ で 9 都道県が外れ値判定。 通常の $z$(SD ベース)では東京都しか捕まらない(次のステップ 4 で検証)ので、 MAD ベースの方が大都市圏を漏れなく拾える。

ステップ 5:複数変数を MAD で標準化

① 目的:単位の異なる 4 指標を MAD ベースで標準化し、 「どの指標かに関わらず最も外れている県」を Modified z の最大絶対値で並べる。
② 橋渡し:2023 年度の df から実在 4 列(総人口・高齢人口・消費支出・一般診療所数)を選ぶ。
③ コード
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 主要 4 変数を MAD ベースで標準化(スケール統一)
cols = ['A1101', 'A1303', 'L3221', 'I5102']  # 総人口・高齢人口・消費支出・一般診療所数
df_scaled = df[cols].copy()

for c in cols:
    med = df[c].median()
    mad = median_abs_deviation(df[c])
    df_scaled[c] = 0.6745 * (df[c] - med) / mad

# Modified z 値が大きい県をピックアップ
df_scaled['max_abs_z'] = df_scaled[cols].abs().max(axis=1)
df_scaled['Prefecture'] = df['Prefecture']
print(df_scaled.sort_values('max_abs_z', ascending=False).head(10))
📤 実行結果(max_abs_z 上位 10) Prefecture A1101 A1303 L3221 I5102 max_abs_z 東京都 13.57 9.47 2.00 18.62 18.62 大阪府 7.81 6.71 -1.45 10.33 10.33 神奈川県 8.31 6.59 0.29 7.96 8.31 愛知県 6.42 4.94 -0.02 5.94 6.42 埼玉県 6.26 5.25 2.14 4.35 6.26 兵庫県 4.14 3.83 -1.02 5.27 5.27 千葉県 5.10 4.35 0.31 3.54 5.10 福岡県 3.85 3.28 0.41 4.73 4.73 北海道 3.84 4.09 -0.19 2.80 4.09 愛媛県 -0.28 -0.29 -3.81 -0.27 3.81
💬 ④ 読み取り:東京都は一般診療所数(I5102)で M=18.62 と突出。 消費支出(L3221, 1 世帯あたり)は人口とは無関係にばらつくので符号が反転する県(愛媛県 −3.81)も出る。 MAD 標準化なら単位の違う指標を同じ物差しで並べられる。

🧮 SSDSE-B-2026 で MAD を計算する — 47 都道府県の散布度

SSDSE-B-2026 で人口・出生数・医療費の MAD を計算し、 SD と比較してみます。 東京・大阪のような巨大値が SD を肥大化させるのに対し、 MAD は安定していることが確認できます。

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 A1101(総人口) A4101(出生数) 北海道 5,092,000 24,430 東京都 14,086,000 86,348 沖縄県 1,468,000 12,549 …(全 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
31
32
33
34
# SSDSE-B-2026 で MAD と SD を比較
import pandas as pd
import numpy as np
from scipy.stats import median_abs_deviation

df = pd.read_csv('data/raw/SSDSE-B-2026.csv',
                 encoding='cp932',
                 skiprows=[1])
df = df[df.iloc[:, 0] == 2023]  # 2023 年度・47 都道府県

# 各指標について SD と MAD を計算
for col in ['A1101','A4101']:  # 総人口・出生数
    x = df[col].astype(float).values
    mean = np.mean(x)
    sd = np.std(x, ddof=1)
    median = np.median(x)
    mad = median_abs_deviation(x, scale='normal')  # ×1.4826 自動付与
    cv_sd = sd / mean
    cv_mad = mad / median
    print(f'{col}:')
    print(f'  平均={mean:10.0f}  SD={sd:10.0f}  CV(SD)={cv_sd:.3f}')
    print(f'  中央値={median:8.0f}  MAD={mad:8.0f}  CV(MAD)={cv_mad:.3f}')
    print(f'  SD/MAD 比 = {sd/mad:.2f} (1.0 なら正規、 >1.5 なら外れ値あり)')
    print()

# 外れ値検出
for col in ['A1101']:  # 総人口
    x = df[col].astype(float).values
    median = np.median(x)
    mad = median_abs_deviation(x, scale='normal')
    z_mad = (x - median) / mad
    outliers = df[np.abs(z_mad) > 3.0][['Prefecture', col]]
    print(f'{col} の外れ値県(|MAD-Z| > 3.0):')
    print(outliers.to_string(index=False))

このコードは総人口(A1101)・出生数(A4101)両方で SD/MAD 比を計算します(総人口 3.03、 出生数 2.78)。 通常 1 に近ければ正規分布、 1.5 以上なら外れ値あり。 SSDSE-B-2026 の総人口では SD/MAD 比が 3 を超え、 東京都・神奈川県・大阪府をはじめ 9 都道県が「MAD-Z > 3」で自動検出されます。 これは政策議論で「典型県」と「異常値」を区別する強力な道具です。

🧮 数式に値を入れて手で計算する: 中央絶対偏差 (MAD)

合成データ [2, 4, 7, 5, 3, 7, 9] で MAD を計算する。

Step 1: 中央値

合成データ [2, 4, 7, 5, 3, 7, 9] の手計算 ソート: [2, 3, 4, 5, 7, 7, 9] 合成データの中央値 = 5

Step 2: 偏差の絶対値とその中央値

合成データ [2, 4, 7, 5, 3, 7, 9] の手計算 (続き) |x - 5| = [3, 1, 1, 0, 2, 2, 4] ソート: [0, 1, 1, 2, 2, 3, 4] MAD (偏差の絶対値の中央値) = 2

Step 3: 標準偏差近似 (k=1.4826)

σ̂ = 1.4826 × 2 ≈ 2.965

🐍 Python で再現

1
2
3
4
5
6
7
import numpy as np
x = np.array([2, 4, 7, 5, 3, 7, 9])
med = np.median(x)
mad = np.median(np.abs(x - med))
print(f"中央値: {med}")
print(f"MAD: {mad}")
print(f"σ̂: {1.4826 * mad:.3f}")

📤 実行結果

中央値: 5.0 MAD: 2.0 σ̂: 2.965

💬 手計算 (Step 2,3) と Python 出力が完全一致。

🐍 Python 実装

1. scipy.stats — 標準的な実装

入力:SSDSE-B-2026 を cp932・skiprows=[1] で読み、 先頭列(年度)で 2023 を選んだ 47 都道府県の A1101(総人口)。 これを pop として生 MAD・正規化 MAD・SD・中央値・平均を並べる。
📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 A1101(総人口) 北海道 5,092,000 東京都 14,086,000 沖縄県 1,468,000 …(全 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
import pandas as pd
import numpy as np
from scipy.stats import median_abs_deviation

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df = df[df.iloc[:, 0] == 2023]        # 先頭列 'SSDSE-B-2026' が年度
pop = df['A1101'].to_numpy(dtype=float)  # A1101 = 総人口

# 生の MAD(スケール補正なし)
mad_raw = median_abs_deviation(pop)
print(f"MAD (raw)         = {mad_raw:,.0f}")

# 正規分布補正された MAD(σ の頑健推定)
mad_normal = median_abs_deviation(pop, scale='normal')
print(f"MAD (normalized)  = {mad_normal:,.0f}")

# 比較用:通常の標準偏差
sd = pop.std(ddof=1)
print(f"Standard deviation = {sd:,.0f}")

# 中央値
median_val = np.median(pop)
print(f"Median = {median_val:,.0f}")
print(f"Mean   = {pop.mean():,.0f}")
📤 実行結果 MAD (raw) = 623,000 MAD (normalized) = 923,661 Standard deviation = 2,797,551 Median = 1,549,000 Mean = 2,645,809
💬 読み方:生 MAD 62.3 万人を 1.4826 倍すると 92.4 万人(σ の頑健推定)。 SD 279.8 万人はこの 3 倍で、 外れ値が SD を膨らませている。

2. statsmodels — ロバスト統計の決定版

目的:statsmodels の robust.mad() で総人口の MAD を求め、 scipy 版と一致することを確認する。
入力:直前で作った pop(2023 年度・47 都道府県の総人口 A1101)と、 PrefectureA1101 列を持つ df を再利用する。
1
2
3
4
5
6
7
from statsmodels import robust

mad = robust.mad(pop)        # デフォルトで正規化される
mad_raw = robust.mad(pop, c=1.0)  # 生の MAD

print(f"robust.mad()      = {mad:,.0f}  (= 1.4826 × raw)")
print(f"robust.mad(c=1.0) = {mad_raw:,.0f}")
📤 実行結果 robust.mad() = 923,661 (= 1.4826 × raw) robust.mad(c=1.0) = 623,000
💬 読み方:statsmodels の robust.mad() は既定で 1.4826 倍済み(923,661)。 scipy の median_abs_deviation(pop, scale='normal') と一致する。

3. 標準偏差 vs MAD — 外れ値の影響を比較

目的:東京都を除くと平均・SD・中央値・MAD がそれぞれどれだけ動くかを一覧し、 頑健指標と非頑健指標を対比する。
入力:直前で作った pop(2023 年度・47 都道府県の総人口 A1101)と、 PrefectureA1101 列を持つ df を再利用する。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 東京都を除いた場合、 どれだけ動くか?
pop_excl_tokyo = pop[df['Prefecture'].values != '東京都']

print("          With Tokyo  Without Tokyo  Change")
print(f"Mean    : {pop.mean():>10,.0f}  {pop_excl_tokyo.mean():>11,.0f}  {100*(pop_excl_tokyo.mean()/pop.mean()-1):+.1f}%")
print(f"SD      : {pop.std():>10,.0f}  {pop_excl_tokyo.std():>11,.0f}  {100*(pop_excl_tokyo.std()/pop.std()-1):+.1f}%")
print(f"Median  : {np.median(pop):>10,.0f}  {np.median(pop_excl_tokyo):>11,.0f}")
print(f"MAD     : {median_abs_deviation(pop):>10,.0f}  {median_abs_deviation(pop_excl_tokyo):>11,.0f}")

# 期待される結果:
# Mean / SD は東京都を抜くと大きく変動(数十%)
# Median / MAD は東京都を抜いてもほぼ変わらない(数%以内)
📤 実行結果 With Tokyo Without Tokyo Change Mean : 2,645,809 2,397,109 -9.4% SD : 2,767,630 2,217,942 -19.9% Median : 1,549,000 1,508,500 MAD : 623,000 588,500
💬 読み方:東京都を抜くと SD は −19.9% と大きく縮むが、 MAD は 623,000→588,500(−5.5%)とほぼ不動。 「中央値・MAD は典型県を、 平均・SD は外れ値を映す」ことが実データで確認できる。

4. MAD ベースの外れ値判定

目的:Modified z-score で総人口の外れ値県を抽出し、 SD ベースの古典的 z との検出数の差を見る。
入力:直前で作った pop(2023 年度・47 都道府県の総人口 A1101)と、 PrefectureA1101 列を持つ df を再利用する。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# Modified z-score で外れ値を検出
def modified_z_score(x):
    median = np.median(x)
    mad = median_abs_deviation(x)
    return 0.6745 * (x - median) / mad

mz = modified_z_score(pop)
df['mod_z'] = mz
outliers = df[np.abs(mz) > 3.5]
print("Outlier prefectures (|Modified z| > 3.5):")
print(outliers[['Prefecture', 'A1101', 'mod_z']])

# 通常の z 値と比較
z = (pop - pop.mean()) / pop.std()
print("\nClassical outliers (|z| > 3):")
print(df[np.abs(z) > 3][['Prefecture', 'A1101']])
📤 実行結果 Outlier prefectures (|Modified z| > 3.5): Prefecture A1101 mod_z 北海道 5092000 3.84 埼玉県 7331000 6.26 千葉県 6257000 5.10 東京都 14086000 13.57 神奈川県 9229000 8.31 愛知県 7477000 6.42 大阪府 8763000 7.81 兵庫県 5370000 4.14 福岡県 5103000 3.85 Classical outliers (|z| > 3): Prefecture A1101 東京都 14086000
💬 読み方:MAD ベースは 9 都道県を外れ値判定するのに対し、 SD ベースの $|z|>3$ は東京都 1 県しか拾えない(masking 効果)。 外れ値検出では MAD の方が漏れが少ない。

5. 自分で書く(教育目的)

目的:MAD を numpy だけで自作し、 ライブラリ実装と値が一致することを確かめる(教育目的)。
入力:直前で作った pop(2023 年度・47 都道府県の総人口 A1101)と、 PrefectureA1101 列を持つ df を再利用する。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import numpy as np

def my_mad(x, normalize=True):
    """中央絶対偏差を計算する素朴な実装"""
    x = np.asarray(x)
    median = np.median(x)
    mad = np.median(np.abs(x - median))
    if normalize:
        mad *= 1.4826
    return mad

print(my_mad(pop))                # 正規化あり(×1.4826)
print(my_mad(pop, normalize=False))  # 生の MAD
📤 実行結果 923659.8 623000.0
💬 読み方:素朴な自作実装でも scipy と一致(正規化 923,659.8、 生 623,000)。 MAD の中身は「中央値からの絶対偏差の中央値」だけで、 数行で書ける。

🐍 MAD の Python 実装パターン — 4 連発

🔬 数式を言葉で読み解く

MAD の定義 $\mathrm{MAD} = \mathrm{median}(|x_i - \mathrm{median}(x)|)$ は、 「中央値からの距離の中央値」 という二段中央値構造です。 平均と SD が外れ値で歪むのに対し、 中央値ベースの MAD は 50% まで汚染されても破綻しない頑健性を持ちます。 SSDSE-B-2026 の出生数(A4101)で実装し、 SD との違いを確認します。

① このコードでやること:SSDSE-B-2026 から出生数(A4101)を読み、 中央値・MAD・SD を計算して並べます。

📥 入力データ(SSDSE-B-2026 抜粋):

Code Prefecture A4101(2023) R01000 北海道 24430 R13000 東京都 86348 R47000 沖縄県 12549
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import pandas as pd
import numpy as np
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df = df[df.iloc[:, 0] == 2023]; x = df['A4101'].to_numpy(dtype=float)  # 2023・出生数
med = np.median(x)
mad = np.median(np.abs(x - med))
sd = x.std(ddof=1)
print(f'median = {med:,.0f}')
print(f'MAD    = {mad:,.0f}')
print(f'SD     = {sd:,.0f}')
print(f'SD / MAD = {sd / mad:.2f}')

📤 実行例:

median = 9,524 MAD = 4,159 SD = 17,155 SD / MAD = 4.12

💬 SD/MAD=4.12 は外れ値の影響で SD が膨らんでいることを示す(正規分布なら SD≈1.4826×MAD なので比は約 1.5)。 東京都(出生数 86,348)が SD を引き上げています。

② このコードでやること:MAD を正規分布相当のスケールに変換し、 σ ベースの SD と直接比較します。

📥 入力データ:直前の x, mad, sd。

1
2
3
4
5
6
7
from scipy import stats
mad_scaled = 1.4826 * mad
mad_scipy = stats.median_abs_deviation(x, scale='normal')
print(f'1.4826 * MAD     = {mad_scaled:,.0f}')
print(f'scipy MAD(normal)= {mad_scipy:,.0f}')
print(f'SD               = {sd:,.0f}')
print(f'SD / (1.4826*MAD)= {sd / mad_scaled:.2f}')

📤 実行例:

1.4826 * MAD = 6,166 scipy MAD(normal)= 6,166 SD = 17,155 SD / (1.4826*MAD)= 2.78

💬 SD/(1.4826*MAD)=2.7 と 1 から大きく乖離 → 「正規分布ならこの比は 1 になる」のに 2.8 倍。 SSDSE-B の出生数は明確に裾の重い分布であることを定量的に確認できます。

③ このコードでやること:Modified z-score $M_i = 0.6745 (x_i - \mathrm{median})/\mathrm{MAD}$ で外れ値検出し、 |M|>3.5 の都道府県を一覧します。

📥 入力データ:x, med, mad。

1
2
3
4
5
M = 0.6745 * (x - med) / mad
out = df.loc[np.abs(M) > 3.5, ['Prefecture', 'A4101']].copy()
out['M_score'] = M[np.abs(M) > 3.5]
print(f'detected outliers: {len(out)} prefectures')
print(out.to_string(index=False))

📤 実行例:

detected outliers: 8 prefectures Prefecture A4101 M_score 埼玉県 42108 5.28 千葉県 35658 4.24 東京都 86348 12.46 神奈川県 53991 7.21 愛知県 48402 6.31 大阪府 55292 7.42 兵庫県 32615 3.74 福岡県 33942 3.96

💬 出生数では 8 都県が |M|>3.5 で検出。 東京都の M=12.46 は通常の z-score(SD ベース)なら masking 効果で過小評価されがちですが、 MAD ベースなら正しく強調されます。

④ このコードでやること:MAD と IQR を比較し、 頑健散布度の冗長性を確認します。

📥 入力データ:x。

1
2
3
4
5
6
7
8
q1, q3 = np.percentile(x, [25, 75])
iqr = q3 - q1
mad_n = 1.4826 * mad
iqr_n = iqr / 1.349
print(f'IQR              = {iqr:,.0f}')
print(f'IQR / 1.349      = {iqr_n:,.0f}  (normal-scaled)')
print(f'1.4826 * MAD     = {mad_n:,.0f}  (normal-scaled)')
print(f'ratio MAD/IQR_n  = {mad_n / iqr_n:.3f}')

📤 実行例:

IQR = 8,918 IQR / 1.349 = 6,611 (normal-scaled) 1.4826 * MAD = 6,166 (normal-scaled) ratio MAD/IQR_n = 0.933

💬 MAD と IQR/1.349 が近い(比 0.933)。 「中央 50%」 と 「中央値からの距離の中央値」 という独立な観点からほぼ同じ散布度に到達 → 頑健散布度として MAD が妥当である強い証拠。

⚠️ 落とし穴

① 「MAD」という同名の別概念に注意
MAD は実は2 種類あります。 (a) Median Absolute Deviation(中央絶対偏差、 このページ)、 (b) Mean Absolute Deviation(平均絶対偏差、 $\frac{1}{n}\sum|x_i - \bar{x}|$)。 後者は外れ値耐性が中央絶対偏差より弱い。 論文や教科書で「MAD」とあったら必ず定義を確認する。 統計実務での標準は(a) 中央絶対偏差
② スケール補正係数 1.4826 を忘れる
生の MAD と 1.4826 倍した MAD は値が全く違う。 ライブラリによってデフォルトの挙動が異なる
scipy.stats.median_abs_deviation(x) → 生(デフォルト)
scipy.stats.median_abs_deviation(x, scale='normal') → 1.4826 倍
statsmodels.robust.mad(x) → 1.4826 倍(デフォルト)
論文で MAD を報告するときはどちらか明記すること。
③ 1.4826 は「正規分布」前提
$1.4826 \times \mathrm{MAD} \approx \sigma$ という関係は、 データが正規分布に従うときのみ厳密。 ポアソン分布や指数分布などでは、 補正係数は別の値になる。 そもそも非正規分布で MAD を使うときは、 $\sigma$ に変換せずMAD そのものを報告するのが安全。
④ 効率は標準偏差より低い
MAD はロバストさと引き換えに統計的効率を失う。 正規分布の下では、 MAD の漸近相対効率(ARE)は約 37%。 つまり「同じ精度で $\sigma$ を推定するのに、 標準偏差なら $n$、 MAD なら $n/0.37 \approx 2.7n$」のデータが必要。 サンプルが少ない場合は、 トリム平均や M 推定量とのバランスを検討。
⑤ 完全に同じ値が多いと MAD = 0 になる
離散データや整数値で、 半数以上の値が同じだと、 中央値からの絶対偏差の中央値が 0 になる。 例:成績データで「ほぼ全員 80 点」の場合、 MAD = 0。 これでは外れ値判定や標準化ができない。 そういうときは、 ε(小さな値)を加える、 IQR ベースに切り替えるなどの対処が必要。

⚠️ MAD の追加的落とし穴(8 個)

📑 MAD 関連の主要文献

⚠ よくある誤用 8 選

誤用問題点正しい対処
1.4826 を忘れるSD と桁が違い、 外れ値判定が誤るscale='normal' を明示
平均からの距離で MADロバスト性が消失必ず中央値からの距離
MAD = 0 を放置外れ値判定が全データを排除Sn 推定量、 IQR/1.349 に切替
k=3 を機械的に使う分野・目的を無視した一律判定Leys (2013) を参考に k=2.5-3.5 から選ぶ
非正規データに 1.4826他の分布では別の調整定数が必要分布を明示、 必要なら経験的調整
時系列で固定 MAD 閾値非定常性で古い閾値が無効に移動窓 MAD、 Hampel フィルタ
多変量に個別 MAD変数間相関を無視、 masking 発生MCD で多変量ロバスト
SD と MAD を混同「SD」のラベルで MAD を出して報告必ず「MAD(正規調整後)」と書く

📔 MAD 関連ミニ用語集 30

MAD (Median Absolute Deviation)
中央値からの絶対偏差の中央値。 ロバスト散布度の代表。
MAD_n(一般版)
scale factor を分布依存にした MAD。 正規以外の分布で使う。
1.4826
正規分布で MAD を SD に換算する定数。 $1/\Phi^{-1}(0.75)$。
0.6745
標準正規分布の 75% 分位点。 MAD = 0.6745σ。
Breakdown point(破壊点)
推定量が崩壊するまでの汚染率。 MAD は 50%。
Influence Function (IF)
1 点が推定量に与える影響。 MAD のものは有界で階段状。
Asymptotic Relative Efficiency (ARE)
「正規時の効率の比」。 MAD vs SD は 0.37。
Sn 推定量
Rousseeuw & Croux (1993)。 効率 58%、 破壊点 50%。
Qn 推定量
Rousseeuw & Croux (1993)。 効率 82%、 破壊点 50%。 高効率のロバスト散布度。
τ 推定量
Yohai & Zamar (1988)。 効率 95%、 反復計算。
IQR (Interquartile Range)
四分位範囲 = Q3 - Q1。 正規時 1.349σ。
Hampel フィルタ
移動窓 MAD ベースの時系列スパイク除去フィルタ。
3 シグマルール
平均 ± 3 SD で 99.7% カバー。 ロバスト版は中央値 ± 3·MAD。
Modified Z-score
$0.6745 \cdot (x - \mathrm{median}) / \mathrm{MAD}$。 MAD ベースの標準化。
Sigma clipping
天文学で popular な反復的外れ値除去。 MAD ベース版が現代的。
Robust scale estimator
ロバスト散布度の総称。 MAD, Sn, Qn, τ などが含まれる。
Median polish
Tukey の二元表分析。 行・列の中央値で繰り返し補正。
Tukey hinge
Tukey 版の四分位数。 通常の Q1/Q3 と微妙に違う。
Fivenum summary
min, Q1, median, Q3, max の 5 値要約。 箱ひげ図の基礎。
M-estimator scale
M 推定における散布度推定量。 MAD が初期値・標準として使われる。
Huber 's Proposal 2
Huber (1964) のスケール推定法。 MAD と組み合わせて使う。
Centered MAD
中央値ベースの MAD。 標準的な定義。
Mean Absolute Deviation
平均からの絶対偏差の平均。 名前は似るが MAD とは別物(ロバストでない)。
Bisquare scale
Tukey biweight ベースのスケール推定量。 MAD より高効率。
MCD (Minimum Covariance Determinant)
多変量ロバスト共分散行列推定。 MAD の多変量版。
Outlier detection
外れ値検出。 MAD ベース閾値が現代標準。
Wavelet denoising
Donoho の MAD ベース閾値。 信号処理での MAD 応用。
Mahalanobis 距離
多変量距離。 ロバスト版は MCD ベースで計算。
RMA (Robust Multi-array Average)
マイクロアレイ正規化アルゴリズム。 median polish 使用。
SD (Standard Deviation)
標準偏差。 平均ベースの散布度。 MAD のライバル。

⚠️ 条件・限界・誤解回避 — 中央絶対偏差(MAD)の実務

MAD(Median Absolute Deviation)は外れ値に頑健な散布度の代表的指標で、 標準偏差(SD)の代替として広く使われる。 ただし「頑健 = 万能」ではなく、 適用条件・分布仮定・スケーリングを理解しないと、 誤った散布度比較や閾値設定の根拠になり得る。 SSDSE-B-2026 を例に注意点を整理する。

📐 適用条件(MAD が散布度の妥当な指標となる前提)

  1. 中央値が代表値として意味を持つ: MAD は中央値からの絶対偏差の中央値。 中央値自体がデータの中心として妥当でない(多峰分布等)なら、 MAD も散布度として意味が薄い。
  2. 連続変数または順序変数: 名義変数(カテゴリ)では中央値・絶対偏差が定義できないため適用不可。
  3. 標本サイズ N ≥ 10 程度: 中央値の安定性に標本サイズが効くため、 N < 10 では MAD の値も大きく揺れる。 SSDSE-B-2026(N=47)は十分。
  4. 正規分布近似で SD と比較する場合は係数 1.4826 を掛ける: MAD × 1.4826 が正規分布での SD の不偏推定(漸近的)。 この係数を忘れると比較が歪む。
  5. 外れ値の定義に閾値を使うなら「median ± k×MAD」: k=2.5〜3 が経験則。 SD ベースの「mean ± 3σ」は外れ値で歪むので避ける。

🚧 限界(MAD で解けない問題)

  1. 効率性で SD に劣る(正規分布下では): 正規データでは SD の方が分散が小さい推定量。 MAD の漸近相対効率は約 37%。 外れ値が無いことが分かっているなら SD を使うべき。
  2. 離散データで「同じ値」が多いと MAD = 0 になる: 例: 二値変数で多くが 0、 一部が 1 のとき MAD = 0。 散布度がゼロでも実際にはばらつきがあるので別指標(IQR、 エントロピー)が必要。
  3. 非対称分布では中央値の解釈に注意: 歪度が大きい分布では、 中央値からの偏差を上下対称に扱うのが妥当でない場合がある。 上側 MAD / 下側 MAD に分けることがある。
  4. 多変量化が難しい: 多変量の頑健散布度は MCD(Minimum Covariance Determinant)等が必要。 単変量 MAD を変数ごとに見るだけでは多変量構造は捉えられない。
  5. 標準誤差の計算が複雑: MAD の標準誤差は SD の SE よりブートストラップ等の数値計算に頼ることが多い。

💡 誤解回避(MAD 運用で陥りがちな勘違い)

  1. 「MAD = SD」と誤って解釈: MAD と SD はスケールが違う。 正規分布下では SD ≈ 1.4826 × MAD。 この係数を掛けないで比較すると「MAD は SD より小さい」と誤判定する。
  2. 「MAD は外れ値があっても変わらない」も誤り: MAD は外れ値に頑健だが完全に不変ではない。 外れ値の割合が 50% を超えると中央値そのものが崩れ、 MAD も意味を失う。
  3. 「MAD があれば SD は不要」も短絡: SD は分散分解(ANOVA、 PCA、 LSE)で数学的に扱いやすい。 「外れ値が無ければ SD、 ある場合は MAD」が原則。
  4. 「MAD だけで外れ値判定」も危険: median ± 3×MAD は経験則で、 分布形状によっては正常データを切ってしまう。 視覚的確認(箱ひげ図・ヒストグラム)と組み合わせる。
  5. 「MAD は SD より常に良い」は誤解: 正規分布では SD の方が効率的。 「データの性質と目的」で使い分けるべき。

✅ 実務でのチェックリスト

💬 MAD は「外れ値があるとき SD では信用できない」という認識から生まれた頑健統計の代表。 SSDSE-B-2026 のように東京都・沖縄県のような特徴的な値が混ざるデータでは、 SD だけでなく MAD・IQR を並べて散布度を見ると、 真の散らばりが立体的に見えてくる。 散布度は 1 つではなく、 複数の角度から見るのが安全。

🗺 概念マップ — MAD が属する位置

ばらつきの指標
├── 非頑健(平均・二乗ベース)
│   ├── 分散($\sigma^2$)
│   ├── 標準偏差($\sigma$)
│   └── 変動係数($CV = \sigma/\mu$)
├── 頑健(中央値・絶対値・分位点ベース)◀ ロバスト統計
│   ├── 中央絶対偏差(MAD)◀ このページ
│   │   ├── 生の MAD
│   │   ├── 1.4826 × MAD(σ 推定)
│   │   └── Modified z-score(外れ値検出)
│   ├── 四分位範囲(IQR)
│   ├── 平均絶対偏差(MeanAD、 別概念)
│   ├── Sn 推定量・Qn 推定量
│   └── トリム標準偏差
└── 応用
    ├── 外れ値検出(Modified z > 3.5)
    ├── ロバスト回帰の初期値
    ├── KDE の頑健バンド幅
    └── 異常検知・データクリーニング

🎓 論文での MAD の典型的使い方

📄 都道府県データの記述統計表
表で「平均・SD」と並べて「中央値・MAD」を併記する。 これにより「平均±SD は東京・大阪に引っ張られた値」「中央値±MAD は典型県の姿」と読者が読み分けられる。 SSDSE-B のような少数の超巨大県を含むデータでは特に重要。
📄 異常検知・データクリーニング
Modified z-score(MAD ベース)で外れ値判定。 通常の z 値(SD ベース)は 外れ値自身が SD を大きくして自分を隠す「マスキング効果」があるが、 MAD は外れ値の影響を受けないので、 隠された外れ値も発見できる。
📄 ロバスト回帰の前処理
通常の OLS(最小二乗回帰)は 1 つの外れ値で大きく傾く。 残差の MAD を使って「重み付け」を行うと、 ロバスト回帰(M 推定)になる。 反復重み付け最小二乗法(IRLS)の各反復で MAD を更新する。
📄 機械学習の特徴量スケーリング
通常の StandardScaler(平均・SD)は外れ値に脆弱。 scikit-learn の RobustScaler は中央値と IQR を使うが、 MAD ベースのスケーリングも有効。 外れ値が多いビジネスデータ・金融データで有用。
📄 時系列データの異常検知
移動窓 MAD を計算し、 「窓内中央値 ± k × MAD」から外れた点を異常と判定。 株価・センサーデータ・売上時系列の異常検出で広く使われる手法。
📄 計量経済・地理統計
都道府県別データ・国別データのように外れ値(東京・米国など超大規模ユニット)が含まれるデータで、 平均・SD ベースの統計は誤解を招く。 MAD・中央値ベースの記述統計が標準化されつつある。

❓ よくある質問

Q1. 「MAD」と「Mean Absolute Deviation」はどちらが普通?

統計実務では Median Absolute Deviation(中央絶対偏差) が圧倒的に主流。 統計入門書では「Mean Absolute Deviation(平均絶対偏差)」が出ることもあるが、 ロバスト性で劣るので実用ではあまり使われない。

Q2. 1.4826 はどこから出る?

標準正規分布 $N(0,1)$ で、 中央値からの絶対偏差の中央値(理論値)は約 0.6745。 これは標準正規の上 4 分の 1 点(75 パーセンタイル)と一致する。 1.4826 = 1/0.6745 で、 これを掛けると正規分布のとき MAD ≈ $\sigma$。

Q3. データ数が偶数のとき、 中央値はどうする?

慣例的に「中央 2 つの平均」を取る。 例えば 47 県なら奇数なので問題ないが、 46 県データなら 23 番目と 24 番目の平均が中央値。 MAD の計算でも同じ処理。

Q4. MAD は加法性を持つ?

持ちません。 分散には $\mathrm{Var}(X+Y) = \mathrm{Var}(X) + \mathrm{Var}(Y) + 2\,\mathrm{Cov}(X,Y)$ という美しい性質があるが、 MAD には同様の関係はない。 これがロバスト統計が「数学的に扱いにくい」と言われる理由の一つ。

Q5. MAD の信頼区間は?

ブートストラップで計算するのが標準:データから $B = 1000$ 回再標本化し、 各回の MAD を計算、 その分布から信頼区間を取る。 解析的な公式もあるが、 実用ではブートストラップで十分。

Q6. 多変量データの MAD は?

素朴には「マハラノビス距離のロバスト版」として、 MCD(Minimum Covariance Determinant)推定量を使う。 各変数の MAD を独立に取ることもあるが、 相関を無視するため一般的でない。

Q7. 標準偏差より MAD を使うべきタイミングは?

(1) データに外れ値が混じる可能性、 (2) 分布が正規から大きく外れる(歪み・裾の重さ)、 (3) データクリーニング段階、 (4) ロバスト回帰のスケール推定。 「典型的な値の周りのばらつき」を知りたいときは MAD。

Q8. R では?

R では mad(x) 関数が組み込み。 デフォルトで 1.4826 倍されている。 生の MAD が欲しければ mad(x, constant=1)

Q9. MAD と Median Absolute Error(MAE)はどう違う?

名前が紛らわしいですが別概念。 MAE(平均絶対誤差)は予測モデルの評価指標で $\frac{1}{n}\sum|y_i - \hat{y}_i|$。 MAD(中央絶対偏差)は単一変数のばらつき指標。 「絶対値の平均」と「絶対偏差の中央値」で大きく違う。

Q10. MAD と分位偏差は?

分位偏差(QD)は $(Q_3 - Q_1)/2$、 つまり IQR の半分。 MAD と並ぶロバストばらつき指標だが、 MAD のほうが理論的に扱いやすく標準的。 IQR / 1.349 ≈ $\sigma$ という近似もある(正規分布前提)。

Q11. 「rolling MAD」とは?

時系列で「直近 $w$ 期の MAD」を窓スライドで計算するもの。 pandas なら series.rolling(window=20).apply(lambda x: np.median(np.abs(x - np.median(x))))。 異常検知でよく使う。

Q12. MAD を負の値に対しても定義できる?

はい、 普通に定義できる。 中央値からの絶対偏差なので、 元の値の符号は関係ない。 例:気温データ(−10〜+35℃)でも問題なく計算可能。

🧠 MAD の核心 — 二重中央値の威力

MAD (Median Absolute Deviation) は 「中央値からの絶対偏差の中央値」。 標準偏差 (SD) が「平均からの二乗偏差の平方根」であるのに対し、 MAD は二重に「中央値」を使うことで 外れ値の影響を完全に有界化します。

$$\mathrm{MAD} = \mathrm{median}_i\!\left(|x_i - \mathrm{median}_j(x_j)|\right)$$

正規分布では $\mathrm{MAD} \approx 0.6745 \sigma$、 つまり $\hat\sigma_{\text{MAD}} = 1.4826 \cdot \mathrm{MAD}$ で SD と同等のスケールに変換できます。 SSDSE-B-2026 の総人口を見ると、 SD は東京都の影響で大きく出ますが、 MAD は中央値ベースなので「典型県のばらつき」を反映します。

📊 分散指標 — 6 種類の比較

指標計算破壊点効率(正規)解釈
SD$\sqrt{\sum(x-\bar x)^2/(n-1)}$1/n100%二乗平均ベース
MAD$\mathrm{med}|x-\mathrm{med}(x)|$50%37%中央値ベース
IQR$Q_3 - Q_1$25%37%四分位ベース
Sn (Rousseeuw)中央値ペア距離50%58%MAD より効率高
Qn (Rousseeuw)0.25 分位点ペア距離50%82%高効率ロバスト
Trimmed SDトリム後 SD可変可変半妥協

Sn と Qn (Rousseeuw & Croux, 1993) は MAD より高効率ですが、 計算量と複雑性で MAD が事実上の標準です。 scikit-learn や scipy には MAD のみ実装されています。

🎯 Modified z-score による外れ値検出

Modified z-score による外れ値検出:

$$M_i = \frac{0.6745 (x_i - \mathrm{median}(x))}{\mathrm{MAD}}$$

Iglewicz & Hoaglin (1993) は $|M_i| > 3.5$ を外れ値の閾値として提案。 SSDSE-B-2026 の総人口で計算すると、 東京都・神奈川県・大阪府をはじめ 9 都道県が $|M_i| > 3.5$ で検出されます。 これは通常の $|z_i| > 3$ ルール(SD ベース)では東京都しか検出されないこともあります(masking 効果)。

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 A1101(総人口) 北海道 5,092,000 東京都 14,086,000 沖縄県 1,468,000 …(全 47 行)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
import pandas as pd
import numpy as np
from scipy import stats

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df = df[df.iloc[:, 0] == 2023]
pop = df['A1101'].to_numpy(dtype=float)
med = np.median(pop)
mad = stats.median_abs_deviation(pop)
M = 0.6745 * (pop - med) / mad

outliers = np.where(np.abs(M) > 3.5)[0]
print(f'外れ値: {df.iloc[outliers, 2].tolist()}')
print(f'σ̂_MAD = {1.4826 * mad:,.0f}')
print(f'σ̂_SD  = {pop.std(ddof=1):,.0f}')

🎓 Masking 効果 — なぜ SD では足りないか

Masking 効果(外れ値が自身を隠す現象)の数学:

SD = $\sqrt{\sum(x-\bar x)^2/(n-1)}$ は外れ値自身を計算に含めるので、 「外れ値があると SD が大きくなり、 すると外れ値が z スコア的に普通に見える」。 これが masking。 MAD は外れ値の影響を有界に抑えるので、 SD ベースで隠れた外れ値も検出できます。

SSDSE-B-2026 では、 もし「東京は外れ値か?」を SD ベースで判定すると、 東京の存在が SD を吊り上げるため、 通常の閾値(3σ)に収まることがあります。 一方 MAD ベースなら、 東京は明確に外れ値として識別されます。

MAD (中央絶対偏差) 四分位範囲(IQR) Sn 推定量・Qn 推定量 トリム平均・ウィンザー平均 M 推定量・MM 推定量 Huber 推定量 標準偏差

🔗 隣接手法への橋渡し

MAD (中央絶対偏差) は単独の指標というより、 外れ値に頑健な散布度を測りたいときに分散・標準偏差の代替として使う。 上流の中央値計算、 並列の IQR / 四分位偏差、 下流の MAD ベース正規化 (Robust Scaler) と組み合わせて使う。

SSDSE-B-2026 の県別人口は東京・大阪が外れ値で標準偏差が肥大化する。 そこで MAD = median(|xi - median(x)|) で散布度を測り、1.4826 倍して標準偏差スケールに変換し、ロバスト Z スコア (xi - median) / MAD で異常検知する、 という三段構成が現場の標準。

🌳 決定木 — どのロバスト散布度を選ぶか

🌳 決定木 — どのロバスト散布度を選ぶか

STEP 1: データ性質
  ├─ 連続値 + 正規っぽい → SD で OK
  ├─ 連続値 + 外れ値あり → MAD
  ├─ 離散値(整数)→ Sn 推定量、 IQR/1.349
  └─ 多変量 → MCD

STEP 2: 目的
  ├─ 教科書標準 → MAD(×1.4826)
  ├─ 効率重視 → Qn 推定量(効率 82%)
  ├─ 計算容易さ重視 → IQR/1.349
  └─ 時系列スパイク → Hampel フィルタ

STEP 3: 外れ値判定
  ├─ 緩い(探索的)→ 中央値 ± 2.5·MAD
  ├─ 標準 → 中央値 ± 3·MAD
  ├─ 保守的(報告用)→ 中央値 ± 3.5·MAD
  └─ 探索+検定 → modified Z-score > 3.5

🧪 モンテカルロ実験 — MAD と SD の汚染下での挙動

「MAD の方が頑健」は理論ですが、 シミュレーションで体感するのが一番です。 以下のコードを実行すると、 5% 汚染で SD は 4 倍以上に膨らみ、 MAD はほぼ動かないことが分かります。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
# 汚染下での SD vs MAD 比較
import numpy as np
from scipy.stats import median_abs_deviation

def simulate(n=1000, eps=0.05, scale_contam=10, n_sim=1000):
    sds, mads = [], []
    for _ in range(n_sim):
        # (1-ε) N(0,1) + ε N(0, scale²) の混合
        clean = np.random.standard_normal(int(n*(1-eps)))
        contam = np.random.standard_normal(int(n*eps)) * scale_contam
        x = np.concatenate([clean, contam])
        sds.append(np.std(x, ddof=1))
        mads.append(median_abs_deviation(x, scale='normal'))
    return np.mean(sds), np.std(sds), np.mean(mads), np.std(mads)

# 汚染 0%, 1%, 5%, 10%, 20% で比較
print(f"{'eps':<6}{'SD(mean)':<12}{'SD(std)':<12}{'MAD(mean)':<12}{'MAD(std)':<12}")
for eps in [0.0, 0.01, 0.05, 0.10, 0.20]:
    sd_m, sd_s, mad_m, mad_s = simulate(eps=eps)
    print(f'{eps:<6.2f}{sd_m:<12.4f}{sd_s:<12.4f}{mad_m:<12.4f}{mad_s:<12.4f}')

典型的な出力結果:

汚染率 εSD 平均SD ばらつきMAD 平均MAD ばらつき
0%1.0000.0220.9980.030
1%1.4510.1101.0000.031
5%2.2250.1421.0200.033
10%3.1710.1701.0550.036
20%4.5000.2201.1400.045

SD は汚染 1% で既に 45% 増、 5% で 2 倍以上、 20% で 4.5 倍まで肥大化。 一方、 MAD は汚染 5% でもわずか 2% 増、 20% でも 14% 増に留まる。 「MAD は外れ値の影響を真に有界に保つ」という主張の数値的裏付けです。

📊 SSDSE-B-2026 での実測値(再現コード付き)

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 A1101(総人口) 北海道 5,092,000 東京都 14,086,000 沖縄県 1,468,000 …(全 47 行)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# SSDSE-B-2026 で SD と MAD を計算して並べる
import pandas as pd
import numpy as np
from scipy.stats import median_abs_deviation

df = pd.read_csv('data/raw/SSDSE-B-2026.csv',
                 encoding='cp932', skiprows=[1])
df = df[df.iloc[:, 0] == 2023]  # 2023 年度・47 都道府県

# 全データ vs 東京を除いたデータで SD と MAD を比較
for use_tokyo in [True, False]:
    sub = df if use_tokyo else df[df['Prefecture'] != '東京都']
    x = sub['A1101'].astype(float).values  # A1101 = 総人口
    sd = np.std(x, ddof=1)
    mad = median_abs_deviation(x, scale='normal')
    label = "全47県" if use_tokyo else "東京除く46県"
    print(f'{label}: SD={sd:9.0f}  MAD={mad:9.0f}  比={sd/mad:.2f}')

典型出力:

全47県:      SD=  2797551  MAD=   923661  比=3.03
東京除く46県: SD=  2242451  MAD=   872511  比=2.57

東京都を含めると SD/MAD 比が 3.03 = 明確な外れ値あり。 東京都を除いても比は 2.57 でまだ 1.5 を上回る — 神奈川県・大阪府など大都市圏が残るため、 単に東京都 1 県を抜くだけでは正規には戻りません。 一方 MAD は 923,661→872,511 とほとんど動かず、 「典型県のばらつき」を一貫して表現していることがわかります。 SD だけが外れ値の増減に敏感に反応します。

🗣 ナラティブ — 「散らばりをどう測るか」という根本問

SD は「平均からの距離の二乗の平均の平方根」。 美しい数学的性質を持ち、 ガウス分布の最尤推定量でもあります。 しかし二乗という操作が外れ値の影響を増幅する弱点を持ち、 1 つの巨大な外れ値が SD を桁違いに肥大化させる。 これは現代統計学が直面する基本問題でした。

MAD は「中央値からの距離の中央値」。 シンプルだが効果絶大で、 (1) 破壊点 50%、 (2) 影響関数が有界、 (3) 計算容易――の三拍子が揃います。 教科書的に効率 37% と言われる弱点も、 「外れ値混入下では SD が崩壊するから実効効率は MAD が上」という現代的観点では大した問題ではありません。 むしろ MAD は「現代統計学の常識」になりつつあると言えます。

SSDSE-B-2026 のように一部の巨大県(東京・大阪)を含む小サンプル(n=47)データでは、 SD 単独報告はミスリードに繋がります。 MAD を併記し、 「典型県と異常値を分けて議論する」文化を作ること――これが統計家としての社会的責任の一部であり、 MAD という小さな指標が持つ大きな意味でもあります。

この視点は機械学習時代になっても色褪せていません。 異常検知のリアルタイムシステム、 サイバーセキュリティの侵入検知、 自動運転の障害物センサの故障判定――いずれも「正常データのばらつき」を MAD で推定し、 「中央値 ± k·MAD を超えれば異常」というシンプルなルールで動いています。 シンプルだからこそ実装が容易で、 シンプルだからこそ説明可能。 MAD は 20 世紀の統計の遺産であり、 21 世紀の機械システムの基盤でもあるのです。

🌟 追加応用例 — MAD が活きる「もう一段深い」場面

📡 通信信号の SNR 推定

無線通信では「信号 + ノイズ」のうち、 ノイズ量を推定する必要があります。 高い瞬間電力(spike)が混じることが多く、 SD ベース推定は SNR を過大評価しがち。 MAD ベース推定なら spike の影響を排除し、 「典型的ノイズレベル」を正しく推定できます。 4G/5G の信号処理パイプラインで実装済みです。

🏛 経済統計のロバスト要約

所得分布のような重い裾の分布では、 SD はトップ 0.1% に支配されます。 OECD や厚労省の所得統計でも「中央値・MAD ベース」での要約が増えており、 「典型的世帯のばらつき」を語る文化が定着しつつあります。 SSDSE-B-2026 の都道府県データでも同じ考え方が活きます。

🧬 single-cell RNA-seq

遺伝子発現解析の単細胞シーケンシング (scRNA-seq) では、 個々の細胞ごとに発現量の MAD を計算し、 doublet(二細胞)を検出します。 これは Seurat や scanpy といった主要ライブラリで標準実装。 数百万細胞のスケールで MAD ベース品質管理が走っています。

🛰 衛星画像の cosmic ray 除去

CCD/CMOS センサに宇宙線が当たると、 一画素に巨大な値が記録されます。 ハッブル・ジェイムズウェッブ宇宙望遠鏡のパイプラインでは、 画像の各画素について「近傍 MAD ベース閾値」を計算し、 cosmic ray を自動除去します。 統計学の理論が宇宙の最先端観測を支えている例です。

⚙ IoT センサ異常検知

工場の IoT センサは年中無休でデータを送信します。 センサの誤動作、 通信エラー、 一時的スパイクが頻繁に発生する中で、 「正常状態の散布度」を MAD ベースで推定し、 リアルタイムに異常検知。 単純な閾値で実装可能なため、 エッジコンピュータでも動作します。

📈 アルゴリズム取引のリスク管理

高頻度取引 (HFT) では、 ミリ秒単位で価格変動を監視。 SD ベースだとフラッシュクラッシュ時に閾値が爆発し、 全注文停止に至ります。 MAD ベース閾値なら過去 1 分間の典型変動に基づく安定した監視ができ、 アルゴリズム取引の事故防止に貢献。

🏥 ICU バイタルサイン監視

集中治療室 (ICU) の心拍・血圧モニターは、 個人ごとの「正常範囲」の MAD を学習し、 中央値 ± 3·MAD を逸脱したら看護師にアラート。 SD ベースだと体動・センサずれで誤警報多発、 MAD ベースなら「真の異常」だけを検知できます。 ICU の alarm fatigue 問題(誤警報多発で看護師が無視)への対策技術として注目されています。

🌍 地震計のキャリブレーション

地震計の長期記録は人為的ノイズ(工事、 交通振動)と真の地震が混在します。 ノイズレベル推定に MAD を使うことで、 工事や交通振動の影響を受けず、 「真の地震活動の閾値」を安定して定めることができます。 USGS や気象庁の地震監視システムで MAD ベース処理が組み込まれています。

📊 SSDSE-B-2026 への応用展望

SSDSE-B-2026 は 47 都道府県 × 100+ 指標の大規模な公的統計。 「全指標について SD と MAD を並べた要約表」を作成するだけで、 「どの指標で外れ値(東京・大阪など)の影響が大きいか」が一目で分かります。 さらに MAD-Z score でランキングを作れば、 「平均的な県」と「特殊な県」を分類でき、 政策提言の根拠資料として価値が高まります。 単なるロバスト統計の練習ではなく、 「正しい統計報告」の実例として SSDSE-B-2026 と MAD は相性抜群です。

🎴 サマリーカード — MAD 早見ボード

項目内容
定義MAD = median$(|x_i - \mathrm{median}(x)|)$
正規調整定数1.4826 = $1/\Phi^{-1}(0.75)$
破壊点50%(中央値と同じ)
影響関数有界、 階段状
正規時効率(ARE)0.37(SD 基準)
計算量$O(n \log n)$
Pythonscipy.stats.median_abs_deviation(x, scale='normal')
Rmad(x)(base R、 デフォルトで 1.4826 付与)
外れ値判定中央値 ± k·MAD(k=2.5-3.5)
代替手法IQR/1.349, Sn (Rousseeuw & Croux), Qn (効率 82%)
主な誤用1.4826 忘れ、 SD と混同、 平均からの距離で計算
教科書Huber (1981), Maronna et al. (2006), Wilcox (2017)

MAD を採用するか別のロバスト散布度に切り替えるかは、 (1) 外れ値混入率、 (2) サンプルサイズ、 (3) 効率 vs 解釈性のトレードオフ、 で判断する。 SSDSE-B-2026 の県別人口のように東京が極端な場合は MAD ×1.4826 が第一選択。

  1. Step 1: 分布の形は?
    • ほぼ正規 → 標準偏差 (SD) で OK、 MAD は不要
    • 裾が重い / 外れ値混入 5% 以下 → MAD ×1.4826 (breakdown 50%)
    • 汚染 10% 以上 / 多変量 → MCD (最小共分散行列式) でロバスト推定
  2. Step 2: サンプルサイズ・効率は?
    • n < 50 → IQR/1.349 (バイアス補正の手間少)
    • n >= 50 + 効率 82% 目標 → Qn 推定量 (Rousseeuw-Croux)
    • 時系列スパイク除去 → Hampel フィルタ (移動窓 MAD)
  3. Step 3: 外れ値判定の保守性は?
    • 探索的 → 中央値 ± 2.5·MAD で広めに拾う
    • 標準 → 中央値 ± 3·MAD (modified Z-score > 3.5 に対応)
    • 報告用・保守的 → 中央値 ± 3.5·MAD で誤検出を抑える

SSDSE-B-2026 47 都道府県人口を分析する場合、 東京 (1400 万) と鳥取 (55 万) があるため SD は外れ値に引っ張られて意味を失う。 中央値 200 万 ± 3·MAD で外れ値判定すると東京・神奈川・大阪が候補となり、 これら 3 都府県を別群として扱うか否かを決定できる。

🎮 触って理解する

数直線上の点をドラッグして動かすと、 中央値・MAD・平均・標準偏差(SD)がリアルタイムに再計算されます。 特に一番右の赤い点(外れ値)を大きく動かして、 MAD(頑健)がほとんど動かないのに対し SD が大きく暴れる様子を体感してください。 このページの MAD は median(|xᵢ − median(x)|)、 つまり「中央値からの絶対偏差」を「もう一度中央値」で集約したものです。

※ 点は 7 個。 値域 0〜100 の説明用ダミーデータ(SSDSE 実測値ではありません)。

読み方: 上段の数直線でオレンジ線が中央値、 その周りのオレンジ帯が±MAD。 青の破線が平均、 青帯が±SD。 下段の横棒は各点の|xᵢ − 中央値|を短い順に並べたもので、 真ん中の棒(=その中央値)が MAD です。 外れ値の棒だけが飛び抜けて長くても、 「真ん中の棒」は動かない — これが MAD が頑健である理由の可視化です。

💡 直感

MAD は「ズレの絶対値を並べて真ん中を取る」だけ。 上段で外れ値を右へ引っ張ると、 下段では一番長い棒(外れ値のズレ)がぐんぐん伸びますが、 真ん中の棒(MAD)は不動です。 一方 SD は全点の二乗平均なので、 外れ値 1 個の巨大なズレが二乗で効いて青帯が大きく広がります。 「並べて真ん中」=順位ベースだから外れ値に強い、 を手で確かめられます。

⚠️ よくある落とし穴 — 「MAD」の2つの定義

同じ略語 MAD に、 実は 2 つの別物があります。 混同は初学者の最頻ミスです。

呼び名定義中心集約
中央絶対偏差
(Median Absolute Deviation)
← このページ・この教材の主役
median(|xᵢ − median(x)|)中央値中央値
平均絶対偏差
(Mean Absolute Deviation)
mean(|xᵢ − mean(x)|)平均平均

上の触って理解するツールが計算しているのは前者(中央値版)です。 後者(平均版)は中心も集約も平均なので、 外れ値に対する頑健性を持たず、 このツールで示している「外れ値でも不動」という性質はありません。 論文やライブラリで「MAD」を見たら、 どちらの定義か必ず確認してください(scipy の median_abs_deviation、 R の mad() はいずれも中央値版)。

🚀 発展 — σ 換算(×1.4826)を数直線で確かめる

正規分布では MAD ≈ 0.6745σ なので、 σ̂ = 1.4826 × MAD で SD と同じスケールに換算できます。 読み取りパネルの「1.4826×MAD」と「SD」を見比べてみましょう。 外れ値がないときは両者が近い値になりますが、 外れ値を極端にすると SD だけが跳ね上がり、 1.4826×MAD はほぼ据え置き。 この乖離の大きさが「データが正規からどれだけ汚染されているか」のバロメータになります(乖離が大きいほど外れ値の影響大)。 さらに |xᵢ − median| / MAD > 3 をロバストな外れ値判定に使えます。

関連ページ: 中央値標準偏差四分位範囲(IQR)ロバスト統計外れ値正規分布

🔬 解説深化 — MAD を「診断計」として使う

ここまでのページで「MAD は外れ値に強い散布度」であることは分かりました。 この追補では一歩進めて、 MAD を「データの汚染度・歪みを測る診断計」として使う視点を、 SSDSE-B-2026 の 2023 年・47 都道府県データの実測値で確かめます。

💡 直感 — 比 SD / (1.4826×MAD) は「外れ値汚染メーター」

正規分布に近いデータなら $\hat{\sigma} = 1.4826 \times \mathrm{MAD}$ は SD とほぼ一致するので、 比 $R = \mathrm{SD} / (1.4826 \times \mathrm{MAD})$ は 1 に近いはず。 逆に $R$ が 1 から大きく離れるほど「少数の極端値が SD を膨らませている」サインです。 SSDSE-B-2026 の 2023 年データ全 109 列(MAD>0 の数値列)でこの比を実際に計算すると、 変数ごとの「汚染度」が一目でランキングできます。

変数(2023 年・47 都道府県)比 R = SD/(1.4826×MAD)読み方
外国人延べ宿泊者数 (G7102)18.97東京・大阪などに極端集中。 SD は「典型県のばらつき」の約 19 倍に膨張
大学教員数 (E6202)8.96大都市集中型。 SD 単独の報告はほぼ無意味
大学卒業者数 (E6502)7.95同上
総人口 (A1101)3.03本文でも扱った例。 SD 279.8 万人 vs 1.4826×MAD 92.4 万人
消費支出・二人以上世帯 (L3221)1.19ほぼ正規的。 SD と MAD 換算値が近い
ごみのリサイクル率 (H5614)0.98比≈1。 SD で語ってよい変数
食料費・二人以上世帯 (L322101)0.84比<1(裾が薄い形)。 汚染ゼロでも 1 ぴったりにはならない

傾向は明快で、 「県の規模に比例する絶対数」(人口・学生数・宿泊者数)は比が大きく、 「率・世帯あたり量」(リサイクル率・世帯支出)は比が 1 前後。 分析前にこの比を全列に流すだけで、 「どの変数は中央値+MAD で報告すべきか」を機械的にスクリーニングできます。

⚠️ 落とし穴(重要) — 右に歪んだデータでは「対称な ±3MAD」が片側しか見えなくする

MAD 外れ値判定(modified z-score $M_i = 0.6745(x_i-\tilde{x})/\mathrm{MAD}$、 $|M_i|>3.5$)は中央値の左右で同じ幅を仮定します。 ところが都道府県人口のような右歪みデータでは、 この対称仮定が静かに壊れます。 実測(総人口 A1101、 2023 年)では:

つまり「9 県が外れ値」という判定は、 外れ値の異常さではなく分布の歪みを検出している可能性が高い。 埼玉・千葉・兵庫・福岡・北海道を「異常値」として除外してしまうと、 大都市圏という構造的な情報ごと捨てることになります。 対称 ±k×MAD の判定を歪んだデータに機械的に当てるのは、 実務で最も起きやすい MAD の誤用の一つです。

🚀 発展 — Double MAD(左右別 MAD)で歪みに対応する

対処法の一つが double MAD(左右非対称 MAD): 中央値より下の点は「下側だけで計算した MAD」、 上の点は「上側だけで計算した MAD」でスケールします。 総人口(2023 年)の実測では:

もう一つの定番は対数変換してから MAD を取る方法(規模に比例する変数に有効)。 いずれも「MAD が使えないのではなく、 歪みを測ってから MAD の当て方を変える」という発想です。 左右 MAD の比(ここでは 108.8/51.5 ≈ 2.1)は、 歪度の頑健な代替指標としてそのまま報告する価値があります。

🔗 関連ページ

対数変換(歪み対策の定番) / 外れ値処理(検出した後どうするか) / 箱ひげ図(IQR ベースの視覚版) / MAE(同じ「絶対偏差」でも予測誤差指標) / 分位数(左右 MAD の一般化) / ヒストグラム(歪みをまず目で確認)

※ 本セクションの数値はすべて SSDSE-B-2026(2023 年度・47 都道府県)から Python (pandas/numpy) で実際に算出した実測値。