관찰연구¶
관찰연구(observational study) 는 연구자가 개입하거나 처리를 배정하지 않은 채 자료를 기록하는 연구다. 실험이 비현실적이거나 비윤리적이거나 너무 오래 걸리는 모든 분야 — 역학, 경제학, 사회학, 생태학, 금융 — 에서 지배적인 연구 방식이며, 사회과학과 보건과학의 경험적 증거 대부분을 만들어낸다. 이 유연함의 대가는 구조적 한계다. 추가적인 식별 가정을 두지 않는 한, 관찰연구는 인과효과가 아니라 연관성을 측정한다.
정의 1. 관찰연구¶
관찰연구는 연구자가 어떤 조건도 조작하지 않고 집단에 무작위 배정도 하지 않은 채 대상을 관찰하고 변수를 측정하는 연구 설계다. 주요 유형 네 가지는 다음과 같다.
- 횡단연구(cross-sectional): 한 시점에서 모집단을 찍은 스냅숏(예: 전국 건강조사).
- 코호트연구(종단연구): 한 집단을 시간에 따라 추적하며, 전향적(시간 순방향)일 수도 후향적(기록을 통해 과거를 되짚음)일 수도 있다.
- 환자대조연구(case–control): 어떤 상태를 가진 대상(사례군)과 갖지 않은 대상(대조군)을 비교하며, 노출 이력을 후향적으로 조사한다. 사례군과 대조군의 비율을 연구자가 정해서 모집하므로 유병률·발생률·위험비는 추정할 수 없고, 얻을 수 있는 것은 오즈비뿐이다.
- 생태학적 연구(ecological): 개인 수준이 아니라 인구나 집단 수준에서 자료를 분석한다 — 생태학적 오류에 취약하다.
관찰자료만으로는 왜 인과관계를 확립할 수 없는가¶
관찰연구에서 대상은 스스로 집단을 선택한다. 집단 간 결과의 차이는 처리효과와 선택의 차이를 뒤섞는다. 대표적인 예로, 흡연자는 비흡연자보다 건강 결과가 나쁘지만 흡연자는 소득, 식단, 운동, 스트레스, 그리고 측정되지 않은 수십 가지 변수에서도 다르다. 관측된 연관성은 참된 인과효과(그것이 무엇이든)와 교란된 선택효과의 합이다.
형식적으로, 처리 \(T\)가 결과 \(Y\)에 미치는 관측된 효과를 \(\mathbb{E}[Y \mid T = 1] - \mathbb{E}[Y \mid T = 0]\)이라 하자. 이것이 인과 효과 \(\mathbb{E}[Y(1) - Y(0)]\)과 같아지는 것은 처리 배정이 잠재적 결과와 독립일 때뿐이다 — 이는 정확히 무작위화가 보장하고 관찰자료는 보장하지 못하는 조건이다.
흔히 쓰는 식별 전략¶
관찰자료만으로는 인과효과를 식별할 수 없지만, 다음과 같은 추가 가정을 두면 가능해진다.
| 전략 | 핵심 가정 |
|---|---|
| 층화 / 짝짓기 | 관측된 공변량을 조건부로 하면 처리가 무작위나 다름없다 |
| 다변량 회귀 | 위와 같고, 더불어 함수 형태가 옳다 |
| 성향점수 방법 | 위와 같고, 더불어 성향점수 모형이 옳다 |
| 도구변수 | 외생적인 변동 원천이 \(T\)에는 영향을 주지만 \(Y\)에는 직접 영향을 주지 않는다 |
| 이중차분법 | 처리가 없었다면 추세가 평행했을 것이다 |
| 회귀 불연속 | 뚜렷한 자격 기준선에서 결과와 교란요인이 매끄럽다 |
각 전략은 "무작위화"를 서로 다른 식별 가정으로 대체한다. 어느 것도 자료만으로는 검증할 수 없으며, 그중 무엇을 고를지는 설계이자 기예의 문제다.
그림으로 보는 보정의 한계¶

\(4{,}000\)명의 가상 코호트를 만들었다. 나이가 많을수록 어떤 약을 복용할 확률이 높고, 나이 자체가 증상 점수를 끌어올리며, 약은 증상 점수를 \(5\)점 낮춘다. 즉 참 처리효과는 \(-5.00\)이고 교란요인은 나이 하나뿐인, 관찰연구로서는 가장 유리한 상황이다.
(가)를 보면 두 군이 애초에 다른 사람들이라는 것이 드러난다. 처리군 \(1{,}985\)명의 평균 나이는 \(61.7\)세, 대조군 \(2{,}015\)명은 \(47.9\)세로 \(13.8\)세 차이가 난다. 두 나이 분포의 겹침 계수는 \(0.465\)다. 절반이 넘는 부분에서 두 군은 서로 견줄 상대를 갖고 있지 않다. 무작위 배정이었다면 이 차이가 \(0\) 주위에서만 흔들렸을 것이다.
(나)는 그 말을 구간별로 세어 본 것이다. \(25\)–\(35\)세 구간에는 대조군이 \(182\)명 있는데 처리군은 \(1\)명뿐이고, \(75\)–\(85\)세 구간은 처리군 \(159\)명에 대조군 \(8\)명이다. 층화든 짝짓기든 성향점수든, 보정이라는 이름의 방법은 모두 같은 나이대의 처리군과 대조군을 맞대어 놓는 일을 한다. 맞댈 상대가 없는 구간에서는 아무것도 할 수 없다. 여기서 한쪽이 \(10\)명 미만인 구간의 관측 \(375\)명은 계산에서 아예 빠진다. 이것이 중첩(positivity) 이라 부르는 조건이며, 표의 모든 식별 전략이 조용히 깔고 있는 전제다. 그리고 관측을 버리는 순간 답하는 질문도 바뀐다. 남은 \(3{,}625\)명에 대한 효과를 추정하는 것이지 원래 코호트 전체에 대한 효과가 아니다.
(다)가 결과다. 나이를 무시한 단순 차이는 \(+1.92\)로, 약이 증상을 악화시키는 것처럼 보인다. 부호까지 뒤집혀 있다. \(5\)년 폭 구간 안에서만 비교한 뒤 구간 크기로 가중평균한 층화 추정값은 \(-4.96\)으로 참값 \(-5.00\)을 거의 그대로 되찾는다.
이 마지막 숫자를 관찰연구에 대한 변론으로 읽으면 안 된다. 여기서 보정이 통한 것은 교란요인이 나이 하나뿐이고, 그 사실을 우리가 알고 있었고, 나이를 정확히 측정했기 때문이다. 현실의 자료에서는 세 조건 중 어느 것도 보장되지 않으며, 보장되지 않는다는 사실조차 자료는 알려 주지 않는다. 위 표의 식별 전략들이 파는 것은 답이 아니라 가정을 명시적으로 적을 자리다.
자연실험의 고전: 존 스노와 콜레라¶
1850년대 런던에서 콜레라의 원인은 오염된 공기("미아즈마")라는 것이 정설이었다. 존 스노는 물이 원인이라고 의심했지만, 런던 시민을 무작위로 두 수도회사에 배정하는 실험은 불가능했다.
스노가 찾아낸 것은 런던이 이미 그 실험을 대신 해 놓았다는 사실이었다. 남부 런던의 상당 지역에서 두 수도회사의 배관이 같은 거리에 뒤섞여 깔려 있었다. 옆집끼리도 수도회사가 다를 수 있었고, 주민은 대개 자기 물이 어디서 오는지도 몰랐다. 배관은 수십 년 전에 상업적 이유로 깔린 것이었다.
결정적으로, 1852년에 Lambeth 회사만 취수구를 템스강 상류로 옮겼다. 하수 유입 지점보다 위쪽이다. Southwark & Vauxhall 회사는 하류에 그대로 두었다. 1854년 콜레라가 돌았을 때 스노는 사망자 집집마다 수도회사를 확인했다.
| 수도 공급 | 가구 수 | 콜레라 사망 | 1만 가구당 사망률 |
|---|---|---|---|
| Southwark & Vauxhall (하류 취수) | 40,046 | 1,263 | 315 |
| Lambeth (상류 취수) | 26,107 | 98 | 37 |
| 런던의 나머지 | 256,423 | 1,422 | 59 |
사망률이 8.5배 차이 난다.
이것이 왜 그토록 강력한 관찰연구인가
스노가 무작위화하지 않았는데도 이 비교가 설득력을 갖는 이유는, 배정 기제가 결과와 무관했기 때문이다. 위 표의 식별 가정을 그대로 점검해 보자.
- 두 회사의 고객은 같은 거리에 섞여 살았다 → 지역, 공기, 위생 상태가 같다.
- 주민이 회사를 고르지 않았다(대부분 알지도 못했다) → 자기선택이 없다.
- 배관은 콜레라가 돌기 수십 년 전에 깔렸다 → 역인과가 없다.
- 취수구 이전은 콜레라와 무관한 이유로 1852년에 일어났다 → 외생적 충격이다.
이 네 줄이 무작위화가 해 주었을 일을 대신한다. 스노는 무작위 배정을 잃은 대신, 배정이 무작위나 다름없다고 논증할 수 있는 상황을 찾아냈다. 오늘날 이를 자연실험이라 부르며, 위 표의 "도구변수"와 "이중차분법"이 이 착상을 형식화한 것이다.
비교해 보라. 만약 스노가 "물을 끓여 마시는 사람과 아닌 사람"을 비교했다면 아무것도 증명하지 못했을 것이다. 물을 끓이는 사람은 더 부유하고, 더 잘 먹고, 덜 붐비는 곳에 살았을 테니 말이다. 좋은 관찰연구와 나쁜 관찰연구를 가르는 것은 자료의 양이 아니라 비교의 구조다.
한 가지 덧붙일 것이 있다. 스노는 세균을 본 적이 없다. 콜레라균은 30년 뒤에나 분리된다. 그는 기제를 모른 채 인과를 확립했다. 좋은 설계는 이론이 도착하기 전에도 작동한다.
- Snow, J. (1855). On the Mode of Communication of Cholera (2nd ed.). London: John Churchill. (표는 Freedman, Pisani, & Purves, Statistics (4th ed.), 2장의 정리를 따랐다.)
장기 코호트 연구의 힘¶
자연실험을 찾지 못하면 남는 길은 오래 기다리는 것이다. 노출 이전부터 사람들을 등록해 놓고 수십 년간 추적하면, 적어도 역인과(결과가 원인을 만든 것)는 배제할 수 있다.
프레이밍햄 심장 연구 (1948– ). 매사추세츠주 프레이밍햄 주민 5,209명을 등록해 2년마다 검진하며 지금까지 3세대에 걸쳐 추적하고 있다. 오늘날 상식이 된 "위험인자(risk factor)"라는 말 자체가 이 연구에서 나왔다. 고혈압, 고콜레스테롤, 흡연, 당뇨, 비만이 심혈관질환과 연결된다는 사실이 여기서 확립되었다.
간호사 건강 연구 (1976– ). 미국 간호사 12만여 명을 등록해 생활양식과 건강 결과를 추적했다. 간호사를 고른 이유가 흥미로운데, 의학 용어로 된 설문에 정확히 답할 수 있고 장기 추적에 협조적이며 이사해도 면허 기록으로 추적할 수 있기 때문이다. 표본의 대표성을 일부 희생하고 측정의 질과 낮은 탈락률을 얻은 설계다.
코호트 연구가 무작위화를 대신하지 못하는 지점
두 연구 모두 훌륭하지만 여전히 관찰연구다. 프레이밍햄이 "흡연이 심장병을 일으킨다"를 증명한 것이 아니라 흡연자와 비흡연자의 심장병 발생률 차이를 보인 것이다. 흡연자는 술도 더 마시고 운동도 덜 하고 소득도 다르다.
그럼에도 이 연구들이 설득력을 갖는 이유는 다음과 같다.
- 시간 순서가 확정된다. 노출을 먼저 측정하고 결과를 나중에 관측하므로 역인과가 배제된다.
- 용량–반응 관계를 볼 수 있다. 하루 한 갑보다 두 갑이 더 위험하다면 우연한 교란으로 설명하기 어려워진다.
- 여러 코호트에서 재현된다. 나라와 시대가 다른 코호트에서 같은 결과가 나오면, 모든 곳에 같은 교란요인이 있다고 보기 어렵다.
Hill(1965)이 정리한 이 판단 기준들은 무작위화의 대체물이 아니라, 무작위화가 불가능할 때 인과 주장을 얼마나 신뢰할지 가늠하는 체크리스트다. 흡연과 폐암의 인과관계는 끝내 무작위 시험 없이 확립되었다.
강점¶
- 현실 적합성. 자연 상태에서 관측된 효과는 통제된 실험실 결과보다 더 쉽게 일반화된다.
- 실행 가능성. 관심 있는 노출 중 상당수(흡연, 직업적 위험, 교육)는 무작위 배정이 불가능하다.
- 규모. 현대의 행정 자료는 흔히 수백만 명을 포함하며, 실험으로는 불가능한 정밀도를 제공한다.
약점¶
- 교란 — 앞서 말한 대표적 문제.
- 누가 표본에 들어오는지, 누구의 자료가 기록되는지에서 생기는 선택편향.
- 역인과 — "결과"가 실제로는 "노출"을 유발할 수 있다(아파서 운동을 덜 하는 것이지 그 반대가 아니다).
- 자기보고 변수의 측정오차.
보기 1. 관찰연구. 나이가 \(20\)세부터 \(70\)세까지 고르게 퍼진 \(500\)명에서
로 자료를 만든다(\(\varepsilon_1 \sim N(0,1)\), \(\varepsilon_2 \sim N(0,5^2)\)). 참 인과효과는 \(-0.3\)이다.
(1) 나이를 무시했을 때의 상관 \(r\)과 회귀기울기를 닫힌 꼴로 구하시오.
(2) 나이를 통제한 편상관을 구하고, 모의실험이 두 값을 재현하는지 확인하시오.
풀이
(1) 해석적으로. \(\operatorname{Var}(\text{나이}) = 50^2/12 = 208.333\)에서 출발한다.
혈압과의 공분산은 두 조각으로 갈린다.
가짜 경로가 참 경로의 \(11\)배다. 이것이 교란의 크기를 수로 본 것이다.
혈압의 분산은
이므로
이다. 참 효과 \(-0.3\)이 \(-3.678\)로, 열두 배 넘게 부풀려진다.
(2) 해석적으로. 나이를 빼고 남는 것을 직접 계산한다. 운동의 잔차는 \(\varepsilon_1\) 그 자체다. 혈압은 운동을 대입하면
이므로 그 잔차는 \(-0.3\varepsilon_1 + \varepsilon_2\)다. 따라서
이다. 나이를 통제하면 상관이 \(-0.71\)에서 \(-0.06\)으로 떨어진다. 남은 \(-0.06\)이 작은 것은 효과가 없어서가 아니라 혈압의 잡음 \(\sigma = 5\)가 운동의 효과 \(0.3 \times 1.76 = 0.53\)에 견주어 크기 때문이다. 상관이 작다는 것과 인과효과가 없다는 것은 다른 말이다.
(1)(2) 수치적으로.
"""관찰연구에서 나이가 교란요인으로 작동하는 모습."""
import numpy as np
from scipy import stats
rng = np.random.default_rng(42)
n = 500
# === 교란요인: 나이 ===
# 20세부터 70세까지 고르게 퍼져 있다고 두자.
age = rng.uniform(20, 70, n)
# 나이가 두 변수 모두에 화살표를 쏜다 — 이것이 교란의 정의다.
# 운동량: 나이가 많을수록 줄어든다 (계수 -0.1)
# 혈압: 나이가 많을수록 올라간다 (계수 +0.5)
# 그리고 운동은 혈압을 실제로 **낮춘다** (계수 -0.3). 이것이 참 인과효과다.
exercise = 10 - 0.1 * age + rng.normal(0, 1, n)
bp = 80 + 0.5 * age - 0.3 * exercise + rng.normal(0, 5, n)
# === 나이를 무시한 순진한 상관 ===
# 젊은 사람은 많이 운동하고 혈압이 낮다. 나이 든 사람은 반대다.
# 나이를 빼놓고 보면 이 두 무리가 만들어 낸 가짜 패턴이 겹쳐 보인다.
r_naive, _ = stats.pearsonr(exercise, bp)
print(f"Naive correlation (exercise, BP): r = {r_naive:+.3f}")
print(" (looks like a huge effect -- but most of it is age)")
# === 나이를 통제한 편상관 ===
def residualize(y, x):
"""y에서 x로 설명되는 부분을 빼고 남은 잔차를 돌려준다.
y를 x에 단순회귀시킨 뒤 예측값을 빼는 것이다.
남은 잔차는 "x의 영향을 제거한 y"라고 읽을 수 있다.
"""
b = np.polyfit(x, y, 1) # y = b[0]*x + b[1] 로 직선 적합
return y - np.polyval(b, x) # 실제값 - 예측값 = 잔차
# 운동과 혈압에서 각각 나이의 영향을 뺀 뒤 상관을 낸다.
# 이것이 "나이가 같은 사람들끼리 비교하면 어떤가"라는 물음에 해당한다.
r_partial, _ = stats.pearsonr(residualize(exercise, age),
residualize(bp, age))
print(f"Partial correlation (controlling age): r = {r_partial:+.3f}")
print(" (what is left is the real, much weaker effect)")
# --- (1)(2) 의 이론값 ---
v_age = (70 - 20) ** 2 / 12
v_ex = 0.01 * v_age + 1
cov_ae = -0.1 * v_age
cov = 0.5 * cov_ae - 0.3 * v_ex
v_bp = 0.25 * v_age + 0.09 * v_ex - 0.3 * cov_ae + 25
print(f"이론 r_naive = {cov / np.sqrt(v_ex * v_bp):+.4f}, "
f"기울기 = {cov / v_ex:+.4f}")
print(f"이론 r_partial = {-0.3 / np.sqrt(0.09 + 25):+.4f}")
print(f"관측 기울기 = {np.polyfit(exercise, bp, 1)[0]:+.4f}")
출력:
Naive correlation (exercise, BP): r = -0.705
(looks like a huge effect -- but most of it is age)
Partial correlation (controlling age): r = -0.086
(what is left is the real, much weaker effect)
이론 r_naive = -0.7064, 기울기 = -3.6784
이론 r_partial = -0.0599
관측 기울기 = -3.6081
순진한 상관의 이론값 \(-0.7064\)와 모의값 \(-0.705\)가 맞는다. 기울기도 \(-3.678\) 대 \(-3.608\)로 가깝다.
편상관은 이론 \(-0.0599\)에 모의 \(-0.0858\)이다. 어긋나 보이지만 \(n = 500\)에서 상관의 표준오차가 \((1-r^2)/\sqrt n = 0.0446\)이므로 \(0.58\) 표준오차 차이에 지나지 않는다. 참 효과가 작아 상대오차가 크게 보일 뿐이다.
두 숫자를 나란히 읽어야 한다. 부호는 둘 다 음수이고 참 효과의 부호와도 같다. 달라지는 것은 크기다. 나이를 무시한 \(-0.705\)는 "운동을 많이 하는 사람의 혈압이 낮다"는 사실을 거의 전부 나이가 만들어 낸 것으로 채우고 있다. (1)에서 공분산을 두 조각으로 갈라 보았듯 가짜 경로가 참 경로의 \(11\)배다.
교란은 부호를 뒤집기도 하고 크기를 부풀리기도 한다. 앞의 그림 (다)는 부호가 뒤집힌 경우(\(-5.00\)이 \(+1.92\)로)였고, 여기는 부호는 그대로인 채 크기만 크게 부풀려진 경우다. 후자가 실무에서 훨씬 흔하고, 부호가 맞기 때문에 훨씬 발견하기 어렵다.
연습문제¶
연습문제 1. 다음 각 연구를 관찰연구(횡단, 코호트, 환자대조)인지 실험연구인지 분류하라.
(a) 연구자들이 흡연자 5,000명과 비흡연자 5,000명을 20년간 추적하여 폐암 발생률을 비교한다. (b) 한 제약회사가 환자 300명을 신약 또는 위약을 받도록 무작위 배정하고 8주 후 증상 호전을 측정한다. (c) 한 공중보건팀이 성인 1,000명을 대상으로 한 시점에서 식단과 운동 습관을 조사한다. (d) 연구자들이 심장질환이 있는 환자 200명과 없는 사람 200명을 찾아낸 뒤 이들의 콜레스테롤 이력을 거슬러 살펴본다. (e) 한 학교가 새 교육과정을 받도록 무작위로 배정되고, 이웃 학교는 기존 교육과정을 유지한다.
풀이
(a) 관찰연구 — 코호트(노출로 집단을 정의하고 시간 순방향으로 추적). (b) 실험연구 — 무작위 대조시험. (c) 관찰연구 — 횡단(한 시점의 자료). (d) 관찰연구 — 환자대조(결과로 집단을 정의하고 노출 이력을 후향적으로 조사). (e) 실험연구 — 학교(집락) 수준에서 무작위화했으며, 집락 무작위 시험이라 부르기도 한다.
연습문제 2. 어떤 연구에서 적포도주를 적당히 마시는 사람의 심장질환 발생률이 더 낮다는 결과가 나왔다. 적포도주에 인과효과가 없더라도 이런 연관성을 만들어낼 수 있는 그럴듯한 교란요인 세 가지를 들고, 이를 부분적으로나마 다룰 수 있는 식별 전략 하나를 제안하라.
풀이
그럴듯한 교란요인:
- 소득 / 사회경제적 지위: 적포도주를 정기적으로 마시는 사람은 대체로 더 부유하며, 소득은 의료 접근성과 건강한 음식 접근성을 좌우한다.
- 식단: 적포도주를 마시는 사람은 채소를 더 많이, 가공식품을 더 적게 먹을 수 있다("지중해식" 식단 패턴).
- 운동 / 전반적 건강 행동: 적당한 음주를 유지하는 사람은 운동도 더 많이 할 수 있다.
식별 전략: 지역별 또는 시기별 주류세 변동을 이용하는 도구변수 접근은 개인 소득이나 식단과 독립적인 준실험적 소비 변동을 제공할 수 있다(주류세가 다른 경로로 심장질환에 직접 영향을 주지 않는다는 가정하에). 대안으로, 적절한 윤리적 안전장치를 갖춘 적당량 적포도주 섭취의 무작위 대조시험이라면 이 문제를 더 직접적으로 해결할 것이다.
연습문제 3. 코호트연구와 환자대조연구의 차이를 설명하라. 희귀질환에는 왜 보통 환자대조연구를 쓰는가?
풀이
코호트연구는 대상을 노출로 식별하고(흡연자 대 비흡연자) 시간 순방향으로 추적하여 결과를 관찰한다. 환자대조연구는 대상을 결과로 식별하고(심근경색이 있는 사례군, 없는 대조군) 노출 이력을 거슬러 살펴본다.
희귀질환에 환자대조연구가 선호되는 이유는, 대안인 전향적 코호트로는 충분한 사례 수를 모으는 데 엄청난 표본이 필요하기 때문이다. 어떤 질병이 1만 명 중 1명에게 발생한다면, 1,000명 코호트에서는 기대 사례가 약 0.1건이라 분석에 쓸 수 없다. 환자대조연구는 질병 쪽을 과대표집하는 데서 출발하여 (예컨대) 사례군 200명과 대조군 200명을 모집한 뒤 노출률을 비교한다.
대가는 세 가지다.
- 유병률과 위험을 추정할 수 없다. 사례군 200명 대 대조군 200명이라는 \(1:1\) 구성은 연구자가 정한 것이지 모집단의 구성이 아니다. 표본에서 계산한 "환자 비율 \(200/400 = 0.5\)"는 아무것도 뜻하지 않는다. 같은 이유로 발생률과 위험비도 얻을 수 없고, 남는 것은 오즈비뿐이다. 오즈비만 살아남는 것은 그것이 사례군 대 대조군의 모집 비율에 영향을 받지 않는 유일한 연관성 측도이기 때문이며, 질병이 드물 때 오즈비는 위험비의 좋은 근사가 된다.
- 대조군 선택이 어렵다. 대조군은 "사례군이 병에 걸리지 않았다면 속했을 모집단"에서 나와야 하는데, 이를 보장할 방법이 없다.
- 회상편향: 병을 앓은 사람이 과거 노출을 더 열심히, 더 많이 기억해 낸다.
연습문제 4. 개인지도 수업에 참석한 학생이 그렇지 않은 학생보다 15점 높은 점수를 받았다고 보고한 관찰연구를 생각하자. 학교는 개인지도가 15점의 향상을 유발한다고 결론지었다. 교란요인 세 가지를 찾되 두 개는 측정 가능하고 하나는 측정 불가능한 것으로 제시하고, 후자가 왜 근본적인 한계인지 설명하라.
풀이
측정 가능한 교란요인:
- 이전의 학업 능력(이전 성적이나 표준화 시험 점수로 대리).
- 부모의 교육 수준 / 사회경제적 지위(입학 서류에 기록됨).
측정 불가능한 교란요인:
- 동기 / 성실성. 선택적인 개인지도에 참석하기로 한 학생은 동기가 더 높은 경향이 있고, 동기는 개인지도 밖의 공부 시간과 시험 성적에도 직접 영향을 준다. 동기가 유발하는 행동과 독립적으로 동기를 측정할 믿을 만한 방법은 없다.
이것이 왜 근본적인가: 측정 가능한 교란요인은 층화, 짝짓기, 회귀로 다룰 수 있다. 측정 불가능한 교란요인은 그럴 수 없다. 측정된 모든 변수를 보정한 분석이라도, 측정되지 않은 교란요인이 노출과 결과를 함께 설명하는 만큼 편향된다. 무작위화가 여전히 표준으로 남아 있는 이유가 이것이다 — 무작위화는 관측되든 아니든 모든 교란요인을 균형 잡는다.
연습문제 5. 생태학적 오류는 집단 수준 자료에서 개인 수준의 연관성을 추론하는 오류다. 집단 수준 상관과 개인 수준 상관의 부호가 반대가 되는 작은 인공 예를 만들어라.
풀이
두 지역 A와 B에 다음과 같은 주민이 있다고 하자.
| 지역 | 사람 | 소득 | 행복도 |
|---|---|---|---|
| A | 1 | 10 | 1 |
| A | 2 | 30 | 3 |
| A | 3 | 50 | 5 |
| B | 4 | 20 | 4 |
| B | 5 | 40 | 6 |
| B | 6 | 60 | 8 |
개인 수준: 각 지역 안에서 소득과 행복도는 양의 상관을 갖는다(두 지역 모두 상관 = 1).
집단 수준: 지역 A는 평균 소득 30, 평균 행복도 3이고, 지역 B는 평균 소득 40, 평균 행복도 6이다. 집단 평균은 양의 연관을 보인다.
이제 지역 B가 평균 소득은 더 높으면서도 주민들의 행복도는 일률적으로 더 낮도록 재구성해 보자. 예를 들어 B = (20→0, 40→2, 60→4)로 하면 집단 평균은 (40, 2)가 되어 A의 (30, 3)과 비교된다. 각 집단 내 개인 상관은 여전히 양수지만, 평균 소득과 평균 행복도 사이의 집단 수준 상관은 이제 음수다. 같은 자료가 집계 수준에 따라 서로 다른 두 이야기를 하는 것이며, 한쪽으로 다른 쪽 수준의 주장을 펴는 것이 생태학적 오류다. 심슨의 역설은 범주형 상황에서 나타나는 같은 현상이다.
연습문제 6. 어떤 연구자가 공변량 열 개를 통제한 \(Y\)의 \(T\)에 대한 다변량 회귀로 \(T\)의 인과효과를 확립했다고 주장한다. 이 주장에 필요한 추가 식별 가정을 진술하고, 그것을 검증하지는 못해도 탐색해 볼 수 있는 진단 방법 하나를 설명하라.
풀이
필요한 가정은 측정되지 않은 교란요인이 없음(조건부 독립 또는 무시가능성이라고도 한다)이다. 즉 측정된 열 개 공변량을 조건부로 하면 처리 \(T\)가 잠재적 결과 \((Y(0), Y(1))\)과 독립이라는 것이다. 동등하게, \(T\)에서 \(Y\)로 가는 모든 뒷문 경로가 통제된 공변량들에 의해 차단되어야 한다.
이 가정은 자료만으로는 검정 불가능하다 — 이는 측정하지 않은 변수에 대한 가정이기 때문이다. 이 가정을 (증명은 못 해도) 경고 신호로 짚어 볼 수 있는 두 가지 진단은 다음과 같다.
- 민감도 분석(예: 로젠바움 한계, E-value): 결론을 뒤집으려면 측정되지 않은 교란요인이 \(T\) 및 \(Y\)와 얼마나 강하게 연관되어야 하는가? 답이 "측정된 어떤 교란요인보다도 훨씬 강해야 한다"라면 결과는 견고하고, 그렇지 않다면 취약하다.
- 음성 결과 대조: \(T\)의 영향을 받지 않아야 하지만 같은 미측정 교란요인의 영향은 받을 법한 결과를 고른다(예: 흡연 연구라면 교통사고 사망률이 음성 결과가 될 수 있다). 보정 후에도 \(T\)가 그 음성 결과를 "예측"한다면 미측정 교란이 남아 있는 것이다.
이 진단들은 증거를 줄 뿐 증명을 주지는 않는다. 관찰자료는 무작위화가 알려주는 것을 알려줄 수 없다는 근본적인 인식론적 간극은 결코 완전히 메워지지 않는다.
연습문제 7. "공변량은 많이 넣을수록 좋다"는 흔한 오해다. 교란요인을 보정하면 편향이 줄지만 충돌부(collider) 를 보정하면 없던 편향이 생긴다. 두 경우를 모의실험으로 대비하라.
풀이
import numpy as np
import statsmodels.api as sm
rng = np.random.default_rng(0)
n = 20_000
beta = lambda y, *X: sm.OLS(y, sm.add_constant(np.column_stack(X))).fit().params[1]
# (1) 교란: U 가 T 와 Y 의 공통 원인이다
U = rng.normal(size=n)
T = 0.8 * U + rng.normal(size=n)
Y = 1.5 * T + 0.8 * U + rng.normal(size=n)
print("교란 상황 (참 효과 1.5)")
print(f" 보정 안 함 : {beta(Y, T):.4f} ← 편향")
print(f" U 를 보정 : {beta(Y, T, U):.4f} ← 옳다")
# (2) 충돌부: C 가 T 와 Y 의 공통 결과다
T2 = rng.normal(size=n)
Y2 = 1.5 * T2 + rng.normal(size=n)
C = 0.9 * T2 + 0.9 * Y2 + rng.normal(size=n)
print("\n충돌부 상황 (참 효과 1.5)")
print(f" 보정 안 함 : {beta(Y2, T2):.4f} ← 옳다")
print(f" C 를 보정 : {beta(Y2, T2, C):.4f} ← 편향")
출력:
교란 상황 (참 효과 1.5)
보정 안 함 : 1.8878 ← 편향
U 를 보정 : 1.5059 ← 옳다
충돌부 상황 (참 효과 1.5)
보정 안 함 : 1.5077 ← 옳다
C 를 보정 : 0.3874 ← 편향
결과가 정반대다. 교란 상황에서는 보정이 \(1.89\)를 \(1.51\)로 고쳐 주지만, 충돌부 상황에서는 보정이 옳던 \(1.51\)을 \(0.39\)로 망가뜨린다.
왜 충돌부를 보정하면 편향이 생기는가. \(C\)가 \(T\)와 \(Y\) 둘 다에 의해 결정될 때, \(C\)를 고정하면 \(T\)와 \(Y\) 사이에 인위적인 관계가 생긴다. \(C\)가 높다고 알려진 사람 중에서 \(T\)가 낮다면 \(Y\)가 높았어야 한다. 따라서 \(C\)를 고정한 집단 안에서는 \(T\)와 \(Y\)가 음의 상관을 갖게 되고, 이것이 참된 양의 효과를 상쇄한다.
직관적인 예로, 배우의 외모와 연기력이 서로 무관하더라도 이미 캐스팅된 배우들(=충돌부를 고정한 집단) 안에서는 둘이 음의 상관을 보인다. 외모가 떨어지는데 캐스팅되었다면 연기를 잘하는 것이기 때문이다.
판별법. 인과 그래프를 그려 화살표의 방향을 보라.
| 변수의 위치 | 그림 | 어떻게 할 것인가 |
|---|---|---|
| 교란요인 | \(T \leftarrow U \rightarrow Y\) | 보정한다 |
| 충돌부 | \(T \rightarrow C \leftarrow Y\) | 보정하지 않는다 |
| 매개변수 | \(T \rightarrow M \rightarrow Y\) | 총효과를 원하면 보정하지 않는다 |
실무에서 흔한 충돌부. 표본에 들어오는 조건 자체가 충돌부인 경우가 많다. 입원 환자만 분석하면 두 질병이 실제로는 무관해도 음의 상관을 보이고(버크슨의 역설), 자발적 참여자만 분석하면 참여를 결정한 요인들 사이에 없던 상관이 생긴다.
결론. "통제 변수를 더 넣으면 안전하다"는 생각은 틀렸다. 무엇을 보정할지는 자료가 아니라 인과 구조에 대한 지식이 정한다. \(\square\)
연습문제 8. 이중차분법(DiD) 을 구현하라. 처리군이 원래부터 결과 수준이 높은 상황에서 (a) 사후 단순비교, (b) 처리군 전후비교, (c) 이중차분이 각각 무엇을 주는지 비교하고, 평행추세 가정이 깨지면 어떻게 되는지 보여라.
풀이
import numpy as np
rng = np.random.default_rng(1)
N = 4000
treat = rng.random(N) < 0.5
unit = rng.normal(0, 2, N) + 1.5 * treat # 처리군이 원래 1.5 높다
tau = 2.0 # 참 처리효과
y0 = 5 + unit + rng.normal(0, 1, N) # 사전
y1 = 5 + unit + 1.0 + tau * treat + rng.normal(0, 1, N) # 사후: 공통추세 +1.0
d_treat = y1[treat].mean() - y0[treat].mean()
d_ctrl = y1[~treat].mean() - y0[~treat].mean()
print(f"참 처리효과 {tau}")
print(f" (a) 사후 단순비교 {y1[treat].mean() - y1[~treat].mean():.4f} ← 원래 차이가 섞였다")
print(f" (b) 처리군 전후비교 {d_treat:.4f} ← 공통추세가 섞였다")
print(f" (c) 이중차분 {d_treat - d_ctrl:.4f} ← 옳다")
# 평행추세가 깨진 경우: 처리군만 추가로 0.9 만큼 더 올라간다
y1b = y1 + 0.9 * treat
print(f"\n 평행추세 위배 시 {(y1b[treat].mean() - y0[treat].mean()) - d_ctrl:.4f}"
f" ← 0.9 만큼 부풀었다")
출력:
참 처리효과 2.0
(a) 사후 단순비교 3.4392 ← 원래 차이가 섞였다
(b) 처리군 전후비교 3.0181 ← 공통추세가 섞였다
(c) 이중차분 2.0322 ← 옳다
평행추세 위배 시 2.9322 ← 0.9 만큼 부풀었다
세 추정값이 뚜렷이 갈린다.
- 사후 단순비교 \(3.44\) — 처리효과 \(2.0\)에 원래 차이 \(1.5\)가 통째로 더해졌다.
- 처리군 전후비교 \(3.02\) — 처리효과에 시간이 흐르며 모두에게 일어난 변화 \(1.0\)이 더해졌다.
- 이중차분 \(2.03\) — 두 오염원이 모두 지워진다.
왜 통하는가. 첫 번째 차분(전후)이 시간불변 개체효과를 지운다. 처리군이 원래 높았다는 사실은 두 시점 모두에 똑같이 들어 있으므로 빼면 사라진다. 두 번째 차분(처리군 대 대조군)이 공통 시간효과를 지운다. 그래서 이름이 이중차분이다.
결정적 가정: 평행추세. 처리가 없었다면 두 군이 같은 폭으로 변했을 것이라는 가정이다. 위에서 처리군만 추가로 \(0.9\) 올라가게 하자 추정값이 \(2.91\)로 정확히 그만큼 부풀었다. DiD는 처리군 고유의 추세를 처리효과로 잘못 읽는다.
평행추세를 어떻게 따지는가. 가정 자체는 반사실에 대한 것이라 검증할 수 없다. 다만 다음이 정황 증거가 된다.
- 사전 추세 검사: 처리 이전 여러 시점의 자료가 있다면 그때는 두 군이 평행했는지 본다. 평행하지 않았다면 이후에도 평행하리라 믿기 어렵다.
- 위약 검정: 처리가 실제로는 없었던 가짜 시점에 DiD를 돌려 효과가 \(0\)으로 나오는지 본다.
- 처리 시점이 단위마다 다른 경우 사건 연구 그림으로 시점별 효과를 함께 본다.
수준이 아니라 변화를 비교한다는 것이 DiD의 힘이자 한계다. 원래 차이는 얼마든지 있어도 되지만, 원래 추세가 다르면 무너진다. \(\square\)
연습문제 9. 회귀 불연속(RDD) 을 구현하라. 점수 \(50\)점 이상에게 장학금을 주는 제도를 모의실험하고, 대역폭을 좁혀 가며 추정값과 표준오차가 어떻게 변하는지 보여라.
풀이
import numpy as np
import statsmodels.api as sm
rng = np.random.default_rng(2)
n, cutoff, tau = 5000, 50., 5.0
score = rng.uniform(0, 100, n)
T = (score >= cutoff).astype(float)
Y = 20 + 0.6 * score + tau * T + rng.normal(0, 3, n) # 참 효과 5
print(f"참 효과 {tau}")
print(f" 전체 단순비교 {Y[T == 1].mean() - Y[T == 0].mean():.4f}"
f" ← 점수 자체의 효과가 통째로 섞였다\n")
print(f"{'대역폭':>8}{'n':>7}{'추정':>9}{'표준오차':>10}")
for h in (20, 10, 5, 2):
m = np.abs(score - cutoff) < h
X = sm.add_constant(np.column_stack(
[T[m], score[m] - cutoff, T[m] * (score[m] - cutoff)]))
fit = sm.OLS(Y[m], X).fit()
print(f"{h:>8}{m.sum():>7}{fit.params[1]:>9.4f}{fit.bse[1]:>10.4f}")
출력:
참 효과 5.0
전체 단순비교 35.2551 ← 점수 자체의 효과가 통째로 섞였다
대역폭 n 추정 표준오차
20 1967 4.8873 0.2739
10 977 5.0000 0.3885
5 484 5.3096 0.5386
2 197 5.1275 0.8591
전체를 단순비교하면 \(35.3\)이 나온다. 점수가 높은 학생이 원래 결과도 좋기 때문이며, 참값 \(5\)의 일곱 배다. 반면 기준선 부근으로 좁히면 모든 대역폭에서 \(5\) 근처가 나온다.
왜 통하는가. 기준선 바로 아래 \(49.9\)점 학생과 바로 위 \(50.1\)점 학생은 장학금 여부만 빼면 사실상 같다. 능력, 동기, 배경이 기준선을 넘나들며 갑자기 달라질 이유가 없다. 그래서 기준선 근처에서는 배정이 국소적으로 무작위나 다름없다.
핵심 맞바꿈이 표에 그대로 보인다.
| 대역폭 | \(n\) | 표준오차 |
|---|---|---|
| \(\pm 20\) | \(1967\) | \(0.27\) |
| \(\pm 2\) | \(197\) | \(0.86\) |
대역폭을 좁히면 "두 군이 같다"는 가정이 더 그럴듯해지지만(편향 감소), 표본이 줄어 표준오차가 세 배로 커진다(분산 증가). 편향–분산 맞바꿈이 대역폭 선택으로 나타난 것이며, 실무에서는 이를 최소화하는 최적 대역폭을 자료에서 고른다.
RDD가 무너지는 경우.
- 조작(manipulation): 학생이나 심사자가 점수를 기준선 위로 밀어 올릴 수 있다면 배정이 더는 무작위가 아니다. 기준선 바로 위에 관측이 몰려 있는지 밀도 검정(맥크래리 검정)으로 확인한다.
- 다른 제도가 같은 기준선을 쓰는 경우: \(50\)점에서 장학금 말고 다른 혜택도 함께 주어진다면 둘을 분리할 수 없다.
- 함수 형태: 기준선 양쪽의 추세를 잘못 모형화하면 없는 도약을 만들어 낼 수 있다. 위 코드가 \(T \times (\text{score}-c)\) 상호작용항을 넣어 양쪽 기울기를 따로 추정한 이유다.
RDD가 주는 것은 국소 효과다. 추정된 \(5\)는 기준선 근처 학생들에 대한 효과이지 \(10\)점 학생이나 \(90\)점 학생에 대한 효과가 아니다. 강한 식별력을 얻는 대가로 일반화 범위를 잃는다. \(\square\)
연습문제 10. 도구변수를 구현하라. 미측정 교란이 있을 때 최소제곱이 편향되고 2단계 최소제곱(2SLS)이 참값을 회복함을 보인 뒤, 약한 도구가 왜 위험한지 보여라.
풀이
도구 \(Z\)는 세 조건을 만족해야 한다. (1) \(T\)에 영향을 준다(관련성), (2) \(Y\)에 직접 영향을 주지 않는다(배제 제약), (3) 교란요인과 무관하다(외생성). 이때
가 인과효과를 식별한다. \(Z\)가 만들어 낸 \(T\)의 변동만 골라 쓰는 것이며, 그 변동은 교란요인과 무관하다.
import numpy as np
import statsmodels.api as sm
rng = np.random.default_rng(3)
n, B = 2000, 2000
for strength, label in [(1.0, "강한 도구"), (0.06, "약한 도구")]:
ols = np.empty(B); tsls = np.empty(B); Fstat = np.empty(B)
for b in range(B):
U = rng.normal(size=n) # 미측정 교란
Z = rng.normal(size=n) # 도구
T = strength * Z + 0.9 * U + rng.normal(size=n)
Y = 2.0 * T + 0.9 * U + rng.normal(size=n) # 참 효과 2.0
ols[b] = sm.OLS(Y, sm.add_constant(T)).fit().params[1]
first = sm.OLS(T, sm.add_constant(Z)).fit() # 1단계
Fstat[b] = first.tvalues[1] ** 2
tsls[b] = sm.OLS(Y, sm.add_constant(first.fittedvalues)).fit().params[1]
print(f"{label} (참 효과 2.0)")
print(f" OLS 평균 {ols.mean():.4f} 편향 {ols.mean() - 2:+.4f} 표준편차 {ols.std():.4f}")
print(f" 2SLS 평균 {tsls.mean():.4f} 편향 {tsls.mean() - 2:+.4f} 표준편차 {tsls.std():.4f}")
print(f" 1단계 F 중앙값 {np.median(Fstat):.1f}\n")
출력:
강한 도구 (참 효과 2.0)
OLS 평균 2.2878 편향 +0.2878 표준편차 0.0171
2SLS 평균 1.9989 편향 -0.0011 표준편차 0.0304
1단계 F 중앙값 1103.7
약한 도구 (참 효과 2.0)
OLS 평균 2.4465 편향 +0.4465 표준편차 0.0202
2SLS 평균 1.7995 편향 -0.2005 표준편차 6.6816
1단계 F 중앙값 4.0
강한 도구. OLS는 \(+0.29\)만큼 위로 편향된다. \(U\)가 \(T\)와 \(Y\)를 함께 밀어 올리기 때문이다. 2SLS는 편향이 \(-0.001\)로 사실상 사라진다. 대신 표준편차가 \(0.017\)에서 \(0.030\)으로 커지는데, \(Z\)가 설명하는 \(T\)의 변동만 쓰므로 정보를 덜 쓰기 때문이다. 편향을 분산과 맞바꾸는 것이 도구변수의 본질이다.
약한 도구는 재앙이다. \(F\)가 \(4.0\)까지 떨어지자 2SLS의 표준편차가 \(6.68\)로 폭발한다. OLS 표준편차 \(0.02\)의 \(330\)배다. 추정값이 참값 \(2\)에서 수십씩 벗어나는 일이 예사로 일어난다.
왜 그런가. 2SLS의 분모가 \(\operatorname{Cov}(Z, T)\)인데, 도구가 약하면 이 값이 \(0\) 근처라 조금만 흔들려도 추정값이 폭주한다. 게다가 유한표본에서 2SLS는 OLS 쪽으로 편향된다. 도구가 완전히 무력해지는 극한에서 2SLS는 OLS와 같아지므로, 약한 도구는 "고치려던 편향을 그대로 되돌려 놓으면서 분산만 키우는" 최악의 조합이 된다.
\(F > 10\) 규칙
1단계 \(F\) 통계량이 \(10\) 미만이면 도구가 약하다고 보는 것이 관행이다(스타이거–스톡). 논문에서 도구변수 추정을 볼 때 1단계 \(F\)가 보고되어 있는지 먼저 확인하라. 없다면 의심할 이유가 충분하다.
검증할 수 없는 가정. 관련성(1단계 \(F\))은 자료로 확인할 수 있지만 배제 제약은 확인할 수 없다. \(Z\)가 \(Y\)에 직접 영향을 주지 않는다는 것은 순전히 이론적 논증이다. 앞서 본 존 스노의 연구가 사실상 도구변수 설계인데, 그가 든 근거("배관은 수십 년 전에 상업적 이유로 깔렸다")가 바로 배제 제약에 대한 논증이었다. 좋은 도구는 통계가 아니라 제도적 지식에서 나온다. \(\square\)
정리하며¶
관찰연구는 개입 없이 기록만 하는 연구다. 경험적 증거의 대부분이 여기서 나오며, 그 대가는 구조적이다.
- 네 가지 설계. 횡단(한 시점의 스냅숏) · 코호트(시간을 따라 추적) · 환자대조(결과에서 노출을 되짚음, 오즈비만 얻고 유병률은 얻지 못한다) · 생태학적(집단 수준). 마지막 것은 생태학적 오류에 취약하다.
- 왜 인과관계를 말할 수 없는가. 대상이 스스로 집단을 고르므로 관측된 차이는 처리효과와 선택효과의 합이다. \(\mathbb{E}[Y\mid T{=}1]-\mathbb{E}[Y\mid T{=}0]\) 이 인과효과 \(\mathbb{E}[Y(1)-Y(0)]\) 과 같아지려면 배정이 잠재적 결과와 독립이어야 하는데, 그것이 바로 관찰자료에 없는 조건이다.
- 식별 전략은 무작위화를 가정으로 대체한다. 층화·회귀·성향점수·도구변수·이중차분·회귀 불연속이 각각 다른 가정을 요구하며, 어느 것도 자료만으로는 검증할 수 없다.
- 존 스노의 콜레라 연구가 보여주듯, 때로는 세상이 실험을 대신 해 놓는다. 두 수도회사의 배관이 같은 거리에 뒤섞여 있었고 취수구만 달랐다는 사실이 사실상의 무작위 배정이었다.
핵심은 설계이지 통계 기법이 아니다. 좋은 자연실험 하나가 정교한 회귀 모형 열 개보다 낫다.
다음 절 통제실험은 이 모든 가정을 한 번에 없애는 방법을 다룬다. 처리를 직접 무작위로 배정하면 측정하지 않은 교란요인까지 평균적으로 균형이 맞고, 그때 비로소 연관성이 곧 인과효과가 된다.