NetworkX で始めるネットワーク分析入門：Google Colab でハンズオン

## はじめに
ネットワーク分析に興味がある人向けに、Python のライブラリ「NetworkX」を使ったグラフ構築や可視化を体験できるハンズオン記事です。今回は、Google Colab 上で実行可能なコードを用いて、初歩的なネットワーク分析の流れを見ていきます。

---

## 1. NetworkX とは何か？
- **NetworkX** は、Python でネットワーク（グラフ）を扱うためのライブラリ  
- ネットワーク分析用のアルゴリズム（ページランク・最短経路探索・中心性指標など）が豊富に実装されている  
- グラフの構築、操作、描画を手軽に行える  
- 有向グラフ・無向グラフ・多重グラフなどさまざまな種類のグラフに対応  

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/ebf96002-32e8-120b-f3e7-7a1bc0b6b8aa.png)

---

## 2. ネットワーク分析と「グラフ」とは？
- **ネットワーク分析**  
  - ノード(頂点)とエッジ(辺)の集合で表されるネットワーク構造を扱う手法  
  - SNS の友達関係やインターネット上のリンク構造、物流ネットワークなど、多岐にわたる分野で応用される  
- **グラフ**  
  - 「点(ノード)」と「線(エッジ)」の集合で表現される構造  
  - ノードどうしがどのように繋がっているか、その「つながり」を分析・可視化することで、ネットワーク構造の特徴を調べる  

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/21bec019-f800-fc2d-1865-b5da5ae2a403.png)

---

## 3. この記事でできること
- Google Colab 上で NetworkX をインストール・読み込みする
- 簡単なグラフを作成して可視化する
- 代表的なネットワーク指標（中心性など）を計算する流れを体験する

---

## 4. Google Colab での環境構築・インストール方法

Google Colab では、通常 Python の多くのライブラリがあらかじめインストールされていますが、最新バージョンを利用したい場合や、Colab ランタイムで未インストールのものは以下のように `%pip` コマンドなどでインストールできます。

```python
# Colab 上で NetworkX をインストール（Colabには標準でインストール済みの場合が多い）
%pip install networkx
```

- **インストール後の確認**  
  ```python
  import networkx as nx
  print(nx.__version__)
  ```
  バージョン番号が表示されればインストール成功です。

---

## 5. NetworkX を使ったハンズオン

以下のコードを Google Colab のセルにコピー＆ペーストして実行してください。

### 5.1 まずは単純なグラフを作成してみる

```python
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()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/3c621fc4-6df9-3fb0-81eb-726c5831e3d8.png)

### 5.2 サンプルデータセットを用いた分析

```python
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()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/ada5f4db-5cf8-1a1f-30f8-8acb75052e8e.png)

### 5.3 ネットワーク指標を計算してみる

```python
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}")
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/d7a52b04-9d22-a50a-ff77-50f7a5c93b34.png)

---

## 6. まとめと応用

- **まとめ**  
  - NetworkX はネットワーク分析に必要な基本機能やアルゴリズムが一通り揃っており、シンプルなコードで試せる  
  - Google Colab を使うことで環境構築が手軽にでき、ブラウザ上で可視化も確認できる  

- **応用例**  
  - SNS 上のユーザ間関係のネットワーク可視化・中心人物分析  
  - 物流・交通ネットワークの最適経路・ボトルネック検出  
  - Web 上のハイパーリンク構造分析（ページランクなど）  

---
以上が「NetworkX」を使ったネットワーク分析の第一歩です。  

<details>
<summary>実装例:Notebook</summary>

```json
{"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}
```
</details>