[掲示板へもどる]
一括表示

  [No.897] 中心性の数値について 投稿者:中田  投稿日:2012/01/29(Sun) 16:37:59

はじめまして。中田と申します。

現在研究でkh coderを利用させていただいております。

質問なのですが、共起ネットワークにおける媒介中心性、次数中心性、固有ベクトル中心性の正確な数値を確認する方法について、詳しく教えていただけないでしょうか?
掲示板に似た質問があったので確認したのですが、Rについて詳しい知識が無いのでよくわかりませんでした。

鈴木努先生のネットワーク分析 (Rで学ぶデータサイエンス 8)は手元にあります。

お忙しいと思いますが、教えていただけると幸いです。
よろしくお願いします。


  [No.898] Re: 共起ネットワークにおける中心性の数値の確認 投稿者:HIGUCHI Koichi  投稿日:2012/01/29(Sun) 17:20:33

こんにちは、樋口です。書き込みありがとうございます。
また既存のQ&Aを詳しくご確認いただいたご様子で恐れ入ります。

KH Coderで共起ネットワークを作成してから、「tutorial\Rの利用例\readme_
network.pdf」の2ページ目(スライド4枚目)までの手順を実行して下さい。
共起ネットワークを「R Source」形式で保存し、KH Coderに付属のRで実行する
という手順です。

この手順を実行すれば、「n2」というigraphオブジェクトに共起ネットワーク
が格納されますので、あとはR上の操作で数値をご確認いただけます。例えば、
以下のコマンドで次数中心性を確認できます。(最初の「>」は省いて実行し
てください)

> cnt <- data.frame(
> words = colnames(d)[ as.numeric( get.vertex.attribute(n2,"name") ) ],
> centrality = degree(n2)
> )
> print(cnt)

ここで「centrality = degree(n2)」となっている箇所を変更すれば、違う種
類の中心性をご確認いただけます。

媒介中心性を確認する場合:
> centrality = betweenness(n2)

固有ベクトル中心性を確認する場合:
> centrality = evcent(n2)$vector

p.s.
どうせなら以下のようにした方が、すべての中心性を一度に確認できてスマー
トかもしれません。

> cnt <- data.frame(
> words = colnames(d)[ as.numeric( get.vertex.attribute(n2,"name") ) ],
> degree = degree(n2),
> betweenness = betweenness(n2),
> evcent = evcent(n2)$vector
> )
> print(cnt)


  [No.899] Re: 共起ネットワークにおける中心性の数値の確認 投稿者:中田  投稿日:2012/01/29(Sun) 17:44:00

ご返信ありがとうございます。
欲しかった数値を手に入れられました。


  [No.900] Re: 共起ネットワークにおける中心性の数値の確認 投稿者:袋井  投稿日:2012/02/06(Mon) 20:44:56

樋口先生さま

お世話になります、袋井と申します。

3つの中心性(媒介、次数、固有ベクトル)の値を出力できる方法を、私も大変に重宝しております。
ありがとうございます。


この出力結果を、私は以下のように使っております。

3つの中心性(媒介、次数、固有ベクトル)のうち、任意の2つで散布図を作成します。

例えば、横軸に次数中心性、縦軸に媒介性中心性で、散布図を作成します。

おもしろいことに、必ずしも線形にはなりません。

次数中心性が大きいのに媒介性中心性が小さい、
逆に、次数中心性が小さいのに媒介性中心性が大きいなどの、新しい視点を提供してくれます。


樋口先生にお願いしたいことがございます。

3つの中心性(媒介、次数、固有ベクトル)に、2つのサブグラフ検出(媒介、modularity)も加えた、
5つのネットワーク指標を出力できるプログラムを例示していただけないでしょうか?

 行方向に、ノードID(または、ノードラベル)
 列方向に、中心性(媒介)、中心性(次数)、中心性(固有ベクトル)、サブグラフ検出(媒介)、サブグラフ検出(modularity)の5つの指標


これら5つの指標からなるベクトルを、ノードの特徴ベクトルとみなすことで、
ノードのクラスタリングを行うことができるのではないかと思っております。

どうぞよろしくお願いいたします。


  [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)
#----------------------------------------------------------------------------


  [No.902] Re: 共起ネットワークにおける中心性の数値の確認 投稿者:袋井  投稿日:2012/02/07(Tue) 21:04:42

樋口先生さま

お世話になります、袋井と申します。

早々にご教示をいただき、誠にありがとうございました。

3つの中心性指標は標準化を行い、
2つのサブグラフ検出結果はダミー変数化を行い、
これら5属性をノードの特徴ベクトルとして、実験をしたいことがございます。

とても助かりました。

ありがとうございました。
御礼を申し上げます。