読書・NBA・ポケモン

読書・ポケモン・NBA・統計学について書きます

富樫勇樹の今後1年のWikipediaの閲覧数を予測する――Prophetを用いた分析

○はじめに

Facebookが作ったProphetを用いて、Bリーグのスター選手である富樫勇樹選手のWikipediaの閲覧数を予測します。この予測を通じて、時系列分析の練習をするのが目的です。正直、予測そのものよりも、教師データの記述的な分析の方が読んでいて面白いと思います。

○データの取得&EDA

wikipediatrendパッケージを使って、4年分のviewsと日付のデータを得ました。それを折れ線グラフで示したのが図1です。
f:id:morry0371:20200215193900p:plain
 折れ線グラフで可視化したところ、だいたいviews/日は350~500で推移していることと、ときどき2500viewsを超えるスパイクがあることが分かりました。そこで2500viewsを超える日を調べたところ、大雑把に言って①天皇杯決勝の日は閲覧数が多い、②日本代表の試合がある日は閲覧数が多い、③Bリーグプレーオフ・チャンピオンシップの日は閲覧数が多い、ことが分かりました(より詳しい説明はコードに書いたので見てみてくださると幸いです)。要するに千葉ジェッツの試合がTVで放映されている日は閲覧数が多いということです。このうち①③は、千葉ジェッツの勝ち上がり次第ではあるものの、年周期で見られるものだと考えられるので、予測を行う際に有用だと考えました。*1
 次に、曜日ごとの閲覧数の中央値を可視化したものが図2です。
f:id:morry0371:20200215193932p:plain
この図から、土曜日と日曜日には閲覧数が多いことが分かりました。これはBリーグの試合が週末に行われているためだと考えられます。Prophetでは、weekly.seasonalityをTrueにすることで、曜日の影響を表現することができます。

○今後1年の閲覧数の予測

Prophetで教師データの4年分と今後1年の閲覧数を予測したものが図3です。
f:id:morry0371:20200215193953p:plain
予測された閲覧数の点推定値は366099となりました。ただし、この閲覧数の点推定値は千葉ジェッツが2020年のチャンピオンシップまで勝ち進んだという想定の下である点には注意してください。

○感想

私は観戦しながらスマホをいじるということはしないのですが、今回の分析を通して、TVで観戦しながら選手のWikiを見る、という行動が明らかになって面白かったです。

○おまけ(分析に使ったコード)

#必要なパッケージの準備
library(wikipediatrend)
library(tidyverse)
library(lubridate)
library(prophet)

#富樫勇樹の閲覧数データを取得する
togashi=wp_trend(page="富樫勇樹",lang = "ja",Sys.Date()-1460)#4年前までのデータを取得
togashi %>% ggplot(.,aes(x=date,y=views))+
  geom_line()+
  theme_gray (base_family = "HiraKakuPro-W3")+
  labs(title = "図1:viewsの推移(2016~2020年)")

#いくつかスパイクが見られるので、viewsが2500以上の日を特定する
togashi$date[togashi$views>2500]
#2016年9月22日はBリーグの開幕日
#2017/01/15はBリーグのオールスター
#2017/01/06-10は天皇杯
#2017/02/10,11は日本代表戦vs.イラン
#2017/05/07はレギュラーシーズン最終日
#2017/05/08は?
#2017/05/13-14はBリーグチャンピオンシップvs.栃木
#20170527は?
#20170603は東アジア選手権開幕日vs.韓国
#20170902は炎の体育会TV出演日
#20171001はBリーグ開幕節第2戦
#20171124はバスケW杯1次予選vs.フィリピン
#20180107は天皇杯決勝
#20180421は?
#20180520は?
#20180526はBリーグチャンピオンシップvs東京
#20180627は富樫の契約更新日
#20190113は天皇杯決勝
#20190224はW杯2次予選最終戦vs.カタール
#20190225はその結果が報じられた日?
#201903は?
#20190505-20190623はBリーグプレーオフ
#20190724は富樫の怪我が報じられた日
#20190824は日本代表戦vs.ドイツ
#20190825は日本代表戦vs.チュニジア
#20190905はフジテレビでW杯の特集が組まれた日
#20200208は千葉の10連勝が止まった日?


#一週間のviewsの変動を見る
togashi$date=as.Date(togashi$date,"%d.%m.%Y")

togashi$year=year(togashi$date)
togashi$year=as.factor(togashi$year)

togashi$day=day(togashi$date)
togashi$day=as.factor(togashi$day)

togashi$month=month(togashi$date)
togashi$month=as.factor(togashi$month)

togashi$weekdays=weekdays(togashi$date)
togashi$weekdays=as.factor(togashi$weekdays)

#weekdaysの順番を変更する
togashi$weekdays=factor(togashi$weekdays,levels=c("月曜日","火曜日","水曜日","木曜日","金曜日","土曜日","日曜日"))

#一週間の閲覧数を可視化する
togashi %>% group_by(weekdays) %>% 
  summarise(median=median(views)) %>% 
  ggplot(.,aes(y=median,x=weekdays))+
  geom_bar(stat = "identity")+
  theme_gray (base_family = "HiraKakuPro-W3")+
  labs(title = "図2:曜日ごとにみたviews")
#日曜日と土曜日のview数が多い。これは試合の効果だと考えられる

#prophetでモデルを組んでみる
togashi %>% 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")

#days of week は日曜日始まり
prophet_plot_components(model,forecast)

sum(forecast[1462:1825,32])#一年間の閲覧数の合計

*1:プレーオフ・チャンピオンシップは日程が公表されていなかったので、2020年のプレーオフの日程が2019年の日程と同じであると仮定しました