Rのigraphで相関図
最近、「Rパッケージのigraph*1って相関図描くのに便利そうだな-」と思っているので、練習も兼ねて簡単な作図と計算をしてみた。たとえば、イロハ、すもも、梨子、てゐの4人に以下のような関係があったとする。
この関係性を0と1で表すと、こんな行列ができる(グラフ理論では、隣接行列と呼ぶ)。
エクセルで作成して、適当な名前をつけてテキスト形式(タブ区切り)で保存したあと、Rを立ち上げて次のコマンドを打ち込む。これで基本的な相関図は作れる。
library(igraph)#igraphを呼び出す
d <- as.matrix(read.table(file="sample.txt",header=T,row.names=1))#1列目と1行目に名前をつけて読み込む
g <- graph.adjacency(d,mode="directed",weighted=NULL)#有向重みなしグラフとしてgに格納
plot(g)#とりあえず描く
それぞれの要素(ここでは人)は「ノード (node)」、ノード同士を結ぶ辺(ここでは2人の関係性)は「エッジ (edge)」とよばれる。エッジには方向性と重みを持たせることができる。上のグラフの場合は「重みなし有向グラフ」となる。
さらに、distanceコマンドを使うと、それぞれのノードから他のノードへの距離を知ることができる。
distances(g, mode="out")#ノードから出るエッジの計算
Infは、infiniteつまりいかなるノードを経由してもたどり着けないことを表す。この例では、すももは1人の仲介でてゐにたどり着けるが、梨子とはどう頑張っても知り合いになれない。この行列は、距離行列とも呼ばれる。
次に、「すももを出発点としたとき、他のメンバーには平均何回の仲介でたどり着けるか?」を計算してみる。
dis <- distances(g, mode="out")#disに計算結果代入
dis[dis == Inf] <- 0#無限大が交じると計算できないので、ゼロに変換
mean(dis[2,])#すももの行の平均を求める
[1] 0.75 #割る数に値が0の要素も数えてしまっている
sum(dis[2,])/sum(dis[2,]>0)#1以上の値を持つ要素の数で2行目の合計を割る
[1] 1.5
というわけで、平均1.5回となる。次回はもう少し複雑な関係性にも挑戦したい。
参考サイト様:
igraphパッケージの使い方 1. グラフオブジェクトの作成と取り扱い - もうカツ丼でいいよな