はてなダイアラーの fladdict-rate

漫然とTwitterのタイムラインを眺めて、興味深い法則に気がついた。それは、500人以上フォロワーのいるユーザーの大半は、「フォロワー数 / 被リスト数」がおよそ10という値になる。ということだ。

自分の場合なら、フォロワー15000人のリストが1800人。8.3となる。だいたいのユーザーが、12〜8のレンジに収まる。

気持ち悪いほどに、フォロワー/リスト比がこのレンジのユーザーが多い。これは何を意味しているのだろうか?

Twitterのフォロワーに関する10:1の法則、メモ | fladdict

上記の記事が興味深かったので,いくつかサンプルを取ってみる事にしました.http://fladdict-rate.appspot.com/ と言う Web サービスが付けていた名前が気に入ったので,ここではFollower / List の比を fladdict-rate と呼ぶ事にします

サンプルの取得には,Twitter で「はてなダイアラー」ときゃっふきゃっふしよう! - IT戦記 で紹介されていた TopHatenar の(Twitter アカウントを保持している)はてな上位 100 ユーザのリストを使用しました*1.下図は,このリストに書かれている各ユーザの fladdict-rate を昇順にソートしたものになります.

中央値は 10.28 と先の主張にかなり合致した結果となりました.8 〜 12 はさすがに狭いですが,90% のユーザが fladdict-rate 6 〜 20 のレンジに収まっていると言う事で,この結果はなかなか興味深いです.外れ値に当たるユーザでも,"119 / 5" や "199 / 6" のようにサンプル数が少ないせいなユーザも混じっているので,これを除くと,例外的なユーザは本当に限られた人数だけになりそうです.

Twitter に関しては,一部 Follower の数が指標になってしまう領域もあるそうで,(Follow と Remove を繰り返したり Bot に Follow してもらうなどして)無理やり Follower を増やそうとする人もいるそうです.まだ閾値の検討などは行っていないですが,そういった人達の判別方法の一つとしても利用できるのかもな,と思ったりもしました.尚,この辺りの問題については,ツイッターフォロワー10:1の法則と「リスト率」[絵文録ことのは]2011/02/18 でもう少し詳細な言及がなされていました.

はてなダイアラーの fladdict-rate 一覧

以下の表が,上記の図に使用した各ユーザの fladdict-rate の詳細になります.Following の値は今回は関係ないですが,参考までに載せています.

はてな ID Twitter ID Friend Follower List Fladdict-rate
1 id:elm200 @elm200 88 5351 867 6.17
2 id:Baatarism @baatarism 130 902 144 6.26
3 id:ryuka01 @ryuka01 369 1594 254 6.28
4 id:RyoAnna @RyoAnna 656 1942 302 6.43
5 id:moto_maka @motomaka 23 2836 426 6.66
6 id:DocSeri @DocSeri 1097 1519 226 6.72
7 id:shinichiroinaba @shinichiroinaba 60 2191 318 6.89
8 id:heatwave_p2p @heatwave_p2p 407 980 140 7.00
9 id:FUKAMACHI @ash0966 175 1679 231 7.27
10 id:orangestar @ajico_k 160 10836 1458 7.43
11 id:mamoruk @mamoruk 1913 2422 318 7.62
12 id:tkng @tkng 268 492 64 7.69
13 id:stanaka @stanaka 285 2085 264 7.90
14 id:mkusunok @masanork 1931 11868 1445 8.21
15 id:kobeni_08 @kobeni 880 2527 307 8.23
16 id:finalvent @finalvent 1656 6198 748 8.29
17 id:jkondo @jkondo 146 10871 1303 8.34
18 id:tt_clown @tt_clown 622 709 84 8.44
19 id:michikaifu @michikaifu 443 6904 809 8.53
20 id:os0x @os0x 2632 2720 318 8.55
21 id:y_arim @y_arim 6061 7232 844 8.57
22 id:javascripter @javascripter 487 669 78 8.58
23 id:tsumiyama @tsumiyama 393 6368 742 8.58
24 id:masayang @masayang 299 1941 224 8.67
25 id:banraidou @banraidou 1125 1129 130 8.68
26 id:zyesuta @zyesuta 3050 3467 398 8.71
27 id:ockeghem @ockeghem 813 1666 188 8.86
28 id:rikuo @rikuo 506 2324 261 8.90
29 id:reikon @reikon 201 711 79 9.00
30 id:hyoshiok @hyoshiok 1163 4026 447 9.01
31 id:umeten @umeten 1782 1388 154 9.01
32 id:naoya @naoya_ito 99 8217 901 9.12
33 id:rx7 @namikawa 1383 2133 233 9.15
34 id:Lhankor_Mhy @lhankor_mhy 1403 1429 155 9.22
35 id:LM-7 @LunarModule7 164 3303 357 9.25
36 id:yomoyomo @yomoyomo 140 3164 341 9.28
37 id:hirose31 @hirose31 634 1295 139 9.32
38 id:pha @pha 1182 7126 755 9.44
39 id:kiyo560808 @kbkt 277 1001 105 9.53
40 id:chnpk @CHNPK 117 525 55 9.55
41 id:hakobe932 @hakobe 507 1299 135 9.62
42 id:aerodynamik @aerodynamik_tw 154 427 44 9.70
43 id:amatanoyo @amatanoyo 918 923 95 9.72
44 id:nowokay @kis 5617 5217 521 10.01
45 id:kutabirehateko @kutabirehateko 282 344 34 10.12
46 id:TERRAZI @TERRAZI 692 3063 302 10.14
47 id:ZIGOROu @zigorou 707 1651 162 10.19
48 id:Erlkonig @valerico 777 1036 101 10.26
49 id:goldhead @goldhead 749 638 62 10.29
50 id:RPM @RPM99 294 4305 413 10.42
51 id:LittleBoy @u5u 608 4326 410 10.55
52 id:gamella @gamella 1222 2397 226 10.61
53 id:shi3z @shi3z 323 6767 637 10.62
54 id:GiGir @gigir 737 1335 123 10.85
55 id:sikii_j @sikii_j 878 1567 139 11.27
56 id:hatayasan @hatayasan 534 548 48 11.42
57 id:kaerudayo @kaerudayo 700 629 55 11.44
58 id:shimooka @shimooka 532 987 86 11.48
59 id:kusigahama @kusigahama 1549 2279 195 11.69
60 id:Hamachiya2 @Hamachiya2 4185 14226 1200 11.86
61 id:todesking @todesking 2729 3341 280 11.93
62 id:mohri @mohri 1889 2133 178 11.98
63 id:kanose @kanose 973 5495 455 12.08
64 id:kawasaki @yukawasa 575 6947 574 12.10
65 id:amachang @amachang 19340 18356 1506 12.19
66 id:nakakzs @nakakzs 1829 1926 158 12.19
67 id:t_yano @t_yano 2562 2631 214 12.29
68 id:taan @maikatan 755 4604 370 12.44
69 id:acqua_alta @acqua_alta 170 1058 85 12.45
70 id:wadap @wadap 1335 2941 231 12.73
71 id:tanemori @panpot 1579 1946 152 12.80
72 id:nitoyon @nitoyon 1138 2275 166 13.70
73 id:active_galactic @active_galactic 1284 1260 91 13.85
74 id:HolyGrail @HolyGrail 4589 6931 492 14.09
75 id:shibata616 @shibata616 5803 5273 364 14.49
76 id:YUYUKOALA @yuyukoala 608 233 16 14.56
77 id:gothedistance @gothedistance 4062 4163 285 14.61
78 id:heimin @heimin 3635 3729 252 14.80
79 id:kskmeuk @kskmeuk 1706 1683 111 15.16
80 id:mellowmymind @mellowmind 219 711 45 15.80
81 id:takerunba @takerunba 2555 3134 195 16.07
82 id:adgt @adgt33 23 232 14 16.57
83 id:dacs @dac_News 1 83 5 16.60
84 id:Asmodeus-DB @AsmodeusDB 482 2373 138 17.20
85 id:ululun @ululun 1246 1585 92 17.23
86 id:hejihogu @hejihogu 2941 2893 161 17.97
87 id:Yoshiori @yoshiori 8587 7939 437 18.17
88 id:kokorosha @kokorosha 5149 4902 262 18.71
89 id:coconutsfine @coconutsfine 968 1651 88 18.76
90 id:white_cake @white_cake 711 606 32 18.94
91 id:repon @repon 1764 1678 79 21.24
92 id:tittea @tittea 189 119 5 23.80
93 id:hrkt0115311 @hrkt0115311 1740 1475 61 24.18
94 id:fk_2000 @fk_2000 1999 1480 60 24.67
95 id:hagakurekakugo @Ahnenerbe 180 199 6 33.17
96 id:kurimax @kurimax 446 788 19 41.47
97 id:kousuke-i @kousuke3 984 578 13 44.46

取得方法

最後に取得方法をメモ.Twitter の各ユーザの Following/Follower/Membership 数は Twitter API を叩くより,html からスクレイピングした方が早そうだったので,各種カウントを返す関数を作成して github にアップロードしておきました.スクレイピングの方法は twitter bot達 2 - Reworking... を参考にしました.

追記

注:本サービスのクローリングは、robots.txtファイルの規定に従って為される場合には許されます。但し、Twitterの事前の承諾なくして本サービスのスクレーピングを行うことは明示的に禁じられています

Terms of Service

Twitter ではスクレイピングを禁止しているそうです.そういう訳で,github にアップロードしたコードを Twitter API の形に修正しました(ついでに,各種メンバ変数名も少し修正).

この関数を使用して,以下のようなコードで各種情報を取得しました.

#!/bin/ruby -Ku
require 'rubygems'
require 'crown/twitter'

File.open(ARGV[0]) { |file|
    file.each { |line|
        begin
            v = line.chomp.split # id:hatena_id @twitter_id
            screen_name = v[1].gsub("@", "")
            info = Crown::Twitter.count(screen_name)
            
            printf("%-20s %-20s %8d %8d %8d %8.2f\n",
                v[0],          # hatena ID
                v[1],          # twitter ID
                info.friend,   # フォローしている数
                info.follower, # フォローされている数
                info.list,     # リストに登録されている数
                info.follower / info.list.to_f # fladdict-rate
            )
        rescue Exception
            next
        end
    }
}

*1:何人かアカウントが存在しなくなっていたりした関係で,ぴったり 100 ではなくなっています.