社会ネットワーク分析(SNA: Social Network Analysis)
SNAではネットワークをノード(アクター)とエッジ(関係)で表現する。有向グラフを用いることで、引用関係や影響関係のような方向性のある関係を扱える。エッジに重みを付与すれば、関係の強さや頻度も考慮できる。
主要な分析指標として、ネットワーク全体の結合度を示す密度、ノードの重要性を評価する中心性指標(入次数・出次数中心性、媒介中心性、近接中心性、PageRank)がある。これらの指標を組み合わせることで、ネットワーク内の各アクターの役割や位置づけを多角的に評価できる。
本記事では、論文の引用ネットワークを例として、PythonのNetworkXライブラリを用いた実装と各指標の計算結果の解釈を示した。
YouTube動画:
https://youtu.be/M9GsYdYJ1pU
1. 概要
社会ネットワーク分析(SNA: Social Network Analysis)は、グラフ理論を用いて社会構造を分析する手法である。SNAではネットワークをノード(node)とエッジ(edge)で表現する。ノードは人物、組織などを表し、エッジはノード間の関係を表す。エッジには重み(weight)を付与できる。
2. 他の分析手法との比較
SNAは個体間の関係を分析対象とする。従来の統計手法は個体の属性(年齢、性別、収入など)に着目し、サンプルの独立性を仮定する(補足:相関分析など関係性を扱う統計手法も存在する)。SNAは誰と誰がつながっているか、どのようにつながっているかを定量化する。
3. 原理
3.1 基本構造:グラフ表現
ネットワークはグラフ G = (V, E) で表現する。Vはノードの集合、Eはエッジの集合である。
グラフには無向グラフと有向グラフがある。無向グラフはエッジに方向性がなく、友人関係のような双方向の関係を表す。有向グラフはエッジに方向性があり、引用関係や影響関係を表す。本記事では有向グラフを扱う。
エッジには重みを付与できる。重みは関係の強さや頻度を表す。例えば、引用回数や影響の強さを重みとして設定する。
3.2 主要な分析指標
以下の指標でネットワーク構造を評価する。指標によって重みの扱いが異なる。媒介中心性、近接中心性、PageRankは重みを考慮し、密度と次数中心性は考慮しない。
ネットワーク全体の指標
「密度(Density)」は、実際のエッジ数を最大エッジ数で割った値である。有向グラフでは、A→BとB→Aは別のエッジとして数える。最大エッジ数はN × (N-1)、密度は D = E / (N × (N-1)) である(Nはノード数、Eはエッジ数)。密度は重みを考慮しない。
ノードレベルの指標(中心性指標)
「次数中心性(Degree Centrality)」は、ノードに接続するエッジの数である。有向グラフでは入次数と出次数を区別する。次数中心性は重みを考慮しない。
「入次数中心性(In-degree Centrality)」は、そのノードに入るエッジの数である。被参照数やフォロワー数に相当し、受信者としての重要性を示す。
「出次数中心性(Out-degree Centrality)」は、そのノードから出るエッジの数である。参照数やフォロー数に相当し、発信者としての活発さを示す。
「媒介中心性(Betweenness Centrality)」は、他のノード間の最短経路上にそのノードが含まれる頻度である。仲介者としての重要性を示す。重み付きエッジの場合、重みの逆数を距離として計算する。重みが大きいほど距離が近いと解釈する。
「近接中心性(Closeness Centrality)」は、他の全ノードからそのノードへの平均経路長の逆数である。他のノードからの到達しやすさを示す。入ってくるエッジがないノードは値が0になる。重み付きエッジの場合、重みの逆数を距離として計算する。重みが大きいほど距離が近いと解釈する。近接中心性には出方向と入方向の2種類がある。出方向は引用先への到達しやすさ(参照の効率性)を示し、入方向は引用元からの到達しやすさ(被引用の容易さ)を示す。本記事では入方向の近接中心性を扱う。
「PageRank」は、重要なノードからリンクされているノードほど値が高い。入次数だけでなくリンク元の重要性も考慮する。重み付きエッジの場合、重みに応じてスコア配分が変わる。
3.3 重みがない場合
エッジに重みを設定しない場合、すべてのエッジの重みを1として扱う。この場合、媒介中心性と近接中心性はホップ数で経路長を計算する。PageRankはすべてのエッジを同等に扱う。
重みがない場合は関係の有無のみを分析する。関係の強さを考慮しない場合や、重みのデータがない場合に用いる。
4. サンプルによる説明
4.1 サンプルネットワーク
論文の引用ネットワークを例とする。論文Aが論文Bを引用する場合、A→Bのエッジを作成する。重みは引用の重要度を表す。値が大きいほど重要な引用である。
サンプルネットワーク(引用関係):
A → B → D
↓ ↘ ↓
C → E ← F
エッジと重み:
A → B (重み: 3)
A → C (重み: 1)
A → E (重み: 2)
B → D (重み: 2)
B → E (重み: 1)
C → E (重み: 3)
F → E (重み: 2)
4.2 Pythonによる実装
以下にNetworkXライブラリを用いた実装を示す。
import networkx as nx
import matplotlib.pyplot as plt
# 有向グラフの構築(重み付き)
G = nx.DiGraph()
edges = [
('A', 'B', 3), ('A', 'C', 1), ('A', 'E', 2),
('B', 'D', 2), ('B', 'E', 1),
('C', 'E', 3),
('F', 'E', 2)
]
G.add_weighted_edges_from(edges)
# 重みの逆数を距離として設定
for u, v, data in G.edges(data=True):
data['distance'] = 1 / data['weight']
# 入次数中心性と出次数中心性(重みは考慮されない)
in_degree_cent = nx.in_degree_centrality(G)
out_degree_cent = nx.out_degree_centrality(G)
# 媒介中心性(重みの逆数を距離として使用)
betweenness_cent = nx.betweenness_centrality(G, weight='distance')
# 近接中心性(重みの逆数を距離として使用)
closeness_cent = nx.closeness_centrality(G, distance='distance')
# PageRank(重みを考慮)
pagerank = nx.pagerank(G, weight='weight')
# 結果の表示
print("=== 入次数中心性 ===")
for node, cent in sorted(in_degree_cent.items()):
print(f" {node}: {cent:.3f}")
print("\n=== 出次数中心性 ===")
for node, cent in sorted(out_degree_cent.items()):
print(f" {node}: {cent:.3f}")
print("\n=== 媒介中心性(重み付き) ===")
for node, cent in sorted(betweenness_cent.items()):
print(f" {node}: {cent:.3f}")
print("\n=== 近接中心性(重み付き) ===")
for node, cent in sorted(closeness_cent.items()):
print(f" {node}: {cent:.3f}")
print("\n=== PageRank(重み付き) ===")
for node, cent in sorted(pagerank.items()):
print(f" {node}: {cent:.3f}")
# ネットワーク全体の指標
print(f"\n=== ネットワーク全体の指標 ===")
print(f" ノード数: {G.number_of_nodes()}")
print(f" エッジ数: {G.number_of_edges()}")
print(f" 密度: {nx.density(G):.3f}")
# ネットワークの可視化
pos = nx.spring_layout(G, seed=42)
edge_labels = nx.get_edge_attributes(G, 'weight')
nx.draw(G, pos, with_labels=True, node_color='lightgreen', node_size=700, font_size=14, arrows=True)
nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels)
plt.show()
4.3 実行結果
=== 入次数中心性 ===
A: 0.000
B: 0.200
C: 0.200
D: 0.200
E: 0.800
F: 0.000
=== 出次数中心性 ===
A: 0.600
B: 0.400
C: 0.200
D: 0.000
E: 0.000
F: 0.200
=== 媒介中心性(重み付き) ===
A: 0.000
B: 0.050
C: 0.000
D: 0.000
E: 0.000
F: 0.000
=== 近接中心性(重み付き) ===
A: 0.000
B: 0.600
C: 0.200
D: 0.600
E: 1.371
F: 0.000
=== PageRank(重み付き) ===
A: 0.101
B: 0.144
C: 0.116
D: 0.183
E: 0.355
F: 0.101
=== ネットワーク全体の指標 ===
ノード数: 6
エッジ数: 7
密度: 0.233
4.4 結果の解釈
入次数中心性と出次数中心性: Eの入次数中心性が0.800と最も高い。4つの論文から引用されている。AとFは0.000で、引用されていない。出次数中心性はAが0.600と最も高い。3つの論文を引用している。DとEは0.000で、引用していない。
媒介中心性: Bのみが0.050を示す(A→D経路の仲介)。他のノードは0.000である。
近接中心性: Eが1.371と最も高い。4つのノードから引用され、到達されやすい。BとDが0.600である。それぞれ引用元から短い距離にある。AとFは0.000である。引用されておらず、他から到達できない。
PageRank: Eが0.355と最も高い。4つのノードからリンクされている。Dが0.183である。Bからのみリンクされるが、Bの重要度が反映されている。
密度: 密度0.233は、最大30本(6×5)のうち7本のエッジが存在することを示す。
5. まとめ
SNAは個体間の関係を分析する手法である。中心性指標などを用いて、ネットワーク内のアクターの位置づけや全体構造を評価する。方向性のある関係には有向グラフを用い、入次数・出次数中心性やPageRankで分析する。エッジに重みを設定すると、関係の強さを考慮した分析ができる。