Rについて
をベースに学んでいく。
今回はネットワーク分析(PP.228-252)を扱う。
前回
19. ネットワーク分析
ネットワーク分析は何らかの関係の有無や関係およびその度合いを調べるための分析手法である。グラフ理論に基づくため、グラフ分析とも呼ぶ。ネットワークは頂点と辺を基本構成要素とする。グラフはノードとエッジの関係である。エッジが方向性を持つグラフを有項グラフ、エッジが方向性を持たないグラフを無向グラフという。
グラフは行列で記述することができ、隣接行列と呼ぶ。有向グラフの隣接行列は非対称で、無向グラフの隣接行列は対称行列である。
19.1 ネットワークの作成
ネットワーク作成のパッケージは複数ある。ここではを用いることとする。
library("igraph") test <- matrix(c(0,0,1,0,1,0,0,0,2,0,0,0,4,3,0,0),4,4) colnames(test) <- c("A","B","C","D") rownames(test) <- c("A","B","C","D") test_g <- graph.adjacency(test,weighted = T) V(test_g) # ノードを返す E(test_g) # エッジを返す E(test_g)$weight # エッジの重み plot(test_g) plot(test_g, layout = layout.circle, edge.label = E(test_g)$weight)
19.1.1 データフレーム形式データのネットワーク
19.2 ネットワークの統計量
ネットワークの特徴を抽出するための統計量としていくつかを紹介する。
19.2.1 基本要素の数と次数
ネットワークにおける基本要素はノードとエッジである。また各ノードにつながるエッジの数を次数という。
library("igraph") test <- matrix(c(0,0,1,0,1,0,0,0,2,0,0,0,4,3,0,0),4,4) colnames(test) <- c("A","B","C","D") rownames(test) <- c("A","B","C","D") test_g <- graph.adjacency(test,weighted = T) ### vcount(test_g) # ノード数 ecount(test_g) # エッジ数 neighbors(test_g, "A") # ノードAに隣接するノード degree(test_g) # 次数
19.2.2 密度
密度はネットワークの混雑度合いを表す統計量で、
で定義される。密度の値が大きいほどエッジの数が多いこととなり、ネットワークが相対的に複雑であることを意味する。
library("igraph") test <- matrix(c(0,0,1,0,1,0,0,0,2,0,0,0,4,3,0,0),4,4) colnames(test) <- c("A","B","C","D") rownames(test) <- c("A","B","C","D") test_g <- graph.adjacency(test,weighted = T) ### graph.density(test_g) # 密度
19.2.3 中心性
ネットワークにおける中心を用いて比較分析を行う場合もある。。
接近中心性はグラフにおけるとあるノードと他のノードとの距離に関する指標
である。ここではノード
の最短距離を表す。値が小さいほど中心性が高いと考える。他にも様々な中心性の定義がある。
19.2.4 クラスター係数
クラスター係数はノードの近傍の関係を表す度合いであり、隣り合うノードの間に三角形ループがいくつ形成されているかに関する指標で、推移性とも呼ばれる。
次にグローバルクラスター係数は
で定義する。ここでは隣接行列
の内積の主対角成分を
にした行列である。
ローカルクラスター係数は
で定義される。
19.2.5 次数の相関係数
ネットワーク内の任意の2つのノード間の次数の関連性を示す指標として、次数の相関係数がある。辺の総数を、エッジ
に接続している両ノードの次数を
とすれば、
で定義できる*1。
library("igraphdata") library("igraph") data(foodwebs) op <- par(mfrow = c(1,3)) plot.igraph(foodwebs[[1]], vertex.size = 2, edge.arrow.size = 0.1) plot.igraph(foodwebs[[2]], vertex.size = 2, edge.arrow.size = 0.1) plot.igraph(foodwebs[[3]], vertex.size = 2, edge.arrow.size = 0.1) par(op)
19.3 コミュニティ分析
ネットワーク分析において、1つのネットワークをいくつかのサブネットワークにグルーピングしたものをコミュニティと呼ぶ。ある個体が複数のコミュニティにまたがっている(オーバーラッピングという。)か否かで結果が変わる。
op <- par(mfrow = c(2,2), mal = c(2,1,1,1)) g1 <- graph.full(6) g2 <- graph.full(5) g <- g1 %du% g2 plot.igraph(g); box() g <- add.edges(g, c(1,9,4,7)) plot.igraph(g);box() bc <- edge.betweenness.community(g) plot(bc,g);box() dendPlot(bc); box() par(op)
コミュニティのクラスタリングには、値が最大になるような分析を行う方法が頻用される。
ここでは隣接行列の成分、
はエッジの総数、
はノード
の次数および
はノード
が同じクラスターに属すると
、そうでなければ
を返す関数である。
オーバーラッピングを許す場合にはパッケージを用いる。
補足 スペック情報
エディション | Windows 10 Home |
バージョン | 20H2 |
プロセッサ | Intel(R) Core(TM) i5-1035G4 CPU @ 1.10GHz 1.50 GHz |
実装 RAM | 8.00 GB |
システムの種類 | 64 ビット オペレーティング システム、x64 ベース プロセッサ |
R バージョン | 4.1.3 (March, 2022) |
RStudio バージョン | 2022.02.2 Build 485 |
*1:他の定義をする流派もある。