TwitterのフォローグラフをRで描画してみる

Twitterでフォローしている人同士を線で結んだグラフ(フォローグラフ)を、一部で流行り(?)のR言語で描いてみます。

手順。

1. Twitterのフォロー関係を取得する。

今回は自分がフォローしている230人ほどのTwitter-erについて、それぞれフォローしている人をTwitterのWebページをスクレイピングして取得しました。

curlを使ったシェルスクリプトperlの1-linerで

(for x in ha_ma sudori syou6162 ; do echo $x ; done) | perl -ne 'print "*$_\n"; chomp; $x = $_; $flag = 1; for($i = 1; $flag; $i++) { $get = `curl -s -u USER:PASSWORD http://twitter.com/$x/followers\\?page=$i | perl -lne \"print \\\$1 if /<.*?class=\\\"url uid\\\".*?>(?:<.*?nickname\\\">)?(.*?)</\" | tee -a $x`; print $get; $flag = 0 if $get eq ""; sleep 1}'

とかなんとか(我ながらこれはひどいコード。良い子は真似しないでね! まぁ真似すら無理(ry)。

for x in 〜に書いた各ユーザについて、ファイル名=ユーザ名のテキストファイルに、フォローしているユーザ名の一覧(改行区切り)が出力されるはずです。

例:$ cat ha_ma
luxion
konishiroku
kagamiverse
...

まず自分を対象にして、そこから…という感じで、自分のフォロワのファイル群を作成しました。

2. Rで読み込むための行列(ASCII matrix)を作る。

こんな感じのperl*1で、先ほどのテキストファイル群を行列に変換します。
このスクリプトでは私がフォローしていない(私から見てhop数>=2)ユーザは対象としません。

# make-matrix.pl

#!/usr/bin/perl
chdir (shift || "follow.d") or die $!;
my @list = glob "*";
print "[,$_] " for @list;
print "\n";
for my $user (@list) {
	print "[$user,] ";
	my %e = ();
	open IN, $user;
	$e{$_} = 1 for <IN>;
	close IN;
	
	print $e{$_."\n"}?1:0, " " for @list;
	print "\n";
}
perl make-matrix.pl ディレクトリ名 > matrix.asc

のようにすると、matrix.ascという名前で

        [,user1]  [,user2]  [,user3]  [,user4]  ...
[user1,]   1         1          0          0    ...
[user2,]   0         0          1          0    ...
   :

という形式の行列ができます。これをRで読み込んで解析/描画します。

3. Rのインストー

Macであれば、R for Mac OS X からパッケージがダウンロードできます。


また、今回は描画に sna (Simple Network Analysys)パッケージ、3D描画のための grDevices を使いますので、併せてインストールします。


Mac用のR.appであれば、R起動後にメニューの「パッケージとデータ>パッケージインストーラ」で、「CRAN(バイナリ)」を選んで「一覧を取得」をクリックし、表示された一覧から「sna」と「grDevice」を選択して「選択をインストール」をクリックすれば、簡単に導入できます(下図)。


導入後、コンソールで require(sna) と入力するか、メニューの「パッケージとデータ>パッケージマネージャ」で sna にチェックを付けると、snaパッケージに含まれる関数が使えるようになります。

4. データの読み込みと描画

2で作ったデータをRのコンソールから

dat <- as.matrix(read.table("~/path/to/matrix.asc",header=TRUE))

のように入力して読み込みます。これで dat と打ちこむと、datが正しく読めているか確認できます。


では、フォローグラフを描画してみましょう。gplotという関数で2次元描画、gplot3dで3次元描画できます。

gplot(dat)
gplot3d(dat)

これだけだとラベルが付かないので、どの点が誰なのか識別できませんから、手動でラベルを指定してあげます。
ついでにいろいろとオプションを指定して見た目を整えます。
各オプションについてはhttp://geocities.yahoo.co.jp/gl/snatool/view/20071213/1197516856を参考にさせて頂きました。

gplot3d(dat,
 label=c("chap_py","..(略)..,"syou6162"),  <-ラベル
 label.col="blue",                         <-ラベルの文字色
 displayisolates=FALSE,                    <-孤立点を表示しない
 edge.lwd=0.1,                             <-枝(辺)の太さ
 vertex.radius=0.2,                        <-頂点の半径
 mode="mds")                               <-頂点の配置アルゴリズム


とりあえず取得した全230人分を描画したところ、凄いことになりました。

マウスでズーム/回転できますが、さすがに何だかよく分かりません。思った以上に密なグラフです。
(1000人以上フォローしている人もちらほらいますしね。)


もうちょっと見やすいよう、10人くらいをランダムに選択して、同じ手順(2以降)で描画してみました。

これなら、何となく納得できる気がする(何が)。
ちなみに有向グラフなので、太い方→細い方というフォロー関係(だと思います)。


オプション指定次第ではもうちょっと見やすいグラフも書けるのかもしれません。
頂点の配置アルゴリズムによっても大きく見た目が変わるようです。(クラスタらしきものが見えたり。)


せっかくデータを採ったので、いろいろ分析して遊んでみたいです。
(ちなみに私の周りではγ=1.82くらいのスケールフリーネットワークになっているようです。)

*1:それRで…と言われそうですが。