異常検知(変化点検出)のパッケージを作ってみた
時系列的な振る舞いの変化点を検出するためのパッケージを作ってみました。
- CRAN: http://cran.r-project.org/web/packages/ChangeAnomalyDetection/
- github: https://github.com/yokkuns/r-AnomalyDetection
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()
異常スコア算出
- 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()
重ねて表示
それぞれで出すと対応が良く分からないので、二つ同時にプロットしてみる。
- データの整形
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))