실전 — 가라테 분열 예측과 FMH 고교 하위집단
SNA 이론 · 단계별 학습 차례

단원 3-8Predicting the Karate Club Split and Subgroups in FMH High

실전 — 가라테 분열 예측과 FMH 고교 하위집단

SNA 이론 · 단계별 학습STAGED+ 스터디
오늘 배우는 것 한 줄 요약
3단계에서 만든 도구를 정답지가 있는 네트워크에 전부 던져 보고 채점한다. 그리고 정답지가 없을 때 무엇을 믿어야 하는지를 배운다.
오늘의 결론을 미리 말하면 — 가장 높은 점수를 받은 분할이 정답이 아니고, 가장 낮은 점수를 받은 분할이 정답을 통째로 품고 있다.

1. 지난 시간 연습문제 확인 (Review of Last Session's Exercises)

연습문제 1 — 12명 학급의 E-I와 rr (Exercise 1: E-I and Assortativity in a Class of 12)

남 S1–S5, 여 S6–S12, 간선 14개였습니다.

항목어떻게
내부 간선 ILIL12남남 5 + 여여 7
외부 간선 ELEL2S3–S6, S5–S9
전체 E-I10/14=0.7143-10/14=-0.7143(212)/(2+12)(2-12)/(2+12)
남학생 E-I (n=5)0.4286-0.4286(25)/7(2-5)/7   기대 +0.5556+0.5556 → 낙차 0.9841-0.9841
여학생 E-I (n=7)0.5556-0.5556(27)/9(2-7)/9   기대 +0.2500+0.2500 → 낙차 0.8056-0.8056
aka_k12/28=3/7,  16/28=4/712/28=3/7,\;16/28=4/7차수합 / 2m2m
ak2\sum a_k^225/49=0.510225/49=0.51029/49+16/499/49+16/49
EIexpEI^{\text{exp}}1/49=0.0204-1/49=-0.020412(25/49)1-2(25/49)
rr0.7083정의식·항등식·assortativity_nominal 모두 일치
핵심은 뒤집기였습니다. 관측만 보면 여학생(0.5556-0.5556)이 남학생(0.4286-0.4286)보다 더 닫혀 보이지만, 기대값 대비 낙차로 보면 남학생(0.984-0.984)이 여학생(0.806-0.806)보다 더 닫혀 있습니다. 5명 집단은 12명 중 소수라 저절로 E-I가 +0.5556+0.5556까지 올라가기 때문입니다.

개인별로 EIi=0EI_i=0인 학생은 S5 하나지만 차수가 2뿐이라 이성 친구가 1명입니다. 가장 좋은 다리는 EI3=0.5EI_3=-0.5인 S3 — 차수 4를 쥐고 있으니까요. 개인 E-I는 반드시 차수와 함께 읽는다가 그 문제의 교훈이었습니다.

연습문제 2 — 30명 학급의 전학생 3명 (Exercise 2: Three Transfer Students in a Class of 30)

내부 1개, 외부 14개 → 관측 EI=13/15=+0.8667EI = 13/15 = +0.8667. 그런데 3명 집단의 기대값은

EI3exp=327(32)327+(32)=81381+3=7884=+0.9286 EI^{\text{exp}}_{3} = \frac{3\cdot 27 - \binom{3}{2}}{3\cdot 27 + \binom{3}{2}} = \frac{81-3}{81+3} = \frac{78}{84} = +0.9286

관측이 기대보다 낮습니다. 담임의 “양수니까 잘 융화됐다”는 해석은 틀렸고, 안쪽 밀도 1/31/3이 바깥쪽 14/8114/81의 약 1.9배라 오히려 더 뭉쳐 있습니다. 기대 E-I가 0이 되는 지점은 k=(230+1)/3=20.33k=(2\cdot 30+1)/3 = 20.33k=20k=20까지는 +0.0256+0.0256로 양수, k=21k=21부터 0.0526-0.0526으로 음수입니다.

지난 시간의 한 문장 — 기준선 없는 E-I 보고서는 “소수 집단은 잘 융화되어 있다”를 자동으로 생산하는 기계입니다.

2. 오늘의 질문: 정답지가 있는 네트워크 (Today's Question: A Network with an Answer Key)

3단계에서 우리는 하위집단을 찾는 도구를 여덟 개쯤 만들었습니다.

단원도구답하는 질문
3-1클리크 (clique)서로 전부 아는 사람들의 뭉치는?
3-2kk-코어, nn-클리크, kk-플렉스조금 느슨하게 봐도 뭉치는가?
3-3모듈러리티 QQ이 분할은 몇 점짜리인가?
3-4커뮤니티 탐지 알고리즘QQ가 높은 분할을 어떻게 찾는가?
3-5구조적 등위성 (structural equivalence)누가 누구와 같은 자리에 있는가?
3-6이분 네트워크와 투영소속에서 관계를 어떻게 뽑아내는가?
3-7E-I 지수, 동류성 rr라벨이 관계를 얼마나 설명하는가?

여기엔 한 가지가 통째로 빠져 있습니다. 이 도구들이 맞기는 하는가?

지금까지는 답을 낼 수 없었습니다. 우리 반 무리 구조에 “정답지”가 없으니까요. 알고리즘이 “S1~S3이 한 무리”라고 해도, 그게 맞는지 틀린지 검증할 외부 기준이 없습니다. QQ알고리즘이 스스로 매기는 점수이지, 정답과의 거리가 아닙니다.

오늘 쓰는 데이터가 특별한 이유
Zachary의 가라테 클럽은 사회네트워크분석에서 사실상 유일하게 정답지가 붙어 있는 고전 데이터입니다. 1970년대 초 미국의 한 대학 가라테 클럽을 2년간 관찰하던 중 사범(Mr. Hi)과 관리자(Officer)가 수업료를 놓고 대립했고, 클럽이 실제로 두 개로 쪼개졌습니다. 누가 어느 쪽으로 갔는지가 34명 전원에 대해 기록되어 있습니다. 즉 관계망(입력)과 분열 결과(정답)를 둘 다 가진 데이터입니다.

3. 데이터와 정답지 (The Data and the Answer Key)

정점 34개, 간선 78개. 정답지는 다음과 같습니다.

진영인원구성원
진영 1 (Mr. Hi)16명1 2 3 4 5 6 7 8 11 12 13 14 17 18 20 22
진영 2 (Officer)18명9 10 15 16 19 21 23 24 25 26 27 28 29 30 31 32 33 34

1번이 사범, 34번이 관리자입니다(차수도 각각 16, 17로 1·2위). 78개 간선 중 진영을 넘는 간선은 10개뿐입니다.

교차 간선 10개진영교차 간선 10개진영
1 – 91↔23 – 281↔2
1 – 321↔23 – 291↔2
2 – 311↔23 – 331↔2
3 – 91↔214 – 341↔2
3 – 101↔220 – 341↔2
3번 한 사람이 교차 간선 10개 중 5개를 쥐고 있습니다. (3–9, 3–10, 3–28, 3–29, 3–33) 나머지는 1번이 2개, 34번이 2개, 2번이 1개. 3번은 차수 10 중 진영 안 5명 · 진영 밖 5명 — 단원 3-7의 표현으로 개인 E-I가 정확히 0인 유일한 고차수 정점입니다. 뒤에서 계속 나옵니다.
가라테 클럽의 실제 분열과 Louvain 최대 Q 분할
그림 1. (가) 실제 분열 — 교차 간선 10개가 보라색. (나) Louvain이 찾은 최대 QQ 분할 4집단.

단원 3-7의 도구를 이 정답지에 그대로 적용하면:

ILILELELE-Iak2\sum a_k^2EIexpEI^{\text{exp}}rr
68100.7436-0.74360.5003290.000657-0.0006570.7434

두 진영의 차수합이 76 : 80으로 거의 같아서 기준선 EIexpEI^{\text{exp}}이 사실상 0입니다. 그래서 이 데이터에서만은 E-I의 크기와 rr이 거의 같은 값이 됩니다(0.7436 vs 0.7434). 단원 3-7 §12의 항등식

r=EIexpEI1+EIexp=0.000657(0.743590)10.000657=0.7429330.999343=0.743421   r=\frac{EI^{\text{exp}}-EI}{1+EI^{\text{exp}}}=\frac{-0.000657-(-0.743590)}{1-0.000657}=\frac{0.742933}{0.999343}=0.743421 \;\checkmark

4. 예측 도구 ① 최소절단 — Zachary의 원래 방법 (Minimum Cut)

Zachary 자신이 1977년 논문에서 쓴 방법은 커뮤니티 탐지가 아니었습니다(그런 건 아직 없었습니다). 그는 최대유량–최소절단을 썼습니다. 발상은 단순합니다.

사범(1번)과 관리자(34번)를 떼어놓으려면 최소 몇 개의 관계를 끊어야 하는가?
그렇게 끊었을 때 각자에게 남는 쪽이 그 사람의 진영이다.

정보(혹은 갈등)가 간선을 따라 흐른다고 보면, 1번에서 34번으로 흘려보낼 수 있는 최대유량은 그 둘을 갈라놓는 최소절단의 크기와 같습니다(최대유량–최소절단 정리).

max_flow(gk, source=1, target=34)$value
[1] 10

10. 그리고 실제 분열의 교차 간선도 정확히 10개였습니다. 즉 실제 분열은 1번–34번을 가르는 최소절단 중 하나입니다. Zachary의 방법은 몇 개를 끊어야 하는가는 정확히 맞혔습니다.

그런데 R이 실제로 돌려준 절단은 이것입니다.

R의 최소절단 10개실제 교차 간선 10개
1–9, 1–32, 2–31, 3–9, 3–28, 3–29, 3–33, 10–34, 14–34, 20–341–9, 1–32, 2–31, 3–9, 3–28, 3–29, 3–33, 3–10, 14–34, 20–34

차이는 딱 한 줄, 10번을 어느 쪽에 두는가입니다. R은 10번을 Mr. Hi 쪽에 두었고, 실제로 10번은 Officer를 따라갔습니다. 정확도 33/34.

최소절단은 유일하지 않습니다. 크기 10짜리 절단이 적어도 세 개 있습니다.
분할교차 간선QQARI
정답 (3번은 진영1, 10번은 진영2)100.3714661.0000
3번을 진영2로100.3599610.8823
10번을 진영1로  (R이 고른 것)100.3717950.8823
둘 다 옮김120.3379360.7717
왜 셋인가는 간단합니다. 3번과 10번은 진영 안팎에 친구 수가 똑같습니다(3번 5:5, 10번 1:1). 이런 정점은 어느 쪽으로 옮겨도 교차 간선 수가 변하지 않습니다 — 잃는 만큼 얻습니다. 최소절단만으로는 이 사람들의 소속을 결정할 수 없습니다.

5. 예측 도구 ② Fiedler 벡터 (Spectral Bisection and the Fiedler Vector)

두 번째 방법은 대수적입니다. 라플라시안 행렬을 만듭니다.

L=DA,D=diag(deg(1),,deg(n)) L = D - A, \qquad D = \mathrm{diag}(\deg(1),\dots,\deg(n))

L[i,i]=deg(i)L[i,i]=\deg(i), iji\neq jL[i,j]=A[i,j]L[i,j]=-A[i,j]. 이 행렬의 성질:

  • 모든 행의 합이 0 → 1=(1,1,,1)\mathbf{1}=(1,1,\dots,1)이 고유값 0의 고유벡터. 항상 있습니다.
  • 고유값 0의 중복도가 컴포넌트 개수. 가라테는 연결되어 있으니 0이 하나뿐.
  • 두 번째로 작은 고유값 λ2\lambda_2대수적 연결도라 하고, 그 고유벡터를 Fiedler 벡터라 합니다.
L <- diag(degree(gk)) - as_adjacency_matrix(gk, sparse=FALSE)
sort(eigen(L, symmetric=TRUE)$values)[1:5]
[1] 0.000000 0.468525 0.909248 1.125011 1.259404

λ2=0.4685\lambda_2 = 0.4685. Fiedler 벡터는 34명에게 실수 하나씩을 붙여 줍니다. 부호로 나누면 이분할이 됩니다.

Fiedler 벡터를 값 순으로 정렬한 막대그래프
그림 2. Fiedler 벡터를 값 순으로 세운 것. 막대 색은 실제 진영.
정점176, 75, 11123142091027
Fiedler 값0.4228-0.42280.3237-0.32370.2846-0.28460.1121-0.11210.0413-0.0413+0.0232+0.02320.0147-0.01470.0136-0.0136+0.0516+0.0516+0.0928+0.0928+0.1871+0.1871
실제 진영11111111222

부호 분할의 정확도도 33/34. 다만 이번에 틀린 것은 10번이 아니라 3번입니다.

Fiedler 벡터가 최소절단보다 나은 점 — 답을 연속적인 값으로 줍니다. 17번(0.423-0.423)은 “확실히 Mr. Hi”, 27번(+0.187+0.187)은 “확실히 Officer”, 20번(0.0136-0.0136)·14번(0.0147-0.0147)·3번(+0.0232+0.0232)은 거의 0 — 즉 “구조만으로는 못 정하겠다”라고 말하고 있는 것입니다. 0/1이 아니라 확신의 정도가 같이 나옵니다.

6. 예측 도구 ③ 커뮤니티 탐지 (Community Detection)

단원 3-4의 알고리즘들을 그대로 돌립니다. 이들은 진영을 2개로 나누라는 말을 듣지 않았으므로 자기가 좋다고 생각하는 개수로 나눕니다.

알고리즘집단 수QQARI
Girvan-Newman50.40130.4686
Louvain (최대 QQ)40.41980.5414
walktrap50.35320.3331
fast greedy30.38070.6803
infomap30.40200.7022
label propagation (운 좋은 실행)20.37151.0000
[정답] 실제 분열20.37151.0000
가장 먼저 눈에 띄는 것: Louvain이 찾은 Q=0.4198Q=0.4198이 정답 분할의 Q=0.3715Q=0.3715보다 훨씬 높습니다. 모듈러리티를 최대화하는 알고리즘에게 정답 분할을 보여 주면 “이건 더 좋은 답이 있다”라고 말합니다.

계층적 알고리즘(GN, walktrap, fast greedy)은 cut_at(no=2)로 2집단에서 잘라 정답과 1:1로 대조할 수 있습니다. 그 결과는 §10 채점표에 모았습니다.

7. 손 계산 — 실제 분할의 모듈러리티 (Modularity of the True Split)

단원 3-3에서 쓴 형태를 그대로 씁니다.

Q=c[mcm(dc2m)2] Q=\sum_{c}\left[\frac{m_c}{m}-\left(\frac{d_c}{2m}\right)^{2}\right]

mcm_c = 집단 cc 안쪽 간선 수, dcd_c = 집단 cc 구성원의 차수 합, m=78m=78, 2m=1562m=156.

부품 세기 (Counting the Pieces)

집단인원안쪽 간선 mcm_c차수 합 dcd_c
진영 1163376
진영 2183580
검산3433+35+10=78 ✓76+80=156=2m ✓

항을 전부 전개 (Every Term Expanded)

집단mcm\dfrac{m_c}{m}dc2m\dfrac{d_c}{2m}(dc2m)2\left(\dfrac{d_c}{2m}\right)^{2}
진영 13378=0.423077\dfrac{33}{78}=0.42307776156=0.487179\dfrac{76}{156}=0.4871790.2373440.2373440.1857330.185733
진영 23578=0.448718\dfrac{35}{78}=0.44871880156=0.512821\dfrac{80}{156}=0.5128210.2629850.2629850.1857330.185733
합계 QQ0.3714660.371466
두 집단의 기여가 소수점 여섯 자리까지 같습니다. 우연이 아닙니다. 2집단 분할에서는 항상 그렇습니다.

cc를 교차 간선 수라 하면 d1=2m1+c,  d2=2m2+cd_1=2m_1+c,\;d_2=2m_2+c이므로 d1d2=2(m1m2)d_1-d_2=2(m_1-m_2). 따라서 (d12m)2(d22m)2=(d1d2)(d1+d2)(2m)2=(d1d2)2m(2m)2=d1d22m=m1m2m \left(\frac{d_1}{2m}\right)^{2}-\left(\frac{d_2}{2m}\right)^{2} =\frac{(d_1-d_2)(d_1+d_2)}{(2m)^2}=\frac{(d_1-d_2)\cdot 2m}{(2m)^2}=\frac{d_1-d_2}{2m}=\frac{m_1-m_2}{m} 이고 이는 m1mm2m\dfrac{m_1}{m}-\dfrac{m_2}{m}와 정확히 같습니다. 두 차의 차이가 0 → 이분할의 QQ는 언제나 한 집단 기여의 정확히 두 배. Q=2[m1m(d12m)2] Q = 2\left[\frac{m_1}{m}-\left(\frac{d_1}{2m}\right)^{2}\right]

이 축약형을 쓰면 검산이 한 줄입니다.

Q=2(3378(76156)2)=2(0.4230770.237344)=2×0.185733=0.371466 Q = 2\left(\frac{33}{78}-\left(\frac{76}{156}\right)^{2}\right)=2\,(0.423077-0.237344)=2\times 0.185733=\boxed{0.371466}

8. 손 계산 — 10번을 옮기면 QQ가 오른다 (Moving Node 10 Raises Q)

이제 §4에서 R이 고른 오답(10번을 진영 1로)의 QQ를 같은 방식으로 계산합니다. 10번의 이웃은 3번(진영 1)과 34번(진영 2), 딱 둘입니다.

무엇이 바뀌나정답10번 이동 후
간선 3–10교차진영 1 안쪽
간선 10–34진영 2 안쪽교차
교차 간선 수1010 (그대로)
m1m_13334 (+1)
m2m_23534 (1-1)
d1d_17678 (+2, 10번 차수)
d2d_28078 (2-2)

축약형에 넣습니다. 차수합이 78 : 78로 정확히 반반이 되었다는 데 주목하세요.

분할m1m\dfrac{m_1}{m}(d12m)2\left(\dfrac{d_1}{2m}\right)^{2}Q=2×Q = 2\times
정답3378=0.423077\dfrac{33}{78}=0.423077(76156)2=0.237344\left(\dfrac{76}{156}\right)^{2}=0.2373440.1857330.3714660.371466
10번 이동3478=0.435897\dfrac{34}{78}=0.435897(78156)2=(12)2=0.250000\left(\dfrac{78}{156}\right)^{2}=\left(\dfrac12\right)^{2}=0.2500000.1858970.3717950.371795
차이+0.000329+0.000329
오답이 정답보다 QQ가 높습니다. 소수점 넷째 자리에서 갈립니다.

왜 그런가: 10번을 옮기면 안쪽 간선은 1개 줄지만(35→34, 두 번째 집단 기준), 차수합이 76:80에서 78:78로 완벽히 균형이 되면서 귀무 모형의 벌점 (dc2m)2\left(\frac{d_c}{2m}\right)^2의 합이 더 크게 줄어듭니다. x2+(1x)2x^2+(1-x)^2x=1/2x=1/2에서 최소이니까요.

모듈러리티는 “집단이 균형 있게 나뉜 분할”을 좋아합니다. 그건 사회적 사실이 아니라 공식의 성질입니다. 그리고 그 성질이 여기서 정답을 밀어내고 있습니다.
10번을 옮기는 것이 왜 “공짜”였나 — 10번은 진영 안 친구 1명, 진영 밖 친구 1명입니다. 단원 3-7의 표현으로 개인 E-I가 정확히 0. 이런 정점을 옮기면 교차 간선 수가 안 변하므로 절단 크기로는 구별할 수 없고, QQ로는 차수 균형만 남아 결정됩니다. 구조가 이 사람에 대해 아무 정보도 갖고 있지 않은 것입니다.

9. 채점 도구: ARI 손 계산 (Adjusted Rand Index by Hand)

지금까지 compare(..., method="adjusted.rand")를 여러 단원에서 그냥 써 왔습니다. 오늘은 손으로 계산합니다. 정답지가 있는 오늘이 적기입니다.

9-1. 발상: 쌍(pair)을 세는 것 (The Idea: Counting Pairs)

두 분할이 얼마나 비슷한지를 재는 방법은 여러 가지지만, ARI는 학생 쌍을 셉니다. 34명이면 쌍은 (342)=561\binom{34}{2}=561개. 각 쌍마다 묻습니다 — 두 분할이 이 쌍을 같은 취급 했는가?

“같은 취급”은 둘 다 같은 집단에 넣었다 또는 둘 다 다른 집단에 넣었다입니다. 그 비율이 랜드 지수 RIRI. 문제는 RIRI우연히도 높게 나온다는 것 — 단원 3-7의 기준선 문제가 그대로 반복됩니다. 그래서 ARI는 관측 − 기대최대 − 기대로 나눕니다.

ARI=ij(nij2)    [i(ai2)][j(bj2)](n2)12[i(ai2)+j(bj2)]    [i(ai2)][j(bj2)](n2) ARI=\frac{\displaystyle\sum_{ij}\binom{n_{ij}}{2}\;-\;\frac{\left[\sum_i\binom{a_i}{2}\right]\left[\sum_j\binom{b_j}{2}\right]}{\binom{n}{2}}} {\displaystyle\frac12\left[\sum_i\binom{a_i}{2}+\sum_j\binom{b_j}{2}\right]\;-\;\frac{\left[\sum_i\binom{a_i}{2}\right]\left[\sum_j\binom{b_j}{2}\right]}{\binom{n}{2}}}
rr, QQ, ARI가 전부 같은 모양입니다.
지표관측기대(우연)정규화
QQ (3-3)mc/mm_c/m(dc/2m)2(d_c/2m)^2없음(빼기만)
rr (3-7)ekk\sum e_{kk}ak2\sum a_k^21ak21-\sum a_k^2로 나눔
ARI (오늘)(nij2)\sum\binom{n_{ij}}{2}(ai2)(bj2)(n2)\frac{\sum\binom{a_i}{2}\sum\binom{b_j}{2}}{\binom n2}12[+]\frac12[\cdot+\cdot]-기대
셋 다 “우연히 나올 만큼은 빼고, 남은 것을 최대치로 나눈다”입니다. 다른 지표를 배우는 게 아니라 같은 문법을 다른 대상에 적용하는 것입니다.

9-2. 교차표 만들기 — Girvan-Newman(2집단) vs 정답 (Building the Contingency Table)

GN을 2집단에서 자른 결과와 정답을 표로 교차시킵니다. nijn_{ij} = 예측 ii이면서 실제 jj인 사람 수.

실제 진영 1실제 진영 2행 합 aia_i
예측 집단 115015
예측 집단 211819
열 합 bjb_j161834

빨간 칸의 1명이 3번입니다(GN은 3번을 Officer 쪽으로 보냄).

9-3. 세 개의 합을 0인 항까지 전부 전개 (Three Sums, Every Term Included)

① 칸별 합 — 4개 칸 전부, (02)=0\binom{0}{2}=0(12)=0\binom{1}{2}=0도 생략하지 않습니다.

nijn_{ij}(nij2)=n(n1)2\binom{n_{ij}}{2}=\frac{n(n-1)}{2}왜 그 값인가
(1,1)1515142\frac{15\cdot 14}{2}105두 분할이 둘 다 같이 묶은
(1,2)00(1)2\frac{0\cdot(-1)}{2}0예측1 ∩ 실제2 = 공집합
(2,1)1102\frac{1\cdot 0}{2}03번 혼자라 쌍이 안 생김
(2,2)1818172\frac{18\cdot 17}{2}153둘 다 같이 묶은 쌍
ij(nij2)\sum_{ij}\binom{n_{ij}}{2}258105+0+0+153

② 행 합 — 예측 분할이 같이 묶은 쌍의 총수.

aia_i(ai2)\binom{a_i}{2}
예측 집단 11515142\frac{15\cdot 14}{2}105
예측 집단 21919182\frac{19\cdot 18}{2}171
i(ai2)\sum_i\binom{a_i}{2}276

③ 열 합 — 정답 분할이 같이 묶은 쌍의 총수.

bjb_j(bj2)\binom{b_j}{2}
실제 진영 11616152\frac{16\cdot 15}{2}120
실제 진영 21818172\frac{18\cdot 17}{2}153
j(bj2)\sum_j\binom{b_j}{2}273

④ 전체 쌍: (342)=34332=561\binom{34}{2}=\dfrac{34\cdot 33}{2}=561.

9-4. 조립 (Putting It Together)

부분
관측(nij2)\sum\binom{n_{ij}}{2}258
기대(우연)276×273561=75348561\dfrac{276\times 273}{561}=\dfrac{75348}{561}134.310160
최대(완전일치)276+2732=5492\dfrac{276+273}{2}=\dfrac{549}{2}274.5
ARI258134.310160274.5134.310160=123.689840140.189840\dfrac{258-134.310160}{274.5-134.310160}=\dfrac{123.689840}{140.189840}0.882302
compare(gn2, truth, method="adjusted.rand")
[1] 0.882302
보정을 안 하면 얼마인가? 랜드 지수는 RI=258+(561276273+258)561=258+270561=528561=0.941176RI = \frac{258+(561-276-273+258)}{561}=\frac{258+270}{561}=\frac{528}{561}=0.941176.
0.94 vs 0.88 — 한 명 틀린 것치고는 RIRI가 너무 후합니다. 쌍의 대부분은 “둘 다 다른 집단”이라 그냥 맞기 때문입니다. ARI가 그 공짜 점수를 걷어냅니다.

10. 채점표 — 여덟 가지 방법 전면 대조 (The Scoreboard)

방법집단 수QQARI진영 경계를
넘었나
진영 복원
정확도
넘은 정점
최소절단 (1–34)20.37180.882333/3410
Fiedler 부호20.36000.882333/343
Girvan-Newman (2로 자름)20.36000.882333/343
walktrap (2로 자름)20.33520.771832/343, 14
fast greedy (2로 자름)20.37180.882333/3410
fast greedy (원본 3집단)30.38070.680333/3410
infomap (3집단)30.40200.702233/3410
Louvain 최대 QQ (4집단)40.41980.5414아니오34/34없음
[정답] 실제 분열20.37151.000034/34
Q와 ARI의 산점도
그림 3. 가로축 QQ(정답지 없이 계산), 세로축 ARI(정답지와 대조). 두 축이 서로 다른 순위를 준다.
그림 3이 이 단원의 그림입니다. QQ와 ARI 사이에 아무 관계가 없습니다. QQ 1등(Louvain 0.4198)이 ARI 꼴찌(0.5414)이고, ARI 1등 후보들(0.8823)은 QQ로 보면 중하위권입니다.

그리고 정답(빨간 마름모)은 QQ로 보면 한가운데에 있습니다. 현실의 분열은 모듈러리티를 최대화하지 않았습니다.

참고로 정답 분할이 형편없는 것은 아닙니다. 무작위 2분할 20,000개를 만들어 QQ를 재면 평균 0.0248-0.0248, 최댓값 0.3010.301이고, 정답 분할의 0.37150.371520,000개 전부보다 높습니다. “QQ가 의미 없다”가 아니라 QQ의 최댓값이 곧 진실은 아니다”입니다.

11. 함정 ①: ARI는 ‘세분’을 벌준다 (ARI Penalizes Refinement)

채점표에서 가장 이상한 줄은 Louvain입니다. ARI 0.5414로 꼴찌인데 진영 복원은 34/34, 만점입니다. 어떻게 둘 다 참일 수 있을까요?

Louvain 집단인원구성원실제 진영
C1111 2 3 4 8 12 13 14 18 20 22전원 진영 1
C255 6 7 11 17전원 진영 1
C3129 10 15 16 19 21 23 27 30 31 33 34전원 진영 2
C4624 25 26 28 29 32전원 진영 2

C1C2C_1\cup C_2는 정확히 진영 1 16명 전원, C3C4C_3\cup C_4는 정확히 진영 2 18명 전원. Louvain은 진영 경계를 단 한 번도 넘지 않았습니다. 다만 각 진영을 둘로 더 쪼갰을 뿐입니다. 이런 관계를 세분(refinement)이라고 합니다.

ARI는 “경계를 잘못 그은 것”과 “경계를 더 그은 것”을 구별하지 못합니다.
같은 진영의 두 사람을 다른 집단에 넣으면, ARI 입장에서는 틀린 쌍입니다. Louvain은 C1C_1C2C_2 사이 11×5=5511\times 5=55쌍과 C3C_3C4C_4 사이 12×6=7212\times 6=72쌍, 합쳐서 127쌍을 “다른 집단”으로 처리했고 그만큼 감점되었습니다. 반면 3번 한 명을 진영 너머로 보낸 GN은 감점이 훨씬 적습니다.

그래서 채점은 두 가지를 해야 합니다.

질문도구
분할이 정답과 얼마나 같은가?ARI, NMILouvain 0.54 — 낮음
정답의 경계를 넘은 집단이 있는가?집단별 순도 검사Louvain 0개 — 완벽
교실 해석 — 알고리즘이 우리 반을 6개 무리로 나눴는데 담임이 보기엔 3개다. ARI는 낮게 나옵니다. 하지만 6개가 3개를 쪼갠 것뿐이라면 알고리즘이 더 잘 본 것일 수 있습니다. 담임이 “여학생 무리”라고 뭉뚱그린 것이 실제로는 두 개의 서로 다른 무리일 수 있으니까요. 낮은 ARI를 보고 “알고리즘이 틀렸다”고 결론 내리기 전에 각 집단이 담임 분류의 경계를 넘었는지를 먼저 확인하십시오. 한 번도 안 넘었다면 그건 반박이 아니라 확대경입니다.

12. 틀린 정점들의 정체 (Who the Misclassified Nodes Are)

여덟 가지 방법이 틀린 정점은 딱 세 개뿐입니다 — 3번, 10번, 14번. 누구인지 봅시다.

정점차수실제 진영진영 안
친구
진영 밖
친구
개인 E-I
(3-7)
Fiedler누가 틀렸나
3101550.000+0.0232+0.0232Fiedler, GN, walktrap
1022110.000+0.0928+0.0928최소절단, fast greedy, infomap
1451410.600-0.6000.0147-0.0147walktrap
2031210.333-0.3330.0136-0.0136(아무도 안 틀림 — 아슬아슬)
952320.200-0.200+0.0516+0.0516(아무도 안 틀림)
11611420.750-0.7500.1121-0.1121
341721520.765-0.765+0.1189+0.1189
틀린 정점은 전부 개인 E-I가 0이거나 Fiedler 값이 0 근처인 정점입니다. 우연이 아닙니다. 이들은 구조가 정보를 갖고 있지 않은 사람입니다.

3번: 진영 안 5명, 진영 밖 5명. 정확히 반반.
10번: 진영 안 1명, 진영 밖 1명. 정확히 반반.
14번·20번: 4:1, 2:1로 기울어 있지만 Fiedler 값이 0.015|0.015| 미만 — 이웃들이 서로 밀고 당깁니다.

어떤 알고리즘도 이들을 구조만으로 맞힐 수 없습니다. 방법마다 답이 다른 것은 알고리즘의 실력 차가 아니라 동점을 깨는 방식의 차이입니다.
10번은 왜 Officer를 따라갔나? 관계망에는 답이 없습니다. Zachary의 관찰 기록에 따르면 이런 결정에는 네트워크 바깥의 이유가 작용했습니다 — 승급 심사가 임박했다든가, 수업 시간대가 맞는다든가.

이것이 오늘의 가장 정직한 결론입니다. 33/34가 이 데이터의 사실상 상한선입니다. 남은 한 명은 더 좋은 알고리즘으로 맞히는 게 아니라 더 많은 정보로 맞혀야 합니다.

13. 함정 ②: 같은 알고리즘이 매번 다른 답을 준다 (Stochastic Algorithms)

여기서 실무에서 제일 자주 사고가 나는 지점을 짚습니다. 단원 3-4에서 배운 알고리즘 중 일부는 난수를 씁니다. 같은 데이터, 같은 함수인데 실행할 때마다 결과가 달라집니다.

가라테 클럽에 100번씩 돌린 결과입니다.

알고리즘QQ 범위ARI 범위집단 수 분포
Louvain0.3886 ~ 0.41980.4397 ~ 0.64454집단 99회, 3집단 1회
label propagation0.0000 ~ 0.41560.0000 ~ 1.00001집단 4회, 2집단 48회, 3집단 39회, 4집단 9회
infomap0.4020 (고정)0.7022 (고정)3집단 100회

결정적(deterministic)인 것들 — Girvan-Newman, walktrap, fast greedy, Fiedler, 최소절단 — 은 몇 번을 돌려도 같은 답입니다. 문제는 Louvain과 label propagation입니다.

label propagation은 ARI가 0.0에서 1.0까지 흔들립니다. 1,000번 돌리면 118번(11.8%)은 정답을 정확히 맞히고(ARI = 1.0), 4번은 전원을 한 집단에 넣어 버립니다(Q=0Q=0).

즉 “가장 단순하고 가장 불안정한 알고리즘만이 정답 그 자체를 뽑아낸 적이 있다”는 얘기가 됩니다. 하지만 정답지가 없으면 그 118번을 골라낼 방법이 없습니다. 운이 좋았다는 걸 알 길이 없으니까요.

실무 지침은 셋입니다.

#지침이유
1set.seed()를 반드시 쓰고 보고서에 시드를 적는다재현 가능해야 검증도 가능
2한 번 돌린 결과를 결론으로 삼지 않는다100번 돌려 분포를 본다
3“누가 어느 집단인가” 대신 “이 둘이 늘 같은 집단인가”를 본다§17 합의

14. 3단계 도구 전부로 본 가라테 (All Stage-3 Tools on the Karate Club)

커뮤니티 탐지 말고 나머지 도구들은 진영에 대해 무엇을 말하는지 훑습니다.

14-1. 클리크 (3-1) (Cliques)

극대 클리크 36개(크기 2:11개, 3:21개, 4:2개, 5:2개). 이 중 진영이 섞인 것은 9개:

{3,10} {3,28} {3,29} {1,32} {20,34} {14,34} {2,31} {3,9,33} {1,3,9}

9개 중 5개에 3번이 들어 있습니다. 크기 5인 두 클리크 {1,2,3,4,8}\{1,2,3,4,8\}, {1,2,3,4,14}\{1,2,3,4,14\}는 둘 다 진영 1 안에 완전히 들어 있습니다.

14-2. kk-코어 (3-2) (k-Cores)

코어1234
인원1111210

최대 코어는 4-코어 10명: 1 2 3 4 8 9 14 31 33 34. 진영 1이 6명, 진영 2가 4명으로 양쪽이 섞여 있습니다. kk-코어는 “누가 중심에 있는가”를 말하지 “어느 편인가”는 말하지 않습니다. 당연합니다 — 코어는 차수 기반이라 진영과 무관합니다.

14-3. 구조적 등위성 (3-5) (Structural Equivalence)

인접행렬 행·열을 붙여 유클리드 거리로 묶으면(단원 3-5 방식):

블록 수ARI(진영)QQ블록 구성
20.0060-0.00600.0435-0.043532명 / 2명
30.00240.1288-0.12882 / 30 / 2
40.01020.1429-0.1429{1,2} / {3} / {4…32의 29명} / {33,34}
ARI가 0 근처, QQ는 음수. 등위성 블록은 진영과 아무 관계가 없습니다. 그런데 이건 실패가 아닙니다. 4블록의 구성을 보세요 — {1,2}(사범과 부관), {3}(양쪽에 걸친 중개자), {33,34}(관리자와 부관), 나머지 29명(일반 회원).

등위성은 ‘역할’을 찾았습니다. 커뮤니티는 ‘소속’을 찾습니다. 같은 데이터에 같은 이름(“하위집단”)을 붙여도 다른 질문에 답하는 것입니다. 단원 3-5의 그 구별이 여기서 숫자로 확인됩니다.

14-4. 매개 중심성 (2-3) — 다리는 누구인가 (Betweenness: Who Is the Bridge)

정점134333329214
매개231.07160.5576.6975.8573.0129.5328.4824.22
차수161712106595

1번·34번이 1·2위인 건 차수가 압도적이라 당연합니다. 주목할 것은 3번이 4위인데 차수는 10으로 3위라는 점 — 즉 차수 대비 매개가 큽니다. 32번은 차수 6으로 중위권인데 매개 5위. 이 둘이 진짜 다리입니다.

15. 정답지가 없는 네트워크: FMH 고교 (A Network Without an Answer Key)

가라테는 34명이고 정답지가 있습니다. 이제 현실에 가까운 쪽으로 갑니다 — faux.magnolia.high, 1,461명 고등학교 친구관계망입니다.

항목
정점1,461
간선974
밀도0.000913
평균 차수1.33
컴포넌트 수661
최대 컴포넌트439명 (30.0%)
차수 0 (고립자)524명 (35.9%)

거대 컴포넌트 439명만 떼어 보면 간선 573개, 밀도 0.00596, 지름 40, 평균거리 16.88입니다.

지름 40이라는 건 좁은 세상이 아닙니다. 439명짜리 무작위망이라면 지름이 6~8쯤 나옵니다. 이 망은 길쭉한 사슬 모양입니다.

정직하게 짚을 것: faux.magnolia.high는 실제 학교 데이터가 아니라 AddHealth 자료에 맞춘 ERGM으로 모의 생성한 망입니다. 그래서 실제 학교보다 사슬형 구조가 과장되어 있고, 고립자 비율도 “친구를 최대 몇 명까지 적어라”라는 설문 설계의 영향을 받습니다. 아래 수치들을 실제 학교의 값으로 읽지는 마십시오. 도구의 작동 방식을 보려고 쓰는 데이터입니다.

클리크와 코어를 먼저 봅니다(단원 3-1, 3-2).

도구결과읽기
kk-코어0:524명, 1:601명, 2:271명, 3:60명, 4:5명최대가 4-코어 5명뿐 — 조밀한 핵이 사실상 없다
4-코어 5명전원 8학년이 학교에서 가장 촘촘한 곳은 8학년
극대 클리크(3명 이상)122개 (3명:106, 4명:15, 5명:1)최대 클리크가 5명 — 가라테와 같은 크기인데 인원은 43배
유일한 5-클리크{183, 122, 1160, 1143, 530} 전원 8학년성별은 M,F,F,F,M로 섞임
학년이 통일된 클리크100/122 = 82.0%학년이 뭉침의 축
성별이 통일된 클리크67/122 = 54.9%성별은 축이 아님

16. FMH 하위집단 — 21개 집단은 학년의 세분인가 (Are the 21 Communities a Refinement of Grade?)

커뮤니티 탐지를 돌립니다. 먼저 전체 망에 그대로 돌리면 이런 일이 벌어집니다.

알고리즘집단 수QQARI(학년)
Louvain (전체 망)6770.95120.0327
fast greedy (전체 망)6770.95230.0304
Q=0.95Q=0.95는 훌륭한 점수가 아니라 경고등입니다. 고립자 524명이 각각 1인 집단이 되고, 1인 집단은 mc=0,  dc=0m_c=0,\;d_c=0이라 QQ에 0을 기여하면서 다른 집단의 벌점을 낮춰 줍니다. 즉 아무 연결도 없는 학생이 많을수록 QQ가 저절로 올라갑니다.
QQ를 보고할 때는 반드시 고립자 처리 방식을 함께 적어야 합니다.

거대 컴포넌트(439명)만 떼어 다시 돌립니다.

알고리즘집단 수QQARI(학년)최대 집단중앙 크기
Louvain210.89690.191342명20
fast greedy210.89900.189942명21
walktrap440.85930.158741명5.5
infomap730.82690.087014명5
학년 분할 자체60.66321.0000

ARI(학년)가 0.19밖에 안 됩니다. 가라테에서 배운 대로, ARI가 낮다고 곧바로 틀린 건 아닙니다. 세분인지 확인해야 합니다. 21개 집단의 학년 구성을 봅니다.

집단인원주 학년순도학년 구성
132871.0007학년 28
21981.0008학년 9
191680.9387:1 8:15
142080.9008:18 12:2
327110.88910:3 11:24
418100.8898:1 9:1 10:16
121670.8757:14 8:2
511100.81810:9 11:2
2020110.8008:2 9:1 10:1 11:16
172280.7737:2 8:17 9:3
161590.7338:1 9:11 10:2 12:1
72190.7149:15 12:6
842100.6909:2 10:29 11:8 12:3
13480.6767:5 8:23 9:1 10:5
22480.6677:1 8:16 10:2 12:5
1017120.58811:7 12:10
623120.52211:11 12:12
1811100.4559:4 10:5 11:2
914100.4299:1 10:6 11:4 12:3
1528100.4297:8 8:5 9:1 10:12 11:1 12:1  (6개 학년 전부)
1123120.3489:6 10:2 11:7 12:8
지표
순도 100%인 집단2 / 21
순도 80% 이상9 / 21
가중평균 순도 = 다수결로 학년을 복원한 정확도0.713 (313/439명)
무작위 기준선(가장 큰 학년의 비율)0.2483
성별 가중평균 순도 / 기준선0.6606 / 0.5718
가라테와의 결정적 차이. 가라테에서 Louvain은 진영 경계를 한 번도 넘지 않았습니다(순도 100%). FMH에서는 71.3%입니다. 기준선 24.8%에 비하면 압도적으로 높지만, 완벽과는 거리가 멉니다.

“친구 무리는 대체로 같은 학년이지만, 꼭 그렇지는 않다”가 이 데이터의 답입니다. 집단 15는 여섯 학년이 전부 섞인 28명짜리 덩어리 — 이런 집단이 진짜 흥미로운 대상입니다 (동아리? 통학버스? 형제자매?). 그리고 성별은 순도 0.66 vs 기준선 0.57로 거의 정보가 없습니다.

단원 3-7의 도구를 세 분할에 나란히 적용하면 순위가 명확해집니다(거대 컴포넌트 기준).

분할집단 수ILILELELE-IEIexpEI^{\text{exp}}rrQQ
Louvain21546270.9058-0.9058+0.8879+0.88790.95010.8969
학년6489840.7068-0.7068+0.6195+0.61950.81900.6632
성별23841890.3403-0.34030.0258-0.02580.32290.1573

rrassortativity_nominal과 정확히 일치합니다(학년 0.8190 ✓). 단원 3-7 §16의 경고 — “집단 수가 다른 분할끼리 E-I를 직접 비교하지 말라” — 가 여기서도 그대로 적용됩니다. Louvain의 E-I가 0.906-0.906으로 가장 음수인 건 집단이 21개라 기준선이 +0.888+0.888까지 올라갔기 때문입니다. rr로 비교해야 합니다.

17. 정답지가 없을 때 무엇을 믿는가: 합의 (Consensus)

FMH엔 정답지가 없습니다. ARI를 계산할 상대가 없습니다. 무엇을 믿어야 할까요?

답은 질문을 바꾸는 것입니다. “이 학생은 몇 번 집단인가?”는 실행마다 달라집니다. 집단 번호 자체가 임의니까요. 대신 이렇게 묻습니다 — “이 두 학생은 늘 같은 집단에 들어가는가?”

Louvain을 100번 돌려(시드 1~100) 거대 컴포넌트의 간선 573개마다 양 끝 두 사람이 같은 집단에 들어간 횟수를 셉니다.

합의 수준간선 수비율읽기
100회 전부 같은 집단50087.3%확실한 무리 안쪽
90회 이상52591.6%거의 확실
50~90회203.5%애매 — 경계선
50회 미만284.9%무리와 무리를 잇는 다리

평균 합의도는 0.951. 한편 서로 다른 두 실행끼리의 ARI는 평균 0.8247 (범위 0.6558~0.9610)에 불과합니다.

이 두 숫자의 차이가 핵심입니다.
실행끼리 ARI가 0.82라는 건 “분할이 꽤 달라진다”는 뜻입니다. 그런데 간선 평균 합의도는 0.95 — 대부분의 관계는 어느 실행에서나 같은 집단 안에 있습니다.

흔들리는 건 무리의 이 아니라 경계입니다. 그리고 그 흔들리는 28개 간선이야말로 진짜 찾아야 할 것 — 서로 다른 무리를 잇는 다리들입니다.
교실 적용 — 보고서에 이렇게 쓰십시오
✗ “우리 반은 4개 무리로 나뉩니다. 1모둠은 …”
✓ “100번 반복했을 때 항상 같은 무리로 묶인 학생들은 다음과 같습니다. … 그리고 실행마다 소속이 바뀌는 학생 3명이 있는데, 이들은 두 무리 사이의 다리입니다.”

전자는 재현되지 않는 주장이고, 후자는 불확실성까지 정보로 만든 보고입니다.

18. 가장 중요한 발견은 집단 밖에 있었다 (The Most Important Finding Was Outside the Groups)

3단계 내내 우리는 “누가 누구와 뭉치는가”를 물었습니다. FMH에서 그 질문에 답하다 보면 놓치는 사실이 하나 있습니다.

FMH의 컴포넌트 크기 분포와 속성별 고립률
그림 4. (가) 컴포넌트 크기 분포 (양축 로그). (나) 속성별 고립률.
컴포넌트 크기12345678911121923439
개수52464291112474111111

1,461명 중 524명(35.9%)이 아무와도 연결되어 있지 않습니다. 거기에 “단짝 한 명뿐”인 2인 컴포넌트가 64쌍(128명) 더 있습니다. 커뮤니티 탐지는 이 652명에 대해 아무 말도 하지 않았습니다 — 1인·2인 집단으로 처리하고 QQ만 0.95로 부풀렸을 뿐입니다.

고립은 고르게 분포하지 않습니다.
집단인원고립자고립률
여학생76822629.4%
남학생69329843.0%
White1,05333331.6%
Black26111945.6%
Asian482245.8%
Hisp683855.9%
NatAm24833.3%
전체1,46152435.9%
남학생이 여학생보다 13.6%p 높고, Hisp 학생은 White 학생보다 24.3%p 높습니다. 반면 학년별로는 차이가 유의하지 않습니다(30.0%~42.0%, 카이제곱 p=0.115p=0.115).
3단계를 마치며 남길 한 문장.
단원 3-7에서 우리는 “학년이 이 학교의 진짜 축이다”(r=0.81,  Q=0.67r=0.81,\;Q=0.67)라는 결론에 도달했습니다. 맞는 결론입니다. 그런데 고립에 관한 한 학년은 아무 설명도 하지 못하고, 성별과 인종이 설명합니다.

“누가 누구와 뭉치는가”와 “누가 아무와도 안 뭉치는가”는 서로 다른 질문이고, 서로 다른 변수가 답합니다. 하위집단 분석의 가장 중요한 결과가 집단 이 아니라 집단 에 있을 수 있습니다.

(다시 한 번 — 이 수치들은 모의 생성된 데이터의 것입니다. 실제 학교의 고립률로 인용하면 안 됩니다. 읽어야 할 것은 숫자가 아니라 “고립률을 속성별로 쪼개 보는 절차”입니다.)

19. R 검증 (R Verification)

library(igraph)

## --- 데이터: karate_net.txt 의 오류를 반드시 복원 (CLAUDE.md 참조) ---
kel <- as.matrix(read.table("karate_net.txt"))
gk  <- add_edges(simplify(graph_from_edgelist(kel, directed=FALSE)), c(9,31))
std <- c(16,9,10,6,3,4,4,4,5,2,3,1,2,5,2,2,2,2,2,3,2,2,2,5,3,3,2,4,3,4,4,6,12,17)
all(igraph::degree(gk) == std)
[1] TRUE

## --- 정답지 ---
f1    <- c(1,2,3,4,5,6,7,8,11,12,13,14,17,18,20,22)
truth <- ifelse(1:34 %in% f1, 1, 2)

## --- §7 실제 분할의 Q ---
modularity(gk, truth)
[1] 0.371466

## --- §8 10번을 옮기면 ---
v10 <- truth; v10[10] <- 1
modularity(gk, v10)
[1] 0.3717949          # 정답보다 +0.000329 높다

## --- §4 최소절단 ---
mf <- max_flow(gk, source=1, target=34); mf$value
[1] 10
mcp <- ifelse(1:34 %in% as.integer(mf$partition1), 1, 2)
sum(mcp == truth)
[1] 33

## --- §5 Fiedler 벡터 ---
L  <- diag(igraph::degree(gk)) - as_adjacency_matrix(gk, sparse=FALSE)
ev <- eigen(L, symmetric=TRUE)
fv <- ev$vectors[, order(ev$values)][, 2]
sum(ifelse(fv < 0, 1, 2) == truth)     # 부호 방향에 따라 33 또는 1
[1] 33

## --- §9 ARI ---
gn2 <- as.integer(cut_at(cluster_edge_betweenness(gk), no=2))
compare(gn2, truth, method="adjusted.rand")
[1] 0.882302

## --- §11 세분 검사: 어떤 집단도 진영 경계를 넘지 않는가? ---
isref <- function(p) all(sapply(unique(p),
           function(c) length(unique(truth[p == c])) == 1))
set.seed(1); bestL <- as.integer(membership(cluster_louvain(gk)))
isref(bestL)                            # 최대 Q 분할일 때
[1] TRUE

## --- §16 FMH ---
library(ergm); library(intergraph)
data(faux.magnolia.high); fm <- faux.magnolia.high
G     <- asIgraph(fm)
grade <- network::get.vertex.attribute(fm, "Grade")   # igraph가 가리므로 명시
gcv   <- which(components(G)$membership == which.max(components(G)$csize))
gc    <- induced_subgraph(G, gcv)
set.seed(42); mb <- as.integer(membership(cluster_louvain(gc)))
tb  <- table(mb, grade[gcv])
sum(apply(tb, 1, max)) / sum(tb)        # 가중평균 순도
[1] 0.7129841
assortativity_nominal(gc, as.integer(factor(grade[gcv])))
[1] 0.8190
구현 함정 셋
cut_at(cm, no=2)계층적 결과에만 씁니다. Louvain은 계층이 없어 2로 자를 수 없고, cluster_leading_eigen에 억지로 쓰면 Cannot have that few communities 경고와 함께 쓰레기 분할이 나옵니다(Q=0.03Q=-0.03).
② Fiedler 벡터의 부호는 임의입니다. vv가 고유벡터면 v-v도 고유벡터. 정확도를 재기 전에 기준 정점(예: 1번)의 부호를 고정하십시오.
networkigraph는 서로 함수를 가립니다. network::get.vertex.attribute, igraph::degree처럼 패키지명을 붙이는 습관을 들이십시오.

20. 교실 적용 (Classroom Application)

#오늘 배운 것교실에서
1QQ 최댓값 ≠ 정답알고리즘이 낸 무리를 결론이 아니라 가설로 다룬다. 담임의 관찰과 대조하는 것이 검증이지, QQ가 높다는 건 검증이 아니다
2ARI는 세분을 벌준다알고리즘 무리가 담임의 무리보다 잘게 나왔을 때, 경계를 넘었는지부터 확인. 안 넘었으면 알고리즘이 더 세밀히 본 것
3개인 E-I가 0인 학생3번·10번 같은 학생 — 어느 무리에도 확실히 속하지 않는다. 모둠 배정에서 가장 자유롭고, 동시에 가장 불안정하다. 학기 중 소속이 바뀔 가능성이 높은 학생
433/34가 상한선관계망만으로 못 맞히는 학생이 반드시 있다. 남은 한 명은 더 좋은 알고리즘이 아니라 담임의 관찰이 맞힌다. 도구는 관찰을 대체하지 않는다
5실행마다 결과가 다르다한 번 돌린 그림을 학부모·동료 교사에게 보여 주지 않는다. 100번 돌려 늘 같이 묶이는 쌍만 보고한다
6흔들리는 경계가 다리다소속이 실행마다 바뀌는 학생 = 두 무리를 잇는 학생. 모둠을 섞고 싶을 때 먼저 찾아야 할 사람
7등위성은 역할, 커뮤니티는 소속“이 아이는 어느 무리인가”와 “이 아이는 어떤 역할인가”는 다른 질문. 후자는 무리를 안 봐도 답할 수 있다
8QQ와 고립자지명받지 못한 학생이 많은 학급일수록 QQ저절로 높아진다. 학급 간 QQ 비교는 고립자 수를 맞추지 않으면 의미 없다
9가장 중요한 건 집단 밖무리 분석 보고서의 첫 줄은 “몇 개 무리”가 아니라 “아무에게도 지명받지 못한 학생 n명”이어야 한다. 그리고 그 n명을 성별·다문화·전학 여부로 쪼개 본다
3단계를 통과한 교사가 할 수 있게 된 일
① 설문 → 인접행렬 → 무리 탐지까지 R로 돌린다
② 그 결과를 믿을 만한지 스스로 검사한다 — 시드를 바꿔 보고, 알고리즘을 바꿔 보고, 순도를 재고
③ 학생 속성(성별·학년·다문화)이 무리를 얼마나 설명하는지 rr로 잰다
④ 그리고 가장 먼저 고립자를 센다

④를 ①보다 먼저 하는 것이 실은 더 낫습니다. 도구는 화려하지만 학급에서 가장 급한 정보는 언제나 연결이 하나도 없는 학생의 명단입니다.

21. 연습문제 (Exercises)

연습문제 1 — ARI를 손으로 계산하고, 그 숫자를 의심하기

20명 학급입니다. 담임이 관찰로 나눈 무리(정답지)와 알고리즘이 낸 분할이 다음과 같습니다.
담임 A조담임 B조행 합
알고리즘 C1707
알고리즘 C2066
알고리즘 C3167
열 합81220
(1) ij(nij2)\sum_{ij}\binom{n_{ij}}{2}, i(ai2)\sum_i\binom{a_i}{2}, j(bj2)\sum_j\binom{b_j}{2}, (202)\binom{20}{2}0인 항까지 전부 써서 구하시오.
(2) 기대값과 최댓값을 구하고 ARI를 계산하시오.
(3) 보정하지 않은 랜드 지수 RIRI도 구해 비교하시오.
(4) 이 분할은 담임 분류의 세분입니까? 다수결로 담임 조를 복원하면 몇 명을 맞힙니까?
(5) (2)와 (4)의 숫자가 이렇게 다른 이유를 한 문장으로 쓰시오.
→ 먼저 풀고 §22 해설과 맞춰 볼 것
연습문제 2 — 알고리즘이 오답을 고르게 만들기

10명짜리 네트워크입니다.
  • S1~S4는 서로 전부 친구 (K4K_4, 간선 6개)
  • S5~S9는 서로 전부 친구 (K5K_5, 간선 10개)
  • S10은 S1과 S5, 딱 두 명하고만 친구
전학 기록에 따르면 실제 무리는 A = {S1,…,S4}, B = {S5,…,S10}입니다(S10은 B 소속).

(1) 간선 수 mm과 10명의 차수를 모두 쓰고, 차수 합이 2m2m인지 검산하시오.
(2) 정답 분할의 QQ[mcm(dc2m)2]\left[\frac{m_c}{m}-\left(\frac{d_c}{2m}\right)^2\right] 두 항을 모두 전개해 구하시오. 두 항의 값이 같은지 확인하시오.
(3) S10을 A로 옮긴 분할의 QQ를 같은 방식으로 구하시오.
(4) 모듈러리티를 최대화하는 알고리즘은 둘 중 어느 것을 고릅니까? 그 이유를 차수 합으로 설명하시오.
(5) S10의 개인 E-I를 구하고, 이 문제가 §8의 10번과 같은 구조임을 설명하시오.
→ 먼저 풀고 §22 해설과 맞춰 볼 것

22. 해설과 답 (Solutions)

연습문제 1 해설 (Solution to Exercise 1)

(1) 세 개의 합 — 0인 항까지 전부

① 칸별 — 6개 칸 전부입니다.

nijn_{ij}(nij2)=n(n1)2\binom{n_{ij}}{2}=\frac{n(n-1)}{2}왜 그 값인가
(C1, A)7762\frac{7\cdot 6}{2}21두 분할이 둘 다 같이 묶은 쌍
(C1, B)00(1)2\frac{0\cdot(-1)}{2}0빈 칸
(C2, A)00(1)2\frac{0\cdot(-1)}{2}0빈 칸
(C2, B)6652\frac{6\cdot 5}{2}15둘 다 같이 묶은 쌍
(C3, A)1102\frac{1\cdot 0}{2}0혼자라 쌍이 안 생김
(C3, B)6652\frac{6\cdot 5}{2}15둘 다 같이 묶은 쌍
ij(nij2)\sum_{ij}\binom{n_{ij}}{2}5121+0+0+15+0+15

② 행 합 (알고리즘이 같이 묶은 쌍)

aia_i(ai2)\binom{a_i}{2}
C17762\frac{7\cdot 6}{2}21
C26652\frac{6\cdot 5}{2}15
C37762\frac{7\cdot 6}{2}21
57

③ 열 합 (담임이 같이 묶은 쌍)

bjb_j(bj2)\binom{b_j}{2}
A조8872\frac{8\cdot 7}{2}28
B조1212112\frac{12\cdot 11}{2}66
94

(202)=20192=190\binom{20}{2}=\dfrac{20\cdot 19}{2}=\boxed{190}

(2) 기대·최대·ARI

부분
관측5151
기대57×94190=5358190\dfrac{57\times 94}{190}=\dfrac{5358}{190}28.200000
최대57+942=1512\dfrac{57+94}{2}=\dfrac{151}{2}75.5
ARI5128.275.528.2=22.847.3\dfrac{51-28.2}{75.5-28.2}=\dfrac{22.8}{47.3}0.482030
답 (2) ARI=0.482030ARI = 0.482030
값의 의미: 우연히 맞을 몫(28.2쌍)을 빼고 나면, 완전일치까지 갈 거리(47.3쌍) 중 22.8쌍만큼 왔다는 뜻입니다. 절반이 채 안 됩니다.

(3) 보정하지 않은 랜드 지수

RIRI는 “같이 묶은 쌍이 일치” + “따로 묶은 쌍이 일치”를 전체 쌍으로 나눈 것입니다.

RI=51둘 다 같이+(1905794+51)둘 다 따로190=51+90190=141190=0.742105 RI=\frac{\overbrace{51}^{\text{둘 다 같이}}+\overbrace{(190-57-94+51)}^{\text{둘 다 따로}}}{190} =\frac{51+90}{190}=\frac{141}{190}=0.742105
답 (3) RI=0.742105RI = 0.742105 vs ARI=0.482030ARI = 0.482030
0.74와 0.48. RIRI는 “둘 다 따로 묶었다”는 이유로 90쌍을 공짜로 맞다고 세어 줍니다. 집단이 여러 개면 대부분의 쌍은 저절로 “따로”가 되므로 RIRI거의 항상 후하게 나옵니다. 그래서 논문·보고서에서 RIRI만 제시된 수치는 신뢰하지 마십시오.

(4) 세분인가? 다수결 복원은?

집단구성경계를 넘었나다수결 배정맞힌 인원
C1A 7명, B 0명아니오 — A에 완전히 들어감A7
C2A 0명, B 6명아니오 — B에 완전히 들어감B6
C3A 1명, B 6명 — A 학생 1명이 섞임B6
합계19 / 20
답 (4) 세분이 아닙니다(C3가 경계를 넘음). 다만 넘은 것은 단 1명이라 다수결 복원 정확도는 19/20 = 0.95입니다.

(5) 두 숫자가 다른 이유

답 (5) ARI 0.48은 “틀렸다”가 아니라 “더 잘게 나눴다”를 재고 있기 때문입니다.

자세히 보면: 담임의 B조 12명을 알고리즘이 C2(6명)와 C3(6명)로 쪼갰습니다. 그 사이 6×6=366\times 6=36쌍이 ARI 입장에서는 전부 불일치입니다. 반면 진짜 오류 — A조 학생 1명이 C3에 섞인 것 — 은 그 학생이 관련된 쌍 몇 개에만 영향을 줍니다.

ARI가 감점한 것의 대부분은 오류가 아니라 세분입니다. 그래서 §11에서 배운 대로 ARI 하나로 결론 내리면 안 되고, “경계를 넘었는가”를 따로 확인해야 합니다.
교실 해석 — 이 결과를 담임에게 이렇게 보고합니다.
“알고리즘은 선생님이 보신 B조 12명을 두 무리로 다시 나눴습니다. 선생님 분류와 어긋난 학생은 딱 한 명입니다. 그 학생이 누구인지, 왜 C3에 붙었는지 살펴보시고, B조를 둘로 나눠 볼 만한지도 판단해 주십시오.”

“일치도 0.48”이라고만 보고하면 담임은 알고리즘을 버릴 것이고, 실제로 유용한 정보 두 개(B조가 사실 두 무리일 가능성 / 애매한 학생 1명)를 놓칩니다.

연습문제 2 해설 (Solution to Exercise 2)

(1) 간선과 차수

간선 묶음개수내역
K4K_4 (S1~S4)6(42)=6\binom{4}{2}=6: 12,13,14,23,24,34
K5K_5 (S5~S9)10(52)=10\binom{5}{2}=10: 56,57,58,59,67,68,69,78,79,89
S10의 간선2S1–S10, S5–S10
mm182m=362m=36
정점S1S2S3S4S5S6S7S8S9S10
차수4333544442
답 (1) m=18m=18, 차수 합 =4+3+3+3+5+4+4+4+4+2=36=2m=4+3+3+3+5+4+4+4+4+2=36=2m
S1은 K4K_4 안에서 3 + S10과 1 = 4. S5는 K5K_5 안에서 4 + S10과 1 = 5.

(2) 정답 분할 QQ

A = {S1,S2,S3,S4}, B = {S5,…,S10}. S10이 B이므로 S5–S10은 B 안쪽, S1–S10만 교차입니다.

집단인원안쪽 간선 mcm_c차수 합 dcd_c
A46  (K4K_4)4+3+3+3=134+3+3+3=13
B611  (K5K_5 10 + S5–S10)5+4+4+4+4+2=235+4+4+4+4+2=23
검산106+11+1교차=186+11+\underbrace{1}_{\text{교차}}=1813+23=3613+23=36
집단mcm\dfrac{m_c}{m}dc2m\dfrac{d_c}{2m}(dc2m)2\left(\dfrac{d_c}{2m}\right)^{2}
A618=0.3333333\dfrac{6}{18}=0.33333331336=0.3611111\dfrac{13}{36}=0.36111110.13040120.13040120.20293210.2029321
B1118=0.6111111\dfrac{11}{18}=0.61111112336=0.6388889\dfrac{23}{36}=0.63888890.40817900.40817900.20293210.2029321
QQ0.40586420.4058642
답 (2) Q정답=0.4058642Q_{\text{정답}} = 0.4058642. 두 항이 소수점 일곱 자리까지 같습니다 — §7에서 증명한 대로 2집단 분할에서는 언제나 그렇습니다.

(3) S10을 A로 옮긴 분할

이제 S1–S10이 A 안쪽, S5–S10이 교차가 됩니다.

무엇이 바뀌나정답S10 이동 후
간선 S1–S10교차A 안쪽
간선 S5–S10B 안쪽교차
교차 간선 수11 (그대로)
mA,  mBm_A,\;m_B6, 117, 10
dA,  dBd_A,\;d_B13, 2315, 21
집단mcm\dfrac{m_c}{m}dc2m\dfrac{d_c}{2m}(dc2m)2\left(\dfrac{d_c}{2m}\right)^{2}
A′718=0.3888889\dfrac{7}{18}=0.38888891536=0.4166667\dfrac{15}{36}=0.41666670.17361110.17361110.21527780.2152778
B′1018=0.5555556\dfrac{10}{18}=0.55555562136=0.5833333\dfrac{21}{36}=0.58333330.34027780.34027780.21527780.2152778
QQ0.43055560.4305556
답 (3) Q이동=0.4305556Q_{\text{이동}} = 0.4305556

(4) 알고리즘은 무엇을 고르는가

Q이동Q정답=0.43055560.4058642=+0.0246914  >  0 Q_{\text{이동}}-Q_{\text{정답}} = 0.4305556 - 0.4058642 = +0.0246914 \;>\;0
답 (4) 알고리즘은 오답(S10을 A로)을 고릅니다. 실제로 Louvain을 300회 돌리면 최대 QQ가 정확히 0.4305556이고, 그 분할이 바로 S10을 A에 넣은 것입니다. 최소절단(S1–S5 기준)도 똑같이 S10을 A쪽에 둡니다.

차수 합으로 본 이유: 교차 간선 수는 1로 변하지 않습니다(잃는 만큼 얻으므로). 그러니 QQ를 가르는 건 벌점 (dc/2m)2\sum(d_c/2m)^2뿐입니다. 정답: (1336)2+(2336)2=0.1304+0.4082=0.5386 \text{정답: } \left(\tfrac{13}{36}\right)^2+\left(\tfrac{23}{36}\right)^2 = 0.1304+0.4082 = 0.5386 이동: (1536)2+(2136)2=0.1736+0.3403=0.5139 \text{이동: } \left(\tfrac{15}{36}\right)^2+\left(\tfrac{21}{36}\right)^2 = 0.1736+0.3403 = 0.5139 차수 합이 13:23에서 15:21로 더 균형이 되면서 벌점이 0.0247 줄었고, 안쪽 간선 항은 6+1118=1718\frac{6+11}{18}=\frac{17}{18}양쪽 다 똑같아 상쇄됩니다. 남는 것은 벌점 차이뿐 — 그래서 오답이 이깁니다.

x2+(1x)2x^2+(1-x)^2x=12x=\frac12에서 최소이므로 모듈러리티는 언제나 “차수 합이 반반인 분할”을 편애합니다.

(5) S10의 개인 E-I와 §8과의 관계

S10의 이웃은 S1(A, 진영 밖)과 S5(B, 진영 안), 각 1명입니다.

EIS10=ELS10ILS10ELS10+ILS10=111+1=02=0 EI_{S10}=\frac{EL_{S10}-IL_{S10}}{EL_{S10}+IL_{S10}}=\frac{1-1}{1+1}=\frac{0}{2}=\boxed{0}
답 (5) EIS10=0EI_{S10}=0완전히 반반입니다.

가라테의 10번과 똑같은 구조입니다. 10번의 이웃도 3번(진영 1)과 34번(진영 2) 딱 둘이었고, 개인 E-I가 0이었고, 옮겨도 교차 간선 수가 안 변했고, 옮기면 차수 합이 균형이 되면서 QQ가 올라갔습니다.

일반 규칙: 개인 E-I가 0인 정점은 ① 절단 크기로 구별 불가(잃는 만큼 얻음) ② QQ로는 차수 균형만으로 결정 ③ 따라서 알고리즘이 그 사람을 어디에 두는지는 사회적 사실이 아니라 공식의 성질입니다.

차이는 크기뿐입니다. 가라테는 78개 간선짜리라 QQ 차이가 +0.000329+0.000329로 넷째 자리에서 갈렸지만, 이 10명짜리 망은 +0.0247+0.0247로 둘째 자리에서 갈립니다. 작은 망일수록 이 편향이 크게 나타납니다 — 그리고 우리 반은 25~30명입니다.
교실 해석 — S10 같은 학생을 보고서에 이렇게 씁니다.
“S10은 A무리의 S1, B무리의 S5와 각각 한 명씩만 친구입니다. 알고리즘은 S10을 A무리로 분류했지만, 이는 관계 자료가 아니라 계산 방식 때문입니다. S10의 소속은 관찰로 확인해 주십시오.”

그리고 모둠을 짤 때 S10은 어느 모둠에 넣어도 되는 학생이자 양쪽 모두와 약하게만 연결된 학생입니다. 자유롭게 배치할 수 있다는 뜻이기도 하고, 어느 쪽에서도 깊이 받아들여지지 않았다는 뜻이기도 합니다. 두 해석 중 어느 쪽인지는 네트워크가 답하지 못합니다.