🎓 レベル:標準 | 重要度:A(必須)
📎 前提:次数・道・連結成分 | 関連:スモールワールド(Watts–Strogatz)・コミュニティ検出とは
要点(BLUF)
- 局所クラスタ係数 :ノード の隣人どうしが繋がっている割合。「友達の友達は友達」度。
- 推移性(大域クラスタ係数):ネットワーク全体での「閉じた三角形 / 開いた三つ組」の割合。
- 現実のネットワークはランダムグラフよりクラスタ係数が高い — これがスモールワールドの片翼。
概念:友達の友達は友達か
ソーシャルネットワークには「あなたの2人の友達は、互いにも友達であることが多い」という性質があります。これを数値化したのがクラスタ係数。三角形がどれだけ密に存在するかを測り、コミュニティ(コミュニティ検出とは)やスモールワールド性(スモールワールド(Watts–Strogatz))の指標になります。
数式による定義
局所クラスタ係数:ノード の次数を 、隣人どうしを結ぶ実際のエッジ数を とすると、
分母 は「 の隣人どうしがありうる対の総数」。 は「実際に繋がっている割合」で 。全ノードの平均が平均クラスタ係数 。
推移性(transitivity, 大域クラスタ係数):ネットワーク全体で、
「3点が一直線に繋がった三つ組(パス)」のうち、両端も繋がって三角形が閉じている割合。係数3は、1つの三角形が3つの三つ組を生むためです。
平均クラスタ係数と推移性は似て非なる量で、一般に値が違います(後者は次数の高いノードに重みが寄る)。
コードで確認
import networkx as nx
G = nx.karate_club_graph()
print("平均クラスタ係数:", round(nx.average_clustering(G), 4))
print("推移性(グローバル):", round(nx.transitivity(G), 4))
# 三角形ひとつ + ぶら下がり辺の例
Tri = nx.Graph([(0,1),(1,2),(0,2),(2,3)])
print("各ノードのクラスタ係数:", {k: round(v,3) for k,v in nx.clustering(Tri).items()})
実行結果:
平均クラスタ係数: 0.5706
推移性(グローバル): 0.2557
各ノードのクラスタ係数: {0: 1.0, 1: 1.0, 2: 0.333, 3: 0}
小さな例で直観を確認しましょう。ノード0,1は隣人2人が互いに繋がっているので 。ノード2は隣人が0,1,3の3人で、繋がっている対は (0,1) の1組だけ、ありうる3組のうち1組なので 。ノード3は隣人が1人で三角形を作りようがなく 。空手クラブでは平均クラスタ係数(0.571)が推移性(0.256)より大きく、両者が別量であることが見て取れます。
数式の直観的意味
は「あなたの友達グループの密度」です。友達が5人なら友達どうしのありうる関係は10組。そのうち実際に何組が知り合いか、の割合。1なら全員が顔見知り(密なクリーク)、0なら誰も互いを知らない(あなたがハブの星型)。推移性が「ネットワーク全体の三角形充足率」なのに対し、平均クラスタ係数は「各ノードのローカルな密度の平均」。視点が局所か大域かが違います。
⚠️ よくある誤解・落とし穴
- 平均クラスタ係数 ≠ 推移性:定義が異なり値も違う。論文で「クラスタ係数」と言うときどちらか要確認。
- 次数1以下のノードは が定義されない(0扱い):隣人の対が作れないため。平均に含めるか除くかで値が変わります。
- クラスタ係数が高い=コミュニティがある、ではない:局所的な三角形の密度であって、大域的な集団分割(モジュラリティ最大化)とは別の話。
対応シミュレーション
本文のコードがそのまま検証用です。高クラスタ+短距離の両立は スモールワールド(Watts–Strogatz)。
関連
- 前提:次数・道・連結成分
- スモールワールド:スモールワールド(Watts–Strogatz)
- コミュニティ:コミュニティ検出とは
- 上位ハブ:ネットワーク指標 目次