단원 4-7Choosing a Model
모형 고르기 — 노화와 산불, 그리고 로그로그의 착각
4-1부터 4-6까지 우리는 모형을 넷 배웠다. , 왓츠–스트로가츠, BA, 그리고 오늘 배울 산불 모형. 그런데 어느 것을 쓸 것인가는 한 번도 정면으로 다루지 않았다.
오늘은 두 가지를 한다. 하나는 채점표 — 모형은 통째로 맞고 틀리는 게 아니라 축마다 채점된다는 것을 여섯 모형 × 두 자료로 확인한다.
다른 하나는 가장 흔한 오독을 손으로 깨는 것이다. "로그로그에 그렸더니 직선이더라, 그러므로 척도 없는 망이다" — 이 문장이 왜 틀렸는지, 거듭제곱이 전혀 아닌 자료로 을 만들어 보이면서 확인한다.
- 오늘의 질문: 넷 중에 무엇을 쓸 것인가 (Which Model Do We Use?)
- 채점표라는 생각 — 모형은 축마다 채점된다 (Scoring a Model Axis by Axis)
- 손 계산 ① 지수 분포를 로그로그에 그려 보기 (The Log-Log Illusion by Hand)
- 구간을 바꿔 재면 정체가 드러난다 (Changing the Fitting Range)
- R 검증 ① 어떤 자료에도 는 나온다 (fit_power_law on Six Datasets)
- 손 계산 ② 산불 모형 — 불은 언제 안 꺼지는가 (Forest Fire as a Branching Process)
- R 검증 ② 산불의 상전이 (The Phase Transition)
- 노화 모형 — 인기가 영원하지 않다면 (The Aging Model)
- 함정 ④ aging.exp=0은 BA가 아니다 (The Fourth Default Trap)
- R 검증 ③ 채점표: 가라테와 FMH (The Scoreboard)
- 간선 수를 맞추지 않은 채점은 무의미하다 (Match the Edge Count First)
- 최고 차수는 언제 들어온 사람인가 (When Did the Hub Arrive?)
- 교실 적용 (Classroom Application)
- 연습문제 (Exercises)
- 해설과 답 (Solutions)
1. 오늘의 질문: 넷 중에 무엇을 쓸 것인가 (Which Model Do We Use?)
지금까지 배운 모형을 한 줄씩 정리하면 이렇다.
| 단원 | 모형 | 규칙 | 잘 맞히는 축 | 못 맞히는 축 |
|---|---|---|---|---|
| 4-1 | 모든 짝에 같은 동전 | 평균 차수, 거리 | 차수 분산, 군집계수 | |
| 4-4 | 왓츠–스트로가츠 | 고리에서 시작해 확률 로 재배선 | 군집계수 + 거리 동시에 | 차수 분산(허브가 없다) |
| 4-6 | 바라바시–알버트 | 성장 + | 최대 차수, 거리 | 군집계수(삼각형이 없다) |
| 4-7 | 산불 | 소개자를 잡고 불이 옮겨붙듯 번진다 | 군집계수 + 허브 동시에 | 간선 수가 통제 안 됨 |
표만 보면 "산불 모형이 제일 낫네"로 읽힌다. 하지만 그건 아직 이르다. 오늘 볼 것은 세 가지다.
- 채점을 공정하게 하는 법 — 간선 수가 다른 모형끼리 군집계수를 비교하면 안 된다(§11).
- 흔한 오독을 깨는 법 — 로그로그 직선은 거듭제곱의 증거가 아니다(§3~§5).
- 모형을 고르는 기준 — "가장 잘 맞는 모형"이 아니라 "내가 묻는 축에서 맞는 모형"(§13).
2. 채점표라는 생각 — 모형은 축마다 채점된다 (Scoring a Model Axis by Axis)
4-1 §12에서 이미 한 번 말한 것을 정식화한다. 모형을 채점한다는 것은 다음을 하는 것이다.
- 실제 망에서 관심 있는 지표 를 잰다 →
- 모형으로 같은 크기의 망을 번 만들어 매번 를 잰다 →
- 면 "이 축은 모형으로 설명된다", 크면 "이 축에서 모형이 틀렸다"
가 크다는 것이 곧 "모형이 나쁘다"는 뜻은 아니다. 가 크다는 것은 "이 축에서 실제가 모형 밖에 있다"는 뜻이고, 그건 곧 여기에 설명해야 할 무언가가 있다는 신호다. 4-8에서 이 신호를 본격적으로 쓴다.
① 같은 — 정점 수가 다르면 거리도 군집계수도 비교 불가.
② 같은 — 간선 수가 다르면 군집계수 비교가 무의미하다. 간선이 적으면 삼각형이 적은 게 당연하기 때문이다. ②를 지키지 않은 채점표가 아주 흔하다. §11에서 이것 때문에 결론이 뒤집히는 것을 본다.
3. 손 계산 ① 지수 분포를 로그로그에 그려 보기 (The Log-Log Illusion by Hand)
4-5에서 배운 판정법은 이랬다. 로그로그에서 직선이면 거듭제곱, 반로그에서 직선이면 지수. 이 판정법을 실제로 쓸 때 사람들이 하는 일은 대개 "로그로그에 그려 봤더니 직선이더라" 한 줄이다. 그게 왜 위험한지를 손으로 확인한다.
재료는 4-6에서 이미 유도한 것을 쓴다. 성장만 있고 선호적 연결이 없으면 (즉 로 균등하면) 차수 분포는
이 된다. 이것은 거듭제곱이 아니다. 지수 분포다. 의심의 여지가 없다 — 우리가 4-6에서 재귀식 로부터 직접 유도한 정확식이니까.
이 정확식을 구간에서 로그로그에 얹고 직선을 맞춰 보자. (은 , 이라 어느 분포든 지나는 점이므로 뺀다.)
3-1. 표를 채운다 (Filling In the Table)
| 2 | 0.500000000 | 0.3010300 | −0.3010300 | 0.0906191 | −0.0906191 |
| 3 | 0.250000000 | 0.4771213 | −0.6020600 | 0.2276447 | −0.2872894 |
| 4 | 0.125000000 | 0.6020600 | −0.9030900 | 0.3624762 | −0.5437147 |
| 5 | 0.062500000 | 0.6989700 | −1.2041200 | 0.4885591 | −0.8416243 |
| 6 | 0.031250000 | 0.7781513 | −1.5051500 | 0.6055194 | −1.1712797 |
| 7 | 0.015625000 | 0.8450980 | −1.8061800 | 0.7141906 | −1.5262068 |
| 8 | 0.007812500 | 0.9030900 | −2.1072100 | 0.8155715 | −1.9031325 |
| 합 | — | 4.6055205 | −8.4288399 | 3.3045806 | −6.3638665 |
열이 정확히 등차수열이라는 점을 눈여겨보자. −0.30103, −0.60206, −0.90309, … 매번 −0.30103씩 줄어든다. 당연하다. 이니까. 는 에 대해 완벽한 직선이지 에 대해 직선인 게 아니다.
3-2. 최소제곱 직선을 손으로 맞춘다 (Fitting the Least-Squares Line by Hand)
개 점에 대해
중심화한 제곱합을 각각 전개한다.
따라서 기울기와 절편은
결정계수는
4-5의 항등식 를 그대로 쓰면
우리는 거듭제곱이 전혀 아닌 자료(정확한 지수 분포)를 로그로그에 얹었는데 가 나왔다. 눈으로 보면 완벽한 직선이다. 그리고 "척도 없는 망이고 입니다"라는 문장까지 만들어졌다.
전부 거짓이다. 이 자료의 참값은 , 지수 분포다.
3-3. 같은 자료를 반로그에 얹으면 (The Same Data on a Semi-Log Plot)
(로그를 안 씌운 ), 로 놓으면 §3-1에서 본 대로 이므로 회귀는 오차 0으로 맞는다.
| 축 | 기울기 | 해석 | |
|---|---|---|---|
| 로그로그 () | −2.9813323 | 0.9614528 | "거듭제곱, " — 틀림 |
| 반로그 () | −0.301029996 | 1.0000000000 | — 정확히 일치 |
두 그림을 다 그리고 를 비교하라. 하나만 그리면 반드시 속는다. 0.96은 "직선이다"라고 말하기에 충분해 보이지만, 옆에 1.0000이 있으면 0.96은 진 쪽이다.
4. 구간을 바꿔 재면 정체가 드러난다 (Changing the Fitting Range)
비교보다 더 강력한 진단이 있다. 구간을 바꿔 가며 기울기를 다시 재는 것이다.
진짜 거듭제곱 이라면 로그로그 기울기는 구간이 어디든 같은 값이어야 한다. 그게 "척도가 없다(scale-free)"는 말의 뜻이기도 하다. 특징적인 크기가 없으니 어느 구간을 봐도 같은 모양이어야 한다.
같은 을 구간만 바꿔 재면:
| 구간 | 로그로그 기울기 | "측정된 " | 로그로그 |
|---|---|---|---|
| 2 ~ 8 | −2.9813 | 3.9813 | 0.96145 |
| 2 ~ 12 | −3.9081 | 4.9081 | 0.94149 |
| 2 ~ 20 | −5.6555 | 6.6555 | 0.91484 |
| 2 ~ 30 | −7.7349 | 8.7349 | 0.89359 |
| 10 ~ 30 | −12.7713 | 13.7713 | 0.97878 |
기울기가 −2.98에서 −12.77까지 계속 가팔라진다. 가 3.98에서 13.77까지 움직인다. 이건 거듭제곱일 수가 없다. 그리고 만 따로 재면 가 다시 0.979로 올라간다 — 좁은 구간에서는 어떤 곡선이든 직선처럼 보이기 때문이다.
4-6에서는 진짜 BA의 정확식 을 좁은 구간에서 재면 가 3보다 작게(2.84) 나오고, 구간을 넓힐수록 3으로 수렴했다 (2.839 → 2.970 → 2.997 → 2.9997).
오늘은 지수 분포를 재면 가 수렴하지 않고 계속 커진다(3.98 → 4.91 → 6.66 → 8.73).
구별법: 구간을 넓혔을 때 값이 정착하면 거듭제곱, 계속 흘러가면 아니다.
5. R 검증 ① 어떤 자료에도 는 나온다 (fit_power_law on Six Datasets)
이제 손 계산이 아니라 제대로 된 도구를 쓴다.
fit_power_law(implementation="plfit")는 최대우도로 를 추정하고
꼬리 시작점 까지 자동으로 고른다. 훨씬 낫다. 그런데도 문제는 남는다.
f <- fit_power_law(d, implementation="plfit", p.value=TRUE, p.precision=0.01)
c(f$alpha, f$xmin, f$KS.stat, f$KS.p)
여섯 자료에 그대로 돌린 결과다. 모두 (가라테·FMH만 실제 크기).
| 자료 | 꼬리 표본 수 | KS.stat | KS.p | 진실 | |||
|---|---|---|---|---|---|---|---|
| BA (진짜 거듭제곱) | 5000 | 2.960 | 8 | 438 | 0.0161 | 0.640 | 거듭제곱 ✓ |
| ER (푸아송) | 5000 | 24.522 | 10 | 35 | 0.0165 | 0.339 | 거듭제곱 아님 |
| 로그정규 | 5000 | 3.491 | 13 | 464 | 0.0325 | 0.068 | 거듭제곱 아님 |
| 지수 | 5000 | 6.326 | 18 | 100 | 0.0375 | 0.425 | 거듭제곱 아님 |
| 가라테 | 34 | 2.126 | 2 | 33 | 0.1000 | 0.113 | 알 수 없음 |
| FMH (차수>0) | 937 | 5.497 | 4 | 135 | 0.0376 | 0.084 | 알 수 없음 |
읽는 법이 중요하다.
- 는 여섯 줄 모두에 나왔다. 값이 나왔다는 것 자체는 아무 정보가 아니다. 함수는 "이 자료가 거듭제곱이면 지수는 얼마인가"를 답할 뿐, "거듭제곱인가"를 답하지 않는다.
- KS.p는 네 줄 모두에서 기각되지 않았다(0.068~0.640). 즉 거듭제곱이 아닌 자료 셋 다 검정을 통과했다. KS 검정은 "거듭제곱이 아니다"를 잡아내는 힘이 생각보다 약하다.
- 진짜 단서는 과 꼬리 표본 수다. ER은 에서 꼬리에 35개밖에 없다. 5000개 중 35개로 지수를 논한 것이다. 라는 값 자체가 이미 "이건 거듭제곱이 아니다"라고 외치고 있다 (현실의 척도 없는 망은 대개 ).
에 , 꼬리 표본 33개. 그럴듯해 보이지만 차수가 5 이상인 정점이 34명 중 10명뿐이다. 로그로그 그림에서 꼬리를 이루는 점이 사실상 열 개도 안 된다.
4-6 §10에서 본 것과 합치면 결론은 분명하다. 34명짜리 자료로 를 소수 둘째 자리까지 말하는 것은 어느 쪽으로든 무의미하다. 완벽한 BA를 가라테 차수 범위에서 재도 2.853이 나오고, 지수 분포를 재도 3.98이 나온다.
6. 손 계산 ② 산불 모형 — 불은 언제 안 꺼지는가 (Forest Fire as a Branching Process)
이제 오늘의 새 모형이다. 산불 모형(forest fire model)의 규칙은 이렇다.
- 새 정점 가 들어와 소개자(ambassador) 를 무작위로 한 명 잡고 연결한다.
- 의 이웃들 중 몇 명에게 "불이 옮겨붙는다". 옮겨붙는 수 는 기하 분포를 따르고, 성공 확률이 이므로
- 불붙은 이웃들 각각에게도 가 연결되고, 거기서 다시 같은 규칙으로 번진다.
- 더 번지지 않을 때까지 반복. 이미 탄 정점은 다시 안 탄다.
BA와의 차이가 핵심이다. BA는 명의 상대를 서로 독립으로 골랐다. 그래서 삼각형이 안 생겼다(4-6 §11). 산불은 소개자의 이웃으로 번지므로 "친구의 친구를 함께 사귀는" 구조가 저절로 생긴다. 여기서 군집계수가 나온다.
6-1. 가지치기 과정으로 보기 (Viewing It as a Pruning Process)
한 번 붙은 불이 몇 명에게 번지는가를 세대별로 세어 보자. 를 "가지 수"라 부르면,
- 0세대: 소개자 본인 → 명
- 1세대: 소개자에게서 번진 사람 → 기대 명
- 2세대: 1세대 각각에서 다시 번진 사람 → 기대 명
- 세대: 기대 명
따라서 한 새 정점이 만드는 간선 수의 기대값은 등비급수다.
로 각 항을 전부 전개해 보자. .
| 세대 | 값 | 누적 | |
|---|---|---|---|
| 0 | 1.000000000 | 1.000000000 | |
| 1 | 0.250000000 | 1.250000000 | |
| 2 | 0.062500000 | 1.312500000 | |
| 3 | 0.015625000 | 1.328125000 | |
| 4 | 0.003906250 | 1.332031250 | |
| 5 | 0.000976562 | 1.333007812 | |
| 6 | 0.000244141 | 1.333251953 | |
| 극한 | |||
즉 면 새 정점 하나가 평균 1.333개의 간선을 들고 들어오고, 평균 차수는 그 두 배인 2.667이 되어야 한다.
6-2. 임계점 (The Critical Point)
급수가 발산하는 조건은 , 즉
손 계산으로는 에서 불이 안 꺼진다는 결론이 나온다. 이 값을 기억해 두자. §7에서 실측과 대조한다.
7. R 검증 ② 산불의 상전이 (The Phase Transition)
ff <- function(n,p) as_undirected(sample_forestfire(n, fw.prob=p, directed=TRUE),
mode="collapse")
mean(replicate(10, ecount(ff(1000, 0.2))))
| 가지 수 | 손 계산 | 손 계산 예측 평균차수 | 실측 간선 수 (n=1000) | 실측 평균차수 | 실측 군집계수 | |
|---|---|---|---|---|---|---|
| 0.20 | 0.250000 | 1.333333 | 2.667 | 1495.9 | 2.992 | 0.2684 |
| 0.25 | 0.333333 | 1.500000 | 3.000 | 1782.5 | 3.565 | 0.3012 |
| 0.30 | 0.428571 | 1.750000 | 3.500 | 2355.7 | 4.711 | 0.2731 |
| 0.33 | 0.492537 | 1.970588 | 3.941 | 3334.7 | 6.669 | 0.2701 |
| 0.35 | 0.538462 | 2.166667 | 4.333 | 4679.9 | 9.360 | 0.2725 |
| 0.37 | 0.587302 | 2.423077 | 4.846 | 11461.2 | 22.922 | 0.3658 |
| 0.40 | 0.666667 | 3.000000 | 6.000 | 55158.4 | 110.317 | 0.5839 |
손 계산은 에서 발산한다고 했는데, 실측은 0.35 부근부터 폭발한다. 에서 평균 차수가 110 — 1000명 학교에서 한 사람이 평균 110명과 친구인 셈이다.
왜 어긋나는가: 손 계산은 "가지 수가 로 고정"이라고 가정했다. 그런데 망이 자라면서 정점들의 이웃 수가 늘어난다. 이웃이 많으면 불이 옮겨붙을 대상도 많아지므로 실제 가지 수가 보다 커진다. 되먹임이다. 그래서 임계점이 앞당겨진다.
낮은 에서는 이 되먹임이 약해 손 계산이 꽤 잘 맞는다(: 2.667 대 2.992).
군집계수가 에서도 0.2684다. 같은 크기 BA는 0.0026, 는 0.003 수준이었다(4-6 §11). 100배 차이. 실제 가라테 0.2557·FMH 거대성분 0.2840과 같은 자릿수다.
소개로 번지는 규칙 하나가 삼각형 문제를 통째로 해결한다.
8. 노화 모형 — 인기가 영원하지 않다면 (The Aging Model)
BA의 선점 효과(4-6 §4)에는 불편한 구석이 있었다. 1번 정점의 차수가 로 영원히 자란다. 한 번 허브가 되면 절대 안 밀린다.
현실은 그렇지 않다. 6학년 교실에서 3월에 인기 있던 아이가 11월에도 똑같이 인기 있으리라는 보장은 없다. 이걸 모형에 넣는 방법이 노화(aging)다.
는 정점 의 나이다. 이면 나이가 들수록 매력이 깎인다. 이면 나이에 반비례하고, 면 나이의 제곱에 반비례한다.
g <- sample_pa_age(3000, pa.exp=1, aging.exp=-1, m=2, aging.bin=100, directed=FALSE)
| 노화 지수 | 평균 차수 | 최대 차수 | 차수 분산 | 군집계수 | 평균 거리 | (plfit) |
|---|---|---|---|---|---|---|
| 0.0 | 3.999 | 512.6 | 164.61 | 0.0036 | 3.8318 | 2.588 |
| −0.5 | 3.999 | 281.7 | 57.16 | 0.0042 | 4.4287 | 2.858 |
| −1.0 | 3.999 | 138.9 | 17.65 | 0.0048 | 5.2576 | 3.682 |
| −2.0 | 3.999 | 43.3 | 6.67 | 0.0144 | 6.6919 | 5.328 |
읽을 것 세 가지.
- 평균 차수는 3.999로 고정이다(). 노화는 간선을 없애는 게 아니라 어디에 붙는지만 바꾼다. 그래서 평균은 그대로고 분산만 움직인다.
- 최대 차수 512.6 → 43.3, 분산 164.61 → 6.67. 노화가 세지면 허브가 죽는다. 의 분산/평균 은 4-5 기준으로 거의 무작위 수준이다.
- 거리는 반대로 늘어난다(3.83 → 6.69). 당연하다. 허브는 모두에게 공통인 지름길이었으므로(4-6 §11), 허브가 죽으면 길이 멀어진다. 노화는 쏠림을 줄이는 대신 거리를 희생한다.
9. 함정 ④ aging.exp=0은 BA가 아니다 (The Fourth Default Trap)
§8의 표에서 줄은 "노화가 없는 경우"이므로 BA와 같아야 한다고 생각하는 것이 자연스럽다. 실제로 처음 쓴 스크립트에도 "aging.exp=0이 곧 BA"라고 적어 두었었다. 틀렸다.
같은 , 같은 로 나란히 돌려 보면:
| 생성기 | 1번 차수 | 최대 차수 | 간선 | 다중 간선 |
|---|---|---|---|---|
sample_pa(power=1, m=2, zero.appeal=0) | 68.2 | 142.4 | 5997 | 0 |
sample_pa(power=1, m=2, zero.appeal=1) | 53.6 | 88.2 | 5997 | 0 |
sample_pa_age(pa.exp=1, aging.exp=0, m=2) | 566.2 | 570.8 | 5998 | 58 |
꼬리가 네 배 무겁다. 그리고 sample_pa에서는 2번(132.2)이 1번(68.2)보다
컸는데 — 시작 상태 때문이다(4-6 §4) — sample_pa_age에서는
최대 차수 ≈ 1번 차수다. 사실상 항상 1번이 이긴다.
9-1. 원인 추적 (Tracking Down the Cause)
| 시험한 것 | 결과 | 판정 |
|---|---|---|
aging.bin ∈ {100, 300, 1000, 3000} | 출력이 완전히 동일 | 원인 아님 (이면 무관) |
zero.deg.appeal=0으로 고쳐 보기 | 경고 10개 + 최대 차수 5998 (별 그래프로 붕괴) | 해결책이 아님 |
pa.exp=0 (선호적 연결 끄기) | 1번 차수 18.6으로 정상화 | 선호적 연결 쪽 문제 |
| 1번의 차수 비중이 과 함께 커지는가 | 9.75% → 2.07%로 감소 | 응집(condensation) 아님 |
결정적인 확인은 선점 효과 지수 를 직접 재는 것이다. 4-6 §4에서 , 즉 최대 차수가 로 자란다고 유도했다. 을 바꿔 가며 최대 차수를 재고 – 회귀하면 가 나온다.
pa_age 1번 | pa_age 최대 | pa za=0 1번 | pa za=0 최대 | |
|---|---|---|---|---|
| 500 | 195.2 | 196.8 | 36.6 | 60.3 |
| 1000 | 264.2 | 270.4 | 62.4 | 87.2 |
| 3000 | 554.2 | 569.0 | 108.7 | 145.9 |
| 10000 | 1178.7 | 1223.8 | 192.2 | 265.6 |
| 30000 | 2433.4 | 2585.9 | 281.4 | 439.0 |
| 모형 | 실측 | (k=10~100) | (k=30~300) | |
|---|---|---|---|---|
sample_pa_age | 0.6372 | 2.569 | 2.5355 | 2.5107 |
sample_pa za=0 (순수 BA) | 0.4841 | 3.066 | 2.9195 | 2.8638 |
이고 이면 두 지수 사이에 가 성립한다(순수 BA: ✓).
두 모형 모두 이 관계를 만족한다. 에서 예측한 2.569는 실측 2.51~2.54와 맞고, 에서 예측한 3.066은 실측 2.86~2.92와 맞는다.
즉
sample_pa_age(aging.exp=0)은 고장 난 BA가 아니라
지수가 다른 별개의 모형이다. 순수 BA보다 더 센 부익부다.
4-4
sample_smallworld(양 끝점을 각각 재배선),
4-5 fit_power_law(p.value=FALSE),
4-6 sample_pa(zero.appeal=1), 그리고 오늘.앞의 셋은 "기본값이 예상과 다르다"였는데 오늘 것은 한 단계 더 나쁘다. "특수한 값을 넣으면 내가 아는 모형이 되겠지"라는 추론 자체가 틀렸다. 은 "노화 항이 사라진다"는 뜻일 뿐, 나머지 구현이
sample_pa와
같다는 보장은 어디에도 없다.실무 규칙: 노화 그림의 기준선은
sample_pa가 아니라
sample_pa_age(aging.exp=0) 자신을 쓴다.
같은 함수 안에서만 비교해야 의 효과가 분리된다.
10. R 검증 ③ 채점표: 가라테와 FMH (The Scoreboard)
이제 여섯 모형을 두 자료에 나란히 채점한다. 각 100회.
10-1. 가라테 (n=34, m=78) (Karate)
| 모형 | 평균 거리 | 군집계수 | 최대 차수 | 차수 분산 | 지름 |
|---|---|---|---|---|---|
| 실제 | 2.4082 | 0.2557 | 17 | 15.037 | 5 |
| ER | 2.4070 | 0.1324 | 8.8 | 3.628 | 4.8 |
| WS | 3.2945 | 0.3617 | 5.4 | 0.398 | 6.7 |
| WS | 2.7139 | 0.1754 | 6.6 | 1.419 | 5.4 |
| BA | 2.4349 | 0.1426 | 14.3 | 8.922 | 4.4 |
| 산불 | 2.8374 | 0.4763 | 14.1 | 14.013 | 6.6 |
축마다 승자가 다르다.
| 축 | 가장 가까운 모형 | 읽기 |
|---|---|---|
| 평균 거리 | ER (2.4070 대 2.4082) | 거리는 아무 모형이나 맞힌다 — 변별력이 없는 축 |
| 군집계수 | WS (0.1754), 산불은 과대(0.4763) | 어느 쪽도 0.2557을 정확히는 못 맞힘 |
| 최대 차수 | BA (14.3) / 산불 (14.1) | 허브는 성장 모형만 만든다 |
| 차수 분산 | 산불 (14.013 대 15.037) | 산불만 유일하게 맞힘 |
10-2. FMH 거대성분 (n=439, m=573) (The FMH Giant Component)
| 모형 | 평균 거리 | 군집계수 | 최대 차수 | 차수 분산 | 지름 |
|---|---|---|---|---|---|
| 실제 | 16.8773 | 0.2840 | 8 | 2.106 | 40 |
| ER | 6.1351 | 0.0065 | 8.5 | 2.570 | 14.4 |
| WS | 32.4620 | 0.0006 | 3.9 | 0.195 | 90.1 |
| WS | 14.2720 | 0.0019 | 5.2 | 0.726 | 37.3 |
| BA | 6.1085 | 0.0000 | 42.0 | 9.569 | 14.7 |
| 산불 | 3.3893 | 0.3474 | 125.9 | 409.832 | 10.7 |
가라테에서는 BA와 산불이 최대 차수를 맞혔는데, FMH에서는 바로 그 둘이 최악이다. BA는 최대 차수 42(실제 8), 산불은 125.9(실제 8). 차수 분산도 409.8 대 2.106.
FMH 거대성분은 439명에 최대 차수가 8밖에 안 되는 허브 없는 망이고, 거리 16.88·지름 40의 길쭉한 망이다. 이건 4-4의 격자(WS)에 가깝다. 실제로 WS 이 거리 14.27·지름 37.3으로 유일하게 자릿수를 맞혔다.
다만 WS도 군집계수는 0.0019로 완전히 실패했다(실제 0.2840, 150배 차이). 여섯 모형 중 FMH의 네 축을 동시에 맞히는 것은 하나도 없다.
11. 간선 수를 맞추지 않은 채점은 무의미하다 (Match the Edge Count First)
§10의 표에는 결함이 있다. 모형마다 간선 수가 다르다.
간선 수를 표에 넣고 산불의 fw.prob을 이분 탐색으로 보정해서
실제 간선 수에 맞춘 뒤 다시 채점하면:
calib <- function(n, mtarget) { # 목표 간선 수에 맞는 fw.prob 이분 탐색
lo <- 0.01; hi <- 0.40
for (i in 1:22) {
mid <- (lo+hi)/2
if (mean(replicate(15, ecount(ff(n, mid)))) < mtarget) lo <- mid else hi <- mid
}
(lo+hi)/2
}
11-1. 가라테 (목표 78간선, 보정된 fw.prob = 0.3635) (Karate: Targeting 78 Edges)
| 모형 | 간선 | 평균 거리 | 군집계수 | 최대 차수 | 차수 분산 | 지름 |
|---|---|---|---|---|---|---|
| 실제 | 78 | 2.4082 | 0.2557 | 17 | 15.037 | 5 |
| ER | 78 | 2.3874 | 0.1352 | 8.9 | 3.947 | 4.7 |
| WS | 68 | 3.3391 | 0.3726 | 5.3 | 0.388 | 6.8 |
| WS | 68 | 2.7208 | 0.1811 | 6.7 | 1.490 | 5.3 |
| WS | 68 | 2.5927 | 0.1253 | 8.2 | 3.425 | 5.3 |
| BA | 65 | 2.4284 | 0.1382 | 14.4 | 8.859 | 4.3 |
| 산불(보정) | 82 | 2.8824 | 0.4763 | 14.2 | 13.777 | 6.7 |
WS는 68간선, BA는 65간선밖에 못 만든다. 실제는 78이다.
- WS: , 이웃 수 면 간선이 정확히 개다. 재배선은 간선을 옮길 뿐 개수를 안 바꾼다. 으로 올리면 102개가 되어 이번엔 너무 많다. 68과 102 사이는 만들 수 없다.
- BA: 4-6에서 본 대로 평균 차수가 으로 고정이라 면 65간선 (), 이면 96간선. 역시 78을 못 만든다.
공정하지 않았다. WS는 간선이 13% 적은 상태로 0.1811을 냈다. 간선이 적으면 삼각형도 적을 텐데 그런데도 0.18이 나왔다는 것은 간선당 삼각형 효율은 오히려 WS가 더 높다는 뜻이다.
반대로 BA는 65간선으로 0.1382 — 이것도 간선이 적어서 낮은 것인지 구조 때문에 낮은 것인지 이 표만으로는 구별이 안 된다.
이 문제를 완전히 없애는 방법이 4-8의 배열 모형이다. 차수를 하나하나 고정하면 간선 수도 자동으로 정확히 맞는다.
11-2. FMH 거대성분 (목표 573간선, 보정된 fw.prob = 0.1486) (FMH: Targeting 573 Edges)
| 모형 | 간선 | 평균 거리 | 군집계수 | 최대 차수 | 차수 분산 | 지름 |
|---|---|---|---|---|---|---|
| 실제 | 573 | 16.8773 | 0.2840 | 8 | 2.106 | 40 |
| ER | 573 | 6.1200 | 0.0063 | 8.6 | 2.587 | 14.4 |
| WS | 439 | 32.1282 | 0.0006 | 3.9 | 0.198 | 87.3 |
| WS | 439 | 14.2657 | 0.0022 | 5.1 | 0.716 | 37.4 |
| WS | 439 | 7.8125 | 0.0048 | 7.5 | 1.990 | 19.3 |
| BA | 438 | 6.1978 | 0.0000 | 39.6 | 8.976 | 15.0 |
| 산불(보정) | 571 | 7.9772 | 0.2321 | 16.5 | 4.361 | 18.8 |
보정이 결론을 바꿨다. §10에서 산불은 fw.prob=0.37로 돌려
군집 0.3474·최대 차수 125.9라는 엉망인 결과를 냈는데,
간선 수를 맞추니(0.1486) 군집계수 0.2321(실제 0.2840)로
여섯 모형 중 유일하게 자릿수를 맞혔다.
최대 차수도 125.9에서 16.5로 내려왔다.
은 가라테 크기(n=34)에서 맞춰 놓은 값이다. 같은 를 에 쓰면 간선이 20배 넘게 생긴다(§7의 상전이). 모형의 손잡이는 자료 크기마다 다시 맞춰야 한다.
그래도 산불이 FMH를 설명하는 건 아니다 — 거리 7.98 대 실제 16.88, 지름 18.8 대 40. 길쭉함이라는 축에서는 여전히 WS가 이긴다.
12. 최고 차수는 언제 들어온 사람인가 (When Did the Hub Arrive?)
4-6 §4에서 "1번이 최고 차수일 확률은 40.8%뿐이지만 인 넷 중 하나가 최고일 확률은 99.75%"라는 것을 봤다. 이걸 도착 순서의 분포로 다시 보면 모형 선택의 관점에서 더 선명하다.
arr <- replicate(400, which.max(igraph::degree(
sample_pa(10000, power=1, m=1, zero.appeal=0, directed=FALSE))))
| 항목 | 값 |
|---|---|
| 최고 차수 정점의 도착 순서 — 최소 / Q1 / 중앙값 / Q3 / 최대 | 1 / 1 / 2 / 4 / 25 |
| 1~10번 안에서 나온 비율 | 0.9425 |
| 1~100번 안에서 나온 비율 | 1.000 |
| 무작위였다면 1~100번일 확률 | 100/10000 = 0.01 |
400번 중 단 한 번도 100번 이후에 들어온 정점이 최고 차수가 되지 못했다. 가장 늦게 들어와서 1등을 한 정점의 도착 순서가 25번이다. 1만 명 중 25번. 무작위라면 100번 이내일 확률이 1%인데 실측은 100%다.
이건 모형 이야기지만 검증 가능한 예측을 준다. "우리 반 인기 있는 아이가 누구인지"를 물어서 그 아이들이 언제 이 학급/학교에 들어왔는지를 보라.
BA가 맞는 교실이라면 상위권은 거의 전부 초기 진입자여야 한다. 만약 5월에 전학 온 아이가 상위권이라면 그건 BA로 설명이 안 되는 사건이고, 그 아이가 무엇을 했는지가 개입의 힌트가 된다.
13. 교실 적용 (Classroom Application)
13-1. 모형은 "고르는" 게 아니라 "묻는 축에 맞춰 고르는" 것 (Models Are Chosen to Fit the Question)
§10~§11에서 본 것을 교실 언어로 옮기면 이렇다.
| 묻고 싶은 것 | 쓸 모형 | 이유 |
|---|---|---|
| "우리 반 소외 학생 수가 이상한가?" | 또는 배열 모형 | 차수만 보는 질문이라 구조 모형이 필요 없다 |
| "모둠이 잘 나뉘어 있나?" | 배열 모형 (4-8) | 차수를 고정해야 "차수 때문에 생긴 모둠"을 뺄 수 있다 |
| "인기 쏠림이 심한가?" | BA | 쏠림을 만들어내는 유일한 모형이라 기준선이 된다 |
| "친한 무리가 뭉쳐 있나?" | 산불 또는 WS | 삼각형을 만드는 모형이라야 비교가 된다 |
| "정보가 얼마나 빨리 퍼지나?" | , BA | 거리 축은 대부분의 모형이 잘 맞는다(§10-1) |
13-2. 소개로 친구를 사귀게 하면 무엇이 달라지는가 (What Changes When Friendships Come from Introductions)
산불 모형의 규칙 — "소개자를 통해 그 사람의 친구들과도 이어진다" — 은 교실에서 실제로 조작 가능한 변수다. 짝 활동, 모둠 재구성, 또래 멘토링이 전부 "소개자를 지정하는" 개입이다.
§7의 표를 개입의 세기 로 읽으면:
| 교실에서의 뜻 | 평균 차수 | 군집계수 | 판정 | |
|---|---|---|---|---|
| 0.20 | 소개가 가끔 일어남 | 2.99 | 0.268 | 실제 학급과 비슷한 영역 |
| 0.30 | 소개가 흔함 | 4.71 | 0.273 | 가라테(4.59, 0.256)와 거의 같음 |
| 0.40 | 모두가 모두를 소개 | 110.3 | 0.584 | 현실에 없는 영역 |
읽을 점은 군집계수가 에 거의 반응하지 않는다는 것이다 (0.20→0.30에서 0.268→0.273). 늘어나는 건 간선 수뿐이다. 즉 소개라는 방식 자체가 삼각형을 만들고, 소개를 더 자주 한다고 더 뭉치지는 않는다. "모둠 활동을 늘리면 더 끈끈해질 것"이라는 기대는 이 모형 안에서는 성립하지 않는다. 늘어나는 것은 관계의 수지 밀집도가 아니다.
13-3. 노화라는 손잡이 — 인기의 유효 기간 (Aging as a Dial: The Shelf Life of Popularity)
§8에서 를 0에서 −2로 내리면 최대 차수가 512.6 → 43.3으로 떨어졌다. 교실에서 에 해당하는 것은 "과거의 인기가 현재에 얼마나 영향을 주는가"다.
- 에 가까운 교실: 3월에 정해진 서열이 학년 말까지 간다. 자리·모둠이 고정되고, 새 활동이 없고, 관계가 갱신될 기회가 없는 교실.
- 가 음수인 교실: 주기적으로 모둠을 다시 짜고 새 활동을 넣어 "지금 무엇을 하고 있는가"가 "예전에 인기였는가"보다 중요해지는 교실.
다만 대가가 있다는 것을 §8에서 이미 봤다. 면 쏠림은 거의 사라지지만 평균 거리가 3.83에서 6.69로 1.75배 늘어난다. 교실 언어로는 "누구에게 물어봐도 두세 다리 건너면 닿던 것이 대여섯 다리가 된다". 정보 전달과 소식 공유는 오히려 느려진다.
쏠림을 줄이는 개입(모둠 섞기, 무작위 자리 배치)과 정보 전달 속도는 상충한다. 둘 다 최대로 만들 수는 없다.
학기 초에는 노화를 세게(자주 섞기) 걸어 서열이 굳는 것을 막고, 학기 중반 이후 프로젝트 수행기에는 약하게 가져가 안정된 통로를 만드는 식으로 시기별로 다른 를 쓰는 게 이 모형이 주는 조언이다.
13-4. 그래서 남는 것 — "우리 반은 어느 모형인가"를 묻지 말 것 (What Remains: Do Not Ask Which Model Our Class Is)
그러므로 실무에서 쓸 문장은 "우리 반은 척도 없는 망이다"가 아니라 "우리 반은 차수 분산 축에서 무작위 대비 이고, 군집계수 축에서는 이다"이다. 축마다 따로 말해야 개입 지점도 따로 나온다.
14. 연습문제 (Exercises)
(가) 아래 표를 채우고, , , 를 중심화 공식으로 전개해 구하라. 그리고 기울기··를 구하라. (, )
| 2 | ? | 0.3010300 | ? | ? | ? |
| 3 | ? | 0.4771213 | ? | ? | ? |
| 4 | ? | 0.6020600 | ? | ? | ? |
| 5 | ? | 0.6989700 | ? | ? | ? |
| 6 | ? | 0.7781513 | ? | ? | ? |
(나) 연구자가 "가 0.97이니 척도 없는 망이고 는 약 2.46"이라고 보고서에 썼다. 이 주장을 반박할 계산 두 가지를 제시하라.
(다) 같은 자료를 반로그()에 그리면 기울기와 는 얼마인가? 왜 그런지 식으로 설명하라.
→ 먼저 풀고 §15 해설과 맞춰 볼 것
(가) 가지 수 를 구하고, 0세대부터 8세대까지 기대 감염자 수를 각 항 전부 쓰고 누적합을 적어라. 극한값은 얼마인가?
(다) 손 계산으로 예측되는 평균 차수는 얼마인가? 에서 실제로 돌리면 6.647이 나왔다. 차이를 설명하라.
(라) 만약 이면 무슨 일이 일어나는가? 식으로 답하고, 그 값을 교실 상황으로 해석하라.
→ 먼저 풀고 §15 해설과 맞춰 볼 것
15. 해설과 답 (Solutions)
15-1. 연습문제 1 해설 (Solution to Exercise 1)
(가) 표 채우기. 이므로 , , , , . .
| 왜 그 값인가 | ||||||
|---|---|---|---|---|---|---|
| 2 | 0.666666667 | 0.3010300 | −0.1760913 | 0.0906191 | −0.0530088 | , |
| 3 | 0.444444444 | 0.4771213 | −0.3521825 | 0.2276447 | −0.1680338 | , |
| 4 | 0.296296296 | 0.6020600 | −0.5282738 | 0.3624762 | −0.3180525 | , |
| 5 | 0.197530864 | 0.6989700 | −0.7043650 | 0.4885591 | −0.4923300 | , |
| 6 | 0.131687243 | 0.7781513 | −0.8804563 | 0.6055194 | −0.6851282 | , |
| 합 | — | 2.8573325 | −2.6413689 | 1.7748184 | −1.7165532 |
(도 필요하다.)
(나) 반박 두 가지.
반박 ①: 구간을 넓혀 다시 재라. 진짜 거듭제곱이면 기울기가 구간에 무관해야 한다.
| 구간 | 기울기 | "" | 읽기 | |
|---|---|---|---|---|
| 2 ~ 6 | −1.4590 | 2.4590 | 0.97443 | 보고서가 쓴 값 |
| 2 ~ 12 | −2.2861 | 3.2861 | 0.94149 | 가 0.83 커짐 |
| 2 ~ 20 | −3.3083 | 4.3083 | 0.91484 | 계속 커짐 |
| 2 ~ 30 | −4.5246 | 5.5246 | 0.89359 | 정착하지 않음 |
가 2.46 → 5.52로 계속 흘러간다. 거듭제곱이면 있을 수 없는 일이다. (4-6 §10에서 진짜 BA는 2.839 → 2.970 → 2.997 → 2.9997로 3에 정착했다.)
반박 ②: 반로그를 그려 를 비교하라. (다)에서 보듯 반로그 가 정확히 1이다. 0.9744는 1.0000에게 진다.
(다) 반로그. 이므로 는 의 일차식이다.
오차 항이 전혀 없는 정확한 직선이므로 최소제곱 잔차가 0이고 이다.
이 학교의 실제 모습은 , 즉 친구 수가 한 명 늘 때마다 해당 학생 수가 2/3배로 줄어드는 구조다. 500명이면 차수 10 이상이 명, 차수 20 이상이 명 — 사실상 없다.
그런데 보고서대로 인 거듭제곱이라면 차수 20 이상이 훨씬 많아야 한다. "허브가 있는 학교"와 "허브가 없는 학교"를 뒤바꿔 보고한 셈이고, 이 결론 위에 "허브 학생을 통한 정보 확산 전략"을 세우면 그 전략이 겨눌 대상이 실제로는 없다.
15-2. 연습문제 2 해설 (Solution to Exercise 2)
(가) 가지 수와 세대별 전개.
| 세대 | 값 | 누적 | 왜 그 값인가 | |
|---|---|---|---|---|
| 0 | 1.000000000 | 1.000000000 | 소개자 본인 | |
| 1 | 0.500000000 | 1.500000000 | 소개자에게서 번짐 | |
| 2 | 0.250000000 | 1.750000000 | 1세대 각각이 다시 명 | |
| 3 | 0.125000000 | 1.875000000 | ||
| 4 | 0.062500000 | 1.937500000 | ||
| 5 | 0.031250000 | 1.968750000 | ||
| 6 | 0.015625000 | 1.984375000 | ||
| 7 | 0.007812500 | 1.992187500 | ||
| 8 | 0.003906250 | 1.996093750 |
(다) 예측 평균 차수와 실측의 차이. 새 정점 하나가 간선 2개를 들고 오므로 개 정점이면 간선이 개, 평균 차수는
실측은 6.647(간선 3323.7개)로 1.66배 크다.
(라) 이면.
등비급수 는 에서 발산한다. 손 계산상 기대 간선 수가 무한대다. 실제로는 정점 수가 유한하므로 무한대가 되지는 않고, 대신 새 정점이 기존 정점 상당수와 연결된다. 에서 돌리면 평균 차수가 148.8이 나온다 — 199명 중 149명과 친구다.
는 "한 명이 소개해 주는 사람 수"다. 이면 소개의 연쇄가 저절로 멎고, 이면 멎지 않는다. 임계점은 정확히 — 한 사람이 평균 한 명을 소개할 때다.
교실에서 짜리 상황은 "모든 학생이 서로를 아는" 상태인데, 이건 학급 규모에서는 드물지 않다(25명 학급에서 서로 다 안다). 즉 산불 모형은 학급(수십 명)보다 학년·학교(수백 명) 규모에서 의미가 있다.
반대로 읽으면 개입 설계의 기준이 나온다. 새 관계를 퍼뜨리고 싶다면 를 1 근처로 올리는 것으로 충분하다. 한 명이 평균 한 명 이상을 소개하게만 만들면 연쇄가 스스로 유지된다 — 전원에게 개입할 필요가 없다.
§11에서 "WS는 68간선, BA는 65간선밖에 못 만들어서 78간선짜리 가라테와 공정하게 비교할 수 없다"는 문제에 부딪혔다. 단원 4-8에서는 이 문제를 원천적으로 없애는 모형을 배운다. 차수를 하나하나 그대로 고정한 채 연결만 다시 섞는 배열 모형(configuration model)이다. 그러면 "차수 때문에 생긴 구조"를 전부 빼고 남는 것만 볼 수 있다. 3-3 모듈러리티의 이 어디서 왔는지도 그때 정확히 밝혀진다.