Re: 共起ネットワークにおける中心性の値とサブグラフ検出結果 (HIGUCHI Koichi) KH Coder 旧掲示板
[ツリー表示] [留意事項] [ワード検索] [過去ログ]

  [No.901] Re: 共起ネットワークにおける中心性の値とサブグラフ検出結果 投稿者:HIGUCHI Koichi  投稿日:2012/02/07(Tue) 17:27:05

こんにちは、樋口です。書き込みありがとうございます。

中心性を見比べるのは面白そうですね。直接つながっている相手がいくつある
かということ(次数)だけではなく、ネットワークの形状ないしは構造によっ
て「立場」のようなものが決まってくるという、社会ネットワーク分析の醍醐
味に近づけそうな感じがします。

さて、データ出力の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)
#----------------------------------------------------------------------------


- 関連一覧ツリー (■ をクリックするとツリー全体を一括表示します)