R 실습 — 손으로 돌려 보기 차례

6편Betweenness, Eigenvector, and Comparison

중심성 ② 매개·위세, 그리고 네 지표의 비교

R 실습 — 손으로 돌려 보기STAGED+ 스터디

5.3 매개 중심성 (Betweenness Centrality)

남들이 오가는 길목에 얼마나 자주 서 있는가. 모든 쌍의 최단경로를 세고, 그중 ii를 지나는 비율을 합한다.

CB(i)=sitσst(i)σstC_B(i) = \sum_{s \neq i \neq t} \frac{\sigma_{st}(i)}{\sigma_{st}}
여학생 무리 남학생 무리 1006 1042 성별을 넘는 유일한 상호 지명 두 무리 사이의 최단경로가 거의 다 이 간선 하나를 지난다 → 매개 1위 1042 (128.3) · 2위 1006 (102.0)
매개가 높다는 것은 인기가 많다가 아니라 내가 빠지면 길이 끊긴다는 뜻이다.
bet <- sna::betweenness(adj, gmode = "digraph")
names(bet) <- rownames(adj)
round(sort(bet, decreasing = TRUE)[1:5], 1)
 1042  1006  1051  1018  1027
128.3 102.0  76.9  74.5  27.4

# igraph와 대조
max(abs(bet - igraph::betweenness(g, directed = TRUE)))
[1] 0              # 완전 일치
인기와 매개의 1위가 다르다
그림 4 — 왼쪽 받은 지명(인기) 1위는 1051, 오른쪽 매개(다리 역할) 1위는 1042. 1위가 서로 다르다.
교실 해석 — 이 두 그림의 차이가 중심성을 여러 개 재는 이유 전체다.
  • 1051 (인기 1위, 지명 10개) — 남학생 무리 한가운데다. 지명을 가장 많이 받았지만 매개는 3위(76.9)다. 무리 의 스타다.
  • 1042 (매개 1위, 128.3)와 1006 (매개 2위, 102.0) — 이 둘은 한 쌍으로 움직인다. 1006 ↔ 1042는 이 학급에서 성별을 넘는 유일한 상호 지명이다(7절). 남녀 무리를 잇는 최단경로 대부분이 이 간선 하나를 지나므로 둘 다 매개가 치솟는다. 그림 4 오른쪽에서 이 둘이 두 덩어리 사이에 크게 부풀어 있는 게 보인다.
  • 받은 지명으로는 1042가 9개(2위), 1006이 7개(5위)로 그리 두드러지지 않는다. 매개는 "얼마나 사랑받는가"가 아니라 "어디에 서 있는가"를 잰다.
지명 수만 봐서는 이 역할이 보이지 않는다. 모둠을 짤 때 이런 학생을 어디에 배치하느냐가 학급 전체 소통에 영향을 준다.
"매개가 높으면 그 학생이 빠질 때 학급이 쪼개진다"는 것은 사실이 아니다. 확인해 보면 바로 드러난다.
igraph::articulation_points(gu)
+ 0/26 vertices              # 절단점이 하나도 없다

한 명을 빼도 나머지는 계속 이어져 있다. 대신 길이 멀어진다. 고립자 1024를 뺀 25명 무방향 그래프에서 한 명씩 제거해 보면:

제거한 학생컴포넌트평균 거리지름거리 증가
— (기준)12.2704
1051 (인기 1위)12.4825+0.212
1006 (매개 2위)12.4755+0.205
1042 (매개 1위)12.4175+0.147
1018 (인기 2위)12.2864+0.016

제거 효과의 순위가 매개 순위와 일치하지 않는다. 매개 1위 1042보다 인기 1위 1051을 뺐을 때 거리가 더 늘어난다. 매개는 최단경로가 지금 누구를 지나는가를 세지만, 제거 효과는 우회로가 있는가에 달려 있기 때문이다. 1042에게는 1006이라는 대체 통로가 있다.
"이 학생이 없으면 어떻게 되는가"가 궁금하면 지표를 읽지 말고 직접 빼 보면 된다 (delete_vertices()). 두 줄이면 끝난다.

5.4 고유벡터 중심성 (Eigenvector Centrality)

"중요한 사람과 연결돼 있으면 나도 중요하다." 자기 참조적 정의이고, 이를 만족하는 값이 인접행렬의 최대 고유값에 대응하는 고유벡터다.

Ax=λmaxxxi=1λmaxjA[i,j]xjA\mathbf{x} = \lambda_{\max}\mathbf{x} \qquad\Longleftrightarrow\qquad x_i = \frac{1}{\lambda_{\max}}\sum_j A[i,j]\,x_j
# 방향 그래프에서는 정의가 불안정하다 → 무방향화해서 쓰는 것이 관례
A_sym <- sna::symmetrize(adj, rule = "weak")
eig   <- sna::evcent(A_sym)
names(eig) <- rownames(adj)
round(sort(eig, decreasing = TRUE)[1:5], 4)
  1051   1018   1042   1027   1006
0.3473 0.3012 0.3004 0.2984 0.2708

# igraph와 대조 — 정규화 방식이 달라 값은 다르지만 순위는 같다
i_eig <- igraph::eigen_centrality(igraph::as_undirected(g, mode = "collapse"))$vector
cor(eig, i_eig)
[1] 1
두 패키지의 값이 다르게 보여도 당황하지 말 것. 고유벡터는 상수배를 해도 여전히 고유벡터다. sna는 길이를 1로(sum(x^2)=1), igraph는 최댓값을 1로 맞춘다. 순위와 상대적 크기는 완전히 같다(상관 = 1). 비교할 때는 상관이나 순위를 본다.

5.5 네 지표는 서로 얼마나 다른가 (How Much Do They Disagree?)

r <- data.frame(연결정도 = rank(-ind), 매개 = rank(-bet),
                근접 = rank(-clo), 고유벡터 = rank(-eig))
round(cor(r, method = "spearman"), 3)
연결정도매개근접고유벡터
연결정도1.0000.7320.1900.823
매개0.7321.0000.4460.741
근접0.1900.4461.0000.241
고유벡터0.8230.7410.2411.000
읽는 법
  • 연결정도 ↔ 고유벡터 = 0.823 — 거의 같은 이야기를 한다. 지명을 많이 받은 학생은 대체로 지명 많이 받는 학생들과 붙어 있다.
  • 연결정도 ↔ 근접 = 0.190거의 무관하다. 이건 우연이 아니라 정의상 그럴 수밖에 없다. 여기서 연결정도는 받은 지명(indegree)이고, 근접(suminvdir)은 내가 나가는 거리다 — 화살표 방향이 반대다. 실제로 근접은 보낸 지명(outdegree)과는 0.805로 강하게 붙는다(5.2절). 인기 있는 학생이 학급 전체에 가까운 것은 전혀 아니다.
  • 매개는 중간(0.45~0.74) — 어느 지표와도 완전히 겹치지 않는다. 따로 계산할 값어치가 있다는 뜻이다.
결론: 지표 하나만 보고 "누가 중심이다"라고 말하면 안 된다. 최소한 연결정도와 매개는 같이 본다.

5.6 중심화 — 개인이 아니라 집단의 성질 (Centralization)

중심성은 사람의 값이고, 중심화는 네트워크 전체의 값이다. "한 사람에게 얼마나 몰려 있는가"를 잰다. 별 모양이면 1, 모두가 똑같으면 0.

C=i[maxjC(j)C(i)]그 크기에서 가능한 최댓값C = \frac{\sum_i \left[\max_j C(j) - C(i)\right]}{\text{그 크기에서 가능한 최댓값}}
sna::centralization(adj, sna::degree, cmode = "indegree")
[1] 0.2752
sna::centralization(adj, sna::betweenness)
[1] 0.1862
igraph로 같은 것을 재면 값이 다르다.
igraph::centr_degree(g, mode = "in")$centralization
[1] 0.2646154                          # sna는 0.2752
원인은 분모다. 분자는 양쪽 다 (10indegreei)=26088=172\sum(10 - \text{indegree}_i) = 260-88 = 172로 같다.
패키지분모근거
sna(n1)2=625(n-1)^2 = 625172/625 = 0.2752자기고리 없음
igraph 기본n(n1)=650n(n-1) = 650172/650 = 0.2646loops = TRUE가 기본값
igraph::centr_degree()loops 기본값이 TRUE라 자기 자신을 지명하는 경우까지 분모에 넣는다. 맞춰 주면 정확히 일치한다.
igraph::centr_degree(g, mode = "in", loops = FALSE)$centralization
[1] 0.2752                            # sna와 일치
교실 해석 — 연결정도 중심화 0.275는 낮은 편이다. "반을 좌지우지하는 절대적인 한 명"은 없고, 인기가 여러 명에게 흩어져 있다. 매개 중심화 0.186은 더 낮은데, 이건 1042 하나가 끊어져도 학급이 완전히 마비되지는 않는다는 뜻이기도 하다(1006이라는 대체 통로가 있다).