はじめに
ネットワーク分析に興味がある人向けに、Python のライブラリ「NetworkX」を使ったグラフ構築や可視化を体験できるハンズオン記事です。今回は、Google Colab 上で実行可能なコードを用いて、初歩的なネットワーク分析の流れを見ていきます。
1. NetworkX とは何か?
- NetworkX は、Python でネットワーク(グラフ)を扱うためのライブラリ
- ネットワーク分析用のアルゴリズム(ページランク・最短経路探索・中心性指標など)が豊富に実装されている
- グラフの構築、操作、描画を手軽に行える
- 有向グラフ・無向グラフ・多重グラフなどさまざまな種類のグラフに対応
2. ネットワーク分析と「グラフ」とは?
-
ネットワーク分析
- ノード(頂点)とエッジ(辺)の集合で表されるネットワーク構造を扱う手法
- SNS の友達関係やインターネット上のリンク構造、物流ネットワークなど、多岐にわたる分野で応用される
-
グラフ
- 「点(ノード)」と「線(エッジ)」の集合で表現される構造
- ノードどうしがどのように繋がっているか、その「つながり」を分析・可視化することで、ネットワーク構造の特徴を調べる
3. この記事でできること
- Google Colab 上で NetworkX をインストール・読み込みする
- 簡単なグラフを作成して可視化する
- 代表的なネットワーク指標(中心性など)を計算する流れを体験する
4. Google Colab での環境構築・インストール方法
Google Colab では、通常 Python の多くのライブラリがあらかじめインストールされていますが、最新バージョンを利用したい場合や、Colab ランタイムで未インストールのものは以下のように %pip
コマンドなどでインストールできます。
# Colab 上で NetworkX をインストール(Colabには標準でインストール済みの場合が多い)
%pip install networkx
-
インストール後の確認
バージョン番号が表示されればインストール成功です。
import networkx as nx print(nx.__version__)
5. NetworkX を使ったハンズオン
以下のコードを Google Colab のセルにコピー&ペーストして実行してください。
5.1 まずは単純なグラフを作成してみる
import networkx as nx
import matplotlib.pyplot as plt
# 無向グラフの作成
G = nx.Graph()
# ノードの追加
G.add_node("A") # ノード A
G.add_node("B") # ノード B
G.add_node("C") # ノード C
# エッジの追加
G.add_edge("A", "B")
G.add_edge("B", "C")
G.add_edge("C", "A")
# ノード数、エッジ数の確認
print("ノード数:", G.number_of_nodes())
print("エッジ数:", G.number_of_edges())
# 描画
nx.draw(G, with_labels=True)
plt.show()
5.2 サンプルデータセットを用いた分析
import networkx as nx
import matplotlib.pyplot as plt
# ランダムな空間グラフを生成
# n=ノード数, radius=近傍ノードを結ぶ半径
G = nx.random_geometric_graph(n=30, radius=0.3, seed=42)
# 座標を取得
pos = nx.get_node_attributes(G, 'pos')
# 可視化
nx.draw(G, pos, node_size=100, with_labels=False)
plt.show()
5.3 ネットワーク指標を計算してみる
import networkx as nx
# 次数中心性 (degree centrality) の計算
degree_centrality = nx.degree_centrality(G)
# 上位5ノードの表示
sorted_centrality = sorted(degree_centrality.items(), key=lambda x: x[1], reverse=True)
for node, cent in sorted_centrality[:5]:
print(f"ノード: {node}, 次数中心性: {cent:.3f}")
6. まとめと応用
-
まとめ
- NetworkX はネットワーク分析に必要な基本機能やアルゴリズムが一通り揃っており、シンプルなコードで試せる
- Google Colab を使うことで環境構築が手軽にでき、ブラウザ上で可視化も確認できる
-
応用例
- SNS 上のユーザ間関係のネットワーク可視化・中心人物分析
- 物流・交通ネットワークの最適経路・ボトルネック検出
- Web 上のハイパーリンク構造分析(ページランクなど)
以上が「NetworkX」を使ったネットワーク分析の第一歩です。
実装例:Notebook
{"cells": [{"cell_type": "markdown", "metadata": {}, "source": ["# NetworkX \u30cf\u30f3\u30ba\u30aa\u30f3\n", "Google Colab \u4e0a\u3067 NetworkX \u3092\u4f7f\u7528\u3057\u3066\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u5206\u6790\u306e\u57fa\u672c\u3092\u5b66\u3076\u305f\u3081\u306e\u30ce\u30fc\u30c8\u30d6\u30c3\u30af\u3067\u3059\u3002"]}, {"cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": ["# NetworkX \u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\n", "%pip install networkx"]}, {"cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": ["# \u30a4\u30f3\u30dd\u30fc\u30c8\u3068\u30d0\u30fc\u30b8\u30e7\u30f3\u78ba\u8a8d\n", "import networkx as nx\n", "print(nx.__version__)"]}, {"cell_type": "markdown", "metadata": {}, "source": ["## \u30b0\u30e9\u30d5\u3092\u4f5c\u6210\u3057\u3066\u53ef\u8996\u5316"]}, {"cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": ["import networkx as nx\n", "import matplotlib.pyplot as plt\n", "\n", "# \u7121\u5411\u30b0\u30e9\u30d5\u306e\u4f5c\u6210\n", "G = nx.Graph()\n", "\n", "# \u30ce\u30fc\u30c9\u3068\u30a8\u30c3\u30b8\u306e\u8ffd\u52a0\n", "G.add_edges_from([(\"A\", \"B\"), (\"B\", \"C\"), (\"C\", \"A\")])\n", "\n", "# \u30b0\u30e9\u30d5\u306e\u60c5\u5831\u3092\u8868\u793a\n", "print(\"\u30ce\u30fc\u30c9\u6570\uff1a\", G.number_of_nodes())\n", "print(\"\u30a8\u30c3\u30b8\u6570\uff1a\", G.number_of_edges())\n", "\n", "# \u63cf\u753b\n", "nx.draw(G, with_labels=True)\n", "plt.show()"]}, {"cell_type": "markdown", "metadata": {}, "source": ["## \u30b5\u30f3\u30d7\u30eb\u30c7\u30fc\u30bf\u30bb\u30c3\u30c8\u3092\u4f7f\u3063\u305f\u5206\u6790"]}, {"cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": ["import networkx as nx\n", "import matplotlib.pyplot as plt\n", "\n", "# \u30e9\u30f3\u30c0\u30e0\u306a\u7a7a\u9593\u30b0\u30e9\u30d5\u3092\u751f\u6210\n", "G = nx.random_geometric_graph(n=30, radius=0.3, seed=42)\n", "\n", "# \u5ea7\u6a19\u306e\u53d6\u5f97\u3068\u63cf\u753b\n", "pos = nx.get_node_attributes(G, 'pos')\n", "nx.draw(G, pos, node_size=100, with_labels=False)\n", "plt.show()"]}, {"cell_type": "markdown", "metadata": {}, "source": ["## \u4e2d\u5fc3\u6027\u306e\u8a08\u7b97"]}, {"cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": ["# \u6b21\u6570\u4e2d\u5fc3\u6027\u306e\u8a08\u7b97\n", "degree_centrality = nx.degree_centrality(G)\n", "\n", "# \u4e0a\u4f4d5\u30ce\u30fc\u30c9\u306e\u8868\u793a\n", "sorted_centrality = sorted(degree_centrality.items(), key=lambda x: x[1], reverse=True)\n", "for node, cent in sorted_centrality[:5]:\n", " print(f\"\u30ce\u30fc\u30c9: {node}, \u6b21\u6570\u4e2d\u5fc3\u6027: {cent:.3f}\")"]}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10"}}, "nbformat": 4, "nbformat_minor": 5}