Rのigraphで相関図

最近、「Rパッケージのigraph*1って相関図描くのに便利そうだな-」と思っているので、練習も兼ねて簡単な作図と計算をしてみた。たとえば、イロハ、すもも、梨子、てゐの4人に以下のような関係があったとする。

  • イロハはすもも、てゐを知っている
  • ももはイロハを知っている
  • 梨子はイロハ、すもも、てゐを知っている
  • てゐは他の3人のことを知らない

 この関係性を0と1で表すと、こんな行列ができる(グラフ理論では、隣接行列と呼ぶ)。

f:id:Fujinitaka:20170518230442p:plain

エクセルで作成して、適当な名前をつけてテキスト形式(タブ区切り)で保存したあと、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)#とりあえず描く

f:id:Fujinitaka:20170516002555p:plain

それぞれの要素(ここでは人)は「ノード (node)」、ノード同士を結ぶ辺(ここでは2人の関係性)は「エッジ (edge)」とよばれる。エッジには方向性と重みを持たせることができる。上のグラフの場合は「重みなし有向グラフ」となる。

さらに、distanceコマンドを使うと、それぞれのノードから他のノードへの距離を知ることができる。

 distances(g, mode="out")#ノードから出るエッジの計算

f:id:Fujinitaka:20170518233200p:plain

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. グラフオブジェクトの作成と取り扱い - もうカツ丼でいいよな

R+igraph - Kazuhiro Takemoto