길이 편향 표집과 검사 역설¶
지금까지 본 편향은 대부분 누군가의 선택 — 응답할지, 동의할지, 출판할지 — 에서 비롯되었다. 길이 편향은 아무도 아무것도 선택하지 않아도 생긴다. 큰 것이 눈에 더 잘 띄기 때문에 생긴다. 그래서 이 편향은 알아채기가 특히 어렵다. 표집 절차에 잘못된 곳이 하나도 없어 보이는데도 답이 틀린다.
정의 1. 길이 편향 표집¶
길이 편향 표집(length-biased sampling) 은 어떤 대상이 표본에 포함될 확률이 그 대상의 크기·길이·지속시간에 비례하는 표집이다. 크기 \(x\)인 대상이 뽑힐 확률이 \(x\)에 비례하면, 표본에서 관측되는 분포는 모집단 분포가 아니라 그것을 크기로 가중한 분포다.
모집단의 크기 분포가 밀도 \(f(x)\)와 평균 \(\mu = \mathbb{E}[X]\)를 가질 때, 길이 편향된 표본의 밀도는 다음과 같다.
이 분포의 평균은 모집단 평균보다 항상 크거나 같다.
등호는 \(\sigma^2 = 0\)일 때, 즉 모든 대상의 크기가 같을 때만 성립한다. 분산이 클수록 편향이 커진다.
검사 역설(inspection paradox) 은 이 현상이 시간축에서 나타나는 형태다. 시간을 구간으로 나누는 어떤 과정이 있을 때, 무작위로 고른 한 시점이 긴 구간 안에 떨어질 확률이 크므로, 그 시점을 포함하는 구간은 평균적인 구간보다 길다.
버스는 왜 늘 늦게 오는 것 같은가¶
버스가 평균 10분 간격으로 온다. 시간표를 모르고 정류장에 도착했다면 평균 몇 분을 기다릴까?
"간격의 절반이니 5분"이라는 답이 자연스럽지만, 이는 간격이 정확히 10분씩 일정할 때만 맞다. 간격에 변동이 있으면 답이 달라진다.
핵심은 이것이다. 정류장에 도착한 시점이 어느 간격 안에 떨어지는가는 간격의 길이에 비례한다. 간격이 2분인 구간과 30분인 구간이 있다면, 무작위 시점이 30분짜리 안에 떨어질 확률이 15배 높다. 우리는 짧은 간격을 거의 경험하지 못한다.
위의 공식을 그대로 쓰면, 내가 떨어진 구간의 기대 길이는
이다. 여기서 \(\mathrm{CV} = \sigma/\mu\)는 변동계수다.
| 간격의 분포 (평균 10분) | 표준편차 | 내가 떨어진 구간의 기대 길이 | 기대 대기시간 |
|---|---|---|---|
| 정확히 10분마다 | 0 | 10분 | 5분 |
| 평균 10분의 지수분포 | 10분 | 20분 | 10분 |
대기시간 쪽 수치는 구간 길이를 절반으로 나눈 것이다. 무작위 시점은 자기가 떨어진 구간 안에서도 균등하게 놓이므로, 잔여 대기시간의 기댓값은 관측된 구간 길이의 절반이 된다.
두 공식을 혼동하지 않는 것이 중요하다. \(\mathbb{E}[X^2]/\mathbb{E}[X]\)는 내가 떨어진 구간 전체의 길이이고, \(\mathbb{E}[X^2]/(2\mathbb{E}[X])\)는 그중 앞으로 남은 부분이다. 지수분포는 \(\mathrm{CV}=1\)이라 구간은 두 배로 보이지만 잔여 대기시간은 \(\mu(1+1)/2 = \mu\), 곧 원래의 평균 간격과 정확히 같아진다. 간격이 일정하면 \(\mathrm{CV}=0\)이라 구간은 그대로이고 대기는 절반이다.
버스가 완전히 무작위로(포아송 과정) 온다면 평균 10분을 기다린다. 간격의 절반이 아니라 간격 전체다. 시간표대로 오는 버스보다 두 배를 기다리면서도, 두 노선의 "배차 간격 10분"이라는 공지는 똑같이 정직하다.
역설이 아니다
"평균 간격이 10분인데 평균 대기가 10분"이 모순처럼 들리는 이유는 두 개의 서로 다른 평균을 같은 것으로 여기기 때문이다.
- 버스 회사가 재는 평균: 간격 하나하나를 세어 평균낸다. 짧은 간격도 긴 간격도 각각 한 번씩.
- 승객이 겪는 평균: 승객이 간격 안에 떨어지는 빈도로 가중된다. 긴 간격이 더 자주 겪어진다.
둘 다 옳다. 다른 것을 재고 있을 뿐이다. "평균"을 말할 때는 무엇을 단위로 세는지 먼저 정해야 한다.

길이 편향은 확률 계산이기 전에 기하다. 위 그림의 시간축에는 평균 10분 간격의 버스 14대가 지나가고, 승객 90명이 115.1분 구간 위에 고르게 떨어진다. 각 간격 위에 세운 막대의 높이가 그 간격에 떨어진 승객 수인데, 막대의 높이가 곧 간격의 폭을 따라간다. 가장 긴 21.8분짜리 간격 하나가 승객 18명을 받는 동안, 가장 짧은 0.3분짜리 간격은 한 명도 받지 못한다. 승객 쪽에서 보면 그 짧은 간격은 존재하지 않는 것과 같다.
여기에는 아무 선택도 개입하지 않았다. 승객은 시간축 위에 정말로 무작위로 떨어졌고, 버스는 모두 운행했다. 그런데도 표본에 들어오는 확률이 길이에 정확히 비례한다. 넓은 구간이 시간축에서 더 넓은 자리를 차지한다는 사실 하나뿐이며, 이것이 정의 1의 \(f^{*}(x) = x f(x)/\mu\)가 말하는 전부다.
같은 그림의 아래쪽 판은 같은 일을 크게 되풀이한 것이다. 간격 400,000개와 승객 400,000명을 각각 세었다. 버스 회사가 재는 평균 간격은 10.00분인데 승객이 겪는 평균 간격은 19.95분으로 정확히 두 배이고(이론값 20.00분), 평균 대기시간은 9.97분이다. 두 히스토그램의 모양을 비교하면 무슨 일이 일어났는지가 분명해진다. 버스 회사가 세는 분포는 0 근처에서 가장 높지만, 승객이 겪는 분포는 짧은 간격 쪽이 눌리고 긴 간격 쪽이 들려 올라가 봉우리가 오른쪽으로 옮겨 간다.
자료는 같고 표집틀도 같다. 세는 단위만 다르다. 파란 막대와 주황 계단은 같은 노선의 같은 운행 기록에서 나왔고, 다른 것은 간격을 하나씩 세었는가 승객을 한 명씩 세었는가뿐이다.
학급 크기 역설¶
같은 구조가 훨씬 흔한 곳에서 나타난다. 어떤 학교의 학급 구성이 이렇다고 하자.
| 학급 크기 | 학급 수 | 학생 수 |
|---|---|---|
| 10명 | 5 | 50 |
| 90명 | 1 | 90 |
| 합계 | 6 | 140 |
학교가 발표하는 평균 학급 크기는 학급을 세어 평균낸다.
학생에게 "네 반은 몇 명이냐"고 물어 평균낸 값은 학생을 세어 평균낸다.
23.3명과 61.4명. 어느 쪽도 거짓말이 아니고 자료도 하나뿐인데 답이 2.6배 다르다. 학생 표본에서는 90명짜리 학급이 90번 세어지고 10명짜리는 10번씩만 세어지기 때문이다. 큰 학급에 학생이 더 많다는 당연한 사실이 곧 길이 편향이다.
같은 구조가 도처에 있다. 무작위로 고른 사람에게 형제자매 수를 물으면 대가족이 과대표집된다(외동은 표본에 한 명만 기여한다). 무작위로 고른 사람에게 "당신 친구는 몇 명이냐"고 물으면 친구가 많은 사람이 더 자주 뽑힌다 — 이것이 우정의 역설, 즉 평균적으로 내 친구가 나보다 친구가 많은 이유다.
무서운 쪽: 암 검진¶
여기까지는 흥미로운 퍼즐이다. 같은 편향이 사람의 생사가 걸린 판단을 뒤집는 곳이 암 검진이다. 두 가지 편향이 겹친다.
길이 편향. 암은 성장 속도가 제각각이다. 검진은 정해진 주기로 실시되므로, 전임상 단계에 오래 머무는 암 — 느리게 자라는 암 — 이 걸릴 확률이 높다. 빠르게 자라는 공격적인 암은 검진과 검진 사이에 증상을 일으켜 발현한다.
결과적으로 검진으로 발견된 암 집단은 애초에 예후가 좋은 암들로 편중되어 있다. 검진 발견 환자의 생존율이 증상 발현 환자보다 높은 것은 검진이 목숨을 구했기 때문일 수도 있고, 처음부터 순한 암만 골라 담았기 때문일 수도 있다. 생존율 비교만으로는 둘을 구분할 수 없다.
리드타임 편향. 검진은 진단 시점을 앞당긴다. 사망 시점이 전혀 바뀌지 않아도 진단 시점부터 재는 생존기간은 앞당긴 만큼 늘어난다.
어떤 사람이 70세에 사망한다고 하자.
- 검진 없음: 67세에 증상으로 진단 → 생존기간 3년
- 검진 있음: 63세에 검진으로 진단 → 생존기간 7년
5년 생존율은 0%에서 100%로 바뀌었다. 그가 산 날은 하루도 늘지 않았다.
과잉진단. 셋째 문제는 더 근본적이다. 평생 증상을 일으키지 않았을 암, 저절로 퇴화했을 암까지 찾아낸다. 이 환자들은 진단되지 않았다면 그 암으로 죽지 않았을 사람들이므로, 100% 생존하여 생존율 통계를 끌어올린다. 그리고 불필요한 수술과 치료를 받는다.
일본의 신경모세포종 검진: 통계가 프로그램을 멈춘 사례
신경모세포종은 영아에게 생기는 암이다. 일본은 1980년대부터 생후 6개월 영아를 대상으로 소변 검사를 이용한 전국 단위 검진을 시행했다. 검진은 잘 작동하는 것처럼 보였다. 발견 건수가 크게 늘었고, 검진으로 발견된 아이들의 진단 후 생존율은 매우 높았다.
그러나 20년 가까이 시행한 뒤에도 신경모세포종 사망률은 줄지 않았다. 검사가 찾아낸 것의 상당수는 치료하지 않아도 저절로 퇴화하거나 성숙해 버려 평생 문제를 일으키지 않았을 종양이었다. 그 아이들은 수술과 항암치료를 받았고, 치료 합병증으로 인한 피해도 발생했다.
2004년 일본 정부는 프로그램을 중단했다.
이 사례의 핵심은 어느 통계를 보았는가에 있다. 진단 후 생존율은 길이 편향·리드타임 편향·과잉진단 세 가지 모두에 의해 부풀려진다. 인구 단위 사망률은 그중 어느 것에도 영향받지 않는다. 검진이 실제로 목숨을 구했다면 사망률이 내려가야 하는데, 내려가지 않았다.
교훈: 검진의 효과는 생존율이 아니라 사망률로 판단해야 한다. 그리고 사망률을 제대로 비교하려면 결국 무작위 배정이 필요하다 — 통제실험 절로 돌아가는 셈이다.
어떻게 대처하는가¶
길이 편향은 표집 방식에서 비롯되므로, 대응책도 무엇을 세는 단위로 삼는지를 바로잡는 데서 나온다.
- 가중치로 되돌린다. 길이 편향된 표본에서 모집단 평균을 복원하려면 각 관측값에 \(1/x\)의 가중을 준다. 크기 \(x\)에 비례해 뽑혔으니 그 역수로 상쇄하는 것이다. 학생 표본에서 학교 평균 학급 크기를 되찾는 방법이 이것이다.
- 표집틀을 바꾼다. 학급 평균을 알고 싶으면 학생이 아니라 학급을 표집한다. 표본조사 절에서 본 표집틀 선택 문제와 같은 것이다.
- 올바른 기준 시점을 쓴다. 리드타임 편향은 진단 시점이 아니라 출생 또는 무작위 배정 시점부터 시간을 재면 사라진다. 일본 사례에서 문제가 된 지점이 정확히 이것이었다.
- 결과 지표를 바꾼다. 검진 평가에서 생존율 대신 사망률을 본다. 지표를 바꾸는 것만으로 세 편향이 한꺼번에 무력해진다.
보기 1. 길이 편향 표집과 검사 역설. 버스 간격의 분포를 \(X\)라 하자. 승객은 시간축 위에 고르게 정류장에 도착한다. 두 노선을 견준다. 하나는 정확히 \(10\)분마다 오고, 다른 하나는 평균 \(10\)분인 지수분포 간격으로 온다.
(1) 승객이 겪는 간격의 기댓값이 \(E[X^2]/E[X] = E[X](1+\mathrm{CV}^2)\)임을 보이시오. 그가 실제로 기다리는 시간의 기댓값은 얼마인가.
(2) 두 노선에서 네 값을 계산하고, 모의실험이 그것을 재현하는지 확인하시오.
풀이
(1) 해석적으로. 승객이 시간축 위에 고르게 떨어지므로, 길이 \(x\)인 간격 안에 떨어질 확률은 그 간격이 시간축에서 차지하는 폭 \(x\)에 비례한다. 따라서 승객이 겪는 간격의 밀도는 \(f\)가 아니라
다(\(\int xf(x)\,dx = E[X]\)로 나누어 정규화했다). 이것이 길이 편향 밀도이고, 그 기댓값은
이다. \(E[X^2] = \operatorname{Var}(X) + E[X]^2\)을 넣고 \(\mathrm{CV} = \operatorname{sd}(X)/E[X]\)로 쓰면
가 된다. 변동이 없으면(\(\mathrm{CV} = 0\)) 편향도 없고, 들쭉날쭉할수록 커진다.
기다리는 시간은 다르다. 겪은 간격의 길이가 \(g\)로 주어지면 승객은 그 안에 고르게 떨어져 있으므로 남은 시간의 조건부 기댓값이 \(g/2\)다. 따라서
이다. 관측 간격은 \(E[X^2]/E[X]\), 대기시간은 그 절반인 \(E[X^2]/(2E[X])\)다. 두 식을 혼동하지 말아야 한다.
두 노선에 넣는다.
| 노선 | \(E[X]\) | \(E[X^2]\) | \(\mathrm{CV}\) | 관측 간격 | 대기 |
|---|---|---|---|---|---|
| 정확히 10분 | \(10\) | \(100\) | \(0\) | \(10.00\) | \(5.00\) |
| 지수(평균 10) | \(10\) | \(200\) | \(1\) | \(20.00\) | \(10.00\) |
지수분포는 \(E[X^2] = 2\theta^2 = 200\)이므로 관측 간격이 참 평균의 두 배가 되고, 대기시간은 \(10\)분이다. 무기억성에서 곧바로 나오는 그 유명한 결과이기도 하다.
(2) 수치적으로.
"""검사 역설: 내가 도착한 간격은 평균보다 길다."""
import numpy as np
rng = np.random.default_rng(1)
mean_gap = 10.0 # 버스 사이 평균 간격(분)
n_buses = 200_000
n_riders = 200_000
def simulate(gaps, label):
"""승객을 아무 때나 정류장에 떨어뜨리고, 그가 겪는 간격과 대기시간을 잰다."""
# 간격들을 누적하면 각 버스의 도착 시각이 된다
arrivals = np.cumsum(gaps)
horizon = arrivals[-1]
# 여기가 길이 편향이 생기는 지점이다.
# 승객을 **시간축 위에** 고르게 뿌린다(간격 위에 고르게가 아니다).
# 긴 간격일수록 시간축에서 차지하는 폭이 넓으므로 더 많은 승객이 그 안에 떨어진다.
riders = rng.uniform(0, horizon, n_riders)
# 각 승객이 어느 간격에 속하는지 이진탐색으로 찾는다
idx = np.searchsorted(arrivals, riders)
observed_gap = gaps[idx] # 승객이 겪은 간격
wait = arrivals[idx] - riders # 다음 버스까지 기다린 시간
# 이론값: E[관측 간격] = E[간격] * (1 + CV^2)
# CV = 변동계수 = 표준편차 / 평균
# 간격이 일정하면 CV=0이라 편향이 없고, 들쭉날쭉할수록 편향이 커진다.
cv2 = gaps.var() / gaps.mean() ** 2
print(f"{label}")
print(f" gap mean (bus company) : {gaps.mean():5.2f} min")
print(f" gap seen by riders : {observed_gap.mean():5.2f} min "
f"(theory: {gaps.mean() * (1 + cv2):5.2f})")
print(f" mean wait : {wait.mean():5.2f} min")
# === 경우 1: 정확히 10분마다. 표준편차 0이므로 CV = 0 ===
# 편향이 전혀 없다. 버스회사의 평균과 승객이 겪는 평균이 같다.
simulate(np.full(n_buses, mean_gap), "Every 10 minutes exactly")
# === 경우 2: 지수분포 간격(포아송 도착). 표준편차 = 평균이므로 CV = 1 ===
# 이론값이 10 * (1 + 1) = 20분. 승객이 겪는 간격이 두 배가 된다.
simulate(rng.exponential(mean_gap, n_buses), "Exponential gaps (Poisson buses)")
출력:
Every 10 minutes exactly
gap mean (bus company) : 10.00 min
gap seen by riders : 10.00 min (theory: 10.00)
mean wait : 5.00 min
Exponential gaps (Poisson buses)
gap mean (bus company) : 9.98 min
gap seen by riders : 19.87 min (theory: 19.89)
mean wait : 9.96 min
네 값이 모두 맞는다. 정확히 \(10\)분 노선에서는 승객이 겪는 간격이 \(10.00\)분, 대기가 \(5.00\)분으로 편향이 없다. 지수 노선에서는 관측 간격이 \(19.87\)분으로 이론값 \(20\)의 \(0.7\%\) 안이고, 대기가 \(9.96\)분으로 \(10\)분에 맞는다.
코드가 찍는 theory 값 \(19.89\)는 모집단의 \(20\)이 아니라 실제로 뽑힌 \(20\)만 개 간격의 \(\bar X(1 + \widehat{\mathrm{CV}}^2)\)다. 그 표본의 평균이 \(9.98\)이었으므로 조금 작게 나왔고, 모의값 \(19.87\)은 그 \(19.89\)와 \(0.1\%\) 안에서 일치한다. 이론과 모의가 어긋나는 것이 아니라, 두 단계의 몬테카를로 오차가 따로 있다.
두 노선 모두 버스회사가 광고하는 "평균 배차 \(10\)분"은 참이다. 그런데 승객이 기다리는 시간은 \(5\)분과 \(10\)분으로 두 배 차이가 난다. 차이를 만드는 것은 평균이 아니라 분산이다. 평균을 그대로 둔 채 간격을 고르게만 만들어도 대기시간은 절반이 된다.
두 식을 혼동하지 말 것
관측 간격은 \(E[X^2]/E[X]\)이고 잔여 대기시간은 \(E[X^2]/(2E[X])\)다. 지수 노선에서 각각 \(20\)분과 \(10\)분이다. "검사 역설"이라는 이름 아래 두 값이 자주 뒤섞이는데, 전자는 "내가 탄 버스의 배차 간격", 후자는 "내가 정류장에서 보낸 시간"으로 묻는 것이 다르다.
연습문제¶
연습문제 1. 어떤 통신사가 "고객 대기시간 평균 3분"이라고 광고한다. 소비자단체가 무작위로 고른 시각에 전화를 건 조사원들의 실제 대기시간을 재어 평균 7분이라고 반박했다. 양쪽 모두 정직하게 측정했다면 이 차이는 왜 생기는가?
풀이
두 평균이 세는 단위가 다르다.
통신사는 통화 건을 단위로 센다. 하루의 모든 통화에 대해 대기시간을 평균낸다. 새벽처럼 한산한 시간대에도 통화는 발생하며, 그 통화들은 대기가 거의 없고 각각 한 건씩 셈에 들어간다.
조사원은 시각을 단위로 무작위 추출했다. 그런데 대기가 긴 시간대(점심시간, 장애 발생 시각)는 더 많은 시각 구간을 차지하지 않더라도, 무작위 시각에 전화를 걸면 혼잡한 상태에 놓일 확률이 그 상태가 지속되는 시간에 비례한다. 혼잡이 오래 지속될수록 조사원이 그 안에 떨어질 확률이 커진다. 검사 역설이다.
덧붙여, 대기가 아주 길면 고객이 중간에 끊어 버리는데(포기 호), 이 통화가 통신사 통계에서 제외되면 무응답 편향까지 겹친다.
양쪽 주장을 공정하게 비교하려면 같은 단위로 다시 계산해야 한다. 소비자가 알고 싶은 것은 대개 "내가 지금 걸면 얼마나 기다리나"이므로 시각 기준이 더 적절하고, 통신사의 운영 지표로는 건 기준이 자연스럽다. 어느 쪽도 틀리지 않았고, 둘을 같은 숫자로 여긴 것이 틀렸다.
연습문제 2. 어떤 지역의 병원 세 곳의 입원 기간이 다음과 같다. 병원 A: 2일짜리 입원 900건. 병원 B: 30일짜리 입원 100건.
(a) 입원 건당 평균 재원일수를 구하라. (b) 어느 날 무작위로 이 지역의 병상 하나를 골라 그 환자의 총 재원일수를 물었다. 기대값을 구하라. (c) (a)와 (b) 중 "병원이 얼마나 효율적인가"를 재는 데 적절한 것은 무엇인가?
풀이
(a) 건 단위 평균이다.
(b) 병상-일을 단위로 세면, 2일 입원은 병상-일 \(1{,}800\)일을, 30일 입원은 \(3{,}000\)일을 차지한다. 무작위 병상에서 만나는 환자의 기대 재원일수는
이다. 4.8일과 19.5일, 네 배 차이다. 장기 입원 환자가 병상을 오래 점유하므로 어느 날 병동에 가 보면 장기 환자가 압도적으로 많이 보인다. 정의의 공식 \(\mathbb{E}[X^2]/\mathbb{E}[X]\)를 그대로 적용한 것이다.
(c) (a) 다. 병원이 처리한 환자를 단위로 세는 것이 진료 효율의 정의에 맞는다. (b)는 병상 점유 실태를 보여 주므로 병상 수요 예측에는 적절하지만 효율 지표로 쓰면 장기 환자를 받는 병원이 부당하게 나쁘게 평가된다.
이 구분은 실무에서 중요하다. 병동을 둘러본 관리자의 인상(장기 환자가 많다)과 통계(평균 4.8일)가 어긋날 때, 둘 중 하나가 틀린 것이 아니라 다른 단위를 세고 있는 것이다.
연습문제 3. 어떤 암 검진 프로그램의 홍보 자료가 이렇게 말한다. "검진으로 발견된 환자의 5년 생존율은 88%인 반면, 증상이 나타난 뒤 진단된 환자는 51%입니다." 이 수치만으로 검진이 생명을 구한다고 결론지을 수 없는 이유를 세 가지 기제로 나누어 설명하라.
풀이
세 기제가 각각 독립적으로 이 격차를 만들 수 있으며, 검진의 실제 효과가 0이어도 그렇다.
리드타임 편향. 검진은 진단 시점을 앞당긴다. 사망 시점이 그대로여도 진단부터 재는 생존기간은 앞당긴 기간만큼 길어진다. 리드타임이 5년을 넘으면 실제로 하루도 더 살지 못한 환자가 "5년 생존"으로 집계된다.
길이 편향. 검진은 주기적으로 실시되므로 전임상 단계에 오래 머무는 느리게 자라는 암을 우선적으로 잡아낸다. 빠르게 자라는 공격적 암은 검진 사이에 증상으로 발현하여 "증상 발현군"에 들어간다. 두 집단은 애초에 서로 다른 종류의 암 집단이며, 검진군 쪽이 원래 예후가 좋다.
과잉진단. 평생 증상을 일으키지 않았을 암이나 저절로 퇴화할 암까지 발견된다. 이 환자들은 그 암으로 죽지 않으므로 100% 생존하여 검진군의 생존율을 끌어올린다. 실제로는 아프지 않았을 사람을 환자로 만든 것이다.
무엇을 보아야 하는가. 세 기제 모두 "진단 후 생존율"을 부풀리지만, 인구 10만 명당 그 암으로 인한 사망률은 어느 것에도 영향받지 않는다. 검진이 실제로 생명을 구한다면 사망률이 내려가야 한다. 일본의 신경모세포종 검진은 생존율이 좋아 보였으나 사망률이 내려가지 않아 2004년 중단되었다.
가장 확실한 판정 방법은 결국 대상자를 검진군과 비검진군에 무작위 배정하고 사망률을 비교하는 것이다.
연습문제 4. 우정의 역설: 무작위로 고른 사람의 친구들은 평균적으로 그 사람보다 친구가 많다. 이것이 길이 편향의 한 사례임을 설명하고, 소셜미디어 이용자가 자신의 인기를 과소평가하기 쉬운 이유와 연결하라.
풀이
왜 길이 편향인가. 사람을 무작위로 고르면 각자가 한 번씩 뽑힌다. 그러나 친구 관계를 무작위로 고르면 친구가 \(k\)명인 사람은 \(k\)개의 관계에 등장하므로 \(k\)에 비례하여 뽑힌다. "누군가의 친구"라는 표본은 정확히 친구 수로 가중된 표본이다.
따라서 친구의 친구 수에 대한 기대값은 정의의 공식대로
이며, 이는 평균 친구 수 \(\mu_K\)보다 크다. 친구 수의 분산이 클수록 격차가 커진다. 소셜네트워크의 연결 수 분포는 꼬리가 매우 두꺼워 \(\sigma_K^2\)가 크므로 격차가 극적으로 벌어진다.
소셜미디어에서의 함의. 이용자가 자기 인기를 가늠하는 준거집단은 "무작위 이용자"가 아니라 자기 친구들이다. 그런데 그 친구들은 정의상 연결 수로 가중 표집된 사람들이므로 평균보다 인기가 많다. 그래서 자기 팔로워 수가 실제로는 상위권이어도 주변과 비교하면 초라해 보인다.
같은 논리가 다른 지표로도 확장된다. 내 친구들은 나보다 평균적으로 게시물을 더 많이 올리고(활발한 사람이 더 자주 친구로 등장한다), 내 타임라인에 뜨는 게시물은 활발한 이용자 쪽으로 편중된다. 여기에 알고리즘 추천이 얹히면 왜곡이 더 커진다.
핵심은 준거집단 자체가 무작위 표본이 아니라는 것이다. 이는 이 절의 다른 사례들과 같은 구조다. 승객이 겪는 배차 간격, 학생이 겪는 학급 크기, 이용자가 겪는 친구의 인기 — 모두 경험하는 쪽에서 세면 큰 쪽이 과대표집된다.
연습문제 5. 어떤 조사가 무작위로 고른 성인에게 형제자매 수를 물어 평균 자녀 수를 추정하려 한다.
(a) 이 추정이 왜 편향되는지 설명하라. (b) 자녀가 없는 가정을 이 조사가 아예 볼 수 없다는 점이 왜 별도의 문제인지 밝혀라. (c) 가중치로 보정하는 방법을 제시하라.
풀이
(a) 자녀가 \(k\)명인 가정은 표본에 \(k\)번 등장할 기회를 갖는다. 따라서 응답자 표본에서 대가족이 \(k\)에 비례하여 과대표집된다. 응답자가 보고하는 "우리 집 자녀 수"의 기대값은 가정당 평균 자녀 수 \(\mu\)가 아니라
이며, 자녀 수의 분산만큼 위로 치우친다.
(b) 자녀가 0명인 가정은 표본에 등장할 성인 자녀를 배출하지 못하므로 표집틀에서 구조적으로 배제된다. 이는 (a)의 가중 문제와 다른 종류의 결함이다. 가중치는 관측된 값들의 상대적 비중을 조정할 뿐, 한 번도 관측되지 않은 범주를 복원하지는 못한다. 표집틀 자체가 모집단을 포괄하지 못하는 포괄 편향이며, 표본조사 절에서 다룬 표집틀 문제와 같다.
이 배제는 아래로 향하는 편향을 만들지 않는다. 오히려 0을 제외하고 평균내는 셈이므로 (a)의 위쪽 편향에 더해진다. 두 편향이 같은 방향으로 겹친다.
(c) 길이 편향된 표본에서 모집단 평균을 복원하려면 각 관측값에 \(1/k\)의 가중치를 준다. 응답자 \(i\)가 보고한 자녀 수를 \(k_i\)라 할 때 추정량은
형태가 된다. \(k\)에 비례해 뽑혔으므로 \(1/k\)로 상쇄하는 것이다.
다만 이 보정으로도 (b)는 해결되지 않는다. 자녀가 없는 가정의 비율은 다른 자료원(인구총조사, 출생 등록)에서 가져와야 하며, 그 없이는 어떤 가중치를 써도 모집단 평균을 되찾을 수 없다.
연습문제 6. 길이 편향은 이 절의 다른 편향들 — 무응답 편향, 생존자 편향, 출판 편향 — 과 한 가지 점에서 두드러지게 다르다. 무엇이 다른지 밝히고, 그 차이가 왜 길이 편향을 알아채기 어렵게 만드는지 논하라.
풀이
다른 점: 아무도 선택하지 않는다.
다른 세 편향에는 모두 걸러 내는 행위자가 있다. 무응답 편향에서는 응답자가 응답할지 말지 정하고, 생존자 편향에서는 실패한 대상이 자료에서 빠지며, 출판 편향에서는 연구자·심사자·편집자가 무엇을 세상에 내보낼지 정한다. 각각에는 "누가 무엇을 걸러 냈는가"라고 물을 대상이 있다.
길이 편향에는 그런 행위자가 없다. 버스 회사는 정직하게 간격을 공지했고, 승객은 아무 편견 없이 정류장에 갔으며, 학교도 학생도 거짓말하지 않았다. 표집 절차 어디에도 잘못된 곳이 없는데 답이 틀린다. 큰 것이 더 많은 기회를 갖는다는 순전히 기하학적인 사실 하나에서 편향이 나온다.
왜 알아채기 어려운가. 편향을 찾는 표준적인 물음이 여기서는 작동하지 않는다.
- "표본이 대표성이 있는가?" → 승객은 정말로 무작위 시각에 도착했다.
- "누가 빠졌는가?" → 아무도 빠지지 않았다. 모든 버스가 운행했고 모든 학급이 존재한다.
- "응답률이 얼마인가?" → 무응답이 없다.
올바른 물음은 다른 것이다. "내가 세고 있는 단위가 무엇인가?" 버스인가 승객인가, 학급인가 학생인가, 입원 건인가 병상-일인가, 진단인가 사람인가. 길이 편향은 자료 수집의 결함이 아니라 단위의 혼동이며, 그래서 자료 품질을 아무리 점검해도 드러나지 않는다.
실무적 함의: 어떤 평균을 보고받았을 때 그 값이 직관과 크게 어긋난다면, 자료를 의심하기 전에 분모가 무엇인지 먼저 확인해야 한다.
연습문제 7. 본문의 "가중치로 되돌린다"를 실제로 해 보라. 길이 편향된 표본만 가지고 모집단 평균을 복원하고, 왜 \(1/x\) 가중이 옳은지 보여라.
풀이
왜 \(1/x\)인가. 길이 편향된 밀도가 \(f^*(x) = xf(x)/\mu\)이므로
이다. 즉 길이 편향된 표본에서 \(1/X\)의 평균을 구해 역수를 취하면 모집단 평균이 나온다. 편향된 표본의 조화평균이 모집단의 산술평균인 셈이다.
import numpy as np
rng = np.random.default_rng(0)
# 모집단: 학급 620개
sizes = np.concatenate([np.full(500, 10), np.full(100, 30), np.full(20, 90)])
print(f"참 평균 학급 크기 (학급 단위) {sizes.mean():.4f}")
# 우리가 실제로 얻는 자료: 학생을 무작위로 뽑아 "네 반은 몇 명이냐"고 묻는다
students = np.repeat(sizes, sizes.astype(int))
sample = rng.choice(students, 200_000)
print(f"학생 표본의 단순평균 {sample.mean():.4f}"
f" (이론 {(sizes ** 2).sum() / sizes.sum():.4f})")
print(f"1/x 가중으로 복원 {1 / np.mean(1 / sample):.4f} ← 참값을 되찾았다")
출력:
참 평균 학급 크기 (학급 단위) 15.8065
학생 표본의 단순평균 30.7878 (이론 30.8163)
1/x 가중으로 복원 15.7995 ← 참값을 되찾았다
단순평균 \(30.79\)가 참값 \(15.81\)의 거의 두 배인데, \(1/x\) 가중이 \(15.80\)으로 정확히 되돌려 놓는다.
일반형. 임의의 함수 \(g\)에 대해서도 같은 방식이 통한다.
즉 \(\mu\)를 먼저 복원한 뒤 어떤 모집단 양이든 계산할 수 있다.
주의할 점. \(1/x\) 가중은 작은 관측값에 큰 가중치를 준다. 표본에 아주 작은 값이 하나 들어오면 추정값이 크게 흔들리므로 분산이 커진다. 앞서 본 역확률가중과 정확히 같은 맞바꿈이다. 편향을 없애는 대신 분산을 얻는다.
그리고 \(x\)가 \(0\)에 가까울 수 있으면 이 방법은 쓸 수 없다. 다행히 길이 편향의 정의상 \(x = 0\)인 대상은 애초에 표본에 들어오지 못하므로 대개 문제가 되지 않는다. \(\square\)
연습문제 8. 본문은 평균 대기시간만 다루었다. 대기시간의 분포 전체는 어떻게 되는가? 간격 분포가 서로 다른 세 경우를 비교하라.
풀이
갱신이론의 결과에 따르면, 정상상태에서 무작위 시점의 잔여 대기시간은 평형분포
를 따른다. 여기서 \(F\)는 간격의 분포함수다. 기대값을 구하면
로 본문의 결과가 나온다. 관측된 간격의 절반이라는 점에 유의하라.
import numpy as np
rng = np.random.default_rng(0)
m = 300_000
cases = [("일정 10분", np.full(m, 10.0)),
("지수 10분", rng.exponential(10, m)),
("2분 80% / 30분 20%", rng.choice([2., 30.], m, p=[0.8, 0.2]))]
print(f"{'간격 분포':>20}{'간격 평균':>11}{'관측 간격':>11}{'대기 평균':>11}{'이론':>9}")
for label, gaps in cases:
arrivals = np.cumsum(gaps)
riders = rng.uniform(0, arrivals[-1], m)
i = np.searchsorted(arrivals, riders)
wait = arrivals[i] - riders
cv2 = gaps.var() / gaps.mean() ** 2
print(f"{label:>20}{gaps.mean():>11.3f}{gaps[i].mean():>11.3f}"
f"{wait.mean():>11.3f}{gaps.mean() * (1 + cv2) / 2:>9.3f}")
출력:
간격 분포 간격 평균 관측 간격 대기 평균 이론
일정 10분 10.000 10.000 4.996 5.000
지수 10분 10.004 20.116 10.043 10.055
2분 80% / 30분 20% 7.623 24.133 12.075 12.064
셋째 경우가 특히 극적이다. 버스 회사가 재는 평균 간격은 \(7.6\)분인데 승객이 겪는 간격은 \(24.1\)분이고 평균 대기는 \(12.1\)분이다. 평균 간격보다 더 오래 기다린다. 간격의 개수로는 \(20\%\)뿐인 \(30\)분짜리 구간이 시간축에서는 \(0.2\times 30 / 7.6 = 78.9\%\)를 차지하기 때문이다. 버스 회사는 \(30\)분 구간을 다섯 번에 한 번으로 세지만, 승객은 열 번 중 여덟 번 꼴로 그 안에 떨어진다.
세 분포의 성격이 다르다.
| 간격 | 대기시간 분포 | 모양 |
|---|---|---|
| 일정 \(\mu\) | \(\mathrm{Uniform}(0,\mu)\) | 균등 |
| \(\mathrm{Exp}(\lambda)\) | \(\mathrm{Exp}(\lambda)\) | 간격과 같다 |
| 혼합 | 혼합 | 긴 구간 쪽으로 치우침 |
지수분포의 경우가 유명한 무기억성이다. 이미 얼마를 기다렸든 앞으로 기다릴 시간의 분포가 똑같다. \(10\)분을 기다린 뒤에도 여전히 평균 \(10\)분이 남아 있다. 버스를 기다리며 느끼는 좌절감에 수학적 근거가 있는 셈이다.
실무에서 어디에 쓰이는가. 대기행렬 이론, 신뢰성 공학(부품의 잔여 수명), 그리고 생존분석의 왼쪽 절단 문제가 모두 같은 구조다. 예컨대 어떤 시점에 이미 진행 중인 사건만 관측하는 연구는 자동으로 긴 사건 쪽으로 편중된다. \(\square\)
연습문제 9. 본문의 리드타임 편향을 모의실험으로 확인하라. 검진이 사망 시점을 전혀 바꾸지 않는 세계를 만들고, 그럼에도 5년 생존율이 얼마나 뛰는지 보여라.
풀이
핵심 설계는 사망 시점을 검진과 무관하게 먼저 정해 놓는 것이다. 그러면 생존율의 어떤 개선도 순전히 시계를 앞당긴 결과일 수밖에 없다.
import numpy as np
rng = np.random.default_rng(2)
n = 200_000
onset = rng.uniform(40, 70, n) # 종양 발생 나이
sojourn = rng.exponential(6, n) # 전임상 기간
symptom = onset + sojourn # 증상 발현
death = symptom + rng.exponential(3, n) # 사망 — 검진과 무관하게 결정된다
grid = np.arange(40, 80, 2.0) # 2년마다 검진
i = np.minimum(np.searchsorted(grid, onset), len(grid) - 1)
screen_dx = np.where(grid[i] <= symptom, grid[i], np.nan)
detected = ~np.isnan(screen_dx)
# 같은 사람들. 같은 사망 시점. 시계만 다르다.
from_screen = death[detected] - screen_dx[detected]
from_symptom = death[detected] - symptom[detected]
print(f"검진으로 발견된 {detected.sum():,}명에 대해")
print(f" 진단 시점부터 재면: 5년 생존율 {(from_screen > 5).mean():.4f}"
f" 평균 생존 {from_screen.mean():.3f}년")
print(f" 증상 시점부터 재면: 5년 생존율 {(from_symptom > 5).mean():.4f}"
f" 평균 생존 {from_symptom.mean():.3f}년")
print(f"\n 리드타임 평균 {(symptom[detected] - screen_dx[detected]).mean():.3f}년")
print(f" 사망 나이는 어느 쪽으로 재든 {death[detected].mean():.4f}세로 같다")
출력:
검진으로 발견된 170,074명에 대해
진단 시점부터 재면: 5년 생존율 0.6802 평균 생존 9.003년
증상 시점부터 재면: 5년 생존율 0.1880 평균 생존 3.004년
리드타임 평균 5.999년
사망 나이는 어느 쪽으로 재든 65.0067세로 같다
5년 생존율이 \(19\%\)에서 \(68\%\)로 뛴다. 같은 사람들이고, 사망 나이는 \(65.0067\)세로 소수점 넷째 자리까지 동일하다. 단 한 명도 하루를 더 살지 못했다.
차이를 만든 것은 오직 리드타임 \(6.0\)년, 곧 진단 시점을 앞당긴 만큼이다.
이 모의실험이 보여 주는 것. 검진의 효과가 정확히 \(0\)인 세계에서도 홍보 자료에 실을 만한 생존율 개선이 나온다. 본문 연습문제 3의 \(88\%\) 대 \(51\%\) 같은 수치는 검진이 아무 일도 하지 않아도 얻어진다.
그래서 무엇을 보아야 하는가. 위 코드에서 사망 나이는 두 시계 어느 쪽으로 재도 같았다. 이것이 인구 단위 사망률이 리드타임 편향에 면역인 이유다. 사망률은 "몇 명이 언제 죽었는가"만 세고 "언제 진단받았는가"는 묻지 않는다.
일본 신경모세포종 검진에서 생존율은 훌륭했지만 사망률이 꿈쩍하지 않았던 것이 바로 이 그림이다. 지표를 잘못 고르면 효과가 \(0\)인 프로그램을 20년간 성공으로 착각할 수 있다. \(\square\)
연습문제 10. 연습문제 4의 우정의 역설을 정량화하라. 친구 수 분포에 따라 역설이 얼마나 강해지는지 계산하고, 소셜미디어에서 왜 특히 심한지 설명하라.
풀이
무작위로 고른 사람의 친구 수 평균은 \(\mu = \mathbb{E}[D]\)다. 그런데 무작위로 고른 친구 관계를 따라가 만나는 사람은 친구 수에 비례해 뽑히므로, 그 사람의 친구 수 기대값은 길이 편향 공식 그대로
이다. 친구가 많은 사람일수록 더 많은 사람의 친구 목록에 등장한다는 것이 편향의 원천이다.
import numpy as np
rng = np.random.default_rng(3)
n = 300_000
cases = [
("포아송 (평균 10)", np.maximum(1, rng.poisson(10, n))),
("멱법칙 alpha=2.5", np.clip((rng.pareto(2.5, n) * 6).astype(int) + 1, 1, 3000)),
("멱법칙 alpha=1.8", np.clip((rng.pareto(1.8, n) * 6).astype(int) + 1, 1, 3000)),
]
print(f"{'친구 수 분포':>18}{'내 친구 수':>12}{'친구의 친구 수':>16}{'비율':>9}{'평균 이하':>11}")
for label, deg in cases:
mu = deg.mean()
friend = (deg ** 2).mean() / mu
print(f"{label:>18}{mu:>12.3f}{friend:>16.3f}{friend / mu:>9.2f}배"
f"{(deg < friend).mean():>11.3f}")
출력:
친구 수 분포 내 친구 수 친구의 친구 수 비율 평균 이하
포아송 (평균 10) 10.001 10.999 1.10배 0.582
멱법칙 alpha=2.5 4.520 22.241 4.92배 0.979
멱법칙 alpha=1.8 7.992 100.163 12.53배 0.994
| 분포 | 배율 | 친구의 평균 친구 수 \(\mathbb{E}^*[D]\) 에 못 미치는 사람 |
|---|---|---|
| 포아송 | \(1.10\)배 | \(58\%\) |
| 멱법칙 \(\alpha=2.5\) | \(4.92\)배 | \(98\%\) |
| 멱법칙 \(\alpha=1.8\) | \(12.53\)배 | \(99\%\) |
마지막 열은 각자를 자기 친구들과 일일이 견준 것이 아니라, 모집단 전체의 \(\mathbb{E}^*[D]\) 하나를 기준선으로 삼아 그 아래에 있는 사람의 비율을 센 것이다. 역설의 세기를 가늠하는 간편한 대용치로 보면 된다.
왜 소셜미디어에서 심한가. 현실의 대면 우정은 시간과 물리적 제약 때문에 대체로 포아송에 가깝고, 이때 역설은 \(10\%\) 수준의 미미한 것이다. 그러나 온라인 팔로워 수는 멱법칙을 따른다. 인플루언서 한 명이 수백만 명을 거느리는 구조에서는 \(\sigma^2/\mu\) 항이 폭발한다.
그 결과 이용자의 \(99\%\)가 "친구의 평균 인기"에 못 미친다. 이는 착각이 아니라 사실이며, 동시에 자신이 특별히 인기 없다는 증거도 전혀 아니다. 구조적으로 거의 모두가 그렇다.
같은 계산이 여러 곳에 적용된다.
- 행복의 역설: 내 친구들이 나보다 더 즐겁게 사는 것처럼 보인다. 활동적인 사람이 친구도 많고 게시물도 많이 올린다.
- 헬스장의 역설: 헬스장에서 마주치는 사람들이 나보다 자주 오는 것처럼 보인다. 자주 오는 사람을 더 자주 마주치기 때문이다.
- 전염병 대책: 무작위로 고른 사람의 친구를 백신 접종하면 무작위 접종보다 효율적이다. 연결이 많은 사람이 뽑힐 확률이 높은데, 그런 사람이 전파의 중심이기 때문이다. 명단 없이도 허브를 찾아내는 영리한 방법이며, 길이 편향을 일부러 이용한 사례다. \(\square\)
정리하며¶
길이 편향은 표집 절차에 잘못된 곳이 하나도 없어 보이는데도 답이 틀리는 편향이다. 큰 것이 눈에 더 잘 띄기 때문에 생긴다.
- 크기로 가중된 분포. 포함 확률이 크기에 비례하면 관측되는 밀도는 \(f^{*}(x) = x f(x)/\mu\) 다.
- 편향의 크기가 분산으로 정해진다.
등호는 모든 대상의 크기가 같을 때뿐이다. 퍼짐이 클수록 과대추정이 커진다. - 검사 역설은 같은 현상의 시간축 판본이다. 무작위로 고른 한 시점은 긴 구간 안에 떨어질 확률이 크므로, 그 시점이 속한 구간은 평균 구간보다 길다. 버스를 기다리는 시간이 배차 간격의 절반보다 긴 이유다. - 학급 규모, 친구 수, 시설 이용 기간처럼 "개체를 뽑았는가, 아니면 개체가 속한 덩어리를 뽑았는가"를 혼동하면 어김없이 나타난다.
표집 단위를 무엇으로 잡았는지 확인하는 것이 유일한 처방이다. 대상을 뽑았다면 편향이 없고, 시점이나 접촉을 뽑았다면 크기로 가중된 것이다.
다음 절 알고리즘 편향과 피드백 루프는 마지막이자 가장 현대적인 경우다. 지금까지의 편향은 모두 정적이었지만, 거기서는 편향이 시간에 따라 자란다.