mcpField
N
networkx

networkx

github.com/crazymsnデータ・データベース2335 回インストール22 週間前に更新
リポジトリ

networkx について

NetworkXは、関係データを扱う開発者や分析者向けのPythonグラフ分析スキルです。グラフの構築、アルゴリズム、ファイル入出力、可視化を扱い、一般的な分析手順も案内します。

主な機能

  1. 01有向・無向グラフの作成と編集
  2. 02経路、中心性、コミュニティの計算
  3. 03合成ネットワークの生成
  4. 04一般的なグラフ形式の読み書き
  5. 05レイアウトとスタイルを使った可視化

活用シーン

  1. 01ソーシャルネットワークや生物ネットワークの分析
  2. 02経路や重要なノードの特定
  3. 03シミュレーション用テストグラフの作成
  4. 04グラフ分析結果の描画と出力

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/crazymsn/academic-skills --skill networkx

インストール後、Claude Code で/networkxを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
algorithms.md
generators.md
graph-basics.md
io.md
visualization.md

詳細

NetworkX

概要

NetworkX は、複雑なネットワークやグラフの作成、操作、分析を行うための Python パッケージです。ソーシャルネットワーク、生物学的ネットワーク、交通システム、引用ネットワーク、ナレッジグラフなど、エンティティ間の関係を扱うネットワークやグラフのデータ構造を扱う場合にこのスキルを使用します。

このスキルを使用するタイミング

次のようなタスクでこのスキルを呼び出します:

  • グラフの作成: データからネットワーク構造を構築し、属性付きのノードとエッジを追加する
  • グラフ分析: 中心性指標の計算、最短経路の検索、コミュニティの検出、クラスタリング係数の測定
  • グラフアルゴリズム: Dijkstra 法、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
G = nx.random_tree(n=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
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 のタスクは次のパターンに従います:

  1. グラフの作成または読み込み:

    # 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')
    
  2. 構造の確認:

    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)}")
    
  3. 分析:

    # 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)
    
  4. 可視化:

    pos = nx.spring_layout(G, seed=42)
    nx.draw(G, pos=pos, with_labels=True)
    plt.show()
    
  5. 結果のエクスポート:

    # 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 パラメータ)

ノードとエッジの型:

  • ノードには、ハッシュ可能な任意の 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 ネットワーク、二部グラフのレイアウト、出版品質の図の作成など、可視化技術に関する詳細なドキュメントです。

追加リソース

コメント