ワクチンに関するツイッター統計の備忘録

本記事はワクチンに関するニューズウィークの記事の備忘録です。おそらく1週間以内に記事が掲載されると思います。
統計およびRについての知識を前提にしている箇所があります。これまでもあまり親切な記事ではなかったですが、今回は書くことが多いのでより不親切になっています。気になる点がある方は連絡ください。

●データの取得
ツイッターAPIを統計アプリRのrtweetでたたいて、841,180ツイートを取得しました。当然1回では18,000の制限に引っかかるので分割して取得しました。最初は2,3日分だけやるつもりだったのですが、意外と大変でもなかったので1週間分に拡大しました。
取得が終わったところで、rbindで全部をくっつけてひとつのデータファイルにしました。ちなみに保存したデータ項目は、「"user_id", "status_id","created_at", "screen_name", "name", "text", "favorite_count", "retweet_count", "source", "followers_count", "friends_count", "account_created_at", "is_retweet", "retweet_status_id","retweet_text", "retweet_created_at", "retweet_user_id", "retweet_screen_name", "retweet_name", "retweet_description","retweet_followers_count","retweet_friends_count","retweet_statuses_count", "location", "status_url"」です。あまり深い理由はなく、とりあえずこれくらいあれば足りるだろうということです。


●基本処理
リツイートされたツイートのランキング、リツイートされたツイートをつぶやいたアカウントのランキング、ツイート数の時間推移、24時間ごとのツイート数推移などを行いました。ほとんどは以前の記事に書いたのでご参照ください。

ツイッター統計分析についての備忘録
https://note.com/ichi_twnovel/n/n163c1a5cee60
福島沖地震のツイッター統計についての備忘録
https://note.com/ichi_twnovel/n/nfea8b2ba9210

24時間推移は今回が最初だったと思うのでコードをのせておきます。といってもこれだけなんですけどね。Vx0は元の全データのデータフレームです。24で割っているだけですね。Vx1のTLには調査開始時点からの経過時間を入れ、24時間にするために、それを24で割って切り上げして何日目かを計算し、24で割った余りで24時間内での経過時間を計算しています。24時間目だとゼロになってしまうので最後にゼロを24にしています。

start_time=as.numeric(as.POSIXct("2021-02-28 00:00:00", tz="Japan"))
Vx1=mutate(Vx0,TL=as.integer((as.numeric(as.POSIXct(Vx0$created_at, tz="UTC"))-start_time)/3600)+1)
table(Vx1$TL)
Vx1=mutate(Vx1,TL24_1=ceiling(Vx1$TL / 24))
Vx1=mutate(Vx1,TL24_2=Vx1$TL %% 24)
Vx1$TL24_2=ifelse(Vx1$TL24_2==0,24,Vx1$TL24_2)
VxTL=table(Vx1$TL24_2,Vx1$TL24_1)

●リツイートランキング、リツイートIDランキング
リツイート回数上位20のツイートと、リツイートされた回数上位20のIDをご紹介します。リツイート回数上位はツイートごとのランキングで、IDランキングはそのIDが調査期間中に投稿した全てのツイートのリツイート数の合計です。
ツイートごとのランキングだとかろうじて首相官邸の9位が最上位で、他には産経ニュースと保坂展人が12位と13位に入っています。他は全て「一般人」「医療クラスタ」「文化人」です。

スクリーンショット 2021-03-12 午後2.54.21

スクリーンショット 2021-03-12 午後3.18.20


●アソシエーション分析
このライブラリをわすれずにいれておきましょう。
library(arules)
library(arulesViz)
でアソシエーション分析を行いました。ちなみに、コレスポンデンス分析もしてみようと思ったんですが、計算の途中で、「物理メモリ足りないんじゃね?」とRに煽られて計算終了してしまいました。

全体のツイートの半分を占める1,032のリツイート元のツイートのアソシエーション分析にかけるので、下記の手順でデータを作りました。

・リツイートの全てに、1から1032までのツイート番号RIDを振る
・アカウントごとに、RIDを01形式のデータに展開する。この時、後の処理を考えて、元データのデータフレームとは別のmatrixを用意し、そちらに01データを格納しました。
・matrixをそのままアソシエーション分析に喰わせました。

コードも書いておきたいのですが、結構複雑怪奇になってしまっているのでちょっと……
ご要望あれば整理して掲載します。

●アソシエーション分析の結果
長いし、ほとんどの読者は興味ないだろうと思って割愛したリフト値と支持度の上位の結果です。
これだけだとわかりませんが、同じアカウントからのツイートをリツイートするルールがほとんどです。またリツイートする時間も2時間以内がほとんどでした。

支持度上位 ワクチン接種後死亡した方に関する報道への批判や、副反応によるものとは考えにくいという説明などでした。この中から記事に書いたkantei_vaccineだけをリツイートしているグループが見つかりました。正確にはkantei_vaccineの複数ツイートのルールがあったので、kantei_vaccineだけリツイートしているアカウントを洗い出したら2,681個あったという話です。なお、アカウント作成時期が固まっていないかなどのチェックをしましたが、広くばらついており、そのためだけに作られたアカウントではないようです。

lhs rhs support confidence coverage lift count
[70] {V19} => {V2} 0.012954206 0.9277157 0.013963552 7.790657 2323
[71] {V25} => {V5} 0.009418706 0.8508816 0.011069349 22.142431 1689
[68] {V31} => {V5} 0.008414936 0.8717504 0.009652919 22.685499 1509
[67] {V31} => {V25} 0.007913051 0.8197574 0.009652919 74.056509 1419
[433] {V25,V31} => {V5} 0.007500390 0.9478506 0.007913051 24.665848 1345
[434] {V5,V31} => {V25} 0.007500390 0.8913188 0.008414936 80.521332 1345
[69] {V38} => {V9} 0.006697375 0.8566334 0.007818251 33.430887 1201
[66] {V53} => {V3} 0.005565345 0.9522901 0.005844170 9.581891 998
[469] {V3,V19} => {V2} 0.003251099 0.9433657 0.003446276 7.922081 583
[480] {V1,V25} => {V5} 0.002682296 0.8841912 0.003033615 23.009244 481
[62] {V132} => {V31} 0.002654413 0.9463221 0.002804979 98.034811 476
[64] {V132} => {V5} 0.002648837 0.9443340 0.002804979 24.574336 475
[63] {V132} => {V25} 0.002598648 0.9264414 0.002804979 83.694292 466
[59] {V137} => {V95} 0.002581919 0.9278557 0.002782673 255.194475 463
[367] {V31,V132} => {V5} 0.002576342 0.9705882 0.002654413 25.257548 462
[368] {V5,V132} => {V31} 0.002576342 0.9726316 0.002648837 100.760361 462
[365] {V31,V132} => {V25} 0.002559613 0.9642857 0.002654413 87.113134 459
[366] {V25,V132} => {V31} 0.002559613 0.9849785 0.002598648 102.039452 459
[371] {V25,V132} => {V5} 0.002542883 0.9785408 0.002598648 25.464497 456
[372] {V5,V132} => {V25} 0.002542883 0.9600000 0.002648837 86.725965 456
[615] {V25,V31,V132} => {V5} 0.002503848 0.9782135 0.002559613 25.455980 449
[616] {V5,V31,V132} => {V25} 0.002503848 0.9718615 0.002576342 87.797525 449
[617] {V5,V25,V132} => {V31} 0.002503848 0.9846491 0.002542883 102.005326 449
[447] {V1,V31} => {V5} 0.002319823 0.8965517 0.002587495 23.330901 416
[438] {V1,V31} => {V25} 0.002202717 0.8512931 0.002587495 76.905433 395
[478] {V3,V25} => {V5} 0.002169258 0.8922018 0.002431353 23.217705 389
[65] {V182} => {V46} 0.002091187 0.9541985 0.002191564 139.568260 375
[684] {V1,V25,V31} => {V5} 0.002085610 0.9468354 0.002202717 24.639431 374
[685] {V1,V5,V31} => {V25} 0.002085610 0.8990385 0.002319823 81.218727 374
[445] {V3,V31} => {V5} 0.001935045 0.9155673 0.002113493 23.825742 347


リフト値上位 ほとんどがイスラエルの状況など海外情報に関するものでした。

lhs rhs support confidence coverage lift count
[86] {V626,V675} => {V728} 0.0005743793 0.9626168 0.0005966853 1527.613 103
[89] {V363,V675} => {V728} 0.0005855323 0.9459459 0.0006189913 1501.158 105
[3] {V755} => {V728} 0.0005688028 0.9357798 0.0006078383 1485.025 102
[4] {V728} => {V755} 0.0005688028 0.9026549 0.0006301443 1485.025 102
[85] {V626,V728} => {V675} 0.0005743793 0.9716981 0.0005911088 1440.073 103
[8] {V728} => {V675} 0.0006078383 0.9646018 0.0006301443 1429.556 109
[9] {V675} => {V728} 0.0006078383 0.9008264 0.0006747563 1429.556 109
[88] {V363,V728} => {V675} 0.0005855323 0.9633028 0.0006078383 1427.631 105
[6] {V675} => {V755} 0.0005743793 0.8512397 0.0006747563 1400.438 103
[5] {V755} => {V675} 0.0005743793 0.9449541 0.0006078383 1400.438 103
[92] {V363,V626} => {V728} 0.0005743793 0.8655462 0.0006636033 1373.568 103
[95] {V116,V363} => {V728} 0.0005688028 0.8429752 0.0006747563 1337.749 102
[101] {V363,V431} => {V675} 0.0005632263 0.9017857 0.0006245678 1336.461 101
[84] {V675,V728} => {V626} 0.0005743793 0.9449541 0.0006078383 1293.534 103
[91] {V363,V728} => {V626} 0.0005743793 0.9449541 0.0006078383 1293.534 103
[10] {V728} => {V626} 0.0005911088 0.9380531 0.0006301443 1284.087 106
[11] {V626} => {V728} 0.0005911088 0.8091603 0.0007305213 1284.087 106
[98] {V363,V626} => {V675} 0.0005743793 0.8655462 0.0006636033 1282.754 103
[97] {V363,V675} => {V626} 0.0005743793 0.9279279 0.0006189913 1270.227 103
[2] {V757} => {V626} 0.0005632263 0.9266055 0.0006078383 1268.417 101
[123] {V363,V524} => {V626} 0.0005632263 0.9266055 0.0006078383 1268.417 101
[141] {V355,V363} => {V626} 0.0005688028 0.9189189 0.0006189913 1257.895 102
[138] {V363,V431} => {V626} 0.0005688028 0.9107143 0.0006245678 1246.664 102
[135] {V363,V478} => {V626} 0.0005632263 0.9099099 0.0006189913 1245.562 101
[104] {V116,V363} => {V675} 0.0005632263 0.8347107 0.0006747563 1237.055 101
[492] {V27,V116,V363} => {V626} 0.0005632263 0.9017857 0.0006245678 1234.441 101
[150] {V431,V478} => {V626} 0.0005688028 0.8947368 0.0006357208 1224.792 102
[488] {V27,V116,V524} => {V626} 0.0005688028 0.8947368 0.0006357208 1224.792 102
[17] {V675} => {V626} 0.0005966853 0.8842975 0.0006747563 1210.502 107
[144] {V116,V363} => {V626} 0.0005966853 0.8842975 0.0006747563 1210.502 107


●さらに
このあと、クラスター分けしたり、多重ロジスティックスで予測モデル作ったり、機械学習させたりといろいろな展開が考えられますが、今回は基本的な部分のみということで。
修士やったことないんですが、このデータと解析で社会科学系の修士なら論文になるんじゃね? と思いました(安易な発想)。共同研究はいつでも募集しています。ついでにアカデミックでツイッターのフルアクセスを取りましょう!


●データについて
全体の半数まで拡散された1,032ツイートと、全体の半数までツイートが拡散された215アカウントのアカウントのデータも公開しようかと思ったのですが、悪用される可能性を考えてやめました。記事に書いた通り、圧倒的に「一般人」と「医療クラスタ」が多いです。気になる方はお問合せください。

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