igraphでTwitterのネットワークを描いてみる3
こんどは違うコミュニティに属する(と思われる)人々を種にして、うまくクラスタを分割できるか試してみる。
account <- c("kazuyo_k", #勝間和代 "kohmi", #広瀬香美 "takapon_jp", #堀江貴文 "hmikitani", #三木谷浩史 "kirakira954", #TBSキラキラ "shakase", #水道橋博士(TBSキラキラ) "senochin", #妹尾匡夫(TBSウィークエンドシャッフル) "2dawn", #古川耕(TBSウィークエンドシャッフル) "room66plus", #高橋幸宏 "skmt09", #坂本龍一 "HikaruIjuin", #伊集院光 "Kitsch_Matsuo") #松尾貴史
想定したのは、カツマー、IT長者、TBSラジオ「キラキラ」、TBSラジオ「ウィークエンドシャッフル」、YMO周辺、お笑い、の6クラスタ。
それぞれ核となるであろう2名を種として投入。
それぞれがフォローしている人々でネットワーク図を描きクラスタを探索する。
library(twitteR) library(igraph) init <- initSession("bob3bob3", "************") 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) } g <- graph.data.frame(edge) DG <- degree(g) VL <- rownames(get.adjacency(g)) CUT <- VL[DG < 2] EL <- get.edgelist(g) for (k in CUT) EL <- EL[EL[,1]!=k,] for (l in CUT) EL <- EL[EL[,2]!=l,] # write.csv(EL, "091217_edge_list.csv") # EL <- read.csv("091217_edge_list.csv")[,2:3] gg <- graph.data.frame(EL) PR <- page.rank(gg)$vector (wtc <- walktrap.community(gg)) ########## memb <- community.to.membership(gg, wtc$merges, steps=57) modularity(gg, memb$membership) table(memb$membership) V(gg)$color <- rainbow(length(memb$csize))[memb$membership+1] V(gg)$label <- V(gg)$name V(gg)$size <- 20*PR/max(PR) par(mar=c(0, 0, 0, 0)) plot(gg, layout=layout.fruchterman.reingold, edge.arrow.size=0.5) # tkplot(gg, layout=layout.fruchterman.reingold, edge.arrow.size=0.5)
結果、5クラスタに分かれました。
左上の青が「YMO」クラスタ、隣の赤が「お笑い&漫画家」クラスタ、右中段の黄色が「TBSラジオ」クラスタ、左下の紫が「カツマー」クラスタ、右下の緑は「その他」クラスタって感じでしょうか。
IT長者はクラスタができませんでした。三木谷さん消えちゃってるし。
TBSラジオの2番組は出演者の相互乗り入れが多いので一つにまとまるのは当然でした。
お笑いの人と漫画家の人に結びつきが多いのは意外でした。
「カツマー」と「YMO」の間には全く結びつきが無く、他のクラスタとのつながりも薄い。
水道橋博士は全てのクラスタに結びついている。
「YMO」と「お笑い&漫画家」の媒介となっているのは松尾貴史。
ほかにもいろいろ解釈ができそう。
これを応用してレコメンドエンジンが作れそうだな。
自分がフォローしている人のリストを食わせると、「あなたにはこの人をフォローすることをお勧めします」って感じの。
もう誰か作ってるかな?