異常検知入門で見た「正常をモデル化し、外れを検出する」という原理を、最もシンプルに体現するのが統計的異常検知です。考え方は素朴そのもの——「正常データは何らかの分布(多くは正規分布)に従うはずだ。だから、その分布から確率的に大きく外れた値は異常だ」。
データ分析で「平均±3σを超えたら異常」という話を聞いたことがあるでしょう。これがまさに統計的異常検知の基本形です。しかし、この素朴な方法には意外な落とし穴があります。外れ値を検出するために使う「平均」と「標準偏差」が、その外れ値自身によって歪められてしまうのです。本記事では、zスコア・3σルール・IQR法・Grubbs検定という基本手法を押さえたうえで、この マスキング問題 と、それを解決する 頑健統計(中央値・MAD) までを、Pythonの実測とともに解説します。前提として正規分布の知識があると理解が深まります。

図の通り、データの中心(平均)から大きく離れた点(赤)を異常とみなす——これが統計的異常検知の出発点です。「どれだけ離れたら異常か」を確率的に決めるのがポイントです。
3σルールとzスコア
正規分布には、よく知られた性質があります。

データが正規分布に従うとき、約68.2%が平均±1σ、95.4%が±2σ、そして99.7%が±3σの中に収まります。裏を返せば、±3σの外に出る値は全体の0.3%しかない、極めて稀な値です。だから「±3σの外を異常とみなす」のは理にかなっています。これが 3σルール です。
これを一般化したのが zスコア(標準化得点) です。

$$ \begin{equation} z = \frac{x – \mu}{\sigma} \end{equation} $$
zスコアは「その値が平均から何σ分離れているか」を表します。$|z| > 3$ なら異常、というしきい値で判定するわけです。しきい値を3ではなく2.5や3.5にすれば、検出の厳しさ(感度と誤報のバランス)を調整できます。シンプルで解釈しやすく、1次元データの外れ値検出の第一選択になります。
マスキング問題 — 統計量が歪む
ところが、ここに深刻な落とし穴があります。zスコアの計算に使う $\mu$ と $\sigma$ は、データ全体(異常を含む)から計算されます。すると、外れ値が存在すると、その外れ値自身が $\mu$ と $\sigma$ を引っ張ってしまうのです。

図のように、極端な外れ値があると標準偏差 $\sigma$ が大きく膨らみます。$\sigma$ が大きくなると、$\pm3\sigma$ の範囲も広がり、本来異常であるはずの値が「範囲内」に入ってしまう。これを マスキング(masking) と呼びます。外れ値が、自分自身や他の異常を「隠して」しまう現象です。とくに、極端な外れ値(センサーのスパイクなど)が少数あると、それが $\sigma$ を押し上げ、中程度の異常をまるごと見逃す、という事態が起きます。
この問題を実際に見てみましょう。
Pythonで確かめる — 標準zは異常を見逃す
正常データ(平均100)に、極端な外れ値2個(値1000)と、中程度の異常4個(値130)を混ぜます。標準的なzスコアと、後述する頑健版で、6個の異常をどれだけ検出できるか比べます。
import numpy as np
rng = np.random.default_rng(1)
normal = rng.normal(100, 5, 300)
data = np.concatenate([normal, [1000., 1000.], [130., 130., 130., 130.]])
true = np.zeros(len(data), bool); true[-6:] = True # 後ろ6個が真の異常
# 標準的なzスコア(平均・標準偏差ベース)
mu, sd = data.mean(), data.std()
z = np.abs((data - mu) / sd)
print(f"μ={mu:.1f}, σ={sd:.1f}")
print(f"中程度異常(130)のzスコア = {abs((130-mu)/sd):.2f}")
print(f"標準z(|z|>3)の検出率 = {((z>3) & true).sum() / true.sum():.2f}")
μ=105.8, σ=72.8
中程度異常(130)のzスコア = 0.33
標準z(|z|>3)の検出率 = 0.33
衝撃的な結果です。極端な外れ値2個のせいで $\sigma$ が 72.8 まで膨れ上がり(正常のばらつきは本来5程度)、中程度の異常130のzスコアはわずか 0.33——まったく異常と判定されません。結果、標準zは6個中2個(極端な外れ値のみ)しか検出できず、検出率はたったの0.33。4個の真の異常がマスキングで見逃されました。

右の拡大図がそれを示しています。星印が真の異常130ですが、膨らんだ$\pm3\sigma$境界(赤破線)の内側に収まり、見逃されています。「異常を測るための物差しが、異常自身に狂わされる」——これがマスキングの怖さです。
頑健統計 — 中央値とMAD
解決策は、外れ値に強い(頑健な)統計量を使うことです。平均・標準偏差の代わりに、中央値(median)と MAD(中央絶対偏差, Median Absolute Deviation) を使います。

$$ \begin{equation} z_{\text{robust}} = \frac{x – \mathrm{median}(x)}{1.4826 \cdot \mathrm{MAD}}, \qquad \mathrm{MAD} = \mathrm{median}(|x_i – \mathrm{median}(x)|) \end{equation} $$
中央値は、データの半分以上が動かない限り外れ値に引っ張られません。MADも同様に頑健です(係数1.4826は、正規分布のとき標準偏差と一致させるための補正)。これらは外れ値の影響をほとんど受けないので、マスキングを避けられます。先ほどのデータで試します。
med = np.median(data)
mad = np.median(np.abs(data - med))
zr = np.abs((data - med) / (1.4826 * mad))
print(f"median={med:.1f}, MAD={mad:.2f}")
print(f"中程度異常(130)の頑健z = {abs((130-med)/(1.4826*mad)):.2f}")
print(f"頑健z(|z|>3)の検出率 = {((zr>3) & true).sum() / true.sum():.2f}")
median=99.8, MAD=3.11
中程度異常(130)の頑健z = 6.55
頑健z(|z|>3)の検出率 = 1.00
劇的な改善です。中央値は外れ値に動じず 99.8(真の中心100にほぼ一致)、MADも 3.11 と正常のばらつきを正しく捉えています。その結果、中程度の異常130の頑健zは 6.55 としっかり大きくなり、検出率は1.00——6個の異常をすべて捉えました。標準zの0.33とは雲泥の差です。外れ値を検出したいなら、外れ値に強い統計量を使う——この一見逆説的な原則が、統計的異常検知の要諦です。
IQR法とGrubbs検定
頑健なアプローチには、ほかにも定番があります。

IQR法(箱ひげ図) は、四分位数を使います。第1四分位 $Q_1$ と第3四分位 $Q_3$ の差 $\mathrm{IQR}=Q_3-Q_1$ を求め、$[Q_1 – 1.5\,\mathrm{IQR},\ Q_3 + 1.5\,\mathrm{IQR}]$ の外を外れ値とします。四分位数も中央値同様に頑健なので、マスキングに強く、分布の正規性を仮定しない点も実用的です。箱ひげ図の「ひげの外の点」がまさにこれです。

Grubbs検定 は、より統計的に厳密なアプローチです。「最も外れた1点」について検定統計量 $G = \max_i |x_i – \bar{x}| / s$ を計算し、それが臨界値を超えれば外れ値と判定します。仮説検定なので、有意水準で誤検出率を制御できるのが利点です。1点ずつ検定し、外れ値を取り除いては再検定する、という反復的な使い方をします(ただし多数の外れ値があるとマスキングの影響を受けます)。
3手法の検出率を、先ほどのマスキングデータで並べると違いが一目瞭然です。

標準zは0.33にとどまる一方、頑健z(MAD)とIQR法はともに1.00。頑健な統計量を使う2手法が、極端な外れ値に惑わされず中程度の異常まで拾えていることがわかります。1次元データの外れ値検出では、まず頑健な方法(MADベースのz、IQR)を選ぶのが安全策です。
実務での使い分け
統計的異常検知は手軽で解釈しやすい反面、使いどころを誤ると外します。実務の指針を整理します。
- 正規性を仮定してよいか:zスコア・3σ・Grubbs検定は、正常データがおおむね正規分布に従うことを前提にします。分布が大きく歪んでいたり多峰だったりする場合、これらは不適切で、IQR法(分布を仮定しない)やノンパラメトリックな手法が向きます。
- 外れ値の混入を前提に頑健統計を使う:訓練データに異常が混ざっているのが普通なので、平均・標準偏差より中央値・MADを既定にするのが安全です。
- しきい値の意味を理解する:$|z|>3$ は「正規分布なら0.3%」という確率的な意味を持ちます。許容できる誤報率から逆算してしきい値を決められるのが統計的手法の利点です。Grubbs検定なら有意水準として明示的に扱えます。
- 対数変換などの前処理:右に裾を引く分布(所得・待ち時間など)は、対数変換で正規分布に近づけてからzスコアを適用すると、過剰な誤検出を抑えられます。
これらはいずれも「正常データがどんな分布か」という問いに帰着します。異常検知入門で触れた「正常を定義することの難しさ」が、ここでも効いてくるわけです。
多変量への限界
ここまでは1次元(1変数)の話でした。しかし現実のデータは多次元で、変数間に相関があります。

図のように、2つの変数に強い相関があるとき、各変数を1つずつ見れば正常範囲なのに、組み合わせとして異常な点があります(相関の関係から外れている)。1変数ずつのzスコアでは、こうした異常は捉えられません。変数間の相関を考慮した距離が必要です——それが次の記事で扱うマハラノビス距離です。統計的異常検知は、ここから多変量・非線形へと発展していきます。
まとめ
統計的異常検知の基礎を解説しました。
- zスコア・3σルール:平均から3σ以上離れた値を異常とする最も基本的な方法。$z=(x-\mu)/\sigma$。
- マスキング問題:外れ値が平均・標準偏差を歪め、自分や他の異常を隠す。実測では極端な外れ値2個により$\sigma$が膨れ、標準zは異常の33%しか検出できなかった。
- 頑健統計(中央値・MAD):外れ値に動じない統計量を使うことでマスキングを回避。実測では検出率100%に改善。
- IQR法は四分位数ベースの頑健な方法、Grubbs検定は有意水準で誤検出を制御できる統計的検定。
- 1変数ずつの統計は変数間相関による異常を捉えられず、多変量手法(マハラノビス距離)へ続く。
次の記事では、変数間の相関を考慮して「正常領域からの距離」を測るマハラノビス距離による異常検知を掘り下げます。