Prophetトレンド分析(折れ線モデル)

Prophet統計モデル概要で説明したとおり、Prophetのモデルは3つの項『トレンド』『周期性』『祝日』から成ります。
この記事では『トレンド』項がどのようなモデルに基づくのかを説明します。

まずは目で見て確認するのが理解への一番の近道です。
Prophetのデフォルト設定で時系列予測のページで作ったwikipedia日本語版『イチロー』のページへのアクセス数の予測結果のグラフを再掲します。

wikipedia日本語『イチロー』ページへのアクセス数をProphetを用いて分析した結果の要因別プロット

この図に示されている3つのグラフのうち一番上がトレンド項を表しています。
注目していただきたいのはこのトレンド項は直線がペキペキと折れたような折れ線グラフのような形をしているという点です。
Prophetはまさにデータのトレンドをこのような折れ線モデルで近似しようとします。
Facebook Prophet原論文では


g(t)=(k+\bold{a}(t)^\top\bold{\delta})t+(b+\bold{a}(t)^\top\bold{\gamma})

などと仰々しい数式が書いてありますが恐れることはありません。要するに折れ線グラフです。

折れ線グラフは2種類のパラメータ、傾き(growth)と変化点(changepoint)により決定できます。
傾きはその名の通り折れ線の変化率であり、変化点は傾きが変わる時点のことです。

先のグラフのwikipediaイチローのページへのアクセス分析に戻ります。

wikipedia日本語『イチロー』ページへのアクセス数をProphetを用いて分析した結果の要因別プロット

一番上のトレンドのグラフを見ると、2009年と2013年にピークを打ち、2015年以降は減少傾向であることが確認できます。
2009年はイチローが活躍しまくった第二回WBC、2013年はヤンキース移籍のタイミングであり納得いきますし、2015年のマーリンズ移籍が変化点となりアクセスが減少傾向にあることも捉えられています。
よってProphetのトレンド分析は納得の行く結果を残していると言えそうです。

データの中身を見てみます。
分析元データichiro.csvはココです。

#R
library(prophet)
ichiro <- read.csv("ichiro.csv", header=TRUE)
ichiro <- ichiro[ichiro$y != 0,]
ichiro$y <- log(ichiro$y)
m <- prophet(ichiro)
future <- make_future_dataframe(m, periods = 365)
forecast <- predict(m, future)
tail(forecast)
#             ds        t    trend yhat_lower yhat_upper trend_lower trend_upper seasonal_lower seasonal_upper  weekly       weekly_lower weekly_upper  yearly     yearly_lower yearly_upper     seasonal     yhat
#3204 2017-01-14 1.123711 7.218039   6.545569   7.803245    6.941729    7.484310   -0.047841743   -0.047841743  0.001780777  0.001780777  0.001780777 -0.049622520 -0.049622520 -0.049622520 -0.047841743 7.170197
#3205 2017-01-15 1.124055 7.217159   6.533324   7.786250    6.940464    7.484639   -0.070808737   -0.070808737 -0.037180745 -0.037180745  -0.037180745 -0.033627991 -0.033627991 -0.033627991 -0.070808737 7.146350
#3206 2017-01-16 1.124399 7.216279   6.630266   7.788764    6.938218    7.484886   -0.024909194   -0.024909194 -0.004294907 -0.004294907  -0.004294907 -0.020614287 -0.020614287 -0.020614287 -0.024909194 7.191370
#3207 2017-01-17 1.124742 7.215399   6.584152   7.840563    6.935971    7.485132   -0.008377829   -0.008377829  0.002456342  0.002456342  0.002456342 -0.010834170 -0.010834170 -0.010834170 -0.008377829 7.207021
#3208 2017-01-18 1.125086 7.214518   6.649077   7.867191    6.933725    7.485379    0.005443939    0.005443939  0.009898030  0.009898030   0.009898030 -0.004454091 -0.004454091 -0.004454091  0.005443939 7.219962
#3209 2017-01-19 1.125430 7.213638   6.622858   7.882403    6.931479    7.485625    0.038778608    0.038778608  0.040329058  0.040329058  0.040329058 -0.001550450 -0.001550450 -0.001550450  0.038778608 7.252417

forecastはデータフレームで、予測結果に関する情報が入っています。
このうちトレンド成分g(t)を表す数値はforecast["trend"]で取り出せます。
そしてtrend_lower, trend_upperが信頼区間の上下限を表していることも分かるでしょう。

【まとめ】

本記事ではProphetが折れ線でトレンドを分析する様子を確認しました。
しかし現実は線形トレンドでは無い場合もあるでしょう。
Prophetには非線形な成長、ロジスティック関数(自然な人口成長モデル)に基づいたトレンド分析手法も備えられており、Facebook原論文によるとFacebook内の実運用ではこちらの方が良く使われたそうです。
これの使い方については別記事で説明します。

関連記事

コメントを残す