ネットワーク・グラフ・階層構造の可視化
グラフの目的は「データを分かりやすく伝える」こと。 軸・凡例・出典・スケールを必ず明示してください。
本ページでは 関係性の可視化 を、 定義・前提条件・使い方・落とし穴の順に整理して解説します。 厳密な定義より、 まず何を、 いつ、 どう使うかを理解することを優先してください。
ネットワーク・グラフ・階層構造の可視化
英語名 Network Visualization。 同義・関連語:グラフ可視化。
この用語を理解・使用するときは、 次のような前提を意識してください:
SSDSE-B-2026 のような公的統計データを Python で扱う際の基本パターン:
1 2 3 4 5 6 7 8 9 10 11 12 | import pandas as pd import numpy as np # データ読み込み df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='utf-8', skiprows=1) print(df.shape) print(df.dtypes) print(df.describe()) # 「関係性の可視化」の文脈で扱う場合の例: # 分野: 可視化 # 関連手法は同カテゴリの他用語を参照してください。 |
具体的なコードは 1変量の可視化 を参照してください。
分析結果を報告するときに含めるべき情報:
ネットワーク可視化(Network Visualization) は、 ノード(点)とエッジ(線)でつながりを表す可視化。 SNS、 共著関係、 経路、 隣接関係などに使われ、 中心性指標で重要ノードを特定できる。
| 中心性 | 意味 | 代表例 |
|---|---|---|
| Degree | 接続数 | フォロワー数 |
| Closeness | 最短距離の平均 | 情報の届きやすさ |
| Betweenness | 経路の中継 | ハブ空港 |
| PageRank | 推移的重要度 | Web 検索 |
1 2 3 4 5 6 7 8 9 | # networkx で都道府県隣接グラフ
import networkx as nx, matplotlib.pyplot as plt
G = nx.Graph()
adj = [('北海道','青森県'),('青森県','岩手県'),('青森県','秋田県'),
('岩手県','宮城県'),('岩手県','秋田県'),('秋田県','山形県'),
('宮城県','山形県'),('宮城県','福島県'),('福島県','茨城県')]
G.add_edges_from(adj)
nx.draw(G, with_labels=True, node_color='#80CBC4', node_size=900)
plt.savefig('network.png', dpi=150) |
1 2 3 4 5 6 | # 中心性の計算
deg = dict(G.degree())
betw = nx.betweenness_centrality(G)
import pandas as pd
rank = pd.DataFrame({'degree': deg, 'between': betw}).sort_values('degree', ascending=False)
print(rank) |
1 2 3 4 5 6 7 8 | # 重み付きエッジ : 都道府県人口の対数の積
import pandas as pd, numpy as np
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='utf-8', skiprows=1)
pop = df.set_index('Prefecture')['A1101']
for u, v in G.edges():
if u in pop.index and v in pop.index:
G[u][v]['weight'] = np.log(pop[u] * pop[v])
print(list(G.edges(data=True))[:3]) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | # Plotly でインタラクティブ可視化
import plotly.graph_objects as go
pos = nx.spring_layout(G, seed=1)
edge_x, edge_y = [], []
for u, v in G.edges():
edge_x += [pos[u][0], pos[v][0], None]
edge_y += [pos[u][1], pos[v][1], None]
fig = go.Figure()
fig.add_trace(go.Scatter(x=edge_x, y=edge_y, mode='lines'))
fig.add_trace(go.Scatter(x=[pos[n][0] for n in G.nodes()],
y=[pos[n][1] for n in G.nodes()],
mode='markers+text',
text=list(G.nodes()), textposition='top center'))
fig.write_html('network.html') |
| ネットワーク | ノード | エッジ | 応用例 |
|---|---|---|---|
| 地理隣接 | 都道府県 | 隣接ペア | クラスタ |
| 人口移動 | 都道府県 | 流入数 | 流動 |
| 業界連関 | 産業 | 取引 | 構造分析 |
| 文献 | 論文 | 引用 | 影響度 |
| 感染 | 個人 | 接触 | 拡散 |
1 2 3 4 5 6 7 8 | import networkx as nx, matplotlib.pyplot as plt
G = nx.karate_club_graph()
fig, axes = plt.subplots(1,2, figsize=(10,5))
nx.draw(G, ax=axes[0], pos=nx.spring_layout(G,seed=1), node_color='#80CBC4')
axes[0].set_title('spring')
nx.draw(G, ax=axes[1], pos=nx.circular_layout(G), node_color='#FFB300')
axes[1].set_title('circular')
plt.savefig('layouts.png', dpi=150) |
1 2 3 4 5 6 7 8 | import networkx as nx
G = nx.karate_club_graph()
try:
import community as cm
part = cm.best_partition(G)
print('コミュニティ数:', len(set(part.values())))
except ImportError:
print('python-louvain をインストール') |
1 2 3 4 5 | import networkx as nx, pandas as pd
G = nx.karate_club_graph()
pr = nx.pagerank(G); bw = nx.betweenness_centrality(G)
df = pd.DataFrame({'pr':pr,'bw':bw}).sort_values('pr', ascending=False)
print(df.head()) |
ネットワーク可視化 は古典的可視化手法の一つで、 統計可視化の標準教科書 (Tufte, Cleveland) でも扱われます。
matplotlib (2003-) は MATLAB ライクな API で広く普及。 ggplot2 (R, 2007) で文法 of graphics が確立。 Vega-Lite / Altair (2017) が宣言型表現を Web に持ち込みました。
近年は SVG/Canvas/WebGL の多層実装が普及し、 大規模データでもブラウザ可視化が可能に。 GPU 利用の Datashader, deck.gl が研究機関で活躍。