단원 3-8Predicting the Karate Club Split and Subgroups in FMH High
실전 — 가라테 분열 예측과 FMH 고교 하위집단
3단계에서 만든 도구를 정답지가 있는 네트워크에 전부 던져 보고 채점한다. 그리고 정답지가 없을 때 무엇을 믿어야 하는지를 배운다.
오늘의 결론을 미리 말하면 — 가장 높은 점수를 받은 분할이 정답이 아니고, 가장 낮은 점수를 받은 분할이 정답을 통째로 품고 있다.
- 지난 시간 연습문제 확인 (Review)
- 오늘의 질문: 정답지가 있는 네트워크 (A Network with an Answer Key)
- 데이터와 정답지 (The Data and the Answer Key)
- 예측 도구 ① 최소절단 — Zachary의 원래 방법 (Minimum Cut)
- 예측 도구 ② Fiedler 벡터 (Spectral Bisection)
- 예측 도구 ③ 커뮤니티 탐지 (Community Detection)
- 손 계산 — 실제 분할의 모듈러리티 (Modularity of the True Split)
- 손 계산 — 10번을 옮기면 가 오른다 (Moving Node 10 Raises Q)
- 채점 도구: ARI 손 계산 (Adjusted Rand Index by Hand)
- 채점표 — 여덟 가지 방법 전면 대조 (The Scoreboard)
- 함정 ①: ARI는 ‘세분’을 벌준다 (ARI Penalizes Refinement)
- 틀린 정점들의 정체 (Who the Misclassified Nodes Are)
- 함정 ②: 같은 알고리즘이 매번 다른 답을 준다 (Stochastic Algorithms)
- 3단계 도구 전부로 본 가라테 (All Stage-3 Tools on the Karate Club)
- 정답지가 없는 네트워크: FMH 고교 (A Network Without an Answer Key)
- FMH 하위집단 — 21개 집단은 학년의 세분인가 (Are the 21 Communities a Refinement of Grade?)
- 정답지가 없을 때 무엇을 믿는가: 합의 (Consensus)
- 가장 중요한 발견은 집단 밖에 있었다 (The Most Important Finding Was Outside the Groups)
- R 검증 (R Verification)
- 교실 적용 (Classroom Application)
- 연습문제 (Exercises)
- 해설과 답 (Solutions)
1. 지난 시간 연습문제 확인 (Review of Last Session's Exercises)
연습문제 1 — 12명 학급의 E-I와 (Exercise 1: E-I and Assortativity in a Class of 12)
남 S1–S5, 여 S6–S12, 간선 14개였습니다.
| 항목 | 값 | 어떻게 |
|---|---|---|
| 내부 간선 | 12 | 남남 5 + 여여 7 |
| 외부 간선 | 2 | S3–S6, S5–S9 |
| 전체 E-I | ||
| 남학생 E-I (n=5) | 기대 → 낙차 | |
| 여학생 E-I (n=7) | 기대 → 낙차 | |
| 차수합 / | ||
| 0.7083 | 정의식·항등식·assortativity_nominal 모두 일치 |
개인별로 인 학생은 S5 하나지만 차수가 2뿐이라 이성 친구가 1명입니다. 가장 좋은 다리는 인 S3 — 차수 4를 쥐고 있으니까요. 개인 E-I는 반드시 차수와 함께 읽는다가 그 문제의 교훈이었습니다.
연습문제 2 — 30명 학급의 전학생 3명 (Exercise 2: Three Transfer Students in a Class of 30)
내부 1개, 외부 14개 → 관측 . 그런데 3명 집단의 기대값은
관측이 기대보다 낮습니다. 담임의 “양수니까 잘 융화됐다”는 해석은 틀렸고, 안쪽 밀도 이 바깥쪽 의 약 1.9배라 오히려 더 뭉쳐 있습니다. 기대 E-I가 0이 되는 지점은 — 까지는 로 양수, 부터 으로 음수입니다.
2. 오늘의 질문: 정답지가 있는 네트워크 (Today's Question: A Network with an Answer Key)
3단계에서 우리는 하위집단을 찾는 도구를 여덟 개쯤 만들었습니다.
| 단원 | 도구 | 답하는 질문 |
|---|---|---|
| 3-1 | 클리크 (clique) | 서로 전부 아는 사람들의 뭉치는? |
| 3-2 | -코어, -클리크, -플렉스 | 조금 느슨하게 봐도 뭉치는가? |
| 3-3 | 모듈러리티 | 이 분할은 몇 점짜리인가? |
| 3-4 | 커뮤니티 탐지 알고리즘 | 가 높은 분할을 어떻게 찾는가? |
| 3-5 | 구조적 등위성 (structural equivalence) | 누가 누구와 같은 자리에 있는가? |
| 3-6 | 이분 네트워크와 투영 | 소속에서 관계를 어떻게 뽑아내는가? |
| 3-7 | E-I 지수, 동류성 | 라벨이 관계를 얼마나 설명하는가? |
여기엔 한 가지가 통째로 빠져 있습니다. 이 도구들이 맞기는 하는가?
지금까지는 답을 낼 수 없었습니다. 우리 반 무리 구조에 “정답지”가 없으니까요. 알고리즘이 “S1~S3이 한 무리”라고 해도, 그게 맞는지 틀린지 검증할 외부 기준이 없습니다. 는 알고리즘이 스스로 매기는 점수이지, 정답과의 거리가 아닙니다.
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 – 9 | 1↔2 | 3 – 28 | 1↔2 |
| 1 – 32 | 1↔2 | 3 – 29 | 1↔2 |
| 2 – 31 | 1↔2 | 3 – 33 | 1↔2 |
| 3 – 9 | 1↔2 | 14 – 34 | 1↔2 |
| 3 – 10 | 1↔2 | 20 – 34 | 1↔2 |
단원 3-7의 도구를 이 정답지에 그대로 적용하면:
| E-I | |||||
|---|---|---|---|---|---|
| 68 | 10 | 0.500329 | 0.7434 |
두 진영의 차수합이 76 : 80으로 거의 같아서 기준선 이 사실상 0입니다. 그래서 이 데이터에서만은 E-I의 크기와 이 거의 같은 값이 됩니다(0.7436 vs 0.7434). 단원 3-7 §12의 항등식
4. 예측 도구 ① 최소절단 — Zachary의 원래 방법 (Minimum Cut)
Zachary 자신이 1977년 논문에서 쓴 방법은 커뮤니티 탐지가 아니었습니다(그런 건 아직 없었습니다). 그는 최대유량–최소절단을 썼습니다. 발상은 단순합니다.
그렇게 끊었을 때 각자에게 남는 쪽이 그 사람의 진영이다.
정보(혹은 갈등)가 간선을 따라 흐른다고 보면, 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–34 | 1–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.
| 분할 | 교차 간선 | ARI | |
|---|---|---|---|
| 정답 (3번은 진영1, 10번은 진영2) | 10 | 0.371466 | 1.0000 |
| 3번을 진영2로 | 10 | 0.359961 | 0.8823 |
| 10번을 진영1로 (R이 고른 것) | 10 | 0.371795 | 0.8823 |
| 둘 다 옮김 | 12 | 0.337936 | 0.7717 |
5. 예측 도구 ② Fiedler 벡터 (Spectral Bisection and the Fiedler Vector)
두 번째 방법은 대수적입니다. 라플라시안 행렬을 만듭니다.
즉 , 면 . 이 행렬의 성질:
- 모든 행의 합이 0 → 이 고유값 0의 고유벡터. 항상 있습니다.
- 고유값 0의 중복도가 컴포넌트 개수. 가라테는 연결되어 있으니 0이 하나뿐.
- 두 번째로 작은 고유값 를 대수적 연결도라 하고, 그 고유벡터를 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
. Fiedler 벡터는 34명에게 실수 하나씩을 붙여 줍니다. 부호로 나누면 이분할이 됩니다.
| 정점 | 17 | 6, 7 | 5, 11 | 1 | 2 | 3 | 14 | 20 | 9 | 10 | 27 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Fiedler 값 | |||||||||||
| 실제 진영 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 2 | 2 | 2 |
부호 분할의 정확도도 33/34. 다만 이번에 틀린 것은 10번이 아니라 3번입니다.
6. 예측 도구 ③ 커뮤니티 탐지 (Community Detection)
단원 3-4의 알고리즘들을 그대로 돌립니다. 이들은 진영을 2개로 나누라는 말을 듣지 않았으므로 자기가 좋다고 생각하는 개수로 나눕니다.
| 알고리즘 | 집단 수 | ARI | |
|---|---|---|---|
| Girvan-Newman | 5 | 0.4013 | 0.4686 |
| Louvain (최대 ) | 4 | 0.4198 | 0.5414 |
| walktrap | 5 | 0.3532 | 0.3331 |
| fast greedy | 3 | 0.3807 | 0.6803 |
| infomap | 3 | 0.4020 | 0.7022 |
| label propagation (운 좋은 실행) | 2 | 0.3715 | 1.0000 |
| [정답] 실제 분열 | 2 | 0.3715 | 1.0000 |
계층적 알고리즘(GN, walktrap, fast greedy)은 cut_at(no=2)로 2집단에서 잘라 정답과
1:1로 대조할 수 있습니다. 그 결과는 §10 채점표에 모았습니다.
7. 손 계산 — 실제 분할의 모듈러리티 (Modularity of the True Split)
단원 3-3에서 쓴 형태를 그대로 씁니다.
= 집단 안쪽 간선 수, = 집단 구성원의 차수 합, , .
부품 세기 (Counting the Pieces)
| 집단 | 인원 | 안쪽 간선 | 차수 합 |
|---|---|---|---|
| 진영 1 | 16 | 33 | 76 |
| 진영 2 | 18 | 35 | 80 |
| 검산 | 34 | 33+35+10=78 ✓ | 76+80=156=2m ✓ |
항을 전부 전개 (Every Term Expanded)
| 집단 | 차 | |||
|---|---|---|---|---|
| 진영 1 | ||||
| 진영 2 | ||||
| 합계 | ||||
를 교차 간선 수라 하면 이므로 . 따라서 이고 이는 와 정확히 같습니다. 두 차의 차이가 0 → 이분할의 는 언제나 한 집단 기여의 정확히 두 배.
이 축약형을 쓰면 검산이 한 줄입니다.
8. 손 계산 — 10번을 옮기면 가 오른다 (Moving Node 10 Raises Q)
이제 §4에서 R이 고른 오답(10번을 진영 1로)의 를 같은 방식으로 계산합니다. 10번의 이웃은 3번(진영 1)과 34번(진영 2), 딱 둘입니다.
| 무엇이 바뀌나 | 정답 | 10번 이동 후 |
|---|---|---|
| 간선 3–10 | 교차 | 진영 1 안쪽 |
| 간선 10–34 | 진영 2 안쪽 | 교차 |
| 교차 간선 수 | 10 | 10 (그대로) |
| 33 | 34 (+1) | |
| 35 | 34 () | |
| 76 | 78 (+2, 10번 차수) | |
| 80 | 78 () |
축약형에 넣습니다. 차수합이 78 : 78로 정확히 반반이 되었다는 데 주목하세요.
| 분할 | 차 | 차 | ||
|---|---|---|---|---|
| 정답 | 0.185733 | |||
| 10번 이동 | 0.185897 | |||
| 차이 | ||||
왜 그런가: 10번을 옮기면 안쪽 간선은 1개 줄지만(35→34, 두 번째 집단 기준), 차수합이 76:80에서 78:78로 완벽히 균형이 되면서 귀무 모형의 벌점 의 합이 더 크게 줄어듭니다. 은 에서 최소이니까요.
모듈러리티는 “집단이 균형 있게 나뉜 분할”을 좋아합니다. 그건 사회적 사실이 아니라 공식의 성질입니다. 그리고 그 성질이 여기서 정답을 밀어내고 있습니다.
9. 채점 도구: ARI 손 계산 (Adjusted Rand Index by Hand)
지금까지 compare(..., method="adjusted.rand")를 여러 단원에서 그냥 써 왔습니다.
오늘은 손으로 계산합니다. 정답지가 있는 오늘이 적기입니다.
9-1. 발상: 쌍(pair)을 세는 것 (The Idea: Counting Pairs)
두 분할이 얼마나 비슷한지를 재는 방법은 여러 가지지만, ARI는 학생 쌍을 셉니다. 34명이면 쌍은 개. 각 쌍마다 묻습니다 — 두 분할이 이 쌍을 같은 취급 했는가?
“같은 취급”은 둘 다 같은 집단에 넣었다 또는 둘 다 다른 집단에 넣었다입니다. 그 비율이 랜드 지수 . 문제는 가 우연히도 높게 나온다는 것 — 단원 3-7의 기준선 문제가 그대로 반복됩니다. 그래서 ARI는 관측 − 기대를 최대 − 기대로 나눕니다.
| 지표 | 관측 | 기대(우연) | 정규화 |
|---|---|---|---|
| (3-3) | 없음(빼기만) | ||
| (3-7) | 로 나눔 | ||
| ARI (오늘) | 기대 |
9-2. 교차표 만들기 — Girvan-Newman(2집단) vs 정답 (Building the Contingency Table)
GN을 2집단에서 자른 결과와 정답을 표로 교차시킵니다. = 예측 이면서 실제 인 사람 수.
| 실제 진영 1 | 실제 진영 2 | 행 합 | |
|---|---|---|---|
| 예측 집단 1 | 15 | 0 | 15 |
| 예측 집단 2 | 1 | 18 | 19 |
| 열 합 | 16 | 18 | 34 |
빨간 칸의 1명이 3번입니다(GN은 3번을 Officer 쪽으로 보냄).
9-3. 세 개의 합을 0인 항까지 전부 전개 (Three Sums, Every Term Included)
① 칸별 합 — 4개 칸 전부, 과 도 생략하지 않습니다.
| 칸 | 값 | 왜 그 값인가 | ||
|---|---|---|---|---|
| (1,1) | 15 | 105 | 두 분할이 둘 다 같이 묶은 쌍 | |
| (1,2) | 0 | 0 | 예측1 ∩ 실제2 = 공집합 | |
| (2,1) | 1 | 0 | 3번 혼자라 쌍이 안 생김 | |
| (2,2) | 18 | 153 | 둘 다 같이 묶은 쌍 | |
| 258 | 105+0+0+153 | |||
② 행 합 — 예측 분할이 같이 묶은 쌍의 총수.
| 행 | 값 | ||
|---|---|---|---|
| 예측 집단 1 | 15 | 105 | |
| 예측 집단 2 | 19 | 171 | |
| 276 | |||
③ 열 합 — 정답 분할이 같이 묶은 쌍의 총수.
| 열 | 값 | ||
|---|---|---|---|
| 실제 진영 1 | 16 | 120 | |
| 실제 진영 2 | 18 | 153 | |
| 273 | |||
④ 전체 쌍: .
9-4. 조립 (Putting It Together)
| 부분 | 식 | 값 |
|---|---|---|
| 관측 | 258 | |
| 기대(우연) | 134.310160 | |
| 최대(완전일치) | 274.5 | |
| ARI | 0.882302 |
compare(gn2, truth, method="adjusted.rand")
[1] 0.882302
0.94 vs 0.88 — 한 명 틀린 것치고는 가 너무 후합니다. 쌍의 대부분은 “둘 다 다른 집단”이라 그냥 맞기 때문입니다. ARI가 그 공짜 점수를 걷어냅니다.
10. 채점표 — 여덟 가지 방법 전면 대조 (The Scoreboard)
| 방법 | 집단 수 | ARI | 진영 경계를 넘었나 | 진영 복원 정확도 | 넘은 정점 | |
|---|---|---|---|---|---|---|
| 최소절단 (1–34) | 2 | 0.3718 | 0.8823 | 예 | 33/34 | 10 |
| Fiedler 부호 | 2 | 0.3600 | 0.8823 | 예 | 33/34 | 3 |
| Girvan-Newman (2로 자름) | 2 | 0.3600 | 0.8823 | 예 | 33/34 | 3 |
| walktrap (2로 자름) | 2 | 0.3352 | 0.7718 | 예 | 32/34 | 3, 14 |
| fast greedy (2로 자름) | 2 | 0.3718 | 0.8823 | 예 | 33/34 | 10 |
| fast greedy (원본 3집단) | 3 | 0.3807 | 0.6803 | 예 | 33/34 | 10 |
| infomap (3집단) | 3 | 0.4020 | 0.7022 | 예 | 33/34 | 10 |
| Louvain 최대 (4집단) | 4 | 0.4198 | 0.5414 | 아니오 | 34/34 | 없음 |
| [정답] 실제 분열 | 2 | 0.3715 | 1.0000 | — | 34/34 | — |
그리고 정답(빨간 마름모)은 로 보면 한가운데에 있습니다. 현실의 분열은 모듈러리티를 최대화하지 않았습니다.
참고로 정답 분할이 형편없는 것은 아닙니다. 무작위 2분할 20,000개를 만들어 를 재면 평균 , 최댓값 이고, 정답 분할의 는 20,000개 전부보다 높습니다. “가 의미 없다”가 아니라 “의 최댓값이 곧 진실은 아니다”입니다.
11. 함정 ①: ARI는 ‘세분’을 벌준다 (ARI Penalizes Refinement)
채점표에서 가장 이상한 줄은 Louvain입니다. ARI 0.5414로 꼴찌인데 진영 복원은 34/34, 만점입니다. 어떻게 둘 다 참일 수 있을까요?
| Louvain 집단 | 인원 | 구성원 | 실제 진영 |
|---|---|---|---|
| C1 | 11 | 1 2 3 4 8 12 13 14 18 20 22 | 전원 진영 1 |
| C2 | 5 | 5 6 7 11 17 | 전원 진영 1 |
| C3 | 12 | 9 10 15 16 19 21 23 27 30 31 33 34 | 전원 진영 2 |
| C4 | 6 | 24 25 26 28 29 32 | 전원 진영 2 |
는 정확히 진영 1 16명 전원, 는 정확히 진영 2 18명 전원. Louvain은 진영 경계를 단 한 번도 넘지 않았습니다. 다만 각 진영을 둘로 더 쪼갰을 뿐입니다. 이런 관계를 세분(refinement)이라고 합니다.
같은 진영의 두 사람을 다른 집단에 넣으면, ARI 입장에서는 틀린 쌍입니다. Louvain은 – 사이 쌍과 – 사이 쌍, 합쳐서 127쌍을 “다른 집단”으로 처리했고 그만큼 감점되었습니다. 반면 3번 한 명을 진영 너머로 보낸 GN은 감점이 훨씬 적습니다.
그래서 채점은 두 가지를 해야 합니다.
| 질문 | 도구 | 답 |
|---|---|---|
| 분할이 정답과 얼마나 같은가? | ARI, NMI | Louvain 0.54 — 낮음 |
| 정답의 경계를 넘은 집단이 있는가? | 집단별 순도 검사 | Louvain 0개 — 완벽 |
12. 틀린 정점들의 정체 (Who the Misclassified Nodes Are)
여덟 가지 방법이 틀린 정점은 딱 세 개뿐입니다 — 3번, 10번, 14번. 누구인지 봅시다.
| 정점 | 차수 | 실제 진영 | 진영 안 친구 | 진영 밖 친구 | 개인 E-I (3-7) | Fiedler | 누가 틀렸나 |
|---|---|---|---|---|---|---|---|
| 3 | 10 | 1 | 5 | 5 | 0.000 | Fiedler, GN, walktrap | |
| 10 | 2 | 2 | 1 | 1 | 0.000 | 최소절단, fast greedy, infomap | |
| 14 | 5 | 1 | 4 | 1 | walktrap | ||
| 20 | 3 | 1 | 2 | 1 | (아무도 안 틀림 — 아슬아슬) | ||
| 9 | 5 | 2 | 3 | 2 | (아무도 안 틀림) | ||
| 1 | 16 | 1 | 14 | 2 | — | ||
| 34 | 17 | 2 | 15 | 2 | — |
3번: 진영 안 5명, 진영 밖 5명. 정확히 반반.
10번: 진영 안 1명, 진영 밖 1명. 정확히 반반.
14번·20번: 4:1, 2:1로 기울어 있지만 Fiedler 값이 미만 — 이웃들이 서로 밀고 당깁니다.
어떤 알고리즘도 이들을 구조만으로 맞힐 수 없습니다. 방법마다 답이 다른 것은 알고리즘의 실력 차가 아니라 동점을 깨는 방식의 차이입니다.
이것이 오늘의 가장 정직한 결론입니다. 33/34가 이 데이터의 사실상 상한선입니다. 남은 한 명은 더 좋은 알고리즘으로 맞히는 게 아니라 더 많은 정보로 맞혀야 합니다.
13. 함정 ②: 같은 알고리즘이 매번 다른 답을 준다 (Stochastic Algorithms)
여기서 실무에서 제일 자주 사고가 나는 지점을 짚습니다. 단원 3-4에서 배운 알고리즘 중 일부는 난수를 씁니다. 같은 데이터, 같은 함수인데 실행할 때마다 결과가 달라집니다.
가라테 클럽에 100번씩 돌린 결과입니다.
| 알고리즘 | 범위 | ARI 범위 | 집단 수 분포 |
|---|---|---|---|
| Louvain | 0.3886 ~ 0.4198 | 0.4397 ~ 0.6445 | 4집단 99회, 3집단 1회 |
| label propagation | 0.0000 ~ 0.4156 | 0.0000 ~ 1.0000 | 1집단 4회, 2집단 48회, 3집단 39회, 4집단 9회 |
| infomap | 0.4020 (고정) | 0.7022 (고정) | 3집단 100회 |
결정적(deterministic)인 것들 — Girvan-Newman, walktrap, fast greedy, Fiedler, 최소절단 — 은 몇 번을 돌려도 같은 답입니다. 문제는 Louvain과 label propagation입니다.
즉 “가장 단순하고 가장 불안정한 알고리즘만이 정답 그 자체를 뽑아낸 적이 있다”는 얘기가 됩니다. 하지만 정답지가 없으면 그 118번을 골라낼 방법이 없습니다. 운이 좋았다는 걸 알 길이 없으니까요.
실무 지침은 셋입니다.
| # | 지침 | 이유 |
|---|---|---|
| 1 | set.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 안에 완전히 들어 있습니다.
14-2. -코어 (3-2) (k-Cores)
| 코어 | 1 | 2 | 3 | 4 |
|---|---|---|---|---|
| 인원 | 1 | 11 | 12 | 10 |
최대 코어는 4-코어 10명: 1 2 3 4 8 9 14 31 33 34. 진영 1이 6명, 진영 2가 4명으로 양쪽이 섞여 있습니다. -코어는 “누가 중심에 있는가”를 말하지 “어느 편인가”는 말하지 않습니다. 당연합니다 — 코어는 차수 기반이라 진영과 무관합니다.
14-3. 구조적 등위성 (3-5) (Structural Equivalence)
인접행렬 행·열을 붙여 유클리드 거리로 묶으면(단원 3-5 방식):
| 블록 수 | ARI(진영) | 블록 구성 | |
|---|---|---|---|
| 2 | 32명 / 2명 | ||
| 3 | 0.0024 | 2 / 30 / 2 | |
| 4 | 0.0102 | {1,2} / {3} / {4…32의 29명} / {33,34} |
등위성은 ‘역할’을 찾았습니다. 커뮤니티는 ‘소속’을 찾습니다. 같은 데이터에 같은 이름(“하위집단”)을 붙여도 다른 질문에 답하는 것입니다. 단원 3-5의 그 구별이 여기서 숫자로 확인됩니다.
14-4. 매개 중심성 (2-3) — 다리는 누구인가 (Betweenness: Who Is the Bridge)
| 정점 | 1 | 34 | 33 | 3 | 32 | 9 | 2 | 14 |
|---|---|---|---|---|---|---|---|---|
| 매개 | 231.07 | 160.55 | 76.69 | 75.85 | 73.01 | 29.53 | 28.48 | 24.22 |
| 차수 | 16 | 17 | 12 | 10 | 6 | 5 | 9 | 5 |
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입니다.
정직하게 짚을 것:
faux.magnolia.high는 실제 학교 데이터가 아니라
AddHealth 자료에 맞춘 ERGM으로 모의 생성한 망입니다. 그래서 실제 학교보다
사슬형 구조가 과장되어 있고, 고립자 비율도 “친구를 최대 몇 명까지 적어라”라는
설문 설계의 영향을 받습니다. 아래 수치들을 실제 학교의 값으로 읽지는 마십시오.
도구의 작동 방식을 보려고 쓰는 데이터입니다.
클리크와 코어를 먼저 봅니다(단원 3-1, 3-2).
| 도구 | 결과 | 읽기 |
|---|---|---|
| -코어 | 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?)
커뮤니티 탐지를 돌립니다. 먼저 전체 망에 그대로 돌리면 이런 일이 벌어집니다.
| 알고리즘 | 집단 수 | ARI(학년) | |
|---|---|---|---|
| Louvain (전체 망) | 677 | 0.9512 | 0.0327 |
| fast greedy (전체 망) | 677 | 0.9523 | 0.0304 |
를 보고할 때는 반드시 고립자 처리 방식을 함께 적어야 합니다.
거대 컴포넌트(439명)만 떼어 다시 돌립니다.
| 알고리즘 | 집단 수 | ARI(학년) | 최대 집단 | 중앙 크기 | |
|---|---|---|---|---|---|
| Louvain | 21 | 0.8969 | 0.1913 | 42명 | 20 |
| fast greedy | 21 | 0.8990 | 0.1899 | 42명 | 21 |
| walktrap | 44 | 0.8593 | 0.1587 | 41명 | 5.5 |
| infomap | 73 | 0.8269 | 0.0870 | 14명 | 5 |
| 학년 분할 자체 | 6 | 0.6632 | 1.0000 | — | — |
ARI(학년)가 0.19밖에 안 됩니다. 가라테에서 배운 대로, ARI가 낮다고 곧바로 틀린 건 아닙니다. 세분인지 확인해야 합니다. 21개 집단의 학년 구성을 봅니다.
| 집단 | 인원 | 주 학년 | 순도 | 학년 구성 |
|---|---|---|---|---|
| 13 | 28 | 7 | 1.000 | 7학년 28 |
| 21 | 9 | 8 | 1.000 | 8학년 9 |
| 19 | 16 | 8 | 0.938 | 7:1 8:15 |
| 14 | 20 | 8 | 0.900 | 8:18 12:2 |
| 3 | 27 | 11 | 0.889 | 10:3 11:24 |
| 4 | 18 | 10 | 0.889 | 8:1 9:1 10:16 |
| 12 | 16 | 7 | 0.875 | 7:14 8:2 |
| 5 | 11 | 10 | 0.818 | 10:9 11:2 |
| 20 | 20 | 11 | 0.800 | 8:2 9:1 10:1 11:16 |
| 17 | 22 | 8 | 0.773 | 7:2 8:17 9:3 |
| 16 | 15 | 9 | 0.733 | 8:1 9:11 10:2 12:1 |
| 7 | 21 | 9 | 0.714 | 9:15 12:6 |
| 8 | 42 | 10 | 0.690 | 9:2 10:29 11:8 12:3 |
| 1 | 34 | 8 | 0.676 | 7:5 8:23 9:1 10:5 |
| 2 | 24 | 8 | 0.667 | 7:1 8:16 10:2 12:5 |
| 10 | 17 | 12 | 0.588 | 11:7 12:10 |
| 6 | 23 | 12 | 0.522 | 11:11 12:12 |
| 18 | 11 | 10 | 0.455 | 9:4 10:5 11:2 |
| 9 | 14 | 10 | 0.429 | 9:1 10:6 11:4 12:3 |
| 15 | 28 | 10 | 0.429 | 7:8 8:5 9:1 10:12 11:1 12:1 (6개 학년 전부) |
| 11 | 23 | 12 | 0.348 | 9:6 10:2 11:7 12:8 |
| 지표 | 값 |
|---|---|
| 순도 100%인 집단 | 2 / 21 |
| 순도 80% 이상 | 9 / 21 |
| 가중평균 순도 = 다수결로 학년을 복원한 정확도 | 0.713 (313/439명) |
| 무작위 기준선(가장 큰 학년의 비율) | 0.2483 |
| 성별 가중평균 순도 / 기준선 | 0.6606 / 0.5718 |
즉 “친구 무리는 대체로 같은 학년이지만, 꼭 그렇지는 않다”가 이 데이터의 답입니다. 집단 15는 여섯 학년이 전부 섞인 28명짜리 덩어리 — 이런 집단이 진짜 흥미로운 대상입니다 (동아리? 통학버스? 형제자매?). 그리고 성별은 순도 0.66 vs 기준선 0.57로 거의 정보가 없습니다.
단원 3-7의 도구를 세 분할에 나란히 적용하면 순위가 명확해집니다(거대 컴포넌트 기준).
| 분할 | 집단 수 | E-I | |||||
|---|---|---|---|---|---|---|---|
| Louvain | 21 | 546 | 27 | 0.9501 | 0.8969 | ||
| 학년 | 6 | 489 | 84 | 0.8190 | 0.6632 | ||
| 성별 | 2 | 384 | 189 | 0.3229 | 0.1573 |
은 assortativity_nominal과 정확히 일치합니다(학년 0.8190 ✓).
단원 3-7 §16의 경고 — “집단 수가 다른 분할끼리 E-I를 직접 비교하지 말라” —
가 여기서도 그대로 적용됩니다. Louvain의 E-I가 으로 가장 음수인 건
집단이 21개라 기준선이 까지 올라갔기 때문입니다. 로 비교해야 합니다.
17. 정답지가 없을 때 무엇을 믿는가: 합의 (Consensus)
FMH엔 정답지가 없습니다. ARI를 계산할 상대가 없습니다. 무엇을 믿어야 할까요?
답은 질문을 바꾸는 것입니다. “이 학생은 몇 번 집단인가?”는 실행마다 달라집니다. 집단 번호 자체가 임의니까요. 대신 이렇게 묻습니다 — “이 두 학생은 늘 같은 집단에 들어가는가?”
Louvain을 100번 돌려(시드 1~100) 거대 컴포넌트의 간선 573개마다 양 끝 두 사람이 같은 집단에 들어간 횟수를 셉니다.
| 합의 수준 | 간선 수 | 비율 | 읽기 |
|---|---|---|---|
| 100회 전부 같은 집단 | 500 | 87.3% | 확실한 무리 안쪽 |
| 90회 이상 | 525 | 91.6% | 거의 확실 |
| 50~90회 | 20 | 3.5% | 애매 — 경계선 |
| 50회 미만 | 28 | 4.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에서 그 질문에 답하다 보면 놓치는 사실이 하나 있습니다.
| 컴포넌트 크기 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 11 | 12 | 19 | 23 | 439 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 개수 | 524 | 64 | 29 | 11 | 12 | 4 | 7 | 4 | 1 | 1 | 1 | 1 | 1 | 1 |
1,461명 중 524명(35.9%)이 아무와도 연결되어 있지 않습니다. 거기에 “단짝 한 명뿐”인 2인 컴포넌트가 64쌍(128명) 더 있습니다. 커뮤니티 탐지는 이 652명에 대해 아무 말도 하지 않았습니다 — 1인·2인 집단으로 처리하고 만 0.95로 부풀렸을 뿐입니다.
| 집단 | 인원 | 고립자 | 고립률 |
|---|---|---|---|
| 여학생 | 768 | 226 | 29.4% |
| 남학생 | 693 | 298 | 43.0% |
| White | 1,053 | 333 | 31.6% |
| Black | 261 | 119 | 45.6% |
| Asian | 48 | 22 | 45.8% |
| Hisp | 68 | 38 | 55.9% |
| NatAm | 24 | 8 | 33.3% |
| 전체 | 1,461 | 524 | 35.9% |
단원 3-7에서 우리는 “학년이 이 학교의 진짜 축이다”()라는 결론에 도달했습니다. 맞는 결론입니다. 그런데 고립에 관한 한 학년은 아무 설명도 하지 못하고, 성별과 인종이 설명합니다.
즉 “누가 누구와 뭉치는가”와 “누가 아무와도 안 뭉치는가”는 서로 다른 질문이고, 서로 다른 변수가 답합니다. 하위집단 분석의 가장 중요한 결과가 집단 안이 아니라 집단 밖에 있을 수 있습니다.
(다시 한 번 — 이 수치들은 모의 생성된 데이터의 것입니다. 실제 학교의 고립률로 인용하면 안 됩니다. 읽어야 할 것은 숫자가 아니라 “고립률을 속성별로 쪼개 보는 절차”입니다.)
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 경고와 함께 쓰레기 분할이 나옵니다().② Fiedler 벡터의 부호는 임의입니다. 가 고유벡터면 도 고유벡터. 정확도를 재기 전에 기준 정점(예: 1번)의 부호를 고정하십시오.
③
network와 igraph는 서로 함수를 가립니다.
network::get.vertex.attribute, igraph::degree처럼
패키지명을 붙이는 습관을 들이십시오.
20. 교실 적용 (Classroom Application)
| # | 오늘 배운 것 | 교실에서 |
|---|---|---|
| 1 | 최댓값 ≠ 정답 | 알고리즘이 낸 무리를 결론이 아니라 가설로 다룬다. 담임의 관찰과 대조하는 것이 검증이지, 가 높다는 건 검증이 아니다 |
| 2 | ARI는 세분을 벌준다 | 알고리즘 무리가 담임의 무리보다 잘게 나왔을 때, 경계를 넘었는지부터 확인. 안 넘었으면 알고리즘이 더 세밀히 본 것 |
| 3 | 개인 E-I가 0인 학생 | 3번·10번 같은 학생 — 어느 무리에도 확실히 속하지 않는다. 모둠 배정에서 가장 자유롭고, 동시에 가장 불안정하다. 학기 중 소속이 바뀔 가능성이 높은 학생 |
| 4 | 33/34가 상한선 | 관계망만으로 못 맞히는 학생이 반드시 있다. 남은 한 명은 더 좋은 알고리즘이 아니라 담임의 관찰이 맞힌다. 도구는 관찰을 대체하지 않는다 |
| 5 | 실행마다 결과가 다르다 | 한 번 돌린 그림을 학부모·동료 교사에게 보여 주지 않는다. 100번 돌려 늘 같이 묶이는 쌍만 보고한다 |
| 6 | 흔들리는 경계가 다리다 | 소속이 실행마다 바뀌는 학생 = 두 무리를 잇는 학생. 모둠을 섞고 싶을 때 먼저 찾아야 할 사람 |
| 7 | 등위성은 역할, 커뮤니티는 소속 | “이 아이는 어느 무리인가”와 “이 아이는 어떤 역할인가”는 다른 질문. 후자는 무리를 안 봐도 답할 수 있다 |
| 8 | 와 고립자 | 지명받지 못한 학생이 많은 학급일수록 가 저절로 높아진다. 학급 간 비교는 고립자 수를 맞추지 않으면 의미 없다 |
| 9 | 가장 중요한 건 집단 밖 | 무리 분석 보고서의 첫 줄은 “몇 개 무리”가 아니라 “아무에게도 지명받지 못한 학생 n명”이어야 한다. 그리고 그 n명을 성별·다문화·전학 여부로 쪼개 본다 |
① 설문 → 인접행렬 → 무리 탐지까지 R로 돌린다
② 그 결과를 믿을 만한지 스스로 검사한다 — 시드를 바꿔 보고, 알고리즘을 바꿔 보고, 순도를 재고
③ 학생 속성(성별·학년·다문화)이 무리를 얼마나 설명하는지 로 잰다
④ 그리고 가장 먼저 고립자를 센다
④를 ①보다 먼저 하는 것이 실은 더 낫습니다. 도구는 화려하지만 학급에서 가장 급한 정보는 언제나 연결이 하나도 없는 학생의 명단입니다.
21. 연습문제 (Exercises)
20명 학급입니다. 담임이 관찰로 나눈 무리(정답지)와 알고리즘이 낸 분할이 다음과 같습니다.
| 담임 A조 | 담임 B조 | 행 합 | |
|---|---|---|---|
| 알고리즘 C1 | 7 | 0 | 7 |
| 알고리즘 C2 | 0 | 6 | 6 |
| 알고리즘 C3 | 1 | 6 | 7 |
| 열 합 | 8 | 12 | 20 |
(2) 기대값과 최댓값을 구하고 ARI를 계산하시오.
(3) 보정하지 않은 랜드 지수 도 구해 비교하시오.
(4) 이 분할은 담임 분류의 세분입니까? 다수결로 담임 조를 복원하면 몇 명을 맞힙니까?
(5) (2)와 (4)의 숫자가 이렇게 다른 이유를 한 문장으로 쓰시오.
→ 먼저 풀고 §22 해설과 맞춰 볼 것
10명짜리 네트워크입니다.
- S1~S4는 서로 전부 친구 (, 간선 6개)
- S5~S9는 서로 전부 친구 (, 간선 10개)
- S10은 S1과 S5, 딱 두 명하고만 친구
(1) 간선 수 과 10명의 차수를 모두 쓰고, 차수 합이 인지 검산하시오.
(2) 정답 분할의 를 두 항을 모두 전개해 구하시오. 두 항의 값이 같은지 확인하시오.
(3) S10을 A로 옮긴 분할의 를 같은 방식으로 구하시오.
(4) 모듈러리티를 최대화하는 알고리즘은 둘 중 어느 것을 고릅니까? 그 이유를 차수 합으로 설명하시오.
(5) S10의 개인 E-I를 구하고, 이 문제가 §8의 10번과 같은 구조임을 설명하시오.
→ 먼저 풀고 §22 해설과 맞춰 볼 것
22. 해설과 답 (Solutions)
연습문제 1 해설 (Solution to Exercise 1)
(1) 세 개의 합 — 0인 항까지 전부
① 칸별 — 6개 칸 전부입니다.
| 칸 | 값 | 왜 그 값인가 | ||
|---|---|---|---|---|
| (C1, A) | 7 | 21 | 두 분할이 둘 다 같이 묶은 쌍 | |
| (C1, B) | 0 | 0 | 빈 칸 | |
| (C2, A) | 0 | 0 | 빈 칸 | |
| (C2, B) | 6 | 15 | 둘 다 같이 묶은 쌍 | |
| (C3, A) | 1 | 0 | 혼자라 쌍이 안 생김 | |
| (C3, B) | 6 | 15 | 둘 다 같이 묶은 쌍 | |
| 51 | 21+0+0+15+0+15 | |||
② 행 합 (알고리즘이 같이 묶은 쌍)
| 행 | 값 | ||
|---|---|---|---|
| C1 | 7 | 21 | |
| C2 | 6 | 15 | |
| C3 | 7 | 21 | |
| 합 | 57 | ||
③ 열 합 (담임이 같이 묶은 쌍)
| 열 | 값 | ||
|---|---|---|---|
| A조 | 8 | 28 | |
| B조 | 12 | 66 | |
| 합 | 94 | ||
④
(2) 기대·최대·ARI
| 부분 | 식 | 값 |
|---|---|---|
| 관측 | 51 | 51 |
| 기대 | 28.200000 | |
| 최대 | 75.5 | |
| ARI | 0.482030 |
값의 의미: 우연히 맞을 몫(28.2쌍)을 빼고 나면, 완전일치까지 갈 거리(47.3쌍) 중 22.8쌍만큼 왔다는 뜻입니다. 절반이 채 안 됩니다.
(3) 보정하지 않은 랜드 지수
는 “같이 묶은 쌍이 일치” + “따로 묶은 쌍이 일치”를 전체 쌍으로 나눈 것입니다.
0.74와 0.48. 는 “둘 다 따로 묶었다”는 이유로 90쌍을 공짜로 맞다고 세어 줍니다. 집단이 여러 개면 대부분의 쌍은 저절로 “따로”가 되므로 는 거의 항상 후하게 나옵니다. 그래서 논문·보고서에서 만 제시된 수치는 신뢰하지 마십시오.
(4) 세분인가? 다수결 복원은?
| 집단 | 구성 | 경계를 넘었나 | 다수결 배정 | 맞힌 인원 |
|---|---|---|---|---|
| C1 | A 7명, B 0명 | 아니오 — A에 완전히 들어감 | A | 7 |
| C2 | A 0명, B 6명 | 아니오 — B에 완전히 들어감 | B | 6 |
| C3 | A 1명, B 6명 | 예 — A 학생 1명이 섞임 | B | 6 |
| 합계 | 19 / 20 | |||
(5) 두 숫자가 다른 이유
자세히 보면: 담임의 B조 12명을 알고리즘이 C2(6명)와 C3(6명)로 쪼갰습니다. 그 사이 쌍이 ARI 입장에서는 전부 불일치입니다. 반면 진짜 오류 — A조 학생 1명이 C3에 섞인 것 — 은 그 학생이 관련된 쌍 몇 개에만 영향을 줍니다.
즉 ARI가 감점한 것의 대부분은 오류가 아니라 세분입니다. 그래서 §11에서 배운 대로 ARI 하나로 결론 내리면 안 되고, “경계를 넘었는가”를 따로 확인해야 합니다.
“알고리즘은 선생님이 보신 B조 12명을 두 무리로 다시 나눴습니다. 선생님 분류와 어긋난 학생은 딱 한 명입니다. 그 학생이 누구인지, 왜 C3에 붙었는지 살펴보시고, B조를 둘로 나눠 볼 만한지도 판단해 주십시오.”
“일치도 0.48”이라고만 보고하면 담임은 알고리즘을 버릴 것이고, 실제로 유용한 정보 두 개(B조가 사실 두 무리일 가능성 / 애매한 학생 1명)를 놓칩니다.
연습문제 2 해설 (Solution to Exercise 2)
(1) 간선과 차수
| 간선 묶음 | 개수 | 내역 |
|---|---|---|
| (S1~S4) | 6 | : 12,13,14,23,24,34 |
| (S5~S9) | 10 | : 56,57,58,59,67,68,69,78,79,89 |
| S10의 간선 | 2 | S1–S10, S5–S10 |
| 합 | 18 |
| 정점 | S1 | S2 | S3 | S4 | S5 | S6 | S7 | S8 | S9 | S10 |
|---|---|---|---|---|---|---|---|---|---|---|
| 차수 | 4 | 3 | 3 | 3 | 5 | 4 | 4 | 4 | 4 | 2 |
S1은 안에서 3 + S10과 1 = 4. S5는 안에서 4 + S10과 1 = 5.
(2) 정답 분할
A = {S1,S2,S3,S4}, B = {S5,…,S10}. S10이 B이므로 S5–S10은 B 안쪽, S1–S10만 교차입니다.
| 집단 | 인원 | 안쪽 간선 | 차수 합 |
|---|---|---|---|
| A | 4 | 6 () | |
| B | 6 | 11 ( 10 + S5–S10) | |
| 검산 | 10 | ✓ | ✓ |
| 집단 | 차 | |||
|---|---|---|---|---|
| A | ||||
| B | ||||
(3) S10을 A로 옮긴 분할
이제 S1–S10이 A 안쪽, S5–S10이 교차가 됩니다.
| 무엇이 바뀌나 | 정답 | S10 이동 후 |
|---|---|---|
| 간선 S1–S10 | 교차 | A 안쪽 |
| 간선 S5–S10 | B 안쪽 | 교차 |
| 교차 간선 수 | 1 | 1 (그대로) |
| 6, 11 | 7, 10 | |
| 13, 23 | 15, 21 |
| 집단 | 차 | |||
|---|---|---|---|---|
| A′ | ||||
| B′ | ||||
(4) 알고리즘은 무엇을 고르는가
차수 합으로 본 이유: 교차 간선 수는 1로 변하지 않습니다(잃는 만큼 얻으므로). 그러니 를 가르는 건 벌점 뿐입니다. 차수 합이 13:23에서 15:21로 더 균형이 되면서 벌점이 0.0247 줄었고, 안쪽 간선 항은 로 양쪽 다 똑같아 상쇄됩니다. 남는 것은 벌점 차이뿐 — 그래서 오답이 이깁니다.
은 에서 최소이므로 모듈러리티는 언제나 “차수 합이 반반인 분할”을 편애합니다.
(5) S10의 개인 E-I와 §8과의 관계
S10의 이웃은 S1(A, 진영 밖)과 S5(B, 진영 안), 각 1명입니다.
가라테의 10번과 똑같은 구조입니다. 10번의 이웃도 3번(진영 1)과 34번(진영 2) 딱 둘이었고, 개인 E-I가 0이었고, 옮겨도 교차 간선 수가 안 변했고, 옮기면 차수 합이 균형이 되면서 가 올라갔습니다.
일반 규칙: 개인 E-I가 0인 정점은 ① 절단 크기로 구별 불가(잃는 만큼 얻음) ② 로는 차수 균형만으로 결정 ③ 따라서 알고리즘이 그 사람을 어디에 두는지는 사회적 사실이 아니라 공식의 성질입니다.
차이는 크기뿐입니다. 가라테는 78개 간선짜리라 차이가 로 넷째 자리에서 갈렸지만, 이 10명짜리 망은 로 둘째 자리에서 갈립니다. 작은 망일수록 이 편향이 크게 나타납니다 — 그리고 우리 반은 25~30명입니다.
“S10은 A무리의 S1, B무리의 S5와 각각 한 명씩만 친구입니다. 알고리즘은 S10을 A무리로 분류했지만, 이는 관계 자료가 아니라 계산 방식 때문입니다. S10의 소속은 관찰로 확인해 주십시오.”
그리고 모둠을 짤 때 S10은 어느 모둠에 넣어도 되는 학생이자 양쪽 모두와 약하게만 연결된 학생입니다. 자유롭게 배치할 수 있다는 뜻이기도 하고, 어느 쪽에서도 깊이 받아들여지지 않았다는 뜻이기도 합니다. 두 해석 중 어느 쪽인지는 네트워크가 답하지 못합니다.
오늘 본 FMH의 지름 40, 고립자 36%, 차수 분포가 어떤 모형에서 나올 법한 값인지를 따지는 것이 4단계의 일입니다.