단원 3-3Modularity: Scoring a Partition
모듈러리티 Q — 분할에 점수를 매기는 법
- 지난 시간 연습문제 확인 (Review of Last Exercises)
- 오늘의 질문 — 판정에서 채점으로 (From Detection to Scoring)
- 첫 시도와 그 실패 — 내부 간선 비율 (First Attempt: Internal Edge Fraction)
- 기준선을 만든다 — 영 모형 (The Null Model: Configuration Model)
- 모듈러리티 행렬 (The Modularity Matrix)
- 정의 — (Definition of Modularity)
- 두 공식이 같다는 증명 (Equivalence of the Two Formulas)
- 손 계산 ① — 분할 P1의 (Hand Calculation: Q of P1)
- 두 항이 같았던 것은 우연이 아니다 (The Two-Community Identity)
- 손 계산 ② — 극단 분할과 의 범위 (Extreme Partitions and the Range of Q)
- 손 계산 ③ — 분할 비교표 (Comparing Partitions)
- 한 사람을 옮기면 (Moving One Node)
- 를 읽는 법 (Interpreting Q)
- R로 검증 (R Verification)
- 실전 — 가라테 클럽의 실제 분열 (Karate Club: The Real Split)
- 교실 적용 (Classroom Application)
- 연습문제 (Exercises)
- 해설과 답 (Solutions)
1. 지난 시간 연습문제 확인 (Review of Last Exercises)
단원 3-2의 연습문제 두 개를 먼저 맞춰 본다. 자세한 전개는 노트 17 §16에 있고, 여기서는 핵심만 확인한다.
| 문제 | 답 |
|---|---|
| 1. 은 몇-플렉스인가? | 집단 내 차수 , 최소 1, → , 3-플렉스. 이 거짓이므로 지름 보장 없음. 그래도 실제 유도 지름은 2 — 충분조건일 뿐 필요조건이 아니다. |
| 2. 간선 2개를 더해 S6를 3-코어에 넣으려면? | S1–S6, S2–S6를 추가. 그러면 코어 번호가 가 되어
3-코어 . 반대로 S1–S2, S3–S4를 더하면 왼쪽만 코어 4로 올라가고 S6는 그대로 2. |
2. 오늘의 질문 — 판정에서 채점으로 (From Detection to Scoring)
교실에서 실제로 필요한 것은 이런 질문이다.
“우리 반 26명을 이렇게 4모둠으로 나눴는데, 이 나눔이 좋은 나눔인가? 저쪽 나눔보다 나은가? 몇 점짜리인가?”
이건 “이 5명이 클리크인가?”와 종류가 다른 질문이다.
| 구분 | 단원 3-1, 3-2 | 단원 3-3 (오늘) |
|---|---|---|
| 영어 | subgroup detection | partition scoring |
| 대상 | 집단 하나 | 전원을 남김없이 나눈 분할 |
| 물음 | “이 집단은 조건을 만족하는가?” | “이 나눔은 몇 점인가?” |
| 답의 형태 | 예 / 아니오 | 실수 하나 |
| 바깥 사람 | 신경 쓰지 않음 | 반드시 어느 모둠엔가 들어감 |
왜 이게 새로운 질문인가 — 가라테 4-코어의 충격 (Why This Is a New Question)
지난 시간에 우리는 가라테 클럽에서 4-코어 10명 을 찾았다. 이 10명의 내부 밀도는 0.556으로 전체 밀도 0.139의 4배였다. 대단히 빽빽한 집단이다.
그렇다면 “4-코어 10명” 대 “나머지 24명”으로 반을 나누면 좋은 분할일까? 오늘 배울 로 채점하면 이렇다.
| 분할 | 판정 | |
|---|---|---|
| {4-코어 10명} | {나머지 24명} | 0.0046 | 사실상 0점 — 우연히 나눈 것과 다를 바 없음 |
| Mr.Hi 파벌 16명 | John A 파벌 18명 (실제 분열) | 0.3715 | 진짜 구조 |
왜 4-코어 분할은 0점인가? 4-코어 10명 사이의 간선은 25개지만, 그 10명이 바깥 24명과 맺은 간선은 38개다. 안보다 밖으로 더 많이 나간다. 빽빽하긴 하지만 그들은 반의 중심이지 한쪽 진영이 아니다.
오늘의 네트워크 — 단원 3-2의 를 그대로 (Today's Network)
같은 8명 네트워크 를 쓴다. 간선 12개, 차수는 , .
지난 시간에 3-코어이자 2-플렉스로 나온 와, 삼각형 . 이 분할을 P1이라 부르고, 오늘 이것이 몇 점인지 손으로 계산한다.
3. 첫 시도와 그 실패 — 내부 간선 비율 (First Attempt: Internal Edge Fraction)
가장 먼저 떠오르는 채점법은 이것이다.
여기서 는 모둠 안쪽 간선 수, 는 전체 간선 수다. 에서 몇 개 분할에 대해 계산해 보자.
| 분할 | 모둠 안 간선 | 교차 간선 | |
|---|---|---|---|
| P1 = {S1..S5} | {S6,S7,S8} | 1 | ||
| P2 = {S1..S6} | {S7,S8} | 2 | ||
| P3 = 전원 한 모둠 | 0 | ← 만점 |
무엇이 빠졌나 (What Is Missing)
는 “모둠 안에 간선이 몇 개 있나”만 센다. 물어야 할 것은 “모둠 안에 간선이 많은 편인가”다. 많고 적음을 말하려면 비교 대상이 있어야 한다.
“S6, S7, S8 사이에 간선이 3개 있다”는 사실 자체로는 아무 뜻도 없다.
“아무 관계도 없이 우연히 이었어도 3개쯤 나왔을 것인가?”를 물어야 뜻이 생긴다.
그 “우연히 나왔을 값”을 만드는 것이 다음 절의 영 모형이다.
4. 기준선을 만든다 — 영 모형 (The Null Model: Configuration Model)
반쪽 간선(스터브) 그림 (The Stub Picture)
네트워크의 간선 12개를 전부 가위로 반씩 자른다고 상상하자. 간선 하나가 반쪽 2개가 되므로 반쪽은 총 개다. 그리고 반쪽은 각 정점에 차수만큼 붙어 있다.
| 정점 | S1 | S2 | S3 | S4 | S5 | S6 | S7 | S8 | 합 |
|---|---|---|---|---|---|---|---|---|---|
| 차수 = 반쪽 개수 | 3 | 3 | 3 | 3 | 5 | 3 | 2 | 2 | 24 |
이제 이 24개의 반쪽을 눈을 감고 아무렇게나 두 개씩 짝지어 다시 이어 붙인다. 그러면 차수는 그대로인데 연결 상대는 완전히 무작위인 네트워크가 만들어진다. 이것을 배열 모형(configuration model)이라 한다.
기대 간선 수의 손 계산 (Expected Edge Count by Hand)
정점 의 반쪽 하나를 집었다고 하자. 남은 개 중 정점 의 반쪽은 개이므로, 그 하나가 로 갈 확률은 이다. 의 반쪽이 개이므로
이 커지면 이므로, 관례상 을 쓴다. 이 근사가 좋은 이유는 다음 절에서 확인할 깔끔한 성질들 때문이다.
| 쌍 | 실제 | 차이 | 읽는 법 | |||
|---|---|---|---|---|---|---|
| S5–S6 | 5 | 3 | 1 | +0.375 | 우연이라면 0.625개쯤인데 실제로 1개 — 조금 많다 | |
| S1–S2 | 3 | 3 | 0 | −0.375 | 우연이라면 0.375개쯤인데 실제로 0개 — 모자란다 | |
| S7–S8 | 2 | 2 | 1 | +0.833 | 우연이라면 거의 안 생길 관계인데 실제로 있다 — 매우 많다 | |
| S5–S7 | 5 | 2 | 0 | −0.4167 | 인기 많은 S5라면 있을 법한데 없다 |
검산 — 기대값의 총합은 이어야 한다 (Check — the Expected Values Must Sum to m)
영 모형이 만든 그래프도 간선이 12개여야 말이 된다. 확인해 보자.
에서는 . ✓ (R로도 확인했다 — §14.)
5. 모듈러리티 행렬 (The Modularity Matrix)
모든 쌍에 대해 “실제 − 기대”를 계산해 행렬로 만든다.
는 이므로 모든 값이 24분의 몇으로 딱 떨어진다. 아래 표는 , 즉 분자만 적은 것이다 (예: 는 를 뜻한다).
| S1 | S2 | S3 | S4 | S5 | S6 | S7 | S8 | 행합 | |
|---|---|---|---|---|---|---|---|---|---|
| S1 | −9 | −9 | +15 | +15 | +9 | −9 | −6 | −6 | 0 |
| S2 | −9 | −9 | +15 | +15 | +9 | −9 | −6 | −6 | 0 |
| S3 | +15 | +15 | −9 | −9 | +9 | −9 | −6 | −6 | 0 |
| S4 | +15 | +15 | −9 | −9 | +9 | −9 | −6 | −6 | 0 |
| S5 | +9 | +9 | +9 | +9 | −25 | +9 | −10 | −10 | 0 |
| S6 | −9 | −9 | −9 | −9 | +9 | −9 | +18 | +18 | 0 |
| S7 | −6 | −6 | −6 | −6 | −10 | +18 | −4 | +20 | 0 |
| S8 | −6 | −6 | −6 | −6 | −10 | +18 | +20 | −4 | 0 |
파란 칸 = 모둠 1 블록, 초록 칸 = 모둠 2 블록 (§8에서 씀).
대각선은 왜 음수인가 (Why the Diagonal Is Negative)
(자기 자신과는 친구가 아니다)이므로 으로 항상 음수다. S5는 로 가장 큰 음수인데, 차수가 가장 크기 때문이다. 이건 결함이 아니라 영 모형이 자기 고리(self-loop)를 허용하기 때문에 생기는 정직한 대가다. 반쪽 24개를 무작위로 짝지으면 S5의 반쪽 두 개가 서로 만나는 일도 생긴다.
행합이 0이다 — 가장 좋은 검산 도구 (Row Sums Are Zero — the Best Check)
손으로 확인해 보자.
| 행 | 항을 전부 더한다 (0인 항 없음 — 모든 칸이 값을 가진다) | 합 |
|---|---|---|
| S1 | 0 | |
| S3 | 0 | |
| S5 | 0 | |
| S6 | 0 | |
| S7 | 0 | |
| S8 | 0 |
6. 정의 — (Definition of Modularity)
이제 정의를 쓸 수 있다. 각 정점 의 소속 모둠 번호를 라 하고, 같은 모둠이면 1, 아니면 0인 표시 함수를 라 하자.
말로 옮기면 이렇다.
모둠 밖 쌍은 아예 세지 않는다. 으로 나누는 것은 “간선 개수 대비 비율”로 만들기 위해서다.
같은 값을 모둠별로 묶어 쓴 공식이 계산에는 훨씬 편하다. 모둠 에 대해 = 모둠 안 간선 수, = 모둠 구성원 차수의 합이라 하면
| 기호 | 뜻 | 의 모둠 1 |
|---|---|---|
| 전체 간선 수 | 12 | |
| 모둠 안쪽 간선 수 | 8 | |
| 모둠 구성원의 전체 차수 합 (바깥으로 나간 간선도 포함) | ||
| 모둠 개수 | 2 |
의 직관 (The Intuition)
간선 하나를 무작위로 만든다고 하자. 반쪽 두 개를 뽑는데,
- 첫 번째 반쪽이 모둠 에 속할 확률
- 두 번째 반쪽도 모둠 에 속할 확률
- 둘 다 에 떨어져 모둠 안 간선이 될 확률
모둠 1은 , 즉 반쪽의 70.8%를 차지한다. 그러니 아무렇게나 이어도 간선의 , 약 절반은 저절로 모둠 1 안에 떨어진다. 실제는 이므로 초과분은 뿐이다.
7. 두 공식이 같다는 증명 (Equivalence of the Two Formulas)
형태와 모둠별 형태가 같은 값임을 확인한다. 두 줄이면 끝난다.
| 단계 | 식 | 근거 |
|---|---|---|
| ① | 인 쌍 = 어떤 모둠 안의 쌍. 모둠별로 묶었다 | |
| ② | 모둠 안 간선 는 와 로 두 번 세어진다 | |
| ③ | 이중합이 곱으로 분리된다 | |
| ④ | ②, ③을 ①에 대입 | |
| ⑤ | 을 안으로 넣고 정리 ∎ |
8. 손 계산 ① — 분할 P1의 (Hand Calculation: Q of P1)
P1 . 두 가지 길로 각각 계산해 답을 맞춰 본다.
길 A — 행렬의 블록을 통째로 더한다 (Route A — Summing Blocks of B)
§5 표에서 파란 블록 25칸과 초록 블록 9칸의 값을 전부 더한다. 0인 항은 하나도 없다. 모든 칸을 다 쓴다 (단위: ).
| 모둠 1 블록 — 칸 | ||
|---|---|---|
| 행 | 5개 항 전개 | 행별 합 |
| S1 | ||
| S2 | ||
| S3 | ||
| S4 | ||
| S5 | ||
| 모둠 1 블록 합 | ||
| 모둠 2 블록 — 칸 | ||
|---|---|---|
| 행 | 3개 항 전개 | 행별 합 |
| S6 | ||
| S7 | ||
| S8 | ||
| 모둠 2 블록 합 | ||
블록 합을 24로 나눠 실제 값으로 되돌리고, 로 한 번 더 나눈다.
길 B — 모둠별 공식 (Route B — the Per-Community Formula)
| 모둠 | 차이(항) | ||||
|---|---|---|---|---|---|
| 8 | |||||
| 3 | |||||
| = 두 항의 합 | |||||
길 A는 “쌍 하나하나의 놀라움을 다 더한다”는 정의 그대로이고, 길 B는 “모둠 단위로 실제 비율과 기대 비율을 뺀다”는 실용 공식이다. 손 계산에는 길 B가 훨씬 빠르지만, 가 무엇인지 이해하려면 길 A를 알아야 한다.
값 하나하나의 뜻 (What Each Value Means)
| 값 | 읽는 법 |
|---|---|
| 전체 간선의 66.7%가 모둠 1 안에 들어 있다 | |
| 차수만 같게 두고 아무렇게나 이어도 50.2%는 저절로 모둠 1 안에 들어온다 | |
| 모둠 1이 순수하게 벌어들인 몫. 우연을 넘어선 응집 | |
| 모둠 2 안에 25%의 간선 | |
| 모둠 2는 반쪽의 29%뿐이라 우연 기대치가 8.5%에 불과 | |
| 작지만 기대치의 약 3배를 달성 — 모둠 1과 똑같은 기여 |
9. 두 항이 같았던 것은 우연이 아니다 (The Two-Community Identity)
§8에서 두 모둠의 항이 정확히 로 같았다. 신기한 우연처럼 보이지만 모둠이 2개일 때는 언제나 그렇다. 증명해 보자.
모둠 A, B의 항을 각각 라 하고 교차 간선 수를 라 하자.
| 단계 | 식 | 근거 |
|---|---|---|
| ① | 두 항을 그대로 뺐다 | |
| ② | ||
| ③ | 이므로 첫 괄호 | 모든 정점이 A 아니면 B에 속한다 |
| ④ | A 구성원의 차수 합 = (A 안 간선의 양끝 ) + (밖으로 나간 끝 ) | |
| ⑤ | ④에서 가 소거된다 | |
| ⑥ | ②③⑤를 ①에 대입 ∎ |
에서 숫자로 확인 (Checking the Numbers on W)
| 확인 항목 | 모둠 1 | 모둠 2 |
|---|---|---|
| 8 | 3 | |
| ✓ | ✓ | |
| ✓ | ||
| ✓ | ||
| 항 | ||
① 검산 도구 — 모둠 2개짜리 분할은 한쪽만 계산하고 2배하면 된다. 두 항이 다르게 나오면 계산이 틀린 것이다.
② 가 아무리 커도 가 함께 커지므로 큰 모둠이라고 유리하지 않다.
③ 모둠이 3개 이상이면 성립하지 않는다 (연습문제 1에서 직접 확인).
R로 의 2-분할 126개 전부를 검사했고 예외는 0개였다 (§14).
10. 손 계산 ② — 극단 분할과 의 범위 (Extreme Partitions and the Range of Q)
극단 ① — 전원 한 모둠 (항상) (Extreme 1 — Everyone in One Community)
모둠이 하나뿐이면 , 이다.
§3에서 이 분할은 로 만점이었다. 에서는 정확히 0점이다. 게다가 이건 만의 성질이 아니라 어떤 네트워크에서도 반드시 0이다. 가 의 실패를 정확히 겨냥해 고쳤음을 보여준다.
극단 ② — 8명 각자 따로 음수 (Extreme 2 — All Singletons)
모든 모둠이 1명이면 이고 다.
| S1 | S2 | S3 | S4 | S5 | S6 | S7 | S8 | 합 | |
|---|---|---|---|---|---|---|---|---|---|
| 3 | 3 | 3 | 3 | 5 | 3 | 2 | 2 | 24 | |
| 9 | 9 | 9 | 9 | 25 | 9 | 4 | 4 | 78 | |
| 항 |
(마지막 줄은 분의 값의 분자다.)
음수다. “아무도 같은 모둠이 아니다”는 우연히 나눈 것보다도 나쁘다. 당연하다 — 실제로 존재하는 12개 간선을 전부 모둠 밖으로 내보냈으니.
가장 나쁜 분할 (The Worst Partition)
의 8명을 나누는 방법은 벨 수 가지다. 전부 계산해 보면(§14)
| 순위 | 분할 | |
|---|---|---|
| 최고 | = P1 | |
| 최저 | 등 4가지 |
최저 분할을 보면 무슨 짓을 한 것인지 알 수 있다. 세 모둠 모두 안쪽 간선이 0개다. 서로 친구가 아닌 S1·S2를 굳이 묶고, 이웃이 아닌 S5와 S8을 묶었다. 즉 기대보다 적은 쌍만 골라 같은 모둠으로 만든 것이다. 행렬로 말하면 음수 칸만 블록 안에 가두는 나눔이다. 실제로
로, 세 모둠의 차수합 의 제곱만 남아 전부 벌점이 된다.
상한 — 크기가 같은 덩어리 개가 완전히 분리되어 있을 때 로, 를 키워도 1에 다가갈 뿐 도달하지 못한다. (삼각형 개를 떨어뜨려 놓고 계산해 확인했다 — §14.)
하한 는 이분 그래프를 “양쪽을 각각 한 모둠으로” 나눌 때 나온다.
실전에서는 범위를 벗어나는 일이 거의 없다.
| 2 | 3 | 4 | 5 | |
|---|---|---|---|---|
| 삼각형 개가 완전 분리되었을 때 |
11. 손 계산 ③ — 분할 비교표 (Comparing Partitions)
이제 의 여러 분할을 같은 자로 잰다. 모둠이 2개인 것은 §9의 항등식 덕에 한쪽만 계산하고 2배했다. 분수는 전부 분의 값이다.
| 분할 | 모둠별 | 항들 | 한 줄 진단 | |
|---|---|---|---|---|
| P1 {S1..S5} | {S6,S7,S8} | , | 4140개 중 1위. 교차 간선이 1개뿐 | ||
| P6 {S1,S2,S3,S4} | {S5,S6,S7,S8} | , | S5를 억지로 떼어냄 → 교차 간선 4개 | ||
| P2 {S1..S6} | {S7,S8} | , | S6를 왼쪽에 넣음. 안 간선은 늘었으나 벌점이 더 큼 | ||
| P3 전원 한 모둠 | 나누지 않았으므로 0점 (항상) | |||
| P4 8명 각자 따로 | × 8 | 간선을 전부 밖으로 버림 | ||
| 최악 {S1,S2,S6}|{S3,S4,S7}|{S5,S8} | , , | 사이 나쁜 사람만 골라 묶음 |
P2가 왜 P1보다 나쁜지 — 한 줄로 보기 (Why P2 Loses to P1)
P2는 S6를 왼쪽 모둠에 넣었다. 얻은 것과 잃은 것을 재 보자.
| P1 | P2 | 변화 | |
|---|---|---|---|
| 왼쪽 모둠 안 간선 | 8 | 9 | (S5–S6이 안으로) |
| 왼쪽 모둠 차수합 | 17 | 20 | (S6의 차수 3이 통째로) |
| 실제 비율 | |||
| 기대 비율 | |||
| 항 |
12. 한 사람을 옮기면 (Moving One Node)
P1에서 한 명씩 반대편 모둠으로 옮겨 보면, 그 사람이 지금 자리에 얼마나 확실히 속해 있는지가 숫자로 나온다.
| 옮긴 사람 | 옮긴 뒤 | 변화 | 해석 |
|---|---|---|---|
| P1 원본 | — | 기준 | |
| S1 / S2 / S3 / S4 | 넷 다 대칭이므로 손해가 같다 | ||
| S5 | 손해가 가장 작다 — 유일하게 양쪽에 다리를 걸친 사람 | ||
| S6 | 오른쪽 삼각형이 깨진다 | ||
| S7 / S8 | 손해가 가장 크다 — 관계 전부가 모둠 안에 있다 |
인기와 소속감은 별개다.
13. 를 읽는 법 (Interpreting Q)
| 값 | 뜻 |
|---|---|
| 우연히 나눈 것보다 못하다. 사이 나쁜 사람들을 묶어 놓았다는 뜻 | |
| 우연 수준. “전원 한 모둠”이 늘 여기 해당 | |
| 약한 구조. 구조가 정말 없을 수도, 분할이 나쁠 수도 있다 | |
| 뚜렷한 커뮤니티 구조. 실제 사회망 대부분이 여기 (Newman & Girvan) | |
| 거의 완전히 분리된 덩어리들. 사회망에서는 드물다 |
중요한 경고 — 무작위 그래프도 가 0이 아니다 (A Warning — Random Graphs Have Nonzero Q)
“전원 한 모둠”은 이지만, 그건 주어진 분할 하나의 값이다. 무작위 네트워크라도 4140가지를 다 뒤져 가장 좋은 분할을 고르면 는 꽤 커진다. 와 차수열이 똑같은() 무작위 그래프 300개를 만들어 각각 최적 분할을 찾아 봤다.
| 대상 | 최적 |
|---|---|
| 무작위 그래프 300개의 평균 | 0.2311 |
| 무작위 그래프 300개의 중앙값 | 0.2273 |
| 무작위 그래프 300개의 최댓값 | 0.4091 |
| 실제 의 최적 | 0.3299 (무작위의 94.15%보다 큼) |
올바른 결론은 이렇다: “같은 차수를 가진 무작위 그래프와 비교했을 때 의 0.3299는 상위 6% 안에 든다.” 는 절대 점수가 아니라 비교용 자다.
또 하나의 함정 — 분할끼리만 비교할 것 (Another Pitfall — Compare Partitions Only)
는 과 로 정규화되어 있지만, 다른 네트워크끼리의 를 비교하는 것은 위험하다. 크기·밀도가 다르면 가 도달할 수 있는 최댓값 자체가 다르기 때문이다. 는 같은 네트워크 위의 여러 분할을 줄 세울 때 가장 믿을 만하다.
14. R로 검증 (R Verification)
library(igraph)
nm <- paste0("S",1:8)
W <- matrix(0,8,8,dimnames=list(nm,nm))
el <- rbind(c(1,3),c(1,4),c(1,5),c(2,3),c(2,4),c(2,5),c(3,5),c(4,5),
c(5,6),c(6,7),c(6,8),c(7,8))
for(i in 1:nrow(el)){ W[el[i,1],el[i,2]] <- 1; W[el[i,2],el[i,1]] <- 1 }
gW <- graph_from_adjacency_matrix(W, mode="undirected")
d <- degree(gW); m <- ecount(gW) # d = 3 3 3 3 5 3 2 2 , m = 12
## --- 모듈러리티 행렬 B (24를 곱해 정수로 보기) ---
B <- W - outer(d,d)/(2*m)
24*B
# S1 S2 S3 S4 S5 S6 S7 S8
# S1 -9 -9 15 15 9 -9 -6 -6
# S2 -9 -9 15 15 9 -9 -6 -6
# S3 15 15 -9 -9 9 -9 -6 -6
# S4 15 15 -9 -9 9 -9 -6 -6
# S5 9 9 9 9 -25 9 -10 -10
# S6 -9 -9 -9 -9 9 -9 18 18
# S7 -6 -6 -6 -6 -10 18 -4 20
# S8 -6 -6 -6 -6 -10 18 20 -4
rowSums(B) # 0 0 0 0 0 0 0 0 (행합 = 0)
sum(B) # 0
sum(outer(d,d))/(2*(2*m)) # 12 (= m, 기대 간선 총합)
## --- 블록 합 (§8 길 A) ---
24*sum(B[1:5,1:5]); 24*sum(B[6:8,6:8]) # 95 95
## --- P1의 Q: 세 가지 방법 ---
P1 <- c(1,1,1,1,1,2,2,2)
modularity(gW, P1) # 0.3298611 ( = 190/576 )
sum(B[outer(P1,P1,"==")]) / (2*m) # 0.3298611 (정의 그대로)
sum(sapply(1:2, function(c){ v <- which(P1==c)
sum(W[v,v])/2/m - (sum(d[v])/(2*m))^2 })) # 0.3298611 (모둠별 공식)
## --- 다른 분할들 ---
modularity(gW, c(1,1,1,1,1,1,2,2)) # 0.1111111 P2 = 64/576
modularity(gW, c(1,1,1,1,2,2,2,2)) # 0.1666667 P6 = 96/576
modularity(gW, rep(1,8)) # 0 전원 한 모둠
modularity(gW, 1:8) # -0.1354167 전원 각자 = -78/576
## --- 전수 탐색: 8명을 나누는 4140가지 모두 ---
# 최대 Q = 0.3298611 = 190/576 → {S1,S2,S3,S4,S5} | {S6,S7,S8} (유일)
# 최소 Q = -0.3368056 = -194/576 → {S1,S2,S6}|{S3,S4,S7}|{S5,S8} 등 4가지
# Q > 0 인 분할은 4140개 중 372개 (9.0%)
## --- 2-분할 항등식: 두 항이 늘 같은가 (126개 전수) ---
# 검사한 2-분할 126개, 두 항이 다른 경우 0개
## --- 완전 분리된 삼각형 K개: Q = 1 - 1/K ---
for(K in 2:5){
g <- disjoint_union(replicate(K, make_full_graph(3), simplify=FALSE))
cat(K, modularity(g, rep(1:K, each=3)), 1-1/K, "\n") }
# 2 0.5 0.5
# 3 0.6666667 0.6666667
# 4 0.75 0.75
# 5 0.8 0.8
가라테 클럽(§15) 부분은 이렇다.
kel <- as.matrix(read.table("karate_net.txt"))
gk <- add_edges(simplify(graph_from_edgelist(kel, directed=FALSE)), c(9,31)) # 78개 교정판
hi <- c(1,2,3,4,5,6,7,8,11,12,13,14,17,18,20,22) # Mr.Hi 파벌 16명
fac <- ifelse(1:34 %in% hi, 1, 2)
modularity(gk, fac) # 0.3714661 실제 분열
modularity(gk, ifelse(coreness(gk)>=4, 1, 2))# 0.0046021 4-코어 | 나머지
modularity(gk, rep(1,34)) # 0 전원 한 덩어리
modularity(gk, 1:34) # -0.0498 전원 각자
## 4-코어는 왜 0점인가: 안쪽 25개 vs 바깥으로 38개
c4 <- which(coreness(gk)>=4)
sum(as.matrix(as_adjacency_matrix(gk))[c4,c4])/2 # 25 (안쪽)
sum(degree(gk)[c4]) - 2*25 # 38 (교차)
## Louvain은 실행마다 결과가 달라진다 (100회)
set.seed(4); modularity(cluster_louvain(gk)) # 0.4198 (관측 최댓값)
# 100회: Q 최소 0.3886 / 중앙값 0.4188 / 최대 0.4198, 모둠 수 4개가 99번·3개가 1번
# 최댓값 0.4198에 도달한 경우 30/100
# 실제 파벌 경계를 한 명도 넘지 않은 경우 43/100
## 결정적 방법 셋 (3회 돌려도 같은 값)
modularity(cluster_edge_betweenness(gk)) # 0.4013 크기 12-10-6-5-1
modularity(cluster_fast_greedy(gk)) # 0.3807 크기 17-9-8
modularity(cluster_walktrap(gk)) # 0.3532 크기 9-9-7-5-4
15. 실전 — 가라테 클럽의 실제 분열 (Karate Club: The Real Split)
가라테 클럽은 실제로 두 쪽으로 갈라졌다. 사범 Mr. Hi 편 16명, 회장 John A 편 18명. 이 실제로 일어난 분열이 몇 점인지 재 본다. (간선 78개짜리 교정판 데이터 — CLAUDE.md 참조.)
손 계산 — , (The Hand Calculation)
| 모둠 | 인원 | 항 | ||||
|---|---|---|---|---|---|---|
| Mr. Hi 파벌 | 16 | 33 | 76 | |||
| John A 파벌 | 18 | 35 | 80 | |||
| (실제 분열) | 0.3715 | |||||
검산 ①: ✓
검산 ②: → ✓, ✓
검산 ③: ✓
검산 ④ (§9 항등식): 두 항이 같다 ✓
지난 단원의 4-코어와 비교 (Compared with the 4-Core)
| 분할 | 교차 간선 | |||
|---|---|---|---|---|
| {4-코어 10명} | {나머지 24명} | 25 / 15 | 88 / 68 | 38 | |
| {Mr.Hi 16명} | {John A 18명} | 33 / 35 | 76 / 80 | 10 |
실제로 노트 17에서 확인했듯 4-코어 10명은 파벌이 섞여 있다 — Mr.Hi 쪽 6명(1, 2, 3, 4, 8, 14)과 John A 쪽 4명(9, 31, 33, 34). “빽빽함”과 “한 편임”은 다른 것이다.
기계는 사람보다 높은 점수를 낸다 (The Machine Scores Higher Than the Truth)
단원 3-4에서 배울 알고리즘들을 미리 돌려 봤다.
| 분할 방법 | 모둠 수 | 모둠 크기 | 파벌이 섞인 모둠 | |
|---|---|---|---|---|
Louvain (set.seed(4)) | 4 | 12, 11, 6, 5 | 0.4198 | 0개 |
| Girvan–Newman (edge betweenness) | 5 | 12, 10, 6, 5, 1 | 0.4013 | 1개 (3번 학생 1명이 반대편에) |
| Fast greedy | 3 | 17, 9, 8 | 0.3807 | 1개 (10번 학생 1명이 반대편에) |
| 실제 일어난 분열 | 2 | 18, 16 | 0.3715 | — (기준) |
| Walktrap | 5 | 9, 9, 7, 5, 4 | 0.3532 | 1개 (3번·14번 2명) |
Louvain은 돌릴 때마다 답이 달라진다 (Louvain Answers Differently Each Run)
위 표의 Louvain 행에 set.seed(4)를 적어 둔 이유가 있다.
Louvain은 정점을 훑는 순서를 무작위로 정하므로 실행할 때마다 결과가 바뀐다.
100번 돌려 봤다.
| 항목 | 값 |
|---|---|
| 의 최솟값 / 중앙값 / 최댓값 | 0.3886 / 0.4188 / 0.4198 |
| 모둠 수 | 4개가 99번, 3개가 1번 |
| 최댓값 에 도달한 횟수 | 30 / 100 |
| 실제 파벌 경계를 한 명도 넘지 않은 횟수 | 43 / 100 |
즉 “Louvain이 파벌을 정확히 세분한다”는 것은 절반도 안 되는 경우에만 참이다. 다른 결정적(deterministic) 방법 셋은 매번 같은 답을 내지만, 그 답도 모두 파벌이 섞인 모둠을 정확히 1개씩 갖고 있다.
가장 좋았던 Louvain 결과 () (The Best Louvain Result)
| C1 (11명) | C2 (5명) | C3 (12명) | C4 (6명) | |
|---|---|---|---|---|
| Mr. Hi 파벌 (16명) | 11 | 5 | 0 | 0 |
| John A 파벌 (18명) | 0 | 0 | 12 | 6 |
| 명단 | 1,2,3,4,8,12, 13,14,18,20,22 | 5,6,7, 11,17 | 9,10,15,16,19,21, 23,27,30,31,33,34 | 24,25,26, 28,29,32 |
이 결과에서는 Louvain이 실제 파벌을 틀리게 나눈 것이 아니라 더 잘게 쪼갰다: Mr.Hi 파벌 16명, John A 파벌 18명. 가 0.3715에서 0.4198로 오른 것은 각 파벌 안에도 하위 그룹이 실제로 있기 때문이다.
C2 = 이 특히 선명한 예다. 이 다섯 명은 코어 번호가 로 4-코어에 못 든 주변부인데, 그들끼리는 6개 간선(밀도 0.6, 전체 밀도 0.139의 4배)으로 촘촘히 얽혀 있다. 그리고 결정적으로 — 이 다섯 명의 바깥 이웃은 1번(Mr. Hi) 단 한 사람뿐이다. 바깥으로 나가는 간선 4개가 전부 1번을 향한다. 사범 한 명에게만 매달린, 자기들끼리 완결된 작은 무리인 것이다. 는 이런 구조를 놓치지 않는다.
16. 교실 적용 (Classroom Application)
이면 “이 편성은 관계를 전혀 반영하지 않았다”는 뜻이다. (그것이 의도된 편성일 수도 있다 — 아래 ④ 참조.)
이면 “이미 존재하는 무리를 그대로 모둠으로 만들었다”는 뜻이다.
주의 — 이것은 “소외 학생”과 다르다. 다리 역할을 하는 인기 학생(S5)도 변화량이 작게 나온다. 숫자는 주의를 기울일 대상을 짚어 줄 뿐, 왜 그런지는 관찰과 대화로만 알 수 있다.
새 관계를 만드는 것이 목표라면 오히려 를 일부러 낮게 잡되, 아무도 완전히 혼자가 되지 않도록 각 모둠에 최소 1명의 아는 사람을 배치한다. 는 목표가 아니라 계기판이다.
17. 연습문제 (Exercises)
- 각 모둠의 와 를 구하고, 검산으로 와 를 확인할 것.
- 세 항을 분수로 각각 구한 뒤 더하시오.
- §9의 항등식(두 항이 같다)이 여기서도 성립하는가? 성립하지 않는다면 왜인가?
- P1의 과 비교해 어느 쪽이 좋은 분할이고, 그 차이가 어디서 왔는지 설명하시오.
참고: 의 간선은 S1–S3, S1–S4, S1–S5, S2–S3, S2–S4, S2–S5, S3–S5, S4–S5, S5–S6, S6–S7, S6–S8, S7–S8이고 차수는 이다. → §18 해설 (먼저 풀고 맞춰 볼 것)
A2 ---- A3 B2 ---- B3
\ / \ /
\ / \ /
A1 ---------------- B1
간선: A1-A2, A1-A3, A2-A3, B1-B2, B1-B3, B2-B3, A1-B1 (총 7개)
- 차수를 모두 적고 을 확인하시오.
- 분할 의 를 분수로 구하시오. (§9 항등식을 써서 한쪽만 계산하고 2배 할 것.)
- 이제 다리 A1–B1을 끊으면 같은 분할의 는 얼마가 되는가? §10의 와 맞는지 확인하시오.
- 다리 하나가 있고 없고가 를 얼마나 바꾸는가? 그 이유를 과 두 항의 변화로 나누어 설명하시오.
→ §18 해설 (먼저 풀고 맞춰 볼 것)
18. 해설과 답 (Solutions)
문제 1 해설 — P5의 (Solution 1 — Q of P5)
① 무엇을 세는가. 각 모둠 안에 들어간 간선을 의 간선 목록에서 하나씩 확인한다. 12개 간선을 하나도 빠뜨리지 않고 어디에 속하는지 분류한다.
| 간선 | S1,S3,S5 | S2,S4 | S6,S7,S8 | 교차 |
|---|---|---|---|---|
| S1–S3 | ✓ | |||
| S1–S4 | ✓ | |||
| S1–S5 | ✓ | |||
| S2–S3 | ✓ | |||
| S2–S4 | ✓ | |||
| S2–S5 | ✓ | |||
| S3–S5 | ✓ | |||
| S4–S5 | ✓ | |||
| S5–S6 | ✓ | |||
| S6–S7 | ✓ | |||
| S6–S8 | ✓ | |||
| S7–S8 | ✓ | |||
| 3 | 1 | 3 | 5 |
검산: ✓
② 차수합 . 모둠 밖으로 나간 간선도 포함해서 전체 차수를 더한다.
| 모둠 | 항을 전부 전개 | |
|---|---|---|
| 11 | ||
| 6 | ||
| 7 | ||
| 검산 | ✓ | |
③ 세 항 전개. 분모를 로 통일한다. 임에 주의.
| 모둠 | 항 () | 왜 그 값인가 | ||
|---|---|---|---|---|
| 차수합 11로 반쪽의 46%를 쥐고 있어 기대치가 높다. 실제 3개는 그 기대를 겨우 넘는다 | ||||
| 간선 1개뿐이지만 두 명이라 기대치도 낮다. 소폭 흑자 | ||||
| P1과 똑같은 모둠이므로 항도 똑같다. 기대치의 약 3배 | ||||
| 합 | 130 | |||
§9의 증명에서 결정적으로 쓴 것은 ③ 이었다. 모둠이 2개일 때만 두 모둠의 차수합이 전체를 채우므로 이 되어 제곱차가 깔끔하게 접혔다. 모둠이 3개면 이므로 그 단계가 무너진다.
따라서 항등식은 “모둠 2개” 전용 검산 도구다. 3개 이상이면 각 항을 따로 계산해야 한다.
차이가 어디서 왔는지가 중요하다. 두 분할은 오른쪽 모둠 이 완전히 같고 그 항도 로 같다. 다른 것은 왼쪽뿐이다.
| 왼쪽 처리 | 항의 합 |
|---|---|
| P1: 를 통째로 | 95 |
| P5: 와 로 쪼갬 |
문제 2 해설 — 아령 네트워크 (Solution 2 — the Barbell Network H)
① 무엇을 세는가. 간선 7개를 놓고 각 정점이 몇 개에 등장하는지 센다.
| 정점 | 붙어 있는 간선을 전부 나열 | |
|---|---|---|
| A1 | A1–A2, A1–A3, A1–B1 | 3 |
| A2 | A1–A2, A2–A3 | 2 |
| A3 | A1–A3, A2–A3 | 2 |
| B1 | B1–B2, B1–B3, A1–B1 | 3 |
| B2 | B1–B2, B2–B3 | 2 |
| B3 | B1–B3, B2–B3 | 2 |
| 합 | ✓ | |
② 다리가 있을 때. 모둠 의 안쪽 간선은 A1–A2, A1–A3, A2–A3 세 개 → . 차수합은 . 검산 ✓ (교차 간선 은 다리).
| 모둠 | 항 | 왜 그 값인가 | ||
|---|---|---|---|---|
| 반쪽의 정확히 절반(7/14)을 차지하므로 기대치가 1/4. 실제는 3/7 | ||||
| 대칭이므로 완전히 같다 → (§9 항등식으로도 확인됨) | 두 삼각형이 거울상 | |||
③ 다리를 끊으면. 이 7에서 6으로, 이 14에서 12로 줄고, A1과 B1의 차수가 3에서 2로 떨어져 여섯 명 모두 차수 2가 된다.
| 모둠 | 항 | ||||
|---|---|---|---|---|---|
| 3 | |||||
| 3 | 6 |
④ 다리 하나의 값. 만큼 떨어진다. 두 항이 각각 어떻게 변했는지 나누어 본다.
| 항 | 다리 없음 | 다리 있음 | 변화 | 이유 |
|---|---|---|---|---|
| (실제 비율) | 안쪽 간선은 3개 그대로인데 분모 이 6→7로 늘었다. 새로 생긴 간선이 모둠 밖으로 갔으므로 비율이 희석된다 | |||
| (기대 비율) | 와 이 똑같이 1과 2씩 늘어 비율 가 유지된다. 대칭 구조라 기대치는 전혀 바뀌지 않는다 | |||
| 항 | 전부 실제 비율 쪽에서 왔다 |
손실은 전적으로 항에서 발생했고, 기대 항 는 로 그대로다. 간선 하나가 모둠 밖에 추가되면 와 이 함께 커져 기대치는 유지되는 반면, 실제 비율의 분모만 커져 점수가 깎이기 때문이다.
이것이 §16 ④에서 말한 “는 목표가 아니라 계기판”의 구체적인 사례다. 높은 는 잘 뭉쳤다는 뜻이지 좋은 교실이라는 뜻이 아니다.
다음 단원 예고 — 단원 3-4. 커뮤니티 탐지 알고리즘
(Community Detection Algorithms)
오늘 우리는 주어진 분할을 채점할 수 있게 되었다. 그런데 정작 필요한 것은
가장 좋은 분할을 찾는 것이다. 는 8명이라 가지를 전수 탐색할 수 있었지만,
가라테 34명은 가지다. 컴퓨터로도 불가능하다.
다음 시간에는 이 거대한 공간을 영리하게 뒤지는 세 가지 방법을 손으로 따라간다 —
Girvan–Newman(간선 매개중심성이 높은 다리부터 잘라 나간다),
Louvain(오늘 §12에서 한 “한 사람씩 옮겨 보기”를 가 오르지 않을 때까지 반복한다),
walktrap(무작위 걷기가 커뮤니티 밖으로 잘 못 나간다는 성질을 쓴다).
오늘 계산한 가라테의 를 이들이 어떻게 0.42까지 끌어올리는지,
그리고 그것이 왜 “더 정확한 답”은 아닌지를 확인한다.