単変量の外れ値検出

Rで学ぶ不正検知

Tim Verdonck

Professor Data Science at KU Leuven

外れ値

外れ値は、大多数のパターンから外れる観測です。 外れ値の魚 外れ値は不正の警告となることがあります。

Rで学ぶ不正検知

外れ値検出

  • 外れ値検出の一般的手法:

    • 各観測のzスコアを計算
    • |zスコア|が3より大なら外れ値と判定
  • 観測 $x_i$ のzスコア $z_i$:

$$z_i=\frac{x_i-\hat{\mu}}{\hat{\sigma}} = \frac{x_i-\overline{x}}{s}$$

  • $\overline{x}$ は標本平均: $\overline{x}=\frac{1}{n}\sum_i x_i$
  • $s$ は標本標準偏差: $s= \sqrt{\frac{1}{n-1}\sum_i(x_i-\hat{\mu})^2}$
Rで学ぶ不正検知

データセット loginc は10人の月収を対数変換したものです:

loginc: 7.876 7.681 7.628  ...  7.764 9.912 # ← 最後は明らかな外れ値!
  • (1) 各観測のzスコアを計算
Mean <- mean(loginc)
Sd <- sd(loginc)
zscore <- (loginc - Mean) / Sd
  • (2) zスコアが絶対値で3超か確認
abs(zscore) > 3
FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
  • これらのzスコアでは外れ値は検出されません!
Rで学ぶ不正検知

ロバスト統計

  • 古典的統計手法は(正規性などの)仮定に依存し、単一の外れ値でも結論が大きくぶれることがあります。
  • ロバスト統計は外れ値があっても信頼でき、外れ値検出を自動化できます。
  • 「古典とロバストを常に併用し、差が問題になるほど大きいときだけ注意すべきである。差が出たら、よく考えよ。」J.W. Tukey (1979)
Rで学ぶ不正検知

位置の推定量: 平均・中央値

標本平均: $$\overline{x}=\frac{1}{n}\sum_i x_i$$

mean(loginc)

mean(loginc9)
7.986447

7.772392

loginc9loginc から外れ値のみを除いたものです。

$n$ 個の観測を小さい順に並べ、標本中央値 $Med(X_n)$ は、$n$ が奇数なら $(n+1)/2$ 番目、偶数なら $n/2$ 番目と $n/2+1$ 番目の平均です。

median(loginc)
7.816658
median(loginc9)
7.764296
Rで学ぶ不正検知

尺度の推定量: sd

(1) 標本標準偏差: $$s= \sqrt{\frac{1}{n-1}\sum_i (x_i-\hat{\mu})^2}$$

sd(loginc)
0.6976615
sd(loginc9)
0.1791729
Rで学ぶ不正検知

尺度の推定量: mad, IQR

(2) 中央絶対偏差 (MAD): $$Mad(X_n)=1.4826Med(|x_i-Med(X_n)|)$$

(3) 四分位範囲 (正規化): $$IQR(X_n)= IQR = 0.7413(Q_3-Q_1)$$ ここで $Q_1$, $Q_3$ は第1・第3四分位数

IQR(loginc)/1.349
0.2056784
mad(loginc)
0.2396159
mad(loginc9)
0.201305
IQR(loginc9)/1.349
0.1839295
Rで学ぶ不正検知

外れ値検出のロバストzスコア

ロバスト推定量でロバストzスコアを計算:

$$z_i=\frac{x_i-\hat{\mu}}{\hat{\sigma}} =\frac{x_i-Med(X_n)}{Mad(X_n)}$$

robzscore <- (loginc - median(loginc)) / mad(loginc)

abs(robzscore) > 3 ## 外れ値の判定
FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE
robzscore[10] ## 外れ値のロバストzスコア
8.748523
Rで学ぶ不正検知

箱ひげ図

  • Tukeyの箱ひげ図も外れ値検出に広く使われます
  • 観測値がフェンスの外なら外れ値 $$[Q_1-1.5IQR; Q_3+1.5IQR]$$

箱ひげ図の説明

Rで学ぶ不正検知

例: 入院日数 (LOS)

boxplot(los, col = "blue", ylab = "Lenght of Stay (LOS)")$out
59  33  42  67  35  47 102  36  27  31  27  30  29  32  37  27  38

LOSの箱ひげ図_ggplot

Rで学ぶ不正検知

調整箱ひげ図

  • 分布が非対称だと、箱ひげ図は通常点を多く外れ値とすることがあります。
  • 歪度調整箱ひげ図は、フェンス算出にロバストな歪度指標を用いて補正します(Hubert & Vandervieren, 2008)

カイ二乗の箱ひげ図

Rで学ぶ不正検知

例 LOS: 調整箱ひげ図

調整箱ひげ図での外れ値:

library(robustbase)
adjbox(los)$out
59  67 102

調整箱ひげ図の統計量:

adjboxStats(los)$stats
2  4  8 13 47
Rで学ぶ不正検知

例 LOS: 箱ひげ図 vs 調整箱ひげ図

LOS_箱ひげ図

LOS_調整箱ひげ図

Rで学ぶ不正検知

練習してみましょう!

Rで学ぶ不正検知

Preparing Video For Download...