こんにちは、樋口です。書き込みありがとうございます。
中心性を見比べるのは面白そうですね。直接つながっている相手がいくつある
かということ(次数)だけではなく、ネットワークの形状ないしは構造によっ
て「立場」のようなものが決まってくるという、社会ネットワーク分析の醍醐
味に近づけそうな感じがします。
さて、データ出力の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)
#----------------------------------------------------------------------------