からっぽのしょこ

読んだら書く!書いたら読む!読書読読書読書♪同じ事は二度調べ(たく)ない

R言語でTwitterのフォロー関係をネットワークグラフにする

はじめに

 Twitter APIを取得したので早速遊んでみた内容をメモレベルですが記事にしました。

 rtweetパッケージを使って、指定したアカウントがフォローしているアカウントを拾ってくる。更に、抽出したアカウントがフォローしているアカウントも抽出する。収集したデータから、フォロー関係をネットワークグラフによって可視化する。


フォロー・フォロワー関係を可視化

rtweetでのTwitter APIの導入についてはこちらを参照ください。

www.anarchive-beta.com


・フォロー情報を取得

# 利用パッケージ
library(rtweet)
library(dplyr)
library(stringr)
library(igraph)
ac1_name <- "首相官邸" # 最初のアカウント名を指定
ac1_id <- "kantei" # 最初のアカウントIDを指定
keyword <- "省$|^首相官邸$"

まずはスタートとなるTwitterアカウントを指定する。ここでは例として首相官邸を指定した。アカウントIDは@kantei(ユーザー名)のkantei。
ちなみにrtweetでは、名前(TLで表示されるやつ)をname、ユーザー名(@○○のやつ)をscreenname、あと(なんだかよく分からないやつ)をuser_idとして使われている。

全てのアカウントを取得すると量が増えて大変なので、ここでは、名前が「○○省」のアカウントだけを抽出するため(あとスタートの首相官邸も)キーワードとして指定した。(ちなみに変数名のac1は収集する1巡目のaccountだからです。変数名見られるのほんと恥ずかしい…)

# フォローしているアカウントを収集する
ac1_follow <- get_friends(ac1_id) # フォローしているアカウントを収集

# 必要な情報を抜き出す
ac2_uid <- ac1_follow$user_id # ユーザーIDを抽出
ac2_data1 <- lookup_users(as_userid(ac2_uid)) # アカウント情報を収集
ac2_data2 <- data.frame(user_id = ac2_data1$user_id, 
                       screen_name = ac2_data1$screen_name, 
                       name = ac2_data1$name) # ユーザーID,アカウントID,ユーザー名を抽出(主に確認目的)
ac2_data3 <- ac2_data2 %>% 
             filter(grepl(keyword, name)) # 必要なアカウントを抽出
ac2_id <- ac2_data3$screen_name %>% as.character() # アカウントIDを抽出

get_friends("ユーザー名")でそのアカウントがフォローしているアカウントを取得する。
lookup_users("ユーザーID")でそのアカウントの情報を取得する。

【2巡目】

# フォローしているアカウントがフォローしているアカウントを収集する
ac2_name <- as.character(ac2_data3$name)
df <- data.frame(ac1 = ac1_name, ac2 = ac2_name)
tmp_df <- NULL
for(i in 1:length(ac2_id)) {
  # フォローしているアカウントを収集する
  ac2_follow <- get_friends(ac2_id[i]) # フォローしているアカウントを収集
  
  # 必要な情報を抜き出す
  ac3_uid <- ac2_follow$user_id # ユーザーIDを抽出
  ac3_data1 <- lookup_users(as_userid(ac3_uid)) # アカウント情報を収集
  ac3_data2 <- data.frame(user_id = ac3_data1$user_id, 
                          screen_name = ac3_data1$screen_name, 
                          name = ac3_data1$name) # ユーザーID,アカウントID,ユーザー名を抽出
  ac3_data3 <- ac3_data2 %>% 
               filter(grepl(keyword, name)) # 必要なアカウントを抽出
  
  # フォロー関係をデータフレームにする
  tmp_name <- as.character(ac3_data3$name)
  
  if(length(tmp_name) != 0) {
    tmp_df <- data.frame(ac1 = ac2_name[i], ac2 = tmp_name)
    df <- rbind(df, tmp_df)
  }
  
  Sys.sleep(2)
}

2巡目は複数アカウントからフォローしているアカウントを収集するので、for()で順番に行う。
もし、フォローしているアカウントが0、あるいはキーワードに該当するアカウントが0だとエラーとなるので、if()で場合分け。
一応スクレイピングなので怖いのでおまじないのSys.sleep()

・ネットワークグラフの作図

# ネットワークグラフ化する
network1 <- graph_from_data_frame(df)
tkplot(network1, vertex.color = "grey80", 
       vertex.size = 20, 
       vertex.label.cex = 1, 
       vertex.label.dist = 0,
       vertex.label.family = "JP1")

f:id:anemptyarchive:20190305031447p:plain
フォロー関係のネットワーク

矢印の先のアカウントをフォローしているということなので、丸をつなぐ線の両端が矢印となっていれば相互フォローとなる。ただし、2巡目で取得したアカウントで1巡目がフォローしてないアカウントが1・2巡目のアカウントをフォローしていたとしてもそれを取得できていないので、実際には相互フォローだったとしても追えきれていない。3巡目を拾ってこればいいのだが、その場合数がどんどん数が増えていくのと4巡目もしないと同じことに…

以上です!

おわりに

 Twitter APIを取得したのでとりあえず遊んでみたものです。ネタを貯めていても記事が増えないし、記憶にも残らないので、とりあえずメモとして上げることにしました。改善点がたくさんあるのでその内改訂するつもりです。

 最後まで読んでいただき感謝です!何かあればご指摘いただけると更に幸いです。