Wikipedia『晴山ケビン』の閲覧数を予想する――ARモデルを用いて

こんにちは、らんそうるいです。時系列データの分析の練習として、晴山ケビン選手のWikipediaの閲覧数の予測を4週間先まで立てたので紹介します。結論を先に書くと、4週間後の総閲覧数は1000程度だと考えました。主要なアウトプットである、閲覧数の予測値の推移も示します。

 なぜ晴山選手を題材として選んだのかと言うと、2つ理由があります。一つは晴山選手は日本人選手の中でPoint Per Possessionが上位の選手であり、以前から興味をひかれる選手であったからです。もう一つはメディアへの露出が少なそうだからです。富樫勇樹選手のWikipediaの閲覧数を予測したことがあるのですが、富樫選手はTV出演が多く、TV出演した日にはWikiの閲覧数が大きく伸びることが分かりました。これが不規則なスパイクとなり、予測を難しくしていました。そのため、予測の難易度を下げるために、メディアへの露出が少なそうな選手を題材として選びたかったというわけです。

 今回の分析は、特に自信がないので、有識者様からのアドバイスをお待ちしております。テキストとしてはこれを使いました。

データの概観

2018年7月16日〜2021年7月13日の『晴山ケビン』の閲覧数の推移を示したのが図1です。

閲覧数が250を超えるスパイク(折れ線グラフが赤い水平線を超えている日。9日分)について調べたところ、2018年10月30日は『真の’リアル桜木花道’へ』という記事が公開された日、2019年6月6日は千葉ジェッツへの移籍が発表された日、2020年6月9日は滋賀レイクスターズへの期限付き移籍が発表された日、2021年4月5日は『熱血バスケ』に出演した日、2021年6月4日は富山グラウジーズへの移籍が発表された日でした。その他のスパイクについては何が原因なのか分かりませんでした。目論見通り、富樫選手よりもメディアへの露出が少なく、スパイクが少ないデータとなっていることが分かりました。

ARモデル適用の前提条件の確認

『春山ケビン』の閲覧数の偏自己相関係数を示したコレログラムが図2です。なぜかラグ23に強い偏自己相関があることが分かりました。また、ar()でAICを基に最適な次数を調べた結果、ラグ3までのデータを使ったモデルが最良であることが分かりました。

 時系列データが単位根を持つか調べるためにDickey-Fuller検定を行った結果、帰無仮説(単位根を持つ)は棄却され、単位根を持たないことが示唆されました。

 最後に推定したAR(3)モデルの残差の平均と分散がホワイトノイズと同様の性質を持つか調べるために、誤差平均(残差系列)と誤差分散(残差の2乗系列)を調べました。まず残差系列のコレログラムを示したのが図3です。ラグ23以外に自己相関は見られませんでした。

次に残差の2乗系列のコレログラムを示したのが図4です。やはりラグ23以外に自己相関は見られませんでした。以上の分析から、『晴山ケビン』の閲覧数に対するAR(3)モデルの残差はホワイトノイズと見なせそうだと考えられました。次節では、得られたモデルを使って閲覧数を予測します。

ARモデルによる予測

推定したAR(3)モデルで、28日後までの閲覧数を予測しました。その結果が図5です。

図5では、2021年4月10日から7月13日までの実際の閲覧数を黒実線で、7月14日から8月10日までの予測値を赤実線で示しています。赤破線は予測値±標準誤差の範囲を示しています。予測した28日間の総閲覧数は995.052となりました。そのため、この記事では一ヶ月後の総閲覧数の予想を1000程度としたいと思います。

終わりに

Wikipediaの閲覧数という時系列データに対して分析を試みました。時系列データは普段分析しているボックススコアのデータに比べて扱いが難しく、間違いが含まれているかもしれません。もし間違いがございましたら、著者のTwitterまでご連絡ください。また、時系列データの分析の練習がしたいので、バスケ関連の時系列データのご紹介もお待ちしております。よろしくおねがいします。

著者のTwitter → https://twitter.com/rnsr0371

分析に使ったコード(R)

library(tidyverse)
hr=read_csv("晴山ケビンの閲覧数_20210715.csv")

hr %>% ggplot(.,aes(x=date,y=views))+
  geom_line()+
  geom_hline(yintercept = 250,color="red")+
  ggtitle("図1:晴山ケビンの閲覧数(2018/07/16-2021/07/13)")

#スパイクの確認
hr %>% filter(.,views>250)
#2018-10-30 『真の'リアル桜木花道'へ』という記事が公開された日
#2019-05-14  ?
#2019-06-06 千葉ジェッツへの移籍が発表
#2019-06-07 ?
#2019-06-09 ?
#2020-06-09 滋賀レイクスターズへの期限付き移籍が発表
#2021-03-06 ?
#2021-04-05 熱血バスケに出演
#2021-06-14 富山グラウジーズへの移籍が発表

#自己相関関数の確認
acf(hr$views,plot=T,type="partial",main="図2:『晴山ケビン』のコレログラム")#ラグ23のみ有意

#ARモデルを立てる
model=ar(hr$views)#20180716-20210713までのデータで学習

#単位根の有無を調べる
library(tseries)
hr$views %>% adf.test()#データ系列に単位根は存在しない

#誤差平均を調べる
acf(model$resid[-1:-3],main="図3:誤差平均のコレログラム")

#誤算分散を調べる
acf(model$resid[-1:-3]^2,main="図4:誤差分散のコレログラム")

#4週間分の閲覧数を予測する
pred=predict(model,n.ahead = 28)

#予測値・標準誤差・日付のデータフレームを作成
data=data.frame(date=seq(as.Date("2021-07-14"),as.Date("2021-08-10"),by="days"),
              pred=pred$pred,
              plus_se=pred$pred+pred$se,
              minus_se=pred$pred-pred$se)

#作ったデータフレームをhrにジョインする
hr_pred=data.frame(language=NA,article=NA,date=seq(as.Date("2021-07-14"),as.Date("2021-08-10"),by="days"),views=NA)
hr2=rbind(hr,hr_pred)
data2=hr2 %>% left_join(.,data)

#過去3ヶ月のデータと予測値を図示
data2 %>% filter(date>"2021-04-10") %>% 
  ggplot(.,aes(y=views,x=date))+
  geom_line()+
  geom_line(aes(x=date,y=pred),color="red")+
  geom_line(aes(x=date,y=plus_se),color="red",linetype="dashed")+
  geom_line(aes(x=date,y=minus_se),color="red",linetype="dashed")+
  labs(title = "図5:Wikipedia『晴山ケビン』の閲覧数 (2021/04/10-2021/08/10)")

#予測された閲覧数の合計
sum(pred$pred)#995.0521

 

Follow me!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA