Splunk DLTK : 時系列予測分析をしたい！ prophetのサンプルコードを実行してみる


# はじめに

Splunk DLTKのサンプルコードを眺めてみようシリーズです。
今回は prophet を使った時系列予測モデルのサンプルコードです。将来の動きを予測したい場合など利用できるのでは？

### prophetとは?

Facebookが作ったOSSの時系列予測アルゴリズムになります。従来のARIMAなどの自己相関を元にしたアルゴリズムに比べて非常に簡単に、しかも状態空間モデルも加味しながら、かつ季節性も取り入れられるといったメリットがあるとのことです。

Splunk MLTKにある StateSpaceアルゴリズムを使ったものよりも、季節性も取り入れられる点で優秀と言えるかもしれません。

今回こちらの記事を参考にさせていただきました。
https://www.atmarkit.co.jp/ait/articles/1904/19/news009.html

また細かいオプションなどはオリジナルのマニュアルが充実しております。
https://facebook.github.io/prophet/docs/quick_start.html

# DLTKについて

今回はDLTKの使い方については解説しません。DLTKのセットアップや使い方についてはこちらの記事をご覧ください。
https://qiita.com/maroon/items/5a8b027631a674d6d8be

# サンプルコードを確認

それでは早速 DLTKに含まれるサンプルコードをみてみます。

まずはライブラリのインプート箇所です。Prophet ライブラリが入ってますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/551626e8-60a6-17dc-4442-18126dd63a79.png)

### Stage1: データの読み込み

DLTKは Splunkからデータを取り込みます。そのため取り込みのためのSPLを実行します。データの中身はBluetoothのある拠点のユニークなアドレス数を時間あたりにカウントしたものです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/279eb2fd-76b9-1e93-cb06-9f9a7026e15e.png)

**注意** ノートブックにあるSPLのサンプルコードには以下のオプションが抜けており、そのまま実行すると学習時(Fit)や適用時(apply)で失敗します。　以下のように(fit_range_start / fit_range_end)オプションを追加してください。　このオプションは学習に利用する期間を指定してます。

```
| inputlookup bluetooth.csv
| where probe="AxisBoard-5"
| timechart dc(address) as distinct_addresses span=1h
| eval ds=strftime(_time, "%Y-%m-%d"), y=distinct_addresses
| fit MLTKContainer mode=stage algo=prophet_forecast fit_range_start=1 fit_range_end=1000 y from ds into app:prophet_forecast
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/88b254db-5bf7-1d4b-dbab-33f181eae559.png)


実際のデータをグラフでみるとこんな感じになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/c825615d-86be-2163-c16c-e3441ce55e21.png)

### Stage2: 初期化
単純に Prophetのインスタンスを立ち上げただけですね。
Prophetのオプションを指定する場合は、こちらで指定する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/06f1b266-0a87-53f8-8371-60b7e31b09bd.png)

### Stage3: 学習(fit)
SPLの引数で範囲指定された箇所を抜き出して、学習します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/0d26fe20-c1f1-f24e-9ef5-bb81f5a5b2d5.png)


### Stage4: 適用(apply)

学習したモデルを使って、読み込んだデータを予測します。
changepoints というのを追加して、予測結果と合わせてリターンするようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/16fdfa51-89d5-a424-e315-04ca6cec508b.png)


### Stage5-7: その他

あとは、モデルの保存やロード、サマリー出力を定義します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/a6be79b6-38f0-5420-07cf-9a183bc8f47e.png)

# Splunkから実行してみる

それでは、同じデータですが、Splunkから実行するとどのような結果になるか見てみます。

学習前のオリジナルデータです。どうやら prophetを使う場合 field名を dsと yとしてインプットする必要があるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/7046bc77-2f78-c288-7a63-cc7f37a8650c.png)

実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/040df7fe-516f-09c3-28ba-921d8851f48a.png)

うっ。なんかいっぱい出てきた。。 fieldsummaryでチェックすると、大きく分類すると以下の項目が出力されます。
それぞれの lower, upperが出力されているため、大量に出力されるように見えます。
- yhat: yの予測値
- trend: トレンドライン
- daily: 周期性（daily)
- weekly:　周期性(weekly)
- additive_terms: 周期性モード（ addtive : リニアに増加)
- multiplicative_terms: 周期性モード (multiplicative : percentage的に増加)
- changepoint: トレンドの変化点

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/768edb89-1813-a345-8eb4-23c64ea908a2.png)


prophetは、これらの周期性を組み合わせて予測してますが、これらの周期性も確認できるのはありがたいですね。
(ちなみに、predicted_y, ds.1 というフィールドも出力されてますが、これらは無視して大丈夫です。)

デフォルト設定だと、8:2で指定した期間のデータを学習とテストデータに分けているみていです。そのため changepointも8割までのデータにしか適用されないため、後半は出力されてません。


# ダッシュボードサンプル

DLTKにはダッシュボードサンプルまで用意されております。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/be30ddf8-909e-760b-e6e8-d6c0615cf9be.png)

１つ目のチャートは、実際の値(y)と予測値(yhat as forecast)とその差分(resident)をグラフ化したものです

２つ目のチャートは、トレンドと周期性(daily/weekly)と変化点(changepoint)を可視化したグラフです。
Splunkではあまり見たことがないチャートですですが、通常のLine Chartにオプションで以下のものをつけてました。

**annotation(注釈)**
changepointが annotationとして表示されてます。これはコメントをグラフに追加する機能をうまく応用して表現してます。（参考になりますねー）

# まとめ

如何だったでしょうか？ prophetは時系列予測としては非常に注目されてたので、Splunkでも利用できるのはありがたいですね。でも使いこなすにはオプションなどももっと勉強しなければ・・・