Prophetを使って予測してみます。
予測に用いるデータはwikipediatrendを使って取得した日本語版wikipediaの『イチロー』ページへのアクセス数とします。
【元データ】
Rでwikipediaのアクセス数データ取得のページを見ていただければ元データの作り方を記してありますが、次のリンクから取得できるようにもしてあります。
#R > library(prophet) > ichiro <- read.csv("ichiro.csv", header=TRUE) > ichiro <- ichiro[ichiro$y != 0,] > ichiro$y <- log(ichiro$y) > head(ichiro) ds y 31 2008-02-01 8.126223 32 2008-02-02 8.039480 33 2008-02-03 8.224700 34 2008-02-04 8.208219 35 2008-02-05 8.065894 36 2008-02-06 7.971776
予測するアクセス数は対数にしておきます。
その予備処理としてアクセス数ゼロの行は削除しました。
データフレームのds要素が日付データ、y要素が実現値になるようにしてください。
【予測モデル作成】
まずprophet関数を用いてモデルを作ります。
prophet関数には色々と引数があり、それを使うことで予測の挙動をコントロールできるのですがとりあえず今回は特に何も設定を変更せずデフォルトの予測機能をそのまま使ってみましょう。
#R > m <- prophet(ichiro) Initial log joint probability = -6.29542 Optimization terminated normally: Convergence detected: relative gradient magnitude is below tolerance
どうやらちゃんと何かが収束したようです。
【予測したい日付の指定】
次にアクセス数を予測したい日付を決めます。
prophetライブラリにはmake_future_dataframeという関数が準備されており、これを使うことでお手軽に日付データを作成できるようになっています。
make_future_dataframeは元データの日付列にperiodsで指定した日数だけ追加した日付を返す関数です。
#R > future <- make_future_dataframe(m, periods=365) > tail(future) ds 3280 2017-01-14 3281 2017-01-15 3282 2017-01-16 3283 2017-01-17 3284 2017-01-18 3285 2017-01-19
【予測】
これで予測の準備は整いました。
prophetで予測を行うためには汎用関数predictをprophetモデルに対して適用します。
#R > forecast <- predict(m, future) > tail(forecast[c("ds", "yhat", "yhat_lower", "yhat_upper")]) ds yhat yhat_lower yhat_upper 3204 2017-01-14 7.170197 6.545569 7.803245 3205 2017-01-15 7.146350 6.533324 7.786250 3206 2017-01-16 7.191370 6.630266 7.788764 3207 2017-01-17 7.207021 6.584152 7.840563 3208 2017-01-18 7.219962 6.649077 7.867191 3209 2017-01-19 7.252417 6.622858 7.882403
うまく予測できました。
yhatは点予測値、yhat_lowerとyhat_upperはそれぞれ区間予測の上下限値になります。
【予測結果のプロット】
#R > plot(m, forecast)
青い線が点予測の線で、薄い青が信頼区間です。
ちゃんと減少トレンドに追随して予測できているような感じがしますね。
またprophet_plot_componentsという関数を使うことでProphetの予測モデルを要素に分解して表示することができます。
#R > prophet_plot_components(m, forecast)
Prophetは予測に一般化加法モデルという統計モデルを用いていますが、このモデルを理解しなくても予測結果をある程度は直感的に理解できます。
たとえばこの図からはアクセス数が
- 2014年以降は下降トレンドにある
- 日曜日が少なく、木曜日が多い
- 冬から野球シーズン開幕にかけてアクセスは上昇するも、5月は失速し、6月から反転して9月のシーズン終了時にピークを迎え、秋以降のオフシーズンは落ち込む
ということを読み取ることができます。
【まとめ】
Prophetによる予測は細かい調整をしなくても簡単に予測できることが分かりました。
しかも予測結果を直感的に理解することがでるのは大変な強みです。
もちろんデータに関する知識を用いた細かい調整ももちろん可能です。
これについては別記事で説明する予定です。
ご指定のデータでprophet()を実行すると下記のエラーででますが、どうしてでしょうか。
もし可能でしたら、教えていただけますでしょうか。
> m <- prophet(ichiro)
Disabling daily seasonality. Run prophet with daily.seasonality=TRUE to override this.
Error in new_CppObject_xp(fields$.module, fields$.pointer, …) :
no valid constructor available for the argument list
failed to create the optimizer; optimization not done
matrix(m$params[[name]], nrow = n.iteration) でエラー:
'data' はベクトル型でなくてはなりませんが、'NULL' でした
>kunotchさま
コメントありがとうございます。
ご指摘いただいたエラーは私の手元では再現できませんでした。
内容を見る限り、Rstanで異常が起こっているのではと思われます。
環境はwindowsですか?
windowsであればRtools, rstanをインストールしていますか?もしまだしていなければ
http://funyakofunyao.click/2017/04/25/prophet%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%abr%e7%89%88/
でprophetのインストール方法を紹介しています。これに従ってRtoolsを正しくインストールしてください。
もしRtoolsを既にインストールしているのであればrstanのバージョンを最新版にしてみてください。
https://github.com/stan-dev/rstanarm/issues/202
同様のエラーが報告されています。