콘텐츠로 이동

Simpson의 역설

자료의 모든 하위집단 안에서 성립하는 경향이 하위집단을 합치면 뒤집히거나 사라질 수 있다. 직관에 반하는 이 현상을 Simpson의 역설이라 한다. 교란변수가 집단 구분과 결과 모두에 영향을 줄 때 생기며, 집계된 자료가 얼마나 크게 오도할 수 있는지 강력하게 일깨워 준다.


정의 1. Simpson의 역설

Simpson의 역설은 제3의 변수로 조건화(층화)한 뒤 두 변수 사이 연관의 방향이 뒤집힐 때 일어난다. 형식적으로 모든 \(z\)에 대해

\[ P(Y = 1 \mid X = 1, Z = z) < P(Y = 1 \mid X = 0, Z = z) \quad \text{for every } z \]

이면서도 \(Z\)에 대해 주변화하면

\[ P(Y = 1 \mid X = 1) > P(Y = 1 \mid X = 0) \]

이 되는 일이 가능하다. 자료를 집계하면 부등호가 뒤집힌다.


버클리 입학 사례

Simpson 역설의 가장 유명한 예는 1973년 UC 버클리 대학원 입학 자료에서 나온다.

집계 자료:

지원자 합격자 합격률
남성 8442 3738 44%
여성 4321 1494 35%

언뜻 보면 남성의 합격률이 상당히 높아 성차별의 가능성을 시사한다.

학과별로 층화:

학과 남성 지원 남성 합격률 여성 지원 여성 합격률
A 825 62% 108 82%
B 560 63% 25 68%
C 325 37% 593 34%
D 417 33% 375 35%
E 191 28% 393 24%
F 373 6% 341 7%

대부분의 학과에서 여성의 합격률이 같거나 더 높았다. 여성이 전체 합격률이 낮은 경쟁적인 학과(C, D, E, F)에 불균형하게 많이 지원하고 남성은 덜 경쟁적인 학과(A, B)에 더 많이 지원했기 때문에 역설이 생겼다.

교란변수 \(Z\)(학과 선택)가 집계 수준의 연관을 뒤집은 것이다.


왜 일어나는가

Simpson의 역설은 다음일 때 일어난다:

  1. 교란변수 \(Z\)가 처치/노출 \(X\)와 결과 \(Y\) 모두와 연관되어 있다.
  2. \(X\)로 정의된 집단들의 \(Z\) 분포가 서로 다르다.
  3. 자료를 집계했을 때 \(Z\)가 \(Y\)에 미치는 효과가 \(X\)–\(Y\) 관계를 압도할 만큼 강하다.

이 역설은 수학적 모순이 아니다. 주변확률 \(P(Y \mid X)\)는 조건부확률 \(P(Y \mid X, Z = z)\)의 가중평균이며 가중치는 \(P(Z = z \mid X)\)에 비례한다. \(X = 0\) 집단과 \(X = 1\) 집단에서 그 가중치가 다르면 가중평균이 조건부 관계의 방향을 뒤집을 수 있다.

형식적으로

\[ P(Y = 1 \mid X = x) = \sum_z P(Y = 1 \mid X = x, Z = z) \, P(Z = z \mid X = x) \]

이므로 가중 방식이 다르면(\(P(Z = z \mid X = x)\)가 다르면) 집계 결과가 달라질 수 있다.


수치 보기

어떤 병원이 신장결석에 대한 두 치료법을 비교한다.

전체(집계):

치료 성공 전체 비율
A 273 350 78%
B 289 350 83%

전체적으로는 치료 B가 나아 보인다.

결석 크기로 층화:

결석 크기 치료 A 성공률 치료 B 성공률
작음 93% (81/87) 87% (234/270)
큼 73% (192/263) 69% (55/80)

치료 A가 작은 결석에서도 큰 결석에서도 더 낫지만 전체적으로는 치료 B가 나아 보인다. 치료 A가 (더 어려운 사례인) 큰 결석 환자에게 불균형하게 많이 시행되어 집계 성공률이 끌어내려졌기 때문에 역설이 생긴다.

막대의 폭이 환자 비율, 높이가 성공률이며 붉은 파선이 그 가중평균이다

앞의 공식

\[ P(Y = 1 \mid X = x) = \sum_z P(Y = 1 \mid X = x, Z = z) \, P(Z = z \mid X = x) \]

에서 높이는 \(P(Y=1 \mid X, Z)\)이고 폭은 \(P(Z \mid X)\)다. 왼쪽 그림이 그대로 그 식이다. 치료 A는 두 막대 모두가 치료 B의 대응하는 막대보다 높다(\(93\%\) 대 \(87\%\), \(73\%\) 대 \(69\%\)). 그런데 A는 성공률이 낮은 큰 결석 쪽 막대가 \(263/350 = 75\%\)의 폭을 차지하고, B는 성공률이 높은 작은 결석 쪽이 \(270/350 = 77\%\)를 차지한다. 붉은 파선으로 표시한 가중평균이 A는 \(78\%\)에서, B는 \(83\%\)에서 그어지는 이유가 이것이다.

부등호를 뒤집은 것은 높이가 아니라 폭이다. 그러니 역설이라는 이름이 붙었을 뿐 수학적으로는 아무 모순이 없다. 두 치료가 서로 다른 환자 구성을 가졌을 뿐이고, 합친 비율은 치료의 성능과 환자 구성을 뒤섞어 하나의 숫자로 만든 것이다.

오른쪽이 이를 바로잡는 표준적인 방법이다. 양쪽 치료가 같은 환자 구성을 가졌다고 가정하고 다시 계산한다. 전체 700명 중 작은 결석이 \(357\)명이므로 \(w = 0.51\)을 두 치료에 똑같이 적용하면

\[ 0.51 \times 0.931 + 0.49 \times 0.730 = 0.833, \qquad 0.51 \times 0.867 + 0.49 \times 0.688 = 0.779 \]

로 치료 A가 \(83.3\%\), 치료 B가 \(77.9\%\)가 된다. 합친 비율에서는 \(78.0\%\) 대 \(82.6\%\)로 B가 앞섰는데, 가중치를 맞추자 부등호가 제자리로 돌아온다. 역학에서 말하는 직접 표준화이며, 관찰자료에서 비율을 비교할 때의 기본 절차다.

한 가지만 덧붙이면, 표준화가 언제나 정답인 것은 아니다. 결석 크기가 치료 선택보다 먼저 정해지는 교란요인이므로 여기서는 표준화가 옳지만, 만약 \(Z\)가 치료 때문에 생기는 변수라면 이야기가 달라진다. 아래 절에서 다룰 구별이다.


교란과의 연결

Simpson의 역설은 교란이 드러난 형태이다. 교란변수 \(Z\)가 집계 자료에 허위 연관을 만들거나 실제 연관을 가린다. 해법은 다른 교란 문제와 같다:

  1. 교란변수로 층화하여 각 층을 따로 분석한다.
  2. 통계적 방법(예: 표준화, 회귀)으로 조정한다.
  3. 실험 설계에서 무작위화하여 \(X\)와 \(Z\)의 연관을 끊는다.

자세한 논의는 교란변수를 보라.


집계 결과와 층화 결과 중 무엇을 믿을까

흔한 질문은 집계 결과와 층화 결과 중 무엇을 믿어야 하는가이다. 답은 인과 구조에 달려 있다:

  • \(Z\)가 교란요인(\(X\)와 \(Y\)의 공통원인)이면 층화 분석이 옳고 집계는 오도한다.
  • \(Z\)가 매개자(\(X\)에서 \(Y\)로 가는 인과 경로 위에 있음)이면 \(Z\)로 층화하는 것이 인과효과의 일부를 제거하므로 집계가 더 적절할 수 있다.
  • \(Z\)가 충돌자(\(X\)와 \(Y\) 모두에 의해 생김)이면 \(Z\)로 층화하는 것이 존재하지 않던 허위 연관을 만들어낼 수 있다.

올바른 분석을 정하려면 통계적 연관만이 아니라 인과관계에 대한 지식이 필요하다. 이런 구조를 사고하는 틀은 방향성 비순환 그래프를 보라.


연속형 자료에서의 Simpson 역설

비율과 분할표로 예시하는 경우가 많지만 Simpson의 역설은 연속형 변수와 회귀에서도 일어난다. 전체 자료에서 \(X\)와 \(Y\)의 상관이 양수인데 \(Z\)로 정의된 모든 하위집단 안에서는 음수가 될 수 있다. 이는 생태학적 오류에서 기술한 현상을 다른 각도에서 본 것과 본질적으로 같다.


연습문제

연습문제 1. 두 집단을 합쳤을 때 경향이 뒤집히는 모의 자료를 만들어라:

  1. 집단 A 생성: \(x \sim U(0, 5)\), \(y = -0.5x + 10 + \epsilon\)
  2. 집단 B 생성: \(x \sim U(5, 10)\), \(y = -0.5x + 15 + \epsilon\)
  3. 각 집단을 따로, 그리고 합쳐서 그린다
  4. 각 집단과 전체 자료에 대해 Pearson \(r\)을 계산한다

두 집단 내 상관이 모두 음수인데 전체 상관은 양수가 될 수 있는 이유를 설명하라.

풀이

각 집단 안에서는 \(x\)가 커질수록 \(y\)가 작아지므로(기울기 \(= -0.5\)) 집단 내 상관이 음수이다(\(\epsilon \sim N(0, 0.5^2)\)일 때 대략 \(r \approx -0.8\)).

그런데 집단 B는 \(x\) 값도 크고(\(5\)–\(10\)) 절편이 5만큼 크므로 \(y\) 값도 크다(\(10\)–\(12.5\) 대 집단 A의 \(7.5\)–\(10\)). 두 집단을 합치면 이 집단 간 이동이 "\(x\)가 크면 \(y\)도 크다"는 양의 추세를 만들어 각 집단 안의 음의 기울기를 압도한다. 위 설정에서 전체 상관은 약 \(r \approx +0.47\)이 된다.

핵심은 집단이라는 교란변수가 \(x\)와 \(y\) 모두를 위로 밀어 올린다는 점이다. 그 집단 효과를 무시하고 자료를 합치면 집단 내 관계의 부호가 뒤집혀 보인다.

연습문제 2. UC 버클리 입학 자료를 써서 다음을 계산하라:

  1. 남성과 여성의 전체 합격률
  2. 각 학과에서 남성과 여성의 합격률
  3. 역설에 가장 크게 기여하는 학과 찾기
풀이

전체 합격률은 남성이 여성보다 높아 성차별의 가능성을 시사한다. 그러나 학과별로 층화하면 대부분의 학과에서 여성의 합격률이 같거나 더 높다. 여성이 (전체 합격률이 낮은) 경쟁적인 학과에 불균형하게 많이 지원하고 남성이 (합격률이 높은) 덜 경쟁적인 학과에 불균형하게 많이 지원했기 때문에 역설이 생긴다. 역설에 가장 크게 기여하는 학과는 남녀 지원 비율의 차이가 크면서 전체 합격률도 크게 다른 학과들이다.


정리하며

Simpson의 역설은 교란변수로 층화한 뒤 연관의 방향이 뒤집힐 때 일어난다. 집계가 하위집단의 가중을 바꾸어 교란변수가 전체 관계를 왜곡할 수 있게 되기 때문이다. 버클리 입학 사례와 신장결석 치료 보기는 집계 자료가 크게 오도할 수 있음을 보여준다. 역설을 해소하려면 올바른 인과 구조를 파악하고 적절한 수준에서 자료를 분석해야 한다.

연습문제 3. UC 버클리 1973년 대학원 입학 자료는 심슨 역설의 고전이다. 여섯 개 대형 학과의 자료로 전체 합격률과 학과별 합격률을 계산하고, 역설이 일어남을 확인하라.

풀이
dept = ['A','B','C','D','E','F']
m_app = [825,560,325,417,191,373]; m_adm = [512,353,120,138,53,22]
f_app = [108, 25,593,375,393,341]; f_adm = [ 89, 17,202,131, 94,24]

print(f"{'학과':>5}{'남 지원':>8}{'남 합격률':>10}{'여 지원':>8}"
      f"{'여 합격률':>10}{'차(여-남)':>11}")
for i, d in enumerate(dept):
    mr, fr = m_adm[i]/m_app[i], f_adm[i]/f_app[i]
    print(f"{d:>5}{m_app[i]:>8}{mr:>10.4f}{f_app[i]:>8}{fr:>10.4f}{fr-mr:>+11.4f}")
M, F = sum(m_adm)/sum(m_app), sum(f_adm)/sum(f_app)
print(f"\n  전체: 남 {M:.4f}  여 {F:.4f}   차 {F-M:+.4f}")

출력:

   학과    남 지원     남 합격률    여 지원     여 합격률     차(여-남)
    A     825    0.6206     108    0.8241    +0.2035
    B     560    0.6304      25    0.6800    +0.0496
    C     325    0.3692     593    0.3406    -0.0286
    D     417    0.3309     375    0.3493    +0.0184
    E     191    0.2775     393    0.2392    -0.0383
    F     373    0.0590     341    0.0704    +0.0114

  전체: 남 0.4452  여 0.3035   차 -0.1416

전체로 보면 여성이 \(14.2\)%포인트 불리하다(\(30.35\%\) 대 \(44.52\%\)).

그런데 학과별로는 여섯 중 넷에서 여성이 유리하다. A학과는 \(+20.4\)%포인트, B학과는 \(+5.0\)%포인트다. 여성이 불리한 C와 E도 각각 \(-2.9\), \(-3.8\)%포인트로 작다.

어떻게 이런 일이 가능한가. 다음 연습문제에서 기제를 본다.

연습문제 4. 연습문제 3의 역설이 일어나는 기제를 밝혀라. 학과 합격률과 여성 지원 비율의 관계를 계산하고, 이것이 왜 전체 수치를 뒤집는지 설명하라.

풀이
import numpy as np

rate   = [(m_adm[i]+f_adm[i])/(m_app[i]+f_app[i]) for i in range(6)]
fshare = [f_app[i]/(m_app[i]+f_app[i]) for i in range(6)]
print(f"{'학과':>5}{'전체 합격률':>12}{'여성 지원 비율':>14}")
for i, d in enumerate(dept):
    print(f"{d:>5}{rate[i]:>12.4f}{fshare[i]:>14.4f}")
print(f"\n  둘의 상관 = {np.corrcoef(rate, fshare)[0,1]:+.4f}")

출력:

   학과     전체 합격률      여성 지원 비율
    A      0.6442        0.1158
    B      0.6325        0.0427
    C      0.3508        0.6460
    D      0.3396        0.4735
    E      0.2517        0.6729
    F      0.0644        0.4776

  둘의 상관 = -0.7858

여성은 합격률이 낮은 학과에 더 많이 지원했다(상관 \(-0.79\)). A·B학과는 합격률이 \(63\%\) 넘는데 여성 지원 비율이 \(4\sim12\%\)에 불과하고, E·F학과는 합격률이 \(6\sim25\%\)인데 여성이 절반 넘게 지원했다.

그래서 전체 평균이 뒤집힌다. 전체 합격률은 학과별 합격률을 지원자 수로 가중한 평균인데, 여성은 낮은 가중치를 높은 합격률 학과에 주고 높은 가중치를 낮은 합격률 학과에 주었다.

\[ \text{전체 합격률} = \sum_k w_k \cdot (\text{학과 } k \text{ 합격률}), \qquad w_k = \text{그 집단의 학과 } k \text{ 지원 비중} \]

같은 값을 더하는데 가중치가 다르면 평균이 달라진다. 이것이 심슨 역설의 수학적 정체다.

인과적으로 읽으면. 학과는 성별과 합격 양쪽에 영향을 주는 교란변수다. 학과를 보정하지 않으면 "성별 → 합격"의 연관에 "성별 → 학과 → 합격"의 경로가 섞여 든다. 원 논문(비켈 외 1975)의 결론도 학과 선택이 매개한다는 것이었다.

그런데 조심할 것이 하나 있다. 학과가 교란변수인지 매개변수인지는 인과 구조에 달려 있다. 만약 사회적 압력 때문에 여성이 특정 학과를 피한 것이라면, 학과는 차별의 결과이기도 하다. 그렇다면 학과로 보정하는 것이 오히려 효과의 일부를 지운다. 이 구별은 12.4절 인과 문서에서 다룬다.

연습문제 5. 심슨 역설이 언제 일어날 수 있는지 조건을 정리하라. 두 집단·두 층의 경우 대수적으로 필요한 조건을 쓰고, 수치 예로 확인하라.

풀이

두 층의 가중평균이 뒤집히려면. 집단 \(A\)의 층별 성공률을 \(a_1, a_2\), 가중치를 \(w, 1-w\)라 하고 집단 \(B\)를 \(b_1, b_2\), \(v, 1-v\)라 하자. 역설은

\[ a_1 > b_1,\quad a_2 > b_2 \qquad\text{이지만}\qquad wa_1+(1-w)a_2 < vb_1+(1-v)b_2 \]

일 때 일어난다.

필요한 것은 두 가지다.

  • 층 사이에 성공률 차이가 있어야 한다(\(a_1 \ne a_2\)). 층이 결과와 무관하면 가중치를 어떻게 줘도 평균이 같다.
  • 가중치가 집단마다 달라야 한다(\(w \ne v\)). 두 집단의 층 분포가 같으면 뒤집힐 수 없다.

이 둘이 교란의 정의다. 층이 결과와도 관련되고 집단(처치)과도 관련되어야 한다.

import numpy as np

a1, a2 = 0.80, 0.20      # 집단 A 의 층별 성공률
b1, b2 = 0.75, 0.15      # 집단 B — 두 층 모두 A 보다 낮다
print(f"{'w(A의 층1 비중)':>16}{'v(B의 층1 비중)':>16}"
      f"{'A 전체':>9}{'B 전체':>9}{'역설?':>7}")
for w, v in [(0.5,0.5), (0.2,0.8), (0.1,0.9), (0.05,0.95)]:
    A = w*a1 + (1-w)*a2
    B = v*b1 + (1-v)*b2
    print(f"{w:>16.2f}{v:>16.2f}{A:>9.4f}{B:>9.4f}"
          f"{'예' if A < B else '아니오':>7}")

출력:

  w(A의 층1 비중)   v(B의 층1 비중)    A 전체    B 전체   역설?
            0.50            0.50   0.5000   0.4500  아니오
            0.20            0.80   0.3200   0.6300      예
            0.10            0.90   0.2600   0.6900      예
            0.05            0.95   0.2300   0.7200      예

가중치가 같으면(\(w=v=0.5\)) 역설이 없다. A가 두 층 모두에서 높으니 전체도 높다.

가중치가 엇갈리면 뒤집힌다. A가 어려운 층(성공률 \(0.20\))에 몰리고 B가 쉬운 층에 몰리면, 층별로는 A가 이기는데 전체는 B가 이긴다.

역설의 크기는 두 요인의 곱에 비례한다. 층 간 성공률 차이(\(a_1-a_2 = 0.6\))가 크고 가중치 차이(\(|w-v|\))가 클수록 뒤집기 쉽다. 둘 중 하나라도 \(0\)이면 불가능하다.

실무적 함의. "층별로 나눠 봤더니 결론이 바뀌었다"는 일이 생기면, 그 층 변수가 처치와 결과 양쪽에 관련되어 있다는 뜻이다. 그것이 교란의 정의이므로, 대개 층별 결과가 옳다. 다만 연습문제 4의 단서 — 층이 매개변수일 가능성 — 를 함께 따져야 한다.

연습문제 6. 심슨 역설은 비율에서만 생기는가? 연속형 변수의 회귀 기울기에서도 같은 일이 일어남을 보여라.

풀이
import numpy as np

rng = np.random.default_rng(3)
G, m = 5, 60
gx = np.array([1., 2., 3., 4., 5.])       # 집단 평균 x 가 오른다
gy = np.array([5., 4., 3., 2., 1.])       # 집단 평균 y 는 내린다
X, Y, lab = [], [], []
for i in range(G):
    xi = rng.normal(gx[i], 0.4, m)
    yi = gy[i] + 0.8*(xi - gx[i]) + rng.normal(0, 0.2, m)  # 내부는 +0.8
    X.append(xi); Y.append(yi); lab += [i]*m
X = np.concatenate(X); Y = np.concatenate(Y); lab = np.array(lab)

print(f"  전체 기울기 = {np.polyfit(X, Y, 1)[0]:+.4f}")
for i in range(G):
    print(f"    집단 {i+1} 기울기 = "
          f"{np.polyfit(X[lab==i], Y[lab==i], 1)[0]:+.4f}")

출력:

  전체 기울기 = -0.8429
    집단 1 기울기 = +0.7264
    집단 2 기울기 = +0.7380
    집단 3 기울기 = +0.8250
    집단 4 기울기 = +0.8940
    집단 5 기울기 = +0.7943

모든 집단에서 기울기가 \(+0.8\) 근처인데 전체 기울기는 \(-0.84\)다. 부호가 완전히 뒤집힌다.

그림으로 보면 명확하다. 다섯 개의 우상향 구름이 좌상단에서 우하단으로 늘어서 있는 모양이다. 각 구름은 올라가지만 구름들의 배열은 내려간다.

이것이 회귀판 심슨 역설이다. 비율에서는 가중평균이 뒤집혔고, 여기서는 집단 간 변동과 집단 내 변동이 반대 방향이라 합친 기울기가 뒤집힌다. 생태학적 상관 문서 연습문제 4에서 본 분해가 그대로 적용된다.

\[ \text{전체 기울기} \approx \frac{\text{집단 간 공분산} + \text{집단 내 공분산}}{\text{집단 간 분산} + \text{집단 내 분산}} \]

실무에서 흔한 예.

상황 집단 내 전체
병원별 중증도–사망률 치료가 효과적 중증 환자 많은 병원이 사망률 높음
학교별 학습시간–성적 더 공부하면 성적↑ 어려운 학교 학생이 더 공부
연도별 임금–경력 경력 쌓이면 임금↑ 신입 채용 확대기에 평균 임금↓

대처는 집단을 모형에 넣는 것이다. 고정효과나 혼합모형으로 집단 수준 변동을 흡수하면 집단 내 기울기가 분리된다. 13장의 회귀에서 범주형 변수를 넣는 것이 바로 이 작업이다.

연습문제 7. 역설이 일어났을 때 어느 쪽을 믿어야 하는가? 집계와 층별 결과 중 옳은 것을 고르는 기준을 세우고, 층을 나누는 것이 틀린 경우를 예로 들어라.

풀이

통계만으로는 결정할 수 없다. 두 수치 모두 자료에 대해 참이다. 무엇을 믿을지는 인과 구조가 정한다.

층 변수의 역할 보정해야 하나 예
교란변수(처치·결과 모두의 원인) 그렇다 — 층별을 믿는다 중증도
매개변수(처치의 결과이며 결과의 원인) 아니다 — 집계를 믿는다 처치 → 혈압 → 사망
충돌자(처치와 결과의 공통 결과) 절대 아니다 — 보정이 편향을 만든다 입원 여부

매개변수로 보정하면 효과의 일부를 지운다. 신약이 혈압을 낮춰 사망을 줄인다면, 혈압으로 층화한 뒤 "혈압이 같은 환자끼리 비교하면 효과가 없다"는 결론은 약의 작동 기제를 지운 것이다. 총효과를 알고 싶으면 보정하지 말아야 한다.

충돌자로 보정하면 없던 연관이 생긴다. 이것이 버크슨 역설이다.

import numpy as np

rng = np.random.default_rng(4)
n = 200_000
A = rng.normal(0, 1, n)          # 질병 A
B = rng.normal(0, 1, n)          # 질병 B — A 와 독립
hosp = (A + B) > 2.0             # 둘 중 하나라도 심하면 입원
print(f"  전체       corr(A,B) = {np.corrcoef(A, B)[0,1]:+.4f}")
print(f"  입원자만   corr(A,B) = {np.corrcoef(A[hosp], B[hosp])[0,1]:+.4f}")
print(f"  (입원 비율 {hosp.mean():.4f})")

출력:

  전체       corr(A,B) = -0.0025
  입원자만   corr(A,B) = -0.7331

모집단에서 독립인 두 질병이 입원 환자 안에서는 \(-0.73\)의 강한 음의 상관을 보인다. "A가 없는데 입원했다면 B가 심할 것"이라는 논리 때문이다. 병원 자료만 보고 "A가 B를 막아 준다"고 결론 내리면 완전히 틀린다.

판단 순서.

1. 층 변수가 처치보다 시간적으로 앞서는가?
     앞선다 -> 교란 가능성 -> 보정
     뒤따른다 -> 매개 또는 충돌 -> 보정 금지
2. 층 변수가 처치와 결과의 공통 결과인가?
     그렇다 -> 충돌자 -> 절대 보정 금지
3. 확신이 없으면 양쪽 결과를 모두 보고한다

DAG를 그리는 것이 가장 확실하다. 12.4절에서 다루며, "무엇을 보정할지"는 자료가 아니라 가정한 인과 구조가 정한다는 것이 핵심이다.

연습문제 8. 심슨 역설은 얼마나 흔한가? 무작위로 생성한 \(2\times2\times2\) 표에서 역설이 일어나는 비율을 추정하고, 실무적 함의를 논하라.

풀이
import numpy as np

rng = np.random.default_rng(5)
REP = 500_000
cnt = 0
for _ in range(REP):
    a1, a2, b1, b2 = rng.uniform(0, 1, 4)     # 층별 성공률
    w, v = rng.uniform(0, 1, 2)               # 층 1 의 비중
    A = w*a1 + (1-w)*a2
    B = v*b1 + (1-v)*b2
    if (a1 > b1 and a2 > b2 and A < B) or (a1 < b1 and a2 < b2 and A > B):
        cnt += 1
print(f"  무작위 2x2x2 표에서 심슨 역설이 일어나는 비율: {cnt/REP:.4f}")

출력:

  무작위 2x2x2 표에서 심슨 역설이 일어나는 비율: 0.0243

약 \(2.4\%\)다. 균등하게 무작위로 뽑은 표에서는 드물다.

그러나 이 수치를 안심의 근거로 삼으면 안 된다. 세 가지 이유가 있다.

  • 실제 자료는 무작위가 아니다. 관측연구에서 처치 배정이 결과와 관련된 변수에 좌우되는 것이 일반적이다. 연습문제 5의 조건 — 층이 결과와도 처치와도 관련 — 이 관측연구의 기본 상황이다.
  • 부호 뒤집힘만 센 것이다. 뒤집히지는 않아도 크기가 크게 달라지는 경우는 훨씬 흔하다. 2장 타이타닉 연습문제 6에서 위험차가 \(0.36\sim0.76\)으로 달랐던 것이 그 예이며, 그것도 결론을 바꾸기에 충분하다.
  • 층이 많으면 확률이 올라간다. 위는 층이 둘인 경우다. 층이 여럿이거나 연속형이면 일부 층에서 뒤집히는 일이 훨씬 잦다.

실무적 함의는 "빈도가 아니라 대가"다. \(1.7\%\)라도 일어나면 결론이 정반대가 된다. 그리고 일어났는지 여부는 층화해 보기 전에는 알 수 없다.

그래서 규칙은 단순하다. 관측 자료를 분석할 때는 결과와 관련될 만한 변수로 층화해 확인하는 것을 기본 절차에 넣는다. 비용은 코드 몇 줄이고, 그러지 않았을 때의 대가는 결론의 반전이다.

연습문제 9. 버클리 자료를 회귀로 분석하라. 성별만 넣은 모형과 학과를 함께 넣은 모형의 계수를 비교하고, 심슨 역설이 회귀계수에서 어떻게 나타나는지 보여라.

풀이
import numpy as np
import pandas as pd
import statsmodels.api as sm

rows = []
for i, d in enumerate(dept):
    rows += [(d, 1, 1)]*m_adm[i] + [(d, 1, 0)]*(m_app[i]-m_adm[i])
    rows += [(d, 0, 1)]*f_adm[i] + [(d, 0, 0)]*(f_app[i]-f_adm[i])
df = pd.DataFrame(rows, columns=['dept', 'male', 'admit'])

m1 = sm.Logit(df.admit, sm.add_constant(df[['male']])).fit(disp=0)
D = pd.get_dummies(df.dept, drop_first=True).astype(float)
m2 = sm.Logit(df.admit,
              sm.add_constant(pd.concat([df[['male']], D], axis=1))).fit(disp=0)

print(f"  성별만       : male 계수 = {m1.params['male']:+.4f}  "
      f"오즈비 = {np.exp(m1.params['male']):.4f}")
print(f"  성별 + 학과  : male 계수 = {m2.params['male']:+.4f}  "
      f"오즈비 = {np.exp(m2.params['male']):.4f}")

출력:

  성별만       : male 계수 = +0.6104  오즈비 = 1.8411
  성별 + 학과  : male 계수 = -0.0999  오즈비 = 0.9050

계수의 부호가 뒤집힌다. 학과를 넣지 않으면 남성의 합격 오즈가 \(1.84\)배인데, 학과를 넣으면 \(0.90\)배로 여성이 근소하게 유리해진다.

회귀는 심슨 역설을 자동으로 처리하지 않는다. 적절한 변수를 넣어야 처리된다. 학과를 빠뜨린 모형은 누락변수 편향을 겪으며, 12.2절 교란 문서에서 그 공식을 다룬다.

오즈비 \(0.90\)의 신뢰구간도 함께 봐야 한다.

ci = m2.conf_int().loc['male']
print(f"  95% CI(오즈비) = [{np.exp(ci[0]):.4f}, {np.exp(ci[1]):.4f}]")

출력은 \([0.7723,\ 1.0603]\)으로 \(1\)을 포함한다. 따라서 "학과 보정 후에는 성별 효과의 증거가 약하다"가 정확한 서술이 된다. 원 논문의 결론도 그와 같았다.

로지스틱 회귀의 오즈비가 층화 결과와 정확히 같지는 않다. 오즈비가 비선형이라 층별 오즈비의 단순 평균과 다르며, 이를 비붕괴성이라 한다. 19장에서 다룬다.

연습문제 10. 심슨 역설을 피하기 위한 실무 지침을 정리하라. 자료를 받았을 때 무엇을 확인하고 어떻게 보고할 것인가?

풀이

확인 절차.

1. 결과와 관련될 만한 변수를 나열한다 (도메인 지식)
2. 그중 처치/집단과도 관련된 것을 고른다 -> 교란 후보
3. 각 후보로 층화해 결과를 본다
     방향이 바뀌는가?        -> 심슨 역설
     크기가 크게 바뀌는가?   -> 교호작용 또는 교란
     거의 같은가?            -> 그 변수는 문제 아님
4. 시간 순서를 확인한다 (처치 전 변수만 보정 대상)
5. 충돌자를 걸러 낸다 (처치와 결과의 공통 결과는 보정 금지)

보고 형식.

전체: 여성 합격률 30.4%, 남성 44.5% (차 -14.2%p)

학과별로 층화하면:
  6개 학과 중 4개에서 여성이 높음 (+20.4%p ~ -3.8%p)
  여성은 합격률이 낮은 학과에 더 많이 지원
  (학과 합격률과 여성 지원비율의 상관 -0.79)

학과 보정 후 오즈비 0.90 (95% CI 포함)
-> 전체 격차는 주로 학과 선택 차이로 설명된다.
   단, 학과 선택 자체가 무엇의 결과인지는 이 자료로 답할 수 없다.

마지막 줄이 중요하다. 보정은 "설명했다"까지이고 "원인을 밝혔다"가 아니다. 학과 선택의 배경에 무엇이 있는지는 다른 자료와 설계가 필요하다.

세 가지 금기.

  • 층화 결과를 보고 유리한 쪽만 보고하지 않는다. 양쪽을 모두 적는다.
  • 층을 자료를 보고 고르지 않는다. 9장의 다중성 문제가 된다. 가능하면 사전에 정한다.
  • "보정했으니 인과"라고 하지 않는다. 관측되지 않은 교란은 여전히 남는다. \(\square\)