マハラノビス距離による異常検知 — 相関を考慮した「正常からの距離」

統計的異常検知の基礎の最後で、「各変数を1つずつ見れば正常なのに、組み合わせとして異常」な点は1次元の統計では捉えられない、と述べました。たとえば「身長170cm」も「体重50kg」もそれぞれは普通ですが、その組み合わせは珍しい——変数間の相関から外れているからです。この種の異常を捉えるのが マハラノビス距離(Mahalanobis distance) による異常検知です。

マハラノビス距離は、ひとことで言えば「相関と分散を考慮した、正常分布の中心からの距離」です。単純な直線距離(ユークリッド距離)では、データの広がり方や変数間の相関を無視してしまいます。マハラノビス距離は共分散行列を使ってこれを補正し、「データの形に沿った距離」を測ります。本記事では、ユークリッド距離の限界から出発し、マハラノビス距離の定義・白色化との等価性・カイ二乗分布によるしきい値設定までを、Pythonの実測とともに解説します。多変量正規分布共分散の知識が前提になります。

マハラノビス距離の概念

図の通り、正常データが相関を持って斜めに広がっているとき、その広がり(緑の楕円)の外に出た点を異常とみなします。楕円の内側か外側かを測る物差しがマハラノビス距離です。

ユークリッド距離の限界

まず、なぜ単純な直線距離ではダメなのかを見ます。

ユークリッド距離の問題

図で、正常データは右上がりに相関しています。原点(中心)から見て、相関方向に沿った緑の点と、相関から外れた赤の点は、ユークリッド距離では同じ距離にあります。しかし明らかに、相関から外れた赤の点の方が「異常」です。ユークリッド距離は各方向を平等に扱うため、「データが広がっている方向(正常な方向)」と「広がっていない方向(異常な方向)」を区別できません。これが致命的な弱点です。

マハラノビス距離の定義

この問題を解決するのがマハラノビス距離です。

マハラノビス距離の定義

$$ \begin{equation} D_M(\bm{x}) = \sqrt{(\bm{x}-\bm{\mu})^\top \Sigma^{-1} (\bm{x}-\bm{\mu})} \end{equation} $$

ここで $\bm{\mu}$ は正常データの平均、$\Sigma$ は共分散行列です。ユークリッド距離 $\sqrt{(\bm{x}-\bm{\mu})^\top(\bm{x}-\bm{\mu})}$ との違いは、共分散の逆行列 $\Sigma^{-1}$ が挟まっている点だけです。この $\Sigma^{-1}$ が、「分散の大きい方向は割り引き、相関を考慮して距離を測る」という補正を行います。分散の大きい(データがよく広がる)方向の差は軽く、分散の小さい方向の差は重く評価される——だから「相関から外れた異常」を正しく重く評価できるのです。

白色化との関係

マハラノビス距離の本質は、白色化(whitening)してからユークリッド距離を測ることと同じです。

白色化

白色化とは、相関を持って斜めに広がったデータを、$\Sigma^{-1/2}$ で変換して各方向に等方的な(円形の)分布に直す操作です。図のように、元の空間で傾いた楕円状の正常データは、白色化後にはきれいな円になります。この変換後の空間でユークリッド距離を測ったものが、まさにマハラノビス距離です。「データの形のクセを取り除いてから、素直に距離を測る」——これがマハラノビス距離の幾何学的な意味です。

等距離の楕円

逆に、元の空間でマハラノビス距離が等しい点を結ぶと、図のように共分散の形に沿った楕円になります。ユークリッド距離なら同心円ですが、マハラノビス距離はデータの広がりに合わせて楕円に伸び縮みする。この楕円が「正常領域の等高線」になるわけです。

1次元で考えると正体が見える

マハラノビス距離は抽象的に見えますが、1次元に落とすと正体がはっきりします。1次元では共分散行列 $\Sigma$ はただの分散 $\sigma^2$ なので、

$$ \begin{equation} D_M(x) = \sqrt{(x-\mu)\cdot \sigma^{-2} \cdot (x-\mu)} = \frac{|x-\mu|}{\sigma} = |z| \end{equation} $$

——なんと、統計的異常検知で学んだzスコアの絶対値そのものです。zスコアが「平均から何σ離れているか」を測ったように、マハラノビス距離は「平均から何σ分(多次元的に)離れているか」を測ります。マハラノビス距離は、zスコアを変数間の相関がある多次元へ自然に拡張したもの、と理解できるのです。だからこそ、しきい値も「3σ」に対応する確率的な基準(次節のカイ二乗)で決められます。

Σ⁻¹は「方向ごとの物差し」を与える

$\Sigma^{-1}$ が何をしているかは、固有値分解で見えます。共分散行列 $\Sigma$ の固有ベクトルはデータが広がる主軸の向き、固有値はその方向の分散です。$\Sigma^{-1}$ はその固有値を逆数にするので、分散の大きい方向(よく広がる=正常な動き)の差を小さく、分散の小さい方向(あまり動かない=異常な動き)の差を大きく評価します。「その方向にどれだけ動くのが普通か」で差を割り引く、可変の物差しを各方向に用意しているわけです。これが、相関方向の正常な変動を許容し、相関を破る変動を強く咎める仕組みの正体です。

カイ二乗分布でしきい値を決める

マハラノビス距離の優れた点は、しきい値を確率的に決められることです。データが多変量正規分布に従うとき、マハラノビス距離の二乗 $D_M^2$ は、自由度=次元数のカイ二乗分布に従うことが知られています。

カイ二乗分布

この性質を使えば、「正常データの97.5%が含まれる範囲」のしきい値を、カイ二乗分布の分位点として厳密に計算できます。たとえば2次元なら、$D_M^2 > \chi^2_{0.975}(2) = 7.38$ を異常とする、という具合です。1次元のzスコアで「±3σ=99.7%」としたのと同じ発想を、多次元に拡張したものです。誤検出率を確率で制御できるのは、統計的手法ならではの強みです。

Pythonで確かめる

強い相関(相関係数0.9)を持つ正常データに、「相関の軸から外れた異常」(各変数単体では正常範囲)を混ぜます。ユークリッド距離とマハラノビス距離で、異常をどれだけ捉えられるか比べます。

import numpy as np
from sklearn.covariance import EmpiricalCovariance
from sklearn.metrics import roc_auc_score
from scipy.stats import chi2

rng = np.random.default_rng(0)
cov_true = np.array([[1, 0.9], [0.9, 1]])
Xn = rng.multivariate_normal([0, 0], cov_true, 500)        # 正常:強い相関
Xa = np.array([[2,-2],[-2,2],[2.2,-1.8],[-1.9,2.1],[1.8,-2.2]])  # 異常:相関から外れる
X = np.vstack([Xn, Xa]); y = np.r_[np.zeros(len(Xn)), np.ones(len(Xa))]

mu = Xn.mean(0)
eucl = np.sqrt(((X - mu)**2).sum(1))                       # ユークリッド距離
cov = EmpiricalCovariance().fit(Xn)                         # 正常で共分散を推定
maha = cov.mahalanobis(X)                                   # マハラノビス距離の二乗

print(f"ユークリッド距離 ROC-AUC = {roc_auc_score(y, eucl):.3f}")
print(f"マハラノビス距離 ROC-AUC = {roc_auc_score(y, maha):.3f}")

thr = chi2.ppf(0.975, df=2)                                 # χ²しきい値
pred = maha > thr
print(f"χ²しきい値={thr:.2f}: 異常検出率={pred[-5:].mean():.2f}, 誤報率={pred[:500].mean():.3f}")

出力は次の通りです。

ユークリッド距離 ROC-AUC = 0.962
マハラノビス距離 ROC-AUC = 1.000
χ²しきい値=7.38: 異常検出率=1.00, 誤報率=0.022

検出の比較

マハラノビス距離のROC-AUCは 1.000(完璧)、ユークリッド距離は 0.962 にとどまりました。図を見ると、ユークリッド距離(左)は中心から遠い正常点を誤検出したり、相関方向の異常を取り逃したりしていますが、マハラノビス距離(右)は正常の楕円から外れた異常だけを正確に捉えています。さらに、カイ二乗分布から決めたしきい値7.38で、異常を100%検出しつつ誤報率はわずか2.2%——理論通りの制御ができました。「相関を考慮する」というたった一手で、各変数単体では見えない異常が浮かび上がるのです。

限界と発展

マハラノビス距離は強力ですが、2つの重要な限界があります。

ロバスト共分散

第一に、共分散推定が外れ値に弱いこと。共分散行列も平均と同様、訓練データの外れ値に歪められます(統計的異常検知で見たマスキングの多変量版)。これには MCD(最小共分散行列式, Minimum Covariance Determinant) など、汚染の少ない部分集合から頑健に共分散を推定する手法(sklearnのMinCovDet)を使います。

多峰の限界

第二に、正常が単峰(1つの塊)であることを暗黙に仮定していること。マハラノビス距離は正常を「1つの楕円」で表すため、図のように正常が複数の塊(多峰)に分かれていると、その中心(どちらの塊にも属さない場所)を「最も正常」と誤判定してしまいます。これは異常検知入門の実験でマハラノビスが2クラスタデータに苦戦した理由そのものです。

ROC比較

この「多峰の正常」を扱うには、複数のガウス分布の重ね合わせで正常をモデル化する必要があります——それが次の記事で扱う混合ガウスモデル(GMM)による異常検知です。マハラノビス距離は、いわば「単峰ガウスのGMM」の特別な場合とも言えます。

まとめ

マハラノビス距離による異常検知を解説しました。

  • ユークリッド距離は変数間の相関や分散を無視するため、「相関方向から外れた異常」を捉えられない。
  • マハラノビス距離 $D_M=\sqrt{(\bm{x}-\bm{\mu})^\top\Sigma^{-1}(\bm{x}-\bm{\mu})}$ は、共分散の逆行列で補正した距離。白色化してからのユークリッド距離と等価。
  • $D_M^2$ はカイ二乗分布に従うため、誤検出率を確率で制御するしきい値を厳密に決められる。
  • 実測では、ユークリッド距離 ROC-AUC 0.962 に対し、マハラノビス距離は 1.000。χ²しきい値で検出率100%・誤報率2.2%を達成。
  • 限界は共分散推定の外れ値への弱さ(→MCDで頑健化)と単峰仮定(→多峰ならGMMへ)。

次の記事では、複数のガウス分布で正常をモデル化し、多峰の正常にも対応する混合ガウスモデル(GMM)による異常検知を掘り下げます。