こんにちは、樋口です。書き込みありがとうございます。 中心性を見比べるのは面白そうですね。直接つながっている相手がいくつある かということ(次数)だけではなく、ネットワークの形状ないしは構造によっ て「立場」のようなものが決まってくるという、社会ネットワーク分析の醍醐 味に近づけそうな感じがします。 さて、データ出力のRプログラムは以下のような形になります。 なお、サブグラフ検出(媒介・odularity)はそれ自体がクラスタリングの結 果ですので、数値が入っていますが、これらの数値は「クラスター番号」です。 数値として計算されないようにご注意ください。1と2も、1と10も、「単に違 うクラスター」というだけで、「2倍」「10倍」といった意味はありません。 距離や類似度を計算する時には、ダミー変数に変換するのが良いかもしれませ ん。 ともあれ、こうした指標によるクラスタリングにどんな意味があるか、すぐに は考えをまとめられないのですが、なんにせよ、こうしたデータはご自身での 可視化などにもご活用いただけようかと思います。 #---------------------------------------------------------------------------- # コミュニティ検出に利用する関数(どこまで併合を進めるか) merge_step <- function(n2, m){ # for ( i in 1:( trunc( length( m ) / 2 ) ) ){ temp_csize <- community.to.membership(n2, m,i)$csize num_max <- max( temp_csize ) num_alone <- sum( temp_csize[ temp_csize == 1 ] ) num_cls <- length( temp_csize[temp_csize > 1] ) #print( paste(i, "a", num_alone, "max", num_max, "cls", num_cls) ) if ( # 最大コミュニティサイズが全ノード数の22.5%以上 num_max / length(get.vertex.attribute(n2,"name")) >= 0.225 # かつ、最大コミュニティサイズが単独ノード数よりも大きい && num_max > num_alone # かつ、サイズが2以上のコミュニティ数が12未満 && num_cls < 12 ){ return(i) } # 最大コミュニティサイズがノード数の40%を越える直前で打ち切り if (num_max / length(get.vertex.attribute(n2,"name")) >= 0.4 ){ return(i-1) } } return( trunc(length( m ) / 2) ) } # コミュニティ検出(betweenness) com_b <- edge.betweenness.community(n2, directed=F) com_b <- community.to.membership( n2, com_b$merges, merge_step(n2,com_b$merges) ) # コミュニティ検出(modularity) com_m <- fastgreedy.community(n2, merges=TRUE, modularity=TRUE) com_m <- community.to.membership( n2, com_m$merges, merge_step(n2,com_m$merges) ) # 1つのデータフレームにまとめる cnt <- data.frame( words = colnames(d)[ as.numeric( get.vertex.attribute(n2,"name") ) ], degree = degree(n2), betweenness = betweenness(n2), evcent = evcent(n2)$vector, community_betweenness = as.character(com_b$membership), community_modularity = as.character(com_m$membership) ) print(cnt) #----------------------------------------------------------------------------