networkx について
NetworkXスキルは、Pythonでグラフやネットワークを作成・操作・分析するためのガイドです。アルゴリズム、ネットワーク生成、入出力、可視化を扱い、NetworkX 3.xを対象としています。
主な機能
- 01各種グラフ構造の作成と操作
- 02経路と中心性指標の計算
- 03コミュニティと連結成分の検出
- 04ランダム・構造化ネットワークの生成
- 05各種グラフ形式の読み書き
- 06ネットワーク図の描画と調整
活用シーン
- 01ソーシャルネットワークの関係分析
- 02交通ネットワークの最短経路計算
- 03テスト用の合成ネットワーク生成
- 04グラフ分析結果の可視化と出力
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ kalarislabs/ research-agent-skills --skill networkxインストール後、Claude Code で/networkxを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/algorithms.mdgenerators.mdgraph-basics.mdio.mdvisualization.md詳細
NetworkX
概要
NetworkX は、複雑なネットワークやグラフを作成、操作、分析するための Python パッケージです。ソーシャルネットワーク、生物学的ネットワーク、交通システム、引用ネットワーク、ナレッジグラフなどのネットワークやグラフのデータ構造を扱う場合や、エンティティ間の関係が関わるあらゆるシステムを扱う場合に、このスキルを使用します。
このスキルは NetworkX 3.x(現在の安定版:3.6、Python >= 3.11 が必要)を対象としています。3.0 より前の API(nx.info、nx.write_gpickle、nx.read_shp)や、3.4 時代の nx.random_tree はすでに存在しません。このスキルでは、現在の代替 API を全体で使用しています。
このスキルを使用する場面
次のタスクに関わる場合に、このスキルを呼び出してください。
- グラフの作成:データからネットワーク構造を構築し、属性を持つノードやエッジを追加する
- グラフ分析:中心性指標の計算、最短経路の探索、コミュニティの検出、クラスタリングの測定
- グラフアルゴリズム:ダイクストラ法、PageRank、最小全域木、最大フローなどの標準アルゴリズムの実行
- ネットワーク生成:テストやシミュレーション用の合成ネットワーク(ランダム、スケールフリー、小世界モデル)の作成
- グラフの入出力:さまざまな形式(エッジリスト、GraphML、JSON、CSV、隣接行列)の読み込みや書き込み
- 可視化:matplotlib やインタラクティブライブラリを使ったネットワークの可視化とカスタマイズ
- ネットワーク比較:同型性の確認、グラフ指標の計算、構造的特性の分析
主な機能
1. グラフの作成と操作
NetworkX は、次の 4 つの主なグラフ型をサポートしています。
- Graph:単一のエッジを持つ無向グラフ
- DiGraph:一方向の接続を持つ有向グラフ
- MultiGraph:ノード間の複数のエッジを許可する無向グラフ
- MultiDiGraph:複数のエッジを持つ有向グラフ
次の方法でグラフを作成します。
import networkx as nx
# Create empty graph
G = nx.Graph()
# Add nodes (can be any hashable type)
G.add_node(1)
G.add_nodes_from([2, 3, 4])
G.add_node("protein_A", type='enzyme', weight=1.5)
# Add edges
G.add_edge(1, 2)
G.add_edges_from([(1, 3), (2, 4)])
G.add_edge(1, 4, weight=0.8, relation='interacts')
参考資料:グラフ構造の作成、変更、確認、管理(属性や部分グラフの操作を含む)に関する詳しいガイダンスは、references/graph-basics.md を参照してください。
2. グラフアルゴリズム
NetworkX はネットワーク分析のための豊富なアルゴリズムを提供しています。
最短経路:
# Find shortest path
path = nx.shortest_path(G, source=1, target=5)
length = nx.shortest_path_length(G, source=1, target=5, weight='weight')
中心性指標:
# Degree centrality
degree_cent = nx.degree_centrality(G)
# Betweenness centrality
betweenness = nx.betweenness_centrality(G)
# PageRank
pagerank = nx.pagerank(G)
コミュニティ検出:
from networkx.algorithms import community
# Detect communities
communities = community.greedy_modularity_communities(G)
連結性:
# Check connectivity
is_connected = nx.is_connected(G)
# Find connected components
components = list(nx.connected_components(G))
参考資料:最短経路、中心性指標、クラスタリング、コミュニティ検出、フロー、マッチング、木のアルゴリズム、グラフ探索など、利用可能なすべてのアルゴリズムの詳しいドキュメントは、references/algorithms.md を参照してください。
3. グラフ生成器
テスト、シミュレーション、モデリング用の合成ネットワークを作成します。
古典的なグラフ:
# Complete graph
G = nx.complete_graph(n=10)
# Cycle graph
G = nx.cycle_graph(n=20)
# Known graphs
G = nx.karate_club_graph()
G = nx.petersen_graph()
ランダムネットワーク:
# Erdős-Rényi random graph
G = nx.erdos_renyi_graph(n=100, p=0.1, seed=42)
# Barabási-Albert scale-free network
G = nx.barabasi_albert_graph(n=100, m=3, seed=42)
# Watts-Strogatz small-world network
G = nx.watts_strogatz_graph(n=100, k=6, p=0.1, seed=42)
構造化ネットワーク:
# Grid graph
G = nx.grid_2d_graph(m=5, n=7)
# Random tree (random_tree was removed in NetworkX 3.4)
G = nx.random_labeled_tree(100, seed=42)
参考資料:パラメーターやユースケースの詳細とともに、古典的、ランダム、格子、二部、特殊なネットワークモデルを含むすべてのグラフ生成器について詳しくは、references/generators.md を参照してください。
4. グラフの読み込みと書き込み
NetworkX はさまざまなファイル形式やデータソースをサポートしています。
ファイル形式:
# Edge list
G = nx.read_edgelist('graph.edgelist')
nx.write_edgelist(G, 'graph.edgelist')
# GraphML (preserves attributes)
G = nx.read_graphml('graph.graphml')
nx.write_graphml(G, 'graph.graphml')
# GML
G = nx.read_gml('graph.gml')
nx.write_gml(G, 'graph.gml')
# JSON (node-link format; edge list is stored under the "edges" key
# since NetworkX 3.6 — older files may use "links", see references/io.md)
data = nx.node_link_data(G)
G = nx.node_link_graph(data)
Pandas との連携:
import pandas as pd
# From DataFrame
df = pd.DataFrame({'source': [1, 2, 3], 'target': [2, 3, 4], 'weight': [0.5, 1.0, 0.75]})
G = nx.from_pandas_edgelist(df, 'source', 'target', edge_attr='weight')
# To DataFrame
df = nx.to_pandas_edgelist(G)
行列形式:
import numpy as np
# Adjacency matrix
A = nx.to_numpy_array(G)
G = nx.from_numpy_array(A)
# Sparse matrix
A = nx.to_scipy_sparse_array(G)
G = nx.from_scipy_sparse_array(A)
参考資料:CSV、SQL データベース、Cytoscape、DOT など、すべての入出力形式の詳しいドキュメントと、ユースケースに応じた形式の選び方については、references/io.md を参照してください。
5. 可視化
明瞭で有益なネットワークの可視化を作成します。
基本的な可視化:
import matplotlib.pyplot as plt
# Simple draw
nx.draw(G, with_labels=True)
plt.show()
# With layout
pos = nx.spring_layout(G, seed=42)
nx.draw(G, pos=pos, with_labels=True, node_color='lightblue', node_size=500)
plt.show()
カスタマイズ:
# Color by degree
node_colors = [G.degree(n) for n in G.nodes()]
nx.draw(G, node_color=node_colors, cmap=plt.cm.viridis)
# Size by centrality
centrality = nx.betweenness_centrality(G)
node_sizes = [3000 * centrality[n] for n in G.nodes()]
nx.draw(G, node_size=node_sizes)
# Edge weights
edge_widths = [3 * G[u][v].get('weight', 1) for u, v in G.edges()]
nx.draw(G, width=edge_widths)
レイアウトアルゴリズム:
# Spring layout (force-directed)
pos = nx.spring_layout(G, seed=42)
# Circular layout
pos = nx.circular_layout(G)
# Kamada-Kawai layout
pos = nx.kamada_kawai_layout(G)
# Spectral layout
pos = nx.spectral_layout(G)
出版品質:
plt.figure(figsize=(12, 8))
pos = nx.spring_layout(G, seed=42)
nx.draw(G, pos=pos, node_color='lightblue', node_size=500,
edge_color='gray', with_labels=True, font_size=10)
plt.title('Network Visualization', fontsize=16)
plt.axis('off')
plt.tight_layout()
plt.savefig('network.png', dpi=300, bbox_inches='tight')
plt.savefig('network.pdf', bbox_inches='tight') # Vector format
参考資料:レイアウトアルゴリズム、カスタマイズオプション、Plotly や PyVis によるインタラクティブな可視化、3D ネットワーク、出版品質の図の作成など、可視化手法に関する詳しいドキュメントは、references/visualization.md を参照してください。
NetworkX の使用
インストール
NetworkX がインストールされていることを確認してください。
# Check if installed
import networkx as nx
print(nx.__version__)
# Install if needed (via bash)
# uv pip install networkx
# uv pip install networkx[default] # With optional dependencies
一般的なワークフローパターン
NetworkX のタスクの多くは、次のパターンに従います。
-
グラフを作成または読み込む:
# From scratch G = nx.Graph() G.add_edges_from([(1, 2), (2, 3), (3, 4)]) # Or load from file/data G = nx.read_edgelist('data.txt') -
構造を調べる:
print(f"Nodes: {G.number_of_nodes()}") print(f"Edges: {G.number_of_edges()}") print(f"Density: {nx.density(G)}") print(f"Connected: {nx.is_connected(G)}") -
分析する:
# Compute metrics degree_cent = nx.degree_centrality(G) avg_clustering = nx.average_clustering(G) # Find paths path = nx.shortest_path(G, source=1, target=4) # Detect communities communities = community.greedy_modularity_communities(G) -
可視化する:
pos = nx.spring_layout(G, seed=42) nx.draw(G, pos=pos, with_labels=True) plt.show() -
結果をエクスポートする:
# Save graph nx.write_graphml(G, 'analyzed_network.graphml') # Save metrics df = pd.DataFrame({ 'node': list(degree_cent.keys()), 'centrality': list(degree_cent.values()) }) df.to_csv('centrality_results.csv', index=False)
重要な考慮事項
浮動小数点数の精度:グラフに浮動小数点数が含まれる場合、精度の制限により、すべての結果は本質的に近似値になります。これは、特に最小値や最大値の計算など、アルゴリズムの結果に影響することがあります。
メモリとパフォーマンス:スクリプトを実行するたびに、グラフデータをメモリに読み込む必要があります。大規模なネットワークの場合:
- 適切なデータ構造を使用します(大規模な疎グラフには疎行列を使用します)
- 必要なサブグラフだけを読み込むことを検討します
- 効率的なファイル形式を使用します(Python オブジェクトには pickle、圧縮形式など)
- 非常に大規模なネットワークには近似アルゴリズムを活用します(例:中心性の計算における
kパラメーター) - 負荷の高いワークロードでは、NetworkX 3.x は
backend=キーワードまたはnx.config.backend_priorityによる、ドロップインで利用できる高速化バックエンドに対応しています。例:nx-cugraph(GPU)、nx-parallel(マルチコア)、graphblas-algorithms(疎線形代数)。バックエンドパッケージをインストールし、対応する関数にbackend="cugraph"(または同様の値)を渡します。アルゴリズムのコードを変更する必要はありません。
ノードとエッジの型:
- ノードには、ハッシュ可能な任意の Python オブジェクトを使用できます(数値、文字列、タプル、カスタムオブジェクトなど)
- わかりやすさのため、意味のある識別子を使用します
- ノードを削除すると、接続しているすべてのエッジも自動的に削除されます
乱数シード:ランダムグラフの生成や力指向レイアウトで再現性を確保するには、必ず乱数シードを設定します。
G = nx.erdos_renyi_graph(n=100, p=0.1, seed=42)
pos = nx.spring_layout(G, seed=42)
クイックリファレンス
基本操作
# Create
G = nx.Graph()
G.add_edge(1, 2)
# Query
G.number_of_nodes()
G.number_of_edges()
G.degree(1)
list(G.neighbors(1))
# Check
G.has_node(1)
G.has_edge(1, 2)
nx.is_connected(G)
# Modify
G.remove_node(1)
G.remove_edge(1, 2)
G.clear()
重要なアルゴリズム
# Paths
nx.shortest_path(G, source, target)
nx.all_pairs_shortest_path(G)
# Centrality
nx.degree_centrality(G)
nx.betweenness_centrality(G)
nx.closeness_centrality(G)
nx.pagerank(G)
# Clustering
nx.clustering(G)
nx.average_clustering(G)
# Components
nx.connected_components(G)
nx.strongly_connected_components(G) # Directed
# Community
community.greedy_modularity_communities(G)
ファイル入出力クイックリファレンス
# Read
nx.read_edgelist('file.txt')
nx.read_graphml('file.graphml')
nx.read_gml('file.gml')
# Write
nx.write_edgelist(G, 'file.txt')
nx.write_graphml(G, 'file.graphml')
nx.write_gml(G, 'file.gml')
# Pandas
nx.from_pandas_edgelist(df, 'source', 'target')
nx.to_pandas_edgelist(G)
リソース
このスキルには、包括的なリファレンスドキュメントが含まれています。
references/graph-basics.md
グラフの種類、グラフの作成と変更、ノードとエッジの追加、属性の管理、構造の調査、サブグラフの操作について詳しく説明します。
references/algorithms.md
最短経路、中心性指標、連結性、クラスタリング、コミュニティ検出、フローアルゴリズム、木のアルゴリズム、マッチング、彩色、同型性、グラフ探索など、NetworkX のアルゴリズムを網羅しています。
references/generators.md
古典的なグラフ、ランダムモデル(Erdős-Rényi、Barabási-Albert、Watts-Strogatz)、格子、木、ソーシャルネットワークモデル、特殊なジェネレーターなど、グラフジェネレーターについて詳しく説明します。
references/io.md
エッジリスト、隣接リスト、GraphML、GML、JSON、CSV、Pandas DataFrame、NumPy 配列、SciPy 疎行列、データベース連携など、さまざまな形式でグラフを読み書きするための包括的なガイドと、形式の選択基準を掲載しています。
references/visualization.md
レイアウトアルゴリズム、ノードとエッジの外観のカスタマイズ、ラベル、Plotly と PyVis を使ったインタラクティブな可視化、3D ネットワーク、二部グラフのレイアウト、出版品質の図の作成など、可視化手法について詳しく説明します。
その他のリソース
- 公式ドキュメント:https://networkx.org/documentation/latest/
- チュートリアル:https://networkx.org/documentation/latest/tutorial.html
- ギャラリー:https://networkx.org/documentation/latest/auto_examples/index.html
- GitHub:https://github.com/networkx/networkx
エージェントの作業手順
- 環境を確認します。 Python 環境とライブラリのバージョン(
python -c "import pkg; print(pkg.__version__)")を確認し、データの形状、型、欠損値を調べます。 - 入力を明確にします。 データまたはユーザーから、形式、識別子、パラメーターを確認します。結果に影響する値を推測せず、ユーザーに尋ねます。
- まず小規模に実行します。 サンプルまたは単一のフォールドで実行し、実行時間とメモリ使用量を確認します。
- 上記の手順と参考資料に従って、タスク全体を実行します。
- 結果を検証します。 ホールドアウトデータ、固定した乱数シード、適切な指標を使用し、データリークの有無を確認して、不確実性(信頼区間、シード間の標準偏差)を報告します。
- 報告します。 実行した内容(バージョン、コマンド、パラメーター)、確認した内容、未確定の点を明記します。
| 次のような場合 | 対応 |
|---|---|
| メモリ不足、または実行が非常に遅い | サブサンプリング、チャンク処理や遅延計算の使用、またはモデルサイズの縮小を行い、変更内容をユーザーに伝えます。 |
| これらの手順に記載された関数、フラグ、エンドポイントが、インストール済みのバージョンに存在しない | インストール済みバージョンのドキュメント(help()、--help、公式ドキュメント)を確認して対応し、ユーザーに伝えます。API を捏造してはいけません。 |
| 必須の入力、識別子、パラメーターが曖昧 | ユーザーに尋ねるか、実行前に前提を明示します。 |
整合性のルール
- 結果、パラメーター、識別子、引用、統計値を捏造してはいけません。実行または検証できない場合は、その旨を明確に伝えます。
- このセッションで計算していない指標を報告してはいけません。すべての数値について、その算出に使ったコードの処理経路を示します。
- ここに記載されたバージョン固有の詳細は古くなっている可能性があるものとして扱い、インストール済みバージョンの公式ドキュメントで確認します。
- 費用が発生する、共有 GPU やクラウドのクォータを消費する、個人データや患者データに触れる、または取り消せない操作を行う場合は、事前にユーザーへ確認します。
関連スキル
torch-geometric:グラフニューラルネットワーク向けの PyTorch Geometric(PyG) — ノード/リンク/グラフの分類、メッセージパッシング(GCN、GAT、GraphSAGE、GIN)、ヘテロジニアス…research-knowledge-graph:書誌情報や文献コーパスを、論文、著者、掲載媒体、トピック、引用リンクからなるナレッジグラフに変換して分析します(引…