ツイッター統計分析についての備忘録

ニューズウィーク寄稿記事の備忘録です。ある程度、Rや統計についてご存じのことを前提にしています。分析そのものについてはニューズウィークをご覧ください。ここでは基本的なコードや手順をメモしておきます。

一般人が利用できるツイッターのアーカイブには制限が多いのですが、その範囲でいろいろやってみました。全く同じ方法でフルアーカイブを分析できるはずなので、やってみたいですね。
学術関係者の方はツイッター社の認定を受ければフルアーカイブにアクセスできるので、関心ある方はぜひ挑戦してみてください。よかったら私もお手伝いします。というか、共同研究しましょう。大学教授だけでなく、研究機関や修士課程や博士課程の方でもいいようです。関心ある方は気軽にツイッター(@K_Ichida)で声をかけてください。

●今回行った統計分析について
統計というよりは基本的な集計と整理に近いことしかやっていません。「library(rtweet)」ですね。
Rのrtweetというパッケージを使って、ツイートデータを取得しました。

FULLtweet <- search_tweets("自民党 OR 自民 OR 立憲民主党 OR 民主党 OR 立憲 OR 立民 OR リツミン OR 公明党 OR 公明 OR 日本維新の会 OR 維新 OR 日本共産党 OR 共産党 since:2021-02-08_20:00:00_JST until:2021-02-08_20:30:00_JST",n=10000,include_rts = TRUE,langs = "ja")
write.csv(fx,,file = "./rdata/FULLtweet20210205p1.csv",row.names = FALSE)

こんな感じです。2月5日の2時、8時、14時、20時から30分間のツイートを集めました。中国共産党なども引っかかるので、そうしたものはあとで削除しました。2月5日まるごとを対象にしたかったんですが、1時間でもデータ制限の上限にかかってしまったため、2時間の(30分×4回)総データ数は12,085件で我慢しました。なお、一般人が無償で利用出来るのはアーカイブではないので、おそらくリアルタイムで変動します。ツイ消しや垢消しなどのせいですね。


保存したデータは、下記のように統合して使いました。"character" を設定しているのはidが数字だけなので数値と誤って判断されるのを防ぐためです。

ct= rep(NA, 24)
ct[1]="character"
ct[2]="character"
ct[14]="character"
ct[17]="character"
FULLtweet=read.csv("./rdata/FULLtweet20210205p1.csv",colClasses=ct)
FULLtweet=rbind(FULLtweet8, read.csv("./rdata/FULLtweet20210205p2.csv",colClasses=ct))
FULLtweet=rbind(FULLtweet8, read.csv("./rdata/FULLtweet20210205p3.csv",colClasses=ct))
FULLtweet=rbind(FULLtweet8, read.csv("./rdata/FULLtweet20210205p4.csv",colClasses=ct))

とりあえず、このデータだけあれば、table(FULLtweet$is_retweet)とやるだけでリツイート数がわかるようになります。
リツイート数については"retweet_count"は使えません。なぜかというと、これはその時点での全てのリツイートの合計なので、調査対象の2時間内にリツイートされた数ではないからです。そのためツイートごとにリツイート数をとる場合は、"retweet_status_id"、アカウントごとにリツイート数をとる場合は "retweet_user_id"ごとにツイート数をカウントしなければなりません。多少手間ですが、group_by、summariseで合計しなくてはなりません。

政党別にデータを見るためには政党別のフラグを立てて集計しました。ひとつのツイートに複数の政党が含まれていることもあるので合計すると総数を超えます。

PPid0=FULLtweet
PPid0=mutate(PPid0, LDP=ifelse((str_detect(PPid0$text,"自民")) , 1, 0))
PPid0=mutate(PPid0, CDP=ifelse(str_detect(PPid0$text,"民主党") | str_detect(PPid0$text,"立憲") | str_detect(PPid0$text,"立民") | str_detect(PPid0$text,"リツミン"), 1, 0))
PPid0=mutate(PPid0, KOME=ifelse((str_detect(PPid0$text,"公明")) , 1, 0))
PPid0=mutate(PPid0, JIP=ifelse((str_detect(PPid0$text,"維新")) , 1, 0))
PPid0=mutate(PPid0, JCP=ifelse((str_detect(PPid0$text,"共産党")) , 1, 0))
PPid0=mutate(PPid0,Xcount=LDP+CDP+KOME+JIP+JCP)

ここまでやると、あとは政党別に集計するのも簡単ですし、filterかけて絞り込むのも楽ちんです。
本当はバイオリン図や箱ひげ図も作る予定だったのですが、データの偏りが激しいのでぐちゃぐちゃになって思ってたのと違うのでやめました。ちなみに対数をとってもあまり変わりませんでした。こんな感じですよ。

画像2


テキストマイニングは、RMeCabとwordcloud2を使ったら簡単でした。
発生頻度の高い単語で意味のなさそうなものをストップワードではずしています。今回使ったものよりよい辞書がありそうなので、次回やる時は辞書を変えてみよう思います。

FULLtext<-FULLtweet[,"text"]
write.csv(fx,,file = "./rdata/FULLtext.csv",row.names = FALSE)
x<-docDF("./rdata/FULLtext.csv", type = 1)
stop_words<-c("NA","https","co","TRUE","FALSE","twitter","Twitter","status","for","iPhone","Web","Android","web","App","com","/",".","。","//","://","-",",",":","する","それ","なる","ない","そこ","これ","ある","やる","t","いる","言う","思う","人","私","見る","d","ー","前","o","D","iPad","ここ","いう","知る","できる","つく","行う","いい","何","民主党","維新","公明党","公明","共産党","自民党","自民","立憲")
y<-x[result$POS1 %in% c("名詞","動詞","形容詞") & !(x$POS2 %in% c("非自立","接尾","数","サ変接続"))& !(x$TERM %in% stop_words),]
z=y[order(y$FULLtext.csv,decreasing = TRUE),][1:100,]
wc=z[,c("TERM","FULLtext.csv")]
wordcloud2(wc,size=0.7,minSize=0)

Rをちゃんといじったのは始めてだったので一週間近くかかりましたが、慣れた人なら数時間でできると思います。この分野にいろんな人が関心もって分析を進めてくれることを祈っています。

本noteではサポートを受け付けております。よろしくお願いいたします。