← SNA 입문 · R로 시작하기 차례
6편Betweenness, Eigenvector, and Comparison
중심성 ② 매개·위세, 그리고 네 지표의 비교
SNA 입문 · R로 시작하기STAGED+ 스터디
5.3 매개 중심성 (Betweenness Centrality)
남들이 오가는 길목에 얼마나 자주 서 있는가. 모든 쌍의 최단경로를 세고, 그중 를 지나는 비율을 합한다.
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 # 완전 일치
교실 해석 — 이 두 그림의 차이가 중심성을 여러 개 재는 이유 전체다.
- 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명 무방향 그래프에서 한 명씩 제거해 보면:
| 제거한 학생 | 컴포넌트 | 평균 거리 | 지름 | 거리 증가 |
|---|---|---|---|---|
| — (기준) | 1 | 2.270 | 4 | — |
| 1051 (인기 1위) | 1 | 2.482 | 5 | +0.212 |
| 1006 (매개 2위) | 1 | 2.475 | 5 | +0.205 |
| 1042 (매개 1위) | 1 | 2.417 | 5 | +0.147 |
| 1018 (인기 2위) | 1 | 2.286 | 4 | +0.016 |
제거 효과의 순위가 매개 순위와 일치하지 않는다.
매개 1위 1042보다 인기 1위 1051을 뺐을 때 거리가 더 늘어난다.
매개는 최단경로가 지금 누구를 지나는가를 세지만,
제거 효과는 우회로가 있는가에 달려 있기 때문이다. 1042에게는 1006이라는 대체 통로가 있다.
"이 학생이 없으면 어떻게 되는가"가 궁금하면 지표를 읽지 말고 직접 빼 보면 된다
(delete_vertices()). 두 줄이면 끝난다.
5.4 고유벡터 중심성 (Eigenvector Centrality)
"중요한 사람과 연결돼 있으면 나도 중요하다." 자기 참조적 정의이고, 이를 만족하는 값이 인접행렬의 최대 고유값에 대응하는 고유벡터다.
# 방향 그래프에서는 정의가 불안정하다 → 무방향화해서 쓰는 것이 관례
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.000 | 0.732 | 0.190 | 0.823 |
| 매개 | 0.732 | 1.000 | 0.446 | 0.741 |
| 근접 | 0.190 | 0.446 | 1.000 | 0.241 |
| 고유벡터 | 0.823 | 0.741 | 0.241 | 1.000 |
읽는 법
- 연결정도 ↔ 고유벡터 = 0.823 — 거의 같은 이야기를 한다. 지명을 많이 받은 학생은 대체로 지명 많이 받는 학생들과 붙어 있다.
- 연결정도 ↔ 근접 = 0.190 — 거의 무관하다.
이건 우연이 아니라 정의상 그럴 수밖에 없다.
여기서 연결정도는 받은 지명(indegree)이고,
근접(
suminvdir)은 내가 나가는 거리다 — 화살표 방향이 반대다. 실제로 근접은 보낸 지명(outdegree)과는 0.805로 강하게 붙는다(5.2절). 인기 있는 학생이 학급 전체에 가까운 것은 전혀 아니다. - 매개는 중간(0.45~0.74) — 어느 지표와도 완전히 겹치지 않는다. 따로 계산할 값어치가 있다는 뜻이다.
5.6 중심화 — 개인이 아니라 집단의 성질 (Centralization)
중심성은 사람의 값이고, 중심화는 네트워크 전체의 값이다. "한 사람에게 얼마나 몰려 있는가"를 잰다. 별 모양이면 1, 모두가 똑같으면 0.
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
원인은 분모다. 분자는 양쪽 다 로 같다.
| 패키지 | 분모 | 값 | 근거 |
|---|---|---|---|
| sna | 172/625 = 0.2752 | 자기고리 없음 | |
| igraph 기본 | 172/650 = 0.2646 | loops = 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이라는 대체 통로가 있다).