前回は、prophetを使って、2ヶ月先のブログアクセス数を予測しました。
今回はその答え合わせと、前回は触れなかった時刻周期の扱い方について書いていきます。
予測結果と実測値の比較
前回の予測結果はこのようになっていました。 (前回同様データはこちらにあります。
medi_data/prophet_data at master · kojiro0208/medi_data · GitHub )
dat <- read_csv("Analytics.csv",skip = 6,n_max = 211) %>% rename("ds"="日の指標", "y" = "ユーザー") dat_with_articles <- read_csv("dat_with_articles.csv") future_with_articles <- read_csv("future_with_articles.csv") syukujitsu_dat <- read_csv("syukujitsu_dat.csv") model <- prophet(holidays=syukujitsu_dat,seasonality.mode = "multiplicative") %>% add_regressor(name="articles") %>% fit.prophet(dat_with_articles) pred <- predict(model,future_with_articles) plot(model,pred)+ add_changepoints_to_plot(model)
モデルには、祝日のデータと記事数を外部変数として加えてあります。
結果を見てみましょう。
#前回以降のデータを読み込み dat2 <- read_csv("Analytics2.csv",n_max = 365) %>% rename("ds"="日の指標", "y" = "ユーザー") %>% filter(ds>ymd("2019-07-16")) # 可視化 pred %>% mutate(ds=ymd(ds)) %>% full_join(dat2) %>% rename("Predict"="yhat", "Row" = "y") %>% gather(key="Time",value = "y",Predict,Row) %>% ggplot()+ geom_line(aes(x=ds,y=y,color=Time))+ scale_color_manual(values = c("blue","red"))+ geom_ribbon(aes(x=ds,ymax=yhat_upper,ymin=yhat_lower),fill="skyblue",alpha=0.5)+ geom_point(data=dat ,aes(x=ds,y=y))+ theme(legend.title = element_blank(), legend.position = c(1,1), legend.justification = c(1,1))
青線が予測値、赤線が実際のデータになります。どうやら予測値よりも、実測値は少なくなっているようです。これは、外部変数として投入した記事の数は1週間に1記事ずつ増加することを前提に投入しましたが、私の怠惰によりほとんど記事の数が増えていないことに起因していると考えられます、、、すみません、、
prophetに外部変数を投入する際は、確実に未来の値がわかっている変数を使う必要がありそうですね。
prophetによる時刻周期の解析
prophetは曜日周期だけでなく、時刻周期も扱うことができます。今度は、2019/1/1〜2019/10/1の1時間ごとにアクセス数を記録したデータを使ってみます。
dat3 <- read_csv("Analytics_time.csv") %>% mutate(ds = ymd_hms(ds,tz="GMT"))
ds | y |
---|---|
2019-01-01 00:00:00 | 0 |
2019-01-01 01:00:00 | 0 |
2019-01-01 02:00:00 | 0 |
2019-01-01 03:00:00 | 0 |
2019-01-01 04:00:00 | 0 |
2019-01-01 05:00:00 | 0 |
ここで一つ注意点、データのタイムゾーン をGMTにしておかないと、prophetモデル作成時にタイムゾーン がGMTで計算されるため、出力に時差が出てしまいます。私はこれにハマり、感覚とは異なる結果に翻弄されました、、皆様お気をつけください。
さて、早速やっていくのですが、実はとても簡単で、モデル作成時のデータに時刻が入っていれば、勝手に時刻周期を推定してくれます。
model <- prophet(dat3,holidays=syukujitsu_dat,seasonality.mode = "multiplicative") future <- make_future_dataframe(model,7*4*2) pred <- predict(model,future) #結果の可視化 prophet_plot_components(model,pred)
上からトレンド、祝日の効果、曜日周期、時刻周期になります。時刻周期のところを見てみると、9:00~18:00のところがアクセスが集まっているようです。曜日周期も含めてみてみると、どうやら私のブログはお仕事中に訪問される方が多いようです。prophetを使えば、簡単に時刻周期の解析ができますね!
まとめ
今回はprophetを使って予測した結果と、実測値の比較、時刻周期の解析を方法について書いてみました。予測については、外部変数やイベント効果を入れる際は、将来の値が確実に分かっているデータを使った方が良さそうです。
時刻周期解析は、時刻情報を持つデータをモデル作成時に渡すだけで、簡単に周期解析をすることができます。時刻情報を使って予測などをしてみても良さそうですね。
※本記事は筆者が個人的に学んだことをまとめた記事になります。所属する組織の意見・見解とは無関係です。また、数学の記法や詳細な理論、用語等で誤りがあった際はご指摘頂けると幸いです。