「大人の教養・知識・気付き」を伸ばすブログ

一流の大人(ビジネスマン、政治家、リーダー…)として知っておきたい、教養・社会動向を意外なところから取り上げ学ぶことで“気付く力”を伸ばすブログです。データ分析・語学に力点を置いています。 →現在、コンサルタントの雛になるべく、少しずつ勉強中です(※2024年1月21日改訂)。

MENU

Rによるデータサイエンス(18/21)

 Rについて

をベースに学んでいく。
 今回はネットワーク分析(PP.228-252)を扱う。

19. ネットワーク分析

 ネットワーク分析は何らかの関係の有無や関係およびその度合いを調べるための分析手法である。グラフ理論に基づくため、グラフ分析とも呼ぶ。ネットワークは頂点と辺を基本構成要素とする。グラフはノードとエッジの関係G=(V,E)である。エッジが方向性を持つグラフを有項グラフ、エッジが方向性を持たないグラフを無向グラフという。
 グラフは行列で記述することができ、隣接行列と呼ぶ。有向グラフの隣接行列は非対称で、無向グラフの隣接行列は対称行列である。

19.1 ネットワークの作成

 ネットワーク作成のパッケージは複数ある。ここでは\mathrm{igraph}を用いることとする。

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 データフレーム形式データのネットワーク

 


\begin{aligned}

\end{aligned}

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 密度

 密度はネットワークの混雑度合いを表す統計量で、



\begin{aligned}
d=\begin{cases}
\displaystyle{\frac{m}{n(n-1)}},&\mathrm{有向グラフ}\\
\displaystyle{\frac{2m}{n(n-1)}},&\mathrm{無向グラフ}
\end{cases}
\end{aligned}


で定義される。密度の値が大きいほどエッジの数が多いこととなり、ネットワークが相対的に複雑であることを意味する。

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 中心性

 ネットワークにおける中心を用いて比較分析を行う場合もある。。
 接近中心性はグラフにおけるとあるノードと他のノードとの距離に関する指標



\begin{aligned}
c=\displaystyle{\frac{1}{\displaystyle{\sum_{i\neq j}d(n_i,n_j) }}}
\end{aligned}


である。ここでd(n_1,n_2)はノードn_i,n_jの最短距離を表す。値が小さいほど中心性が高いと考える。他にも様々な中心性の定義がある。

19.2.4 クラスター係数

 クラスター係数はノードの近傍の関係を表す度合いであり、隣り合うノードの間に三角形ループがいくつ形成されているかに関する指標で、推移性とも呼ばれる。
 次にグローバルクラスター係数は



\begin{aligned}
G=\displaystyle{\frac{\displaystyle{\Sigma(B\times A)}}{\displaystyle{\Sigma(B)}}}=\displaystyle{\frac{3\times 三角形の数}{2つのエッジを持つノード数}}
\end{aligned}


で定義する。ここでBは隣接行列A内積の主対角成分を0にした行列である。


 ローカルクラスター係数は



\begin{aligned}
L=\displaystyle{\frac{2\times v_iを含む三角形の数}{k_i(k_i-1)}}
\end{aligned}


で定義される。

19.2.5 次数の相関係数

 ネットワーク内の任意の2つのノード間の次数の関連性を示す指標として、次数の相関係数がある。辺の総数をM、エッジiに接続している両ノードの次数をj_i,k_iとすれば、



\begin{aligned}
r=\displaystyle{\frac{\displaystyle{M^{-1}\sum_{i=1}^{M}j_ik_i-\left\{\displaystyle{(2M)^{-1}\sum_{i=1}^{M}(k_i+k_i)}\right\}^2}}{\displaystyle{(2M)^{-1}\sum_{i=1}^{M}\sum_{j=1}^{M}(j_i^2+k_i^2)-\left\{(2M)^{-1}\sum_{i=1}^{M}(j_i+k_i)\right\}^2}}}
\end{aligned}


で定義できる*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)


 コミュニティのクラスタリングには、Q値が最大になるような分析を行う方法が頻用される。



\begin{aligned}
Q=\displaystyle{\frac{1}{2M}\sum_{i=1}^{n}\sum_{j=1}^{n}\left(A_{ij}-\displaystyle{\frac{k_ik_j}{2M}}\right)\delta(c_i,c_j)}
\end{aligned}


ここでA_{ij}は隣接行列の成分、Mはエッジの総数、k_iはノードiの次数および\delta(c_i,c_j)はノードi,jが同じクラスターに属すると1、そうでなければ0を返す関数である。
 オーバーラッピングを許す場合には\mathrm{linkcomm}パッケージを用いる。

補足 スペック情報

エディション 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:他の定義をする流派もある。

プライバシーポリシー お問い合わせ