5. ネットワークデータ分析
学習目標
- ネットワークデータの構造(ノード・エッジ・重み)を説明できる
- NetworkX でグラフを構築し、基本的な操作ができる
- 主要な中心性指標(次数中心性・媒介中心性・近接中心性)の意味を理解する
- 力学レイアウト(spring layout)でネットワークを可視化できる
- 集計済みのエッジ・ノードデータからネットワーク分析の流れを再現できる
本文
ネットワークデータとは
これまでの単元で扱ってきたデータは「行が観測、列が特徴」という 表形式(テーブル) でした。ネットワークデータは、これとは性質が違う 「点と線」 の構造を持ちます。
- ノード(節点、Node) — 個々の対象。人・組織・場所・遺伝子など
- エッジ(辺、Edge) — ノード同士の つながり。友人関係、共同提出、配線、リンクなど
- 重み(Weight) — エッジの強さ。「何回つながったか」「距離は何 km か」など
ネットワーク分析の主要な問いは:
- 中心的なノードはどれか?(影響力の強い人、要となるハブ)
- いくつかのグループ(コミュニティ)に分かれていないか?
- 全体がどれくらい密につながっているか?
これらは表形式データの集計だけでは見えにくく、ネットワーク特有の指標と可視化で初めて見えてきます。
NetworkX — Python のネットワーク分析ライブラリ
NetworkX は Python の事実上の標準ネットワークライブラリです。Colab には標準でインストールされているので、import するだけで使えます。
import networkx as nx
慣例で nx の別名を使います。
グラフを作る
最小限のグラフは数行で構築できます:
G = nx.Graph() # 無向グラフ
G.add_node("A")
G.add_node("B")
G.add_edge("A", "B", weight=3) # A と B を重み 3 でつなぐ
print(G.nodes()) # NodeView(['A', 'B'])
print(G.edges()) # EdgeView([('A', 'B')])
print(G.number_of_nodes(), G.number_of_edges()) # 2 1
nx.Graph()— 無向グラフ(A-B と B-A を区別しない)nx.DiGraph()— 有向グラフ(リンク・フォロー関係など、向きが意味を持つもの)
エッジを大量に追加するときは、ペアのリストから一気に作れます:
edges = [("A", "B", 3), ("A", "C", 1), ("B", "C", 2)]
G.add_weighted_edges_from(edges)
CSV からネットワークを構築する
実データはたいてい CSV で渡されます。「エッジリスト」形式(2 列の CSV)からなら直接読み込めます:
import pandas as pd
df_edges = pd.read_csv("/content/drive/MyDrive/network/edges.csv")
# 列: source, target, weight
G = nx.from_pandas_edgelist(
df_edges,
source="source",
target="target",
edge_attr="weight",
)
ノードに属性(職業・所属など)を付けたい場合は、ノードリストから別途追加します。
中心性指標 — 「重要なノード」を見つける
ネットワーク分析の中核は 中心性(centrality) の計算です。「どのノードが全体の中で重要か」を定量化する指標で、代表的なものは次の 3 つ:
| 指標 | 意味 | 解釈 |
|---|---|---|
| 次数中心性(degree centrality) | つながっているエッジの数 | 顔が広い・友達が多い人 |
| 媒介中心性(betweenness centrality) | 他のノード間の最短経路にどれだけ含まれるか | 仲介役・橋渡し |
| 近接中心性(closeness centrality) | 他のすべてのノードへの平均距離の逆数 | 全体に素早く到達できる人 |
NetworkX では一行で取り出せます:
deg = nx.degree_centrality(G) # {ノード: 値} の辞書
bet = nx.betweenness_centrality(G)
clo = nx.closeness_centrality(G)
結果は DataFrame に変換して並べ替えると見やすくなります:
centrality_df = pd.DataFrame({
"次数": deg,
"媒介": bet,
"近接": clo,
}).sort_values("次数", ascending=False)
centrality_df.head(10)
「次数は高いけど媒介は低い」のような違いに注目すると、ノードの 役割の違い(人気者か、仲介役か)が見えてきます。
力学レイアウトでの可視化
ネットワークを 2 次元に配置するアルゴリズムが何種類かあります。最も汎用的なのが 力学レイアウト(spring layout / Force-directed layout) で、「エッジを バネ に見立てて、互いに引き合ったり反発したりさせる」という発想です。結果として、密につながったノード同士は近くに、つながりが薄いノード同士は遠くに 配置されます。
import matplotlib.pyplot as plt
pos = nx.spring_layout(G, k=0.5, iterations=50, seed=42)
plt.figure(figsize=(10, 10))
nx.draw_networkx_nodes(G, pos, node_size=100)
nx.draw_networkx_edges(G, pos, alpha=0.3)
nx.draw_networkx_labels(G, pos, font_size=8)
plt.axis("off")
plt.show()
k— ノード間の理想距離。大きいほど散らばるiterations— 計算の繰り返し回数。多いほど安定するが時間がかかるseed— 乱数シード。固定すれば毎回同じレイアウトが得られる
実例:議員の共同提出ネットワーク
題材のデータセットは、衆議院議員が どの議案を誰と一緒に提出したか から作られたネットワークです。
- ノード = 議員
- エッジ = 同じ議案の共同提出者であること
- 重み = 共同提出した議案の回数
完成 Notebook では、生データ(議案一覧)から和暦の日付変換、共同提出者の抽出、エッジリスト化までの一連の処理が含まれています。元データは大規模なため履修者向けには配布せず、集計済みのエッジ・ノードデータから可視化と中心性計算を体験する 形にしています。

色や位置の塊から「派閥的なまとまり」「橋渡し的な議員」が読み取れる、というのがこの可視化の見どころです。
解釈のときに気を付けること
- エッジの定義が分析の方向性を決める — 「共同提出」をエッジにすれば派閥が見えるが、「賛成投票が一致」をエッジにすれば違う構造が浮かぶ
- 時系列を無視するとミスリードする — 古いつながりと最近のつながりは性質が違う。直近 N 年に絞るなどの工夫
- 可視化は印象的だが、定量指標と必ずセットで — 「見た目」だけで結論を出さず、中心性や密度の数値と併読する
よく出る躓きどころ
- エッジリストとノードリストを混同する — エッジは「つながり」、ノードは「対象自体」
- 無向と有向の選択 — 「友人関係」「共同提出」は無向、「フォロー」「引用」は有向。最初に決める
- 大規模グラフで
spring_layoutが遅い —iterationsを減らすか、別のレイアウトアルゴリズム(nx.kamada_kawai_layoutほか)を試す - 中心性の値だけで「重要」と決めつける — 中心性は構造的な指標であり、内容的な重要性とは別物
サンプルコード
- 完成 Notebook:network_analysis.ipynb をダウンロード
- エッジデータ:network_edges.csv をダウンロード(集計済み)
- ノードデータ:network_nodes_with_pos.csv をダウンロード
- 中心性結果:network_results.csv をダウンロード
演習
完成 Notebook を Colab で開き、次を順に行いなさい。
- Notebook を最後まで実行し、ネットワーク可視化と中心性指標の出力を確認する
- 次数中心性の上位 10 ノードを表示する
- 媒介中心性の上位 10 ノードを表示し、次数の上位と比べる(「人気者」と「仲介役」がどう違うか)
spring_layoutのkパラメータを変えて、ネットワーク全体の見え方の変化を観察する
3 番で「次数は高いが媒介は低い」「媒介は高いが次数は普通」のようなノードに注目すると、ノードの役割の違い が読み取れます。これがネットワーク分析の醍醐味です。
発展課題(オプション)
nx.community.greedy_modularity_communities(G)を使ってコミュニティ検出を試す- 色をコミュニティ別に変えて、再度
spring_layoutで可視化する - 自分でエッジリスト CSV を作って(友人関係、書籍の参考文献、ゲームのキャラ間関係など)、NetworkX で読み込んで可視化する