身近な友人ネットワークで遊んでみる

   2018/02/24

先日、高校の同級生と集まって飲んだのですが、そのときのメンツがちょっと面白かったのでネットワークに見立てて遊んでみました。

ネットワーク分析 第2版 (Rで学ぶデータサイエンス)』を頼りにRを用いて計算しました。この書籍、Rを使ってネットワークの解析をするときはすごく便りになります。書籍紹介で別途記事を書きたいと思っています。

今回登場するのは6人です。したがって6つのノードから形成されるネットワークということになります。
エッジの有無は「どうでもいい内容のラインを気軽に送れるかどうか」としました。また、無向グラフとしました。
まず、当該ネットワークを描画した図を載せておきます。

(さて、僕はどれでしょう~)
今回やってみたのはこの友人ネットワークについて、各種中心性指標を計算するというものです。
用いた中心性は、離心中心性、近接中心性、次数中心性、固有ベクトル中心性、媒介中心性、情報中心性の6つです。

以下にソースコードを記しておきます。

#まず隣接行列の準備
friend_net <- matrix(c(
0,1,1,1,0,0,
1,0,0,1,0,0,
1,0,0,0,0,0,
1,1,0,0,1,1,
0,0,0,1,0,1,
0,0,0,1,1,0),
nrow = 6, ncol= 6, byrow = TRUE)

#igraph用のグラフオブジェクト作成
library(igraph)
friend_net_of_igraph <- graph_from_adjacency_matrix(friend_net)

#可視化する
tkplot(friend_net_of_igraph,vertex.size=30,vertex.color="white",
vertex.label.color = "black",edge.color = "blue",edge.arrow.mode="-",
edge.width=5,vertex.label.cex=2)

#中心性の計算
#snaで計算します
detach(package:igraph)
library(sna)
value_risin <- graphcent(friend_net) #離心中心性
value_closeness <- closeness(friend_net) #近接中心性(標準化されている)
value_degree <- degree(friend_net,gmode="graph") #次数中心性
value_eigen <- evcent(friend_net) #固有ベクトル中心性
value_betweenness <- betweenness(friend_net,gmode="graph") #媒介中心性
value_info <- infocent(friend_net) #情報中心性

#一覧表にする
centralities_original <-
matrix(c(round(value_risin,3),round(value_closeness,3),
round(value_degree,1),round(value_eigen,3),round(value_betweenness,3),
round(value_info,3)),nrow=6)
colnames(centralities_original) <- c("離心中心性", "近接中心性",
 "次数中心性","固有ベクトル中心性","媒介中心性","情報中心性")
rownames(centralities_original) <- c("頂点1", "頂点2", "頂点3", "頂点4", "頂点5", "頂点6")
library(gtable)
library(gridExtra) 
library(grid) 
table_centralities_original <- gridExtra::tableGrob(centralities_original) 
grid.draw(table_centralities_original)


#中心性の高さでソートする
vr <- sort(value_risin, index.return = TRUE, decreasing = TRUE)
vc <- sort(value_closeness, index.return = TRUE, decreasing = TRUE)
vd <- sort(value_degree, index.return = TRUE, decreasing = TRUE)
ve <- sort(value_eigen, index.return = TRUE, decreasing = TRUE)
vb <- sort(value_betweenness, index.return = TRUE, decreasing = TRUE)
vi <- sort(value_info, index.return = TRUE, decreasing = TRUE)

#ソートしたやつを一覧表にする
centralities_sort <-
matrix(c(vr[[2]],round(vr[[1]],3),vc[[2]],round(vc[[1]],3),
vd[[2]],round(vd[[1]],3),ve[[2]],round(ve[[1]],3),
vb[[2]],round(vb[[1]],1),vi[[2]],round(vi[[1]],3)),nrow=6)
colnames(centralities_sort)<-
c("頂点","離心","頂点","近接","頂点","次数","頂点","固有","頂点","媒介","頂点","情報")
table_centralities_sort <- gridExtra::tableGrob(centralities_sort) 
grid.draw(table_centralities_sort)

#離心中心性と近接中心性
risin_and_closeness <-
matrix(c(round(value_risin,3),round(value_closeness,3)),nrow=6)
colnames(risin_and_closeness) <- c("離心中心性", "近接中心性")
rownames(risin_and_closeness) <- c("頂点1", "頂点2", "頂点3", "頂点4", "頂点5", "頂点6")
table_risin_and_closeness <- gridExtra::tableGrob(risin_and_closeness) 
grid.draw(table_risin_and_closeness)

#次数中心性と固有ベクトル中心性
degree_and_eigen <-
matrix(c(round(value_degree,1),round(value_eigen,3)),nrow=6)
colnames(degree_and_eigen) <- c("次数中心性", "固有ベクトル中心性")
rownames(degree_and_eigen) <- c("頂点1", "頂点2", "頂点3", "頂点4", "頂点5", "頂点6")
table_degree_and_eigen <- gridExtra::tableGrob(degree_and_eigen) 
grid.draw(table_degree_and_eigen)

#媒介中心性と情報中心性
betweenness_and_info <-
matrix(c(round(value_betweenness,3),round(value_info,3)),nrow=6)
colnames(betweenness_and_info) <- c("媒介中心性", "情報中心性")
rownames(betweenness_and_info) <- c("頂点1", "頂点2", "頂点3", "頂点4", "頂点5", "頂点6")
table_betweenness_and_info <- gridExtra::tableGrob(betweenness_and_info) 
grid.draw(table_betweenness_and_info)

計算結果は次のようになりました。

中心性が高い順に並べ替えるとこんな感じ。

どの中心性指標においても頂点4がトップになりました。これはネットワークの形から予想される結果と直観的に一致しますね。もう少し細かく見ていきましょう。「離心中心性と近接中心性」、「次数中心性、固有ベクトル中心性」、「媒介中心性と情報中心性」の組に分けて考察していきます。

離心中心性と近接中心性


離心中心性では頂点1、頂点2、頂点4が同率一位でしたが、近接中心性では明確に差がつきましたね。
この結果とグラフを見比べてみると、近接中心性のほうがよりグラフの特徴を反映していることがわかります。
離心中心性と近接中心性はどちらも他のノードへの距離を用いた指標ですが、離心中心性はそのうち最大値しか用いていないのに対し、近接中心性は他のノードへの距離すべてを使って算出しているため、グラフに含まれている情報量をより多く反映しているということなのでしょう。

次数中心性と固有ベクトル中心性


ここでは頂点2、頂点5、頂点6を引き合いに出して考察してみると面白いでしょう。
これら三つの頂点はいずれも次数が2ですが、固有ベクトル中心性になると頂点2だけ少し中心性が高くなります。
次数中心性は伸びてる枝の数にしか興味がありませんが、固有ベクトル中心性は枝の先にある頂点にも興味がある指標です。
頂点2、頂点5、頂点6はみんな頂点4に接続しており、ここでは差が生まれません。そこで残りの枝の先にある頂点に着目してみましょう。頂点2、頂点5、頂点6それぞれの残りの枝の接続先である頂点1、頂点5、頂点6を比較してみると、頂点1は次数が3、頂点5と頂点6は次数が2になっています。つまり、より次数が大きい頂点1に結びついている分、頂点2は頂点5と頂点6より中心性が高くなっているということになります。

媒介中心性と情報中心性


まず媒介中心性について、頂点1と頂点4の差について考えてみましょう。
ネットワークから頂点1を取り除いても頂点3が孤立するだけですが、頂点4を取り除くとネットワークが大きく分断されてしまいます。こういった意味で頂点4の方が重要度が高いということでしょう。
次に頂点2、頂点5、頂点6について。これら三つの頂点は、媒介中心性については同率でした。では情報中心性で差がついた原因は何か、と考えてみると、先ほどの固有ベクトル中心性の議論と同様、頂点1に接続しているかどうか、が鍵になってくるのではないでしょうか。

終わりに

実際に解析を行った感想としては、いろいろな特徴量について、実感を伴って理解を深めることができたな、という感じです。
ネットワーク科学については少し前からちょこちょこ本を読んで勉強してはいるのですが、中心性については「種類多い!!」というのが第一印象で、それらについてふわふわした感覚のままになっていました。逆に、今回の「遊び」で自分がふわふわした理解のまま進んでいることに気づいたと言ってもいいかもしれません。

  • このエントリーをはてなブックマークに追加
  • Pocket

コメントを残す