富樫勇樹のWikipediaの閲覧数を予測したので実数値と比較しました
こんにちは、らんそうるいです。2020年2月15日にProphetという時系列分析ライブラリを使って、富樫勇樹選手のWikipediaの閲覧数を予測していたので、実数値と比較したいと思います。予測したのは2020年2月16日から一年後の2021年2月15日までの総閲覧数です。(*下の記事では予測値は366099となっているのですが、2021年7月12日に再び予測してみると444161という点推定値が得られました。なんでや……)
2020/02/16~2021/02/15の閲覧数の推移
Prophetで予測した期間(2020/02/16~2021/02/15)の閲覧数の実数値を示したのが折れ線グラフ(図1)です。データはRのwikipediatrendパッケージを使って取得しました。閲覧数の中央値は352.5でした。
Prophetの学習データとして利用した期間(2016/02/16~2020/02/15)の閲覧数のグラフ(図2)と比較すると、図1ではスパイクが散見されるものの、そのスパイクは図2ほど大きくないことが分かりました。図2のスパイクは主に①天皇杯決勝の日、②日本代表の試合のある日、③Bリーグのチャンピオンシップの日の3タイプで、「試合がテレビ中継される日には閲覧数が伸びる」らしい、という仮説を前回持ちました。
そこで図1の期間のデータで閲覧数が2500を超えていた日を抽出して、どんなイベントがあったのか調べたところ、
- 炎の体育会TVに富樫選手が出演した日(2020/06/20)
- 千葉ジェッツの開幕戦の日(2020/10/03)
- シューイチで富樫選手が出演した日(2020/10/04)
- 不明(2021/01/29, 2021/01/30)
だったことが分かりました。テレビ出演の日でも閲覧数の伸びが弱くなっていることは、富樫選手の知名度が高くなってきて、いちいちWikipediaを調べなくなったのかもしれません。
予測値と実数値の比較
2020/02/16~2021/02/15の期間の、Prophetによる予測値(青)と実数値(赤)を重ねて示したのが図3の折れ線グラフです。後で考察しますが、実数値よりも予測値の線のほうが上にある、つまり予測が過大になっていたことが分かりました。閲覧数の予測値の点推定値は444161でしたが、実数値は187759となりました。
考察:なぜ予測が過大になってしまったのか
新型コロナウイルス感染症の対策のために、2019-2020シーズンが中断されたことが効いているのだと考えました。前回の記事では千葉ジェッツがプレーオフの決勝まで勝ち進むことを想定した予測だったので、閲覧数が伸びるプレーオフが開催されなかった結果、予測値が実数値よりも高くなってしまったのだと思います。ただ、この考察は不十分で、プレーオフ期間中(2020年5月〜6月くらい)に予測値が高くなりすぎることは説明できても、全体的に予測値が高めなことは説明できません。どうして予測値が高めになっているのかについては分かりませんでした……。Prophetへの理解が足りていないために、モデルの立て方がまずかったのかもしれません。
終わりに
当然の話なのですが、モデルに取り込んでいない外部からのショック(今回の分析では新型コロナウイルス感染症)があると、予測が外れてしまうということがよく分かりました。Prophetについても、もっと勉強してまた予測に挑戦してみたいと思います。
分析に使ったコード(R)
#必要なパッケージの準備
library(wikipediatrend)
library(tidyverse)
library(lubridate)
library(prophet)
#富樫勇樹の閲覧数データを取得する
togashi=wp_trend(page="富樫勇樹",lang = "ja",from="2020-02-16",to="2021-02-15")#4年前までのデータを取得
togashi %>% ggplot(.,aes(x=date,y=views))+
geom_line()+
theme_gray (base_family = "HiraKakuPro-W3")+
labs(title = "図1:viewsの推移(2020年2月16日~2021年2月15日)")
#いくつかスパイクが見られるので、viewsが2500以上の日を特定する
togashi$date[togashi$views>2500]
#2020/06/20は炎の体育会TVの放送日
#2020/10/03は千葉ジェッツの開幕戦
#2020/10/04はシューイチで富樫特集
#2021/01/29は?
#2021/01/30は?
#2020/02/15~2021/02/15の総閲覧数を算出
sum(togashi$views)#187759
#この期間の総閲覧数の中央値を算出
median(togashi$views)#352.5
#記事にあるデータセットを作る
togashi2=wp_trend(page="富樫勇樹",lang = "ja",from="2016-02-16",to="2020-02-15")#4年前までのデータを取得
togashi2 %>% ggplot(.,aes(x=date,y=views))+
geom_line()+
theme_gray (base_family = "HiraKakuPro-W3")+
labs(title = "図2:viewsの推移(2016年2月16日~2020年2月15日)")
#prophetでモデルを組んでみる
togashi2 %>% select(date,views)->togashi_prop
colnames(togashi_prop)<-c("ds","y")
#休日効果を入れる。
#まずプレーオフ・天皇杯決勝の日を休日効果に入れる
holiday=read.csv("togashi_holiday.csv")
holiday$ds=as.Date(holiday$ds)
#閲覧数の上限を設定する
togashi_prop$cap=25000#ロジスティックの場合は下限はデフォルトで0
model=prophet(togashi_prop,holidays = holiday,growth = "logistic",weekly.seasonality = T)
future=make_future_dataframe(model,periods = 365)
future$cap=25000
forecast=predict(model,future)
plot(model,forecast)+labs(y="views",x="date",title = "図3:Prophetを用いた閲覧数の予測")+
theme_gray (base_family = "HiraKakuPro-W3")
#2020/02/15の予測と実数値のプロットする
data=forecast %>% select(.,ds,yhat,views=yhat) %>% filter(.,ds>"2020-02-15")
data=data %>% mutate(type="予測値")
data=togashi %>% select(.,date,views,ds=date) %>% mutate(type="実数値") %>% rbind(data,.)
data %>% ggplot(.,aes(x=ds,y=views,color=type))+
geom_line()+
theme_gray (base_family = "HiraKakuPro-W3")+
labs(title = "図3:Prophetによる予測値(青)と実数値(赤)")+
xlab("日付")
#一年間の閲覧数の合計を予測
sum(forecast[1462:1825,29])#444161
#2020/02/15~2021/02/15の総閲覧数を算出
sum(togashi$views)#187759