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

5편Degree and Closeness Centrality

중심성 ① 연결정도와 근접

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

중심성은 하나가 아니다. "중요하다"를 무엇으로 정의하느냐에 따라 답이 달라진다. 네 가지를 순서대로 보고, 마지막에 얼마나 다른 답을 주는지를 확인한다.

5.1 연결정도 중심성 (Degree Centrality)

가장 단순하다. 몇 명과 연결돼 있는가. 방향이 있으면 두 가지로 갈린다.

indegree(j)=iA[i,j](열 합)outdegree(i)=jA[i,j](행 합)\text{indegree}(j) = \sum_i A[i,j] \quad (\text{열 합}) \qquad \text{outdegree}(i) = \sum_j A[i,j] \quad (\text{행 합})
indegree = 4 (받은 지명) outdegree = 3 (보낸 지명) 남이 나를 어떻게 보는가 내가 통제할 수 없다 → 인기 내가 남을 어떻게 보는가 내가 정한다 → 조사에 눌린다
같은 학생인데 세는 방향만 다르다. 왼쪽은 열 합, 오른쪽은 행 합이다.
ind <- sna::degree(adj, cmode = "indegree")    # 받은 지명 = 인기
oud <- sna::degree(adj, cmode = "outdegree")   # 보낸 지명 = 사교성
names(ind) <- rownames(adj)

sort(ind, decreasing = TRUE)[1:5]
1051 1018 1042 1078 1006
  10    9    9    8    7

names(ind)[ind == 0]
[1] "1024" "1030" "1036"

range(oud)
[1] 0 6
indegree와 outdegree는 뜻이 전혀 다르다.
  • indegree(받은 지명) — 남이 나를 어떻게 보는가. 내가 통제할 수 없다. 그래서 "인기"의 지표로 쓴다.
  • outdegree(보낸 지명) — 내가 남을 어떻게 보는가. 내가 정한다. 조사에서 개수를 제한하면 이 값은 인위적으로 눌린다.
교우관계 분석에서 의미 있는 쪽은 거의 항상 indegree다.
# igraph는 인자 이름이 다르다 — mode, cmode 아님
igraph::degree(g, mode = "in")
max(abs(sna::degree(adj, cmode = "indegree") - igraph::degree(g, mode = "in")))
[1] 0              # 값은 완전히 같다

5.2 근접 중심성과 무한거리 함정 (Closeness and the Disconnection Trap)

모두에게 평균적으로 가까운가. 정의는 최단거리 합의 역수다.

CC(i)=n1jid(i,j)C_C(i) = \frac{n-1}{\sum_{j \neq i} d(i,j)}

문제는 d(i,j)d(i,j)도달 불가능하면 \infty라는 것이다. 합에 \infty가 하나만 끼어도 전체가 \infty가 되고, 역수는 0이 된다.

sna::closeness(adj, gmode = "digraph")
 [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
전부 0이다. 계산이 틀린 게 아니라 정의대로 나온 결과다. 1024가 고립돼 있으므로 모든 학생에게 도달 불가능한 상대가 최소 한 명씩 있다.

해결책: cmode="suminvdir" — 거리의 합을 뒤집는 대신 거리마다 역수를 먼저 취해서 더한다. 1/=01/\infty = 0이므로 도달 불가능한 상대는 그냥 0점으로 기여하고, 나머지는 살아남는다.

C(i)=1n1ji1d(i,j)C'(i) = \frac{1}{n-1}\sum_{j \neq i} \frac{1}{d(i,j)}
clo <- sna::closeness(adj, gmode = "digraph", cmode = "suminvdir")
names(clo) <- rownames(adj)
round(sort(clo, decreasing = TRUE)[1:5], 4)
  1063   1066   1021   1027   1069
0.3967 0.3813 0.3713 0.3700 0.3700

igraph 쪽은 조용히 넘어가지 않고 경고를 낸다.

igraph::closeness(g, mode = "out")
Warning: At vendor/cigraph/src/paths/... : closeness centrality is not
well-defined for disconnected graphs
# 값은 나오지만 각 정점이 "도달 가능한 상대까지만" 계산된 것이고,
# 1024는 NaN이 된다. 서로 다른 정점의 값을 비교하기 어렵다.

근접 1위 1063은 인기 1위(1051)도, 매개 1위(1042)도 아니다. 왜 그런지는 다른 지표를 나란히 놓으면 바로 보인다.

학생성별outdegree
(보낸 지명)
indegree
(받은 지명)
근접매개
1063420.39676.2
1066420.38136.2
1021520.371310.8
1027620.370027.4
1069320.37004.0
1042490.3333128.3
근접 상위 5명은 전원 받은 지명이 2개뿐이고, 보낸 지명은 많다. 우연이 아니다. 순위상관을 보면 확실해진다.
cor(rank(-oud), rank(-clo), method = "spearman")   [1] 0.805   # 보낸 지명과 강한 관계
cor(rank(-ind), rank(-clo), method = "spearman")   [1] 0.190   # 받은 지명과는 거의 무관

cmode="suminvdir"내가 남에게 나가는 거리를 잰다. 그러니 많이 지명한 학생, 그리고 지명한 상대들이 서로 다른 무리에 퍼져 있는 학생이 높게 나온다. "근접 = 인기"가 아니다.

교실 해석 — 1063이 지명한 4명은 1006(여, 다른 무리), 1042(남), 1066·1069(자기 무리)다. 여학생 본진과 남학생 쪽에 각각 한 발씩 걸쳐 놓았다. 같은 무리인 1066·1069도 마찬가지여서, 이 셋은 학급 어느 쪽으로든 두세 다리면 닿는다.

다만 매개는 6.2로 26명 중 16위다 — 남들이 1063을 지나가지는 않는다. 근접과 매개는 전혀 다른 것을 잰다. 1063은 자기가 사방으로 잘 나가는 학생이고, 1042는 남들이 지나가는 통로다.

학급 소식을 퍼뜨릴 때는 1063 같은 학생에게 말하는 게 빠르고, 두 무리 사이를 잇는 일에는 1042가 필요하다. 쓰임이 다르다.