平均値0, 分散1にした対称な連続分布いろいろ

ハゲてきたので, 禿げ上がる前にもう一度告白したい.


あっ, どーも僕です.


異常値検知は正規分布でイカンのか?

 対照な分布でも正規分布とは限らないって話.
 こないだ, はてなのホットエントリーに2σ管理による異常値検知の話が上がって来ました.

「n日間移動平均」+「±2σ境界線」をExcelでプロットしてお手軽にKPIの異常値をチェックする(厳密ではないけど) - 道玄坂で働くデータサイエンティストのブログ

 このエントリーは, 著者も述べているようにかなり単純化しすぐ試せる話にしてあるので, 統計リテラシーのあるはてブユーザーからお怒りのコメがついてますね.
 自分として, エントリ中に何度も正規分布しているかわからんとか, 統計学的に厳密な議論でないと記述されているので, 勘違いする人はいないと思うのでこれはこれでいいのかと思うですが....

 で, お怒りポイントの一つにKPIが正規分布してないんじゃね?という話があります. なんでこれがお怒りポイントかっていうと, どんな分布を想定するかで管理範囲か違うんじゃね??って話だからです.

 「 でも対称ならとりあえず正規分布使えばいいんじゃね?」

 と, お考えの方もいるでしょう. 仮に対称だとしてもどんな分布を使うかは慎重に議論したほうがよいです. そこで, 平均値0と分散1で対称な密度関数をいくつか描いてみました. 参考にしてください. (まっホントは対称じゃないというのもお怒りポイントだと思いますが...)

 描いた関数は次の5つです.

  • ロジスティック分布(logis)
  • 一様分布(unif)
  • 正規分布(norm)
  • 両側指数分布(BsExp)
  • 混合正規分布(ConNorm)

 Rで書いてみた結果がこちらです.
f:id:aaaazzzz036:20130530221737j:plain

# 平均0 分散1の分布いろいろ
# 両側指数分布
BsExp <- function (x, m = 0, sigma = 1) 1 / ( 2 * sigma ) * exp (-abs(x-m) / sigma)
# 混合正規分布
ConNorm <- function (x, epsilon = .1) 
  (1 - epsilon) * dnorm(x, m = 0, sd = 1 / sqrt(1.8)) +
  epsilon * dnorm(x, m = 0, sd = 9 / sqrt(1.8))
# グラフ
col = brewer.pal(5, "Set2")
curve(dlogis(x, 0, sqrt(3) / pi), -3, 3, ylim = c(0, .7), 
      xlab = "", ylab = "", bty = "n", cex.axis = 2,
      yaxt = "n", tcl = .5, type = "n")
axis(side = 2, cex.axis = 2, las = 1)
curve(dlogis(x, 0, sqrt(3) / pi), lwd = 3 , col = col[1], add = TRUE)
curve(dunif(x, max = sqrt(3), min = - sqrt(3)), lwd = 3, col = col[2], add = TRUE, n = 1e4)
curve(dnorm(x, m = 0, sd = 1), lwd = 3, col = col[3], add = TRUE)
curve(BsExp(x, m = 0, sigma = 1 / sqrt(2)), lwd = 3, col = col[4], add = TRUE)
curve(ConNorm(x, epsilon = .1), lwd = 3, col = col[5], add = TRUE)
abline(h = 0, col = "darkgrey")
legend("topright", legend = c("logis", "unif", "norm", "BsExp", "ConNorm"), 
       col = col, lty = 1, lwd = 4, cex = 2, bty = "n")