読者です 読者をやめる 読者になる 読者になる

いずにゃんの研究日記

専門性を広げるための練習場

けものフレンズのTwitterアカウントフォロワー変動履歴をAnime APIから読み込んでグラフにしてみる

R

2月6日頃から,ネット上で「けものフレンズ」への関心が急激に高まっていたようである。下図はGoogleトレンドのグラフであるが,2月9日を100とした場合に,2月5日に9だった指標が,6日に35,2月8日に90,といった具合に変化していた。

f:id:izunyan:20170211230719j:plain

公式Twitterアカウントのフォロワー数もこれに連動していると考えられる。本記事では,Rでデータを取得し,ggplot2パッケージを使って「けものフレンズ」Twitterアカウントフォロワー数の推移をグラフに表してみたいと思う。


すごーい!

以前の記事

izunyan.hatenablog.com

で紹介したAnime APIでは,アニメ作品のTwitterアカウントのフォロワー数の履歴といった貴重なデータを取得することができる。すごーい!

qiita.com


わーい!

まずは使用するパッケージを読み込む

library(tidyverse) #あとで使うdplyrもggplot2もこれをロードしておけばOK
library(RCurl)
library(rjson)


Anime APIからデータを読み込む

これは次のコードだけである。

kemono <- getURL('http://api.moemoe.tokyo/anime/v1/twitter/follower/history?account=kemo_anime') #&end_date=1486740607

URLの?account=以下のkemo_animeがけものフレンズのtwtterアカウントである。ここを他作品のものに変えれば,その作品のデータが取得できる。デフォルトだと,現在時刻から前の100件のデータが読み込まれる。コメントアウトされている#&end_date=というのは,後で解説する。


リスト形式に変換する

読みこまれたデータはjson形式であるため,Rで表示しやすくするために,リスト形式にする

kemono.list<-fromJSON(kemono)


データフレーム形式に変換する

なじみあるデータ構造にするために,情報を抜き出してまとめる

Date <- as.character(lapply(kemono.list, '[[','updated_at'))
Follower <- as.character(lapply(kemono.list, '[[','follower'))
dat_kemono <- data_frame(date=Date,follower=Follower)
dat_kemono

作成されたdat_kemonoは以下のような内容になる。

# A tibble: 100 × 2
         date follower
        <chr>    <chr>
1  1486740606    18411
2  1486738806    18370
3  1486737005    18313
4  1486735205    18250
5  1486733405    18202
6  1486731605    18142
7  1486729805    18077
8  1486728006    18019
9  1486726206    17953
10 1486724406    17911
# ... with 90 more rows

dateの列は,日付のUNIXタイムスタンプ(1970年1月1日午前0時0分0秒からの経過秒数)で,followerの列がフォロワー数を表している。


過去100件より前の履歴を取得する

kemono2 <- getURL('http://api.moemoe.tokyo/anime/v1/twitter/follower/history?account=kemo_anime&end_date=1486560610')
kemono.list2 <- fromJSON(kemono2)

履歴を取得するには,どの時点より前なのかの情報を&end_date=の部分に加える必要がある。履歴の更新は大体30分間隔で行われているようなので,60秒*30分*100行で,大体180,000の数字の違いを指定してやればよい 今回は,1行目のデータが1486740606だったので,これから180000を引いて,数秒増やした数字1486560610を指定した。

1486740606-180000
[1] 1486560606

後は,同様にデータフレーム形式にする。リスト形式でまとめた方が手順が少なくて済みそうだが,自分がまだ慣れてないのでこのやり方を紹介する。もしかしたら無駄が多い作業になっているかもしれない。

Date <- as.character(lapply(kemono.list2, '[[','updated_at'))
Follower <- as.character(lapply(kemono.list2, '[[','follower'))
dat_kemono2 <- data_frame(date=Date,follower=Follower)
dat_kemono2

後は同様の作業を繰り返して,集めたい期間の情報を取得してくるだけである。今回は, あと3回繰り返してdat_kemono5まで取得してみた。


データフレームを1つにつなげる

取得したデータはそれぞれ違う時間帯で,縦に長く連結するだけなので,dplyrパッケージのbind_rows()関数を使う。

dat_kemono_all <- bind_rows(dat_kemono, dat_kemono2, dat_kemono3, dat_kemono4, dat_kemono5)

これでデータセットが完成した。わーい!


たーのしーい!

さあ,いよいよグラフを描いていく。が,まずは準備。


date変数がUNIXタイムスタンプのままなので日付形式に変換しておく

これには大変便利なanytimeパッケージを使う。date変数が文字型なので,as.numeric()で数値にしてanytime()関数の中に放り込む。あとはタイムゾーンtz=を東京に指定する。

library(anytime)
dat_kemono_all$date2 <- anytime(as.numeric(dat_kemono_all$date), tz = "Asia/Tokyo")
# A tibble: 500 × 3
         date follower               date2
        <chr>    <dbl>              <dttm>
1  1486740606    18411 2017-02-11 00:30:06
2  1486738806    18370 2017-02-11 00:00:06
3  1486737005    18313 2017-02-10 23:30:05
4  1486735205    18250 2017-02-10 23:00:05
5  1486733405    18202 2017-02-10 22:30:05
6  1486731605    18142 2017-02-10 22:00:05
7  1486729805    18077 2017-02-10 21:30:05
8  1486728006    18019 2017-02-10 21:00:06
9  1486726206    17953 2017-02-10 20:30:06
10 1486724406    17911 2017-02-10 20:00:06
# ... with 490 more rows

このように,新しい変数date2を作成し,日付と時刻が示されるようになった。


折れ線グラフを描く

ついに今回やりたかった所にたどりついた。みゃみゃみゃみゃみゃみゃみゃみゃー

ggplot(data = dat_kemono_all) +
  geom_line(mapping = aes(x = date2, y = follower))

f:id:izunyan:20170212001330j:plain

こんな風に簡単に図が作成できた。これをみると,2月6日前でも徐々にフォロワー数が増加していたのだが,7日にかけて傾きが急に大きくなった様子が読み取れる。ちゃんと下地は形成されつつあったのだろう。この後の勢いが大きく,3日間でフォロワー数が倍増し,その後も増え続けている。たーのしーい!