igraphでTwitterのネットワークを描いてみる2

昨日の続き。

  • 次数(矢印が出入りする数)でノードの数を制限した。
  • ページランクでノードの大きさを変えた。
  • クラスタごとにノードの色を変えた。



少しは見通しが良くなったかな。
水色は中核であるYMOメンバー本人と直接の関係者のクラスタ、ピンクは漫画家のクラスタ、のこり2つのクラスタは良く分からない。
そもそもYMO周辺の人々だけを選んでいるので、その中をクラスタに分割するのはちょっと無理があったみたい。


でもなんとなく感じがつかめてきた。

library(twitteR)
library(igraph)

init <- initSession("bob3bob3", "************")

# YMO周辺の方々
account <- c(
	"o3a3", "takano_hiroshi", "postymo","room66plus", "skmt09",
	"t0da", "Eguchinn", "corneliusjapan", "kenso1978", "9moichi",
    "tomoeshinohara", "videobird", "seikoito", "miusakamoto")

# フォロー先の名前を抽出
# 100件までしか抽出できないみたい
edge <- NULL
for (i in account){
 friends <- userFriends(i,init)
 size <- length(friends)
 if (size == 0) next
 name <- character(size)
  for (j in 1:size){
   name[j] <- screenName(friends[[j]])
  }
 df <- data.frame(FROM=rep(i,length(name)), TO=name)
 edge <- rbind(edge,df)
}

# graphオブジェクトに変換
g <- graph.data.frame(edge)

# ノードごとの次数
DG <- degree(g)

# ノードのリスト
VL <- rownames(get.adjacency(g))

# 次数が2以下の人の名前
CUT <- VL[DG < 3]

# エッジリスト
EL <- get.edgelist(g)

# 次数が1の人を含むエッジを除く
for (k in CUT) EL <- EL[EL[,1]!=k,]
for (l in CUT) EL <- EL[EL[,2]!=l,]

# graphオブジェクトに変換
gg <- graph.data.frame(EL)

# ページランクを算出し、ノードの大きさに使う
PR <- page.rank(gg)$vector

# クラスタごとにノードの色を変える
(wtc <- walktrap.community(gg))

# stepsの数値はwtc$mergesとmodularityを見ながら決める
# ここでRが落ちることがある……
memb <- community.to.membership(gg, wtc$merges, steps=30)
modularity(g, memb$membership)
table(memb$membership)
# 4つのクラスタに分かれた
#  0  1  2  3 
# 12 11  7  4 
V(gg)$color <- memb$membership +5

# ネットワーク図を描く
V(gg)$label <- V(gg)$name
plot(gg, layout=layout.fruchterman.reingold,
 vertex.size=20*PR/max(PR), edge.arrow.size=0.5)