06.7.30
ネットワークグラフで関係性を力学レイアウトで描く
nx.spring_layout(G, seed=42) が座標を計算し、draw_networkx_nodes / edges / labels の 3 関数で描画します。読み終えると、部署内で 70% の確率でつながり部署間は 5 本だけの橋でつながる 15 人のグラフから、次数の大きいハブと部署をまたぐブリッジを読み取り、自分の関係データで同じ図を描けるようになります。直感 #
開発・営業・企画の 3 部署 15 人について「誰と誰がよく話すか」を調べたとします。隣接行列の 15 × 15 の表を眺めても、部署間の橋渡しをしている人は見つけにくいものです。力学レイアウトは、話す相手どうしをバネで引き寄せ、全員を電荷として反発させた状態で釣り合いの位置を求めます。結果として同じ部署の 5 人は密な塊になり、別の部署とつながる人はその塊の端に引っ張られて位置します。ノードの大きさを「つながりの本数(次数)」にすれば中心人物が、エッジの太さを「会話の頻度(重み)」にすれば強い結びつきが、それぞれ目で分かります。
Python で描く #
次のコードは、3 部署 × 5 人のノードを作り、同じ部署内は 70% の確率で重み 1〜3 のエッジ、部署をまたぐ 5 組だけ重み 0.3〜1.0 の弱いエッジでつなぎます。spring_layout で座標を求め、次数に応じたノードサイズと重みに応じたエッジ幅で描きます。
| |

実行結果の読み方 #
同じ色のノードが 3 つの塊を作り、それぞれが 1 つの部署です。塊の中で大きく描かれたノードは次数が多い「ハブ」で、その人を介して部署内の情報が回っていると読めます。塊どうしをつなぐ細い線がブリッジで、この例では田中–渡辺、鈴木–吉田など 5 本だけなので、部署間の情報共有はこの 5 人に依存していると分かります。ブリッジの両端のノードが塊の端に引っ張られて配置されるのは、力学レイアウトが別の塊からも引力を受けるためです。
使いどころと落とし穴 #
ネットワークグラフは、ノードが 10〜100 程度の共著関係、共起関係、依存関係のグラフでコミュニティとハブを探索するときに向いています。ノードが 500 を超えると spring_layout の計算が遅くなり、エッジが絡まった「毛玉」になって何も読めないので、weight に閾値を設けてエッジを間引くか、コミュニティごとに分けて描くか、Gephi や Cytoscape のような専用ツールに移します。seed を固定しないと同じデータでも実行ごとに配置が変わるため、レポートに載せる図では必ず指定してください。階層構造(上司と部下、親カテゴリと子カテゴリ)が本質のデータなら、力学配置よりデンドログラムやサンバーストの方が構造を正確に伝えます。
- サンキーダイアグラム — フローを帯の太さで表現
- 相関ヒートマップ — 変数間の関係を行列で表示
- デンドログラム — 階層的なグループ構造を可視化