Mímisbrunnr知恵の泉

← ネットワーク科学 一覧

🎓 レベル:標準 | 重要度:A(必須)

📎 前提:次数・道・連結成分 | 関連:スモールワールド(Watts–Strogatz)コミュニティ検出とは

要点(BLUF)

概念:友達の友達は友達か

ソーシャルネットワークには「あなたの2人の友達は、互いにも友達であることが多い」という性質があります。これを数値化したのがクラスタ係数。三角形がどれだけ密に存在するかを測り、コミュニティ(コミュニティ検出とは)やスモールワールド性(スモールワールド(Watts–Strogatz))の指標になります。

数式による定義

局所クラスタ係数:ノード ii の次数を kik_i、隣人どうしを結ぶ実際のエッジ数を eie_i とすると、

Ci=2eiki(ki1)C_i = \frac{2 e_i}{k_i (k_i - 1)}

分母 ki(ki1)/2k_i(k_i-1)/2 は「ii の隣人どうしがありうる対の総数」。CiC_i は「実際に繋がっている割合」で [0,1][0,1]。全ノードの平均が平均クラスタ係数 Cˉ=1niCi\bar{C} = \frac{1}{n}\sum_i C_i

推移性(transitivity, 大域クラスタ係数):ネットワーク全体で、

T=3×(三角形の数)(連結された三つ組の数)T = \frac{3 \times (\text{三角形の数})}{(\text{連結された三つ組の数})}

「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人が互いに繋がっているので C=1C=1。ノード2は隣人が0,1,3の3人で、繋がっている対は (0,1) の1組だけ、ありうる3組のうち1組なので C=1/30.333C=1/3≈0.333。ノード3は隣人が1人で三角形を作りようがなく C=0C=0。空手クラブでは平均クラスタ係数(0.571)が推移性(0.256)より大きく、両者が別量であることが見て取れます。

数式の直観的意味

Ci=2ei/(ki(ki1))C_i = 2e_i / (k_i(k_i-1)) は「あなたの友達グループの密度」です。友達が5人なら友達どうしのありうる関係は10組。そのうち実際に何組が知り合いか、の割合。1なら全員が顔見知り(密なクリーク)、0なら誰も互いを知らない(あなたがハブの星型)。推移性が「ネットワーク全体の三角形充足率」なのに対し、平均クラスタ係数は「各ノードのローカルな密度の平均」。視点が局所か大域かが違います。

⚠️ よくある誤解・落とし穴

対応シミュレーション

本文のコードがそのまま検証用です。高クラスタ+短距離の両立は スモールワールド(Watts–Strogatz)

関連