異常検知(変化点検出)のパッケージを作ってみた

時系列的な振る舞いの変化点を検出するためのパッケージを作ってみました。

Usage

changeAnomalyDetection(x, term = 30, smooth.n = 7, order = c(1, 0, 0), ...)
x 時系列の数値ベクトル
term 学習期間
smooth.n 移動平均の期間
order arima関数に渡すorder
... arima関数に渡すその他パラメータ

実行例

パッケージ読み込み
library(ChangeAnomalyDetection)
library(RFinanceYJ) 
library(ggplot2) 
library(reshape2) 
試すデータの用意

今回は、RFinanceYJで適当な株価情報を取得して試してみる

  • 株価データの取得
stock <- quoteStockXtsData("2432.t", since = "2011-01-01")
head(stock)

##            Open High  Low Close  Volume AdjClose
## 2011-01-04 2914 2978 2906  2969 1379000     2969
## 2011-01-05 2990 2995 2914  2931 1521100     2931
## 2011-01-06 2949 2952 2919  2932 1086300     2932
## 2011-01-07 2922 2969 2912  2917 1216000     2917
## 2011-01-11 2924 2965 2919  2957 1369100     2957
## 2011-01-12 2958 3045 2957  3025 2080700     3025

stock <- as.data.frame(stock)
stock$date <- as.POSIXct(rownames(stock))
ggplot(yahoo, aes(x = date, y = Close)) + 
    geom_line()

http://gyazo.com/6895fc589b1bd95242ba92257838622a.png

異常スコア算出
  • changeAnomalyDetection関数を実行
change.score <- changeAnomalyDetection(x = stock$Close, term = 30, order = c(1, 1, 0))
tail(change.score)
## [1] 0.6212 0.6316 0.6207 0.6011 0.9440 1.1845
stock$change.score <- change.score
  • スコアの推移を描画
ggplot(stock, aes(x = date, y = change.score)) + 
    geom_line()

http://gyazo.com/d6caabf05ef1996cf3238829a9bebd17.png

重ねて表示

それぞれで出すと対応が良く分からないので、二つ同時にプロットしてみる。

  • データの整形
stock <- stock[stock$change.score != 0, ]

# ggplotでは2軸のプロットが出来ないので、スケールを合わせてる
stock$change.score <- stock$change.score * 10 + 1000 

# この手の整形はreshape2パッケージのmelt関数が便利!
stock.melt <- melt(stock, id.vars = "date", measure.vars = c("Close", "change.score"))
  • プロット
ggplot(stock.melt, aes(x = date, y = value)) + 
    geom_line(aes(col = variable))

http://gyazo.com/0b2092a889c306129fbc9fcc978e60f6.png

参考

  • 時系列分析による異常検知入門