フェミニストのtwitterクラスタの調査
はじめに
まず、私は単なる貧困女子です。研究者でもないし専門家でもありません。
先日twitterで面白そうな話題を見つけたんです。
要は「右派クラスタがボットなどを使ってtwitterで暴れている」的な。
それで、私も面白そうだなと思ってちょっと追ってみるうちに、私も何かやってみたいと思ったんだ。
マジで素人なので、計量社会学とかクラスタリングとかグラフマイニングとか未経験です。貧困すぎて論文誌を買えないため、無料公開されてるやつだけを読み始めました。
基本となるデータセットを作る
そのうちに 極・フェミニスト108星(共感力ランキング'22年下半期版) というnoteの記事をみつけたので、まずはそこから始めてみようかなと。
つまり、ここで挙げられているフェミニスト108星という108ユーザはフェミニストクラスタを構成しているであろう、と。だから、クラスタ抽出をする方法を探すのは後回しにして、既存クラスタの中身を見ていくところから開始しました。ちなみに、昨日の朝です。
私はtwitter APIを呼び出すのができなかったため、代替手段を用いつつこの108人のフェミニストの皆様のフォローを全て抽出してきました。(ただ、アカウントが閉鎖されていたり凍結されていたりするものも多いのでそれらを除いて94名です。)
第一段階なので、ツイート分析も後回しにしており単純にフォロー関係のグラフだけを作ります。
フォローは有向グラフというやつなので、行列(matrix)で表すことになりますね。
上のtweetにも書いているのですが
A〜Fさんがいるとします。
A->B,C
B->A,D,E,F
C->A,D,E
D->B
E->A,C
F->A,C,D
というフォロー関係を仮定します。
これはA-Fの6x6の関係になりますので、次の行列を作っちゃえばいい。
| A B C D E F
---------------
A | 0 1 1 0 0 0
B | 1 0 0 1 1 1
C | 1 0 0 1 1 0
D | 0 1 0 0 0 0
E | 1 0 1 0 0 0
F | 1 0 1 1 0 0
私はこのフェミニストのフォロワーを抽出したのちに、スクリプトで行列の形に自動成形して、結果を出してみました。参考までにGoogleスプレッドシートに貼り付けたものは以下です。
まず何から見ていくか
基本のデータセットはできたので、これを元にして頑張っていく。このフォロワー/フォロイー関係から単純にベクトルの内積を取れば「同じ人がフォローしている」「同じ人をフォローしている」ということが言えるのでそれくらいでも何かを言うことはできそう。
| A B C D E F
---------------
A | 0 1 1 0 0 0
B | 1 0 0 1 1 1
C | 1 0 0 1 1 0
D | 0 1 0 0 0 0
E | 1 0 1 0 0 0
F | 1 0 1 1 0 0
上記の例ならば、AさんとBさんのフォローは1行目と2行目でわかります。フォローが一つも重なっていませんので、内積は0です。BさんとCさんはかなり近いので内積は3。
被フォローは行でなく列でわかるので、例えばDさんとEさんは同じBさんとCさんにフォローされているのでこの内積をとって2。
これは単純にフォロー関係だけでやっているけれど、例えばツイートで用いる単語を列にすることもできるはず。AさんとBさんが同じ単語を使っていればこの内積が大きくなる。この辺のコーパスを利用した分析も面白そう。
内積以外の指標でもよいと思いますのであくまで一例。
PageRank
行列化しておけば簡単にPageRankを出すことができる。これはGoogleでかつて利用していたとされるアルゴリズムだけど、貧困女子でも分かるレベルに非常に簡単なんだ。
A->B,C
B->A,D,E,F
C->A,D,E
D->B
E->A,C
F->A,C,D
このフォロー関係はフォロイーからすれば次のように言える。
A <- B,C,E,F
B <- A,D
C <- A,E,F
D <- B,C,E
E <- B,C
F <- B
ここで、AさんのPageRankであるPR(A)は次のように定義される。
PR(A) = 1/4*PR(B) + 1/3*PR(C) + 1/2*PR(E) + 1/3*PR(F)
つまりBさんのPageRankのうち1/4とCさんのPageRankのうち1/3と…を全て足し合わせたものがAさんのPageRankになる。ここで1/4とか1/3ってのは何かということだけど、Bさんの場合は4人をフォローしているのでBさんのPageRankのうち1/4だけをAさんに渡しているということ。
結局以下のように6つの式が立つ。
PR(A) = 1/4*PR(B) + 1/3*PR(C) + 1/2*PR(E) + 1/3*PR(F)
PR(B) = 1/2*PR(A) + PR(D)
PR(C) = 1/2*PR(A) + 1/2*PR(E) + 1/3*PR(F)
PR(D) = 1/4*PR(B) + 1/3*PR(C) + 1/2*PR(E)
PR(E) = 1/4*PR(B) + 1/3*PR(C)
PR(F) = 1/4*PR(B)
変数6個に対して6個の式がある連立方程式ですから基本的には解が出る。ちなみにこの場合は必ず解が出るから心配不要。業界ではこれを対角化可能と呼ぶんだ。
方程式はソフトに解かせる
ただ、こんな方程式をいちいち解くほど暇ではないので、普通は先ほどの行列を使って一気に答を出しちゃう。
octave:4> M=[
> 0 1/2 1/2 0 0 0;
> 1/4 0 0 1/4 1/4 1/4;
> 1/3 0 0 1/3 1/3 0;
> 0 1 0 0 0 0;
> 1/2 0 1/2 0 0 0;
> 1/3 0 1/3 1/3 0 0
> ]
M =
0 0.5000 0.5000 0 0 0
0.2500 0 0 0.2500 0.2500 0.2500
0.3333 0 0 0.3333 0.3333 0
0 1.0000 0 0 0 0
0.5000 0 0.5000 0 0 0
0.3333 0 0.3333 0.3333 0 0
octave:5> [V, L] = eig(M')
V =
-0.4885 + 0i 0.0211 + 0i -0.3005 + 0i 0.4921 + 0i -0.1329 - 0.1915i -0.1329 + 0.1915i
-0.5862 + 0i 0.5715 + 0i 0.4629 + 0i 0.3225 + 0i 0.4882 + 0.2896i 0.4882 - 0.2896i
-0.4397 + 0i 0.4945 + 0i -0.5798 + 0i 0.3609 + 0i -0.5714 + 0i -0.5714 - 0i
-0.3420 + 0i -0.3693 + 0i 0.2708 + 0i -0.3570 + 0i -0.0968 + 0.2103i -0.0968 - 0.2103i
-0.2931 + 0i -0.4902 + 0i -0.2977 + 0i -0.5841 + 0i 0.2678 + 0.0929i 0.2678 - 0.0929i
-0.1466 + 0i -0.2276 + 0i 0.4442 + 0i -0.2344 + 0i 0.0451 - 0.4013i 0.0451 + 0.4013i
L =
Diagonal Matrix
1.0000 + 0i 0 0 0 0 0
0 -0.6277 + 0i 0 0 0 0
0 0 0.2605 + 0i 0 0 0
0 0 0 -0.3440 + 0i 0 0
0 0 0 0 -0.1444 + 0.3203i 0
0 0 0 0 0 -0.1444 - 0.3203i
octave:6> PR = V(:,1) ./ 0.01*sum(V(:,1))
PR =
112.172
134.606
100.955
78.520
67.303
33.652
最後に出ているPR=のあとの6個がそれぞれA〜FのPageRank。(数値自体は大した意味がなくて大小比較に意味があるので、分かりやすく大きな数字に変換している。)
やっていることは以下の通りだけどそんなこと知らなくてもいい。
フォロー関係の行列を変換して行の合計値が1になるようにしてMという行列を定義する
この行列を転置する(行と列を変換する) (M'とすると勝手に転置される。)
eig関数を使って固有値/固有ベクトル計算をする(何やら凄そうですが、連立方程式を解いているだけ)
出てきた固有ベクトルVの一列目がPageRankとしての解なのでそれをそのまま取り出す。
ここで使っているのはGNU Octaveという無料のソフトなので誰でもできる。固有値など知らずともコピペでゴー。
フェミニスト行列でのPageRankはどうなるか
これを実際にフェミニストのtwitterアカウントに対して適用。
96x96の行列だけど、これくらいだと大したCPUでなくとも一瞬で答が出ちゃう。最後は100万ユーザくらいでやりたいね。
1 katepanda2 214.1692 (20 弁護士 太田啓子)
2 Cristoforou 189.8468 (5 saebou)
3 kambara7 186.4614 (31 弁護士神原元)
4 i_tkst 172.9295 (53 竹下郁子)
5 colabo_yumeno 170.1954 (15 仁藤夢乃)
6 fuemiad 169.9469 (41 笛美)
7 artesia59 158.4949 (29 アルテイシア)
8 frroots 144.5336 (80 小宮友根)
9 minorikitahara 136.6731 (85 北原みのり)
10 nahokohishiyama 136.0886 (16 菱山南帆子)
11 basadayobengosh 135.0061 (32 弁護士アンバサだよ(ナカガワタク))
12 hokusyu82 119.4110 (51 北守)
13 TrinityNYC 118.3259 (1 TrinityNYC)
14 KazukoIto_Law 116.8695 (88 伊藤和子)
15 bokukoui 108.8726 (12 墨東公安委員会)
16 ueno_wan 107.9144 (67 上野千鶴子)
17 KatsubeGenki 107.6775 (70 勝部元気)
18 kazugoto 106.4510 (76 後藤和智)
19 kyokosakaino 104.1362 (42 .(境野今日子))
20 annaPHd9pj 103.1742 (4 あんな)
21 okisayaka 94.8949 (26 おきさやか)
22 Koiramako 94.6292 (26 郡司真子)
23 segawashin 93.3024 (24 瀬川深)
24 Tsurigane_mushi 93.2889 (17 つりがねむし)
25 AtTheBlackLodge 84.5653 (23 Lhasa)
26 ohtsubakiyuko 75.6785 (7 大椿ゆうこ)
27 mihoimiofficial 75.5435 (73 藤井美穂)
28 hyougenmamoru 71.8634 (54 広く表現の自由を守るオタク連合)
29 shisoyama 66.1393 (12 しろやま)
30 AkioHoshi 65.0958 (35 星 暁雄 (ITと人権))
31 godspeedtetsuma 64.0030 (93 てつま ∃しとう)
32 inumash 63.4507 (61 董卓(不燃ごみ))
33 tkore61 63.3221 (56 柏木哲夫)
34 sivaprod 62.3759 (33 SIVA)
35 _keroko 61.1971 (35 橋迫瑞穂)
36 kongyouguai 61.1754 (99 孔悠鬼)
37 arurukan_home 60.2785 (58 絹谷 田貫)
38 kabutoyama_taro 60.0521 (102 社虫太郎)
39 hollyhockpetal 57.6358 (18 はなびら葵)
40 scriptforus 55.8350 (34 オモチスキー)
41 washburn1975 54.0793 (39 ワッシュ)
42 setsuna0417 53.3637 (57 せつなりっとく)
43 claw2003 53.3011 (106 九郎正宗)
44 yksplash_ina 52.7382 (76 イナモトリュウシ ∃xist)
45 nowhereman134 51.4103 (63 nowhereman134)
46 heboya 49.7294 (76 へぼやま)
47 plumyogamat 46.2580 (10 Plum)
48 takayukiigokura 45.1518 (70 ゴクラクトンボ)
49 francesco3 45.0753 (55 f the minion)
50 taniyanyanz 44.8464 (42 谷家幸子)
51 yskkun 42.2292 (102 クボユウスケ)
52 ura5ch3wo 39.9992 (40 みつを_Mitsuwo�)
53 TasogarKamen 38.3678 (73 黄昏仮面)
54 suto_emini 37.1516 (88 須藤エミニ)
55 rudolph_zenda 35.6333 (93 ルドルフ=ラッセンディル)
56 harupiyo1582 34.1250 (82 鉄馬の貧乏子育てbot)
57 basilsauce 33.8639 (65 �BASIL���)
58 biomasterchan 32.9283 (87 生物系院生)
59 miyuo214 30.3991 (18 ミユオ)
60 SAY_A_BLUR 30.0213 (99 背乃あぶら)
61 Yoru_stern 29.5223 (63 微笑みよる子)
62 hoppeta_yellow 28.8529 (66 黄色いほっぺの人々)
63 poyu_z_ 28.7529 (30 ぽゆぽゆ)
64 su22m4r 28.6307 (82 フィッターR∃)
65 traductricemtl 27.2931 (8 jiji)
66 mumuri7575 25.6611 (46 毒)
67 934bQHcUM1G1NEL 24.0734 (59 マインドちゃん)
68 MuMeimei11 24.0012 (20 めいむ(旧バフバちゃん))
69 females_db_park 23.1187 (25 女たちのデータベース広場)
70 kawataka_alter 22.8394 (99 カワタカオルタナティブ)
71 ddslumber 22.4286 (38 deepdreamlessslumber)
72 niwaka_toshiro 21.8553 (85 要出展)
73 matsudosimasuda 21.4957 (93 増田かおる)
74 mizutayou1 21.3858 (28 mizuta)
75 sodium 20.9084 (6 しお(汐街コナ))
76 sikakuno 20.4642 (80 四角の(足場))
77 adachib 19.4027 (102 安達瑶b)
78 otaota_1215_m 18.8819 (68 オタギリ)
79 XXfifXX 18.8136 (93 Sophie)
80 c4QmAfJ7xPMqDwX 18.1610 (47 おちゃ)
81 jo_ta_haha 17.9244 (88 さんむうん)
82 kazuna_kanajiri 17.0138 (106 金尻カズナ)
83 potatolacertus 15.5993 (37 おいもさば)
84 LDK1B_T 14.7587 (82 無議)
85 e_ndtw 14.7406 (14 山崎)
86 Schuhei_K 14.5597 (76 こたに�ギタリスト)
87 VxLArbYL3tcNEDM 14.0856 (50 ねる)
88 eri82tom 13.7750 (88 山中)
89 kmm295 11.7301 (102 kmm295)
90 rindoh 10.6828 (44 リンドウ)
91 jgkkny 8.3023 (88 消灯)
92 sute0015 6.1104 (93 特急北近畿)
93 ezaki_qma 3.8566 (106 ビエネッタ)
94 minorit403 3.0189 (73 三浦よし)
ここで一番左側の数字がPageRankとしての順位。真ん中あたりの数字がPageRankであり、一番右にあるのが、元データにあった共感力ランキングにおける順位。
私はフェミニストについて何も詳しくないのだけど、上位にある人たちはフェミニストのクラスタ内でそれなりに影響力があることが示唆されるよね。ただ、これはPageRankのモデルが正しければという話であって、この時点では単に計算から数字を出しただけ。(数字が正しいのではなく、現実があってその現実に近い数字を出したいという話なので、数字を先行させるのはおかしいから。)
他の指標との比較
PageRank計算は容易だけど、もっと容易に分かる数字があってそれはフォロワー数。フォロワー数で良いならばこんな計算をする必要はない。
まずはピアソンの相関係数をとって各種指標と比較してみる。
共感力順位とPageRank : -0.3828240854
共感力順位とツイフェミクラスタ内フォロワー数相関: -0.4558379954
共感力順位とフォロワー数相関: -0.2922789118
PageRankとクラスタ内フォロワー数相関: 0.9011171759
PageRankとフォロワー数相関 : 0.6090283423
PagaRankとツイフェミフォロワー率相関 : -0.4483053358
共感力順位とツイフェミフォロワー率相関 : 0.3911030599
共感力順位は共感力が高い人が小さくなる数値だから、負の相関が出ているということはつまりは共感力と正の相関がある。
「ツイフェミクラスタ内フォロワー数」というのはつまりはこの94アカウント内でのフォロワー。
当然かもしれないけれど、PageRankはクラスタ内フォロワー数とかなり高い相関があるね。
ただ、例えば @Tsurigane_mushi (つりがねむし)さんはクラスタ内フォロワー数は30で、@nahokohishiyama (菱山南帆子)さんのフォロワー数である26よりも大きい。しかしPageRankは菱山さん136に対してつりがねむしさんは93。
これはつまりは言い方は悪いけれど「弱小アカウント」からいくらフォローされてもPageRankは上がりにくいからということだろうね。
「強力アカウント」からフォローされており、しかもそのそのフォローが厳選されている場合という時に数値が上がる。
だから岸田首相(464人しかフォローしていないが、67.8万人のフォロワーがいる)からフォローされれば、一気にPageRankは上がりそう。
twitterクラスタのPageRankに意味はあるのか?
正直まだよくわかりらないかな。
貧困を拗らせるうちに、行列演算だけだからすぐに出せるよな、と思っていきなり実施しちゃっただけなので妥当性は不明。
https://twitter.com/w08fGrbtsG5ElJ9/status/1637940036321804289
この辺りにもちょっとだけ書いてみた。
最後に
私はこういう作業は手を動かしてからやり方を考えるので、文献検索もたいしてやってないのでもう少しちゃんと読み込んでから継続しても良さそう。
いい論文があったら教えてください。無料公開のやつを。