Rによるツイート分析(1):指定したTwitterアカウントのツイートをリツイート数が多い順に並べる

概要
rtweet パッケージを用いてTwitter のツイートを取得した上で、リツイート数が多い順にツイートを並べ替える方法についての説明。いいねが多い順に並べ替える方法についても。

今回したいこと

今回したいことは、ある Twitter アカウントのツイートを、リツイート数が多い順に並べることだ。これは、Rの rtweet パッケージを使えばできる。

例えば、NHKニュースの Twitter アカウント (@nhk_news) の直近の1000個のツイートの中で、リツイートされた回数が多いものから順に並べたいとしよう。このことは、次のスクリプトで実行できる。

library("tidyverse")
library("rtweet")

nhk_news_tw <- get_timeline("nhk_news", n = 1000)

nhk_news_tw %>% 
  arrange(desc(retweet_count)) %>%
  select(text, retweet_count)

以下、解説。

rtweet パッケージの準備

Rでは、 rtweet パッケージで Twitter のツイートを分析できる。このパッケージはCRANに入っているので、以下のようにして簡単にインストールすることができる。

install.packages("rtweet")

実際に使うときには、libraryを使って読みこんでおこう。

library("rtweet")

ツイートの取得

rtweet パッケージでは、get_timeline という関数でツイートを取得できる。この関数は、引数として 取得したいアカウントの文字列や取得したいツイートの数をとる。

以下では、@nhk_news の最新のツイートを1000件取得している。

nhk_news_tw <- get_timeline("nhk_news", n = 1000)

取得したツイートは tibble [1] になる。この例で言うと、nhk_news_tw@nhk_news の最新のツイート1000件分が入った tibble になる。

この tibble には、ツイートの文章そのものだけでなく、ツイートに付随するさまざまな情報も入っている。例えば、ツイートが行われた時間やどんなハッシュタグが含まれているかといったものが入っている。

リツイートが多い順に並べ替える

先ほど作った tibble の中には、retweet_count という列がある。ここには、リツイートがなされた回数が収められている。dplyr パッケージの [2] arrange 関数を使って retweet_count の値が大きい順に並べ替えれば、リツイートが多い順に並ぶことになる。

具体的には以下のようにする。

nhk_news_tw %>% 
  arrange(desc(retweet_count)) %>%
  select(text, retweet_count)

arrange の中に desc が入っているのは、昇順(リツイートが少ないものが先に来る順番)でなく、降順(リツイートが多いものが先に来る順番)にしたいからである。また、nhk_news_tw の tibble の中には色々な情報が入っているので、ツイートの文章そのものとリツイート数だけに限定するために select を使っている。

こうすると、こんな感じで、リツイート数が多い順に、ツイートの文章とリツイート数が出てくる。

 1 "新型コロナの影響で売り上げが減少した飲食店の支援のため、山梨県富士吉田市でウマで弁当を配達す…         18333
 2 【速報 JUST IN 】東京都 新たに30人以上の感染確認 新型コロナウイルス #nhk_n…         16124
 3 「次亜塩素酸水」現時点では有効性は確認されず NITEが公表 #nhk_news https:…          7026
 4 東京都 新たに20人余り感染確認 20人超は15日ぶり 新型コロナ #nhk_news htt…          5372
 5 北九州 小学校でクラスター発生 感染5人に 新型コロナ #nhk_news https://t…          4365

「新型コロナの影響で売り上げが減少した飲食店の支援のため、山梨県富士吉田市でウマで弁当を配達……」というツイートが、リツイート数 18,333 回で最も多かったことが分かる。

応用その1:他のアカウントのツイートをリツイートしたものを排除する

上で取得したツイートの中には、他のアカウントがツイートしたものをNHKニュースの Twitter アカウント (@nhk_news) がリツイートしたものも入ってしまっている。他のアカウントのツイートを排除したければ、次のようにすれば良い。

nhk_news_tw %>% 
  filter(is_retweet == FALSE) %>% 
  arrange(desc(retweet_count)) %>%
  select(text, retweet_count)

get_timeline 関数で得られる tibble の中には、is_retweet という列がある。この列には、他のアカウントのツイートのリツイートかどうかという情報が入っている。他のアカウントのツイートのリツイートでなければ、ここは FALSE になるので、filter(is_retweet == FALSE) によって他のアカウントのツイートのリツイートを排除できる。

応用その2:いいねの数が多い順に並べる

get_timeline 関数で得られる tibble の中には、いいね (like) の数の情報も含まれている。具体的に言うと、favorite_count の行にその情報がある。だから、以下のようにすると、いいねの数が多い順に並べることができる。

nhk_news_tw %>% 
  filter(is_retweet == FALSE) %>% 
  arrange(desc(favorite_count)) %>%
  select(text, favorite_count)
脚注
  1. tibble について知らない人へ:tibble とはちょっとすごいデータフレームのことだと考えればOK。 []
  2. dplyr パッケージは、library(tidyverse) とすることで読みこまれている。 []