생존 분석·Cox PH 모형 + 코호트의 약점

Schulz & Grimes Ch.4 Panel 4.1 + Ch.4.3 — Time-to-Event & Disadvantages

코호트의 시간-사건 분석 도구(Kaplan-Meier 곡선, log-rank 검정, Cox 비례 위험 모형)의 수식과 직관을 정리하고, 코호트의 4 가지 약점(selection bias, 희귀 결과 부적합, 장기 비용, loss to follow-up)을 반사실 시나리오로 풍부하게 보강한다.

Experimentation
Epidemiology
저자

Kwangmin Kim

공개

2026년 05월 08일

1 왜 시간-사건 분석이 필요한가

코호트가 단순한 “발생 비율 비교” 라면 카이제곱 검정으로 충분할 것이다. 그러나 실제 코호트에서는 다음 두 문제가 발생한다.

  1. 추적 기간이 사람마다 다르다 — 어떤 사람은 2 년 만에 결과 발생, 어떤 사람은 10 년 추적 후에도 미발생.
  2. 추적 시작 시점이 사람마다 다르다 — 신규 등록이 연구 기간 내내 들어옴(staggered entry).

이 두 문제 때문에 단순한 “10 년 안에 사례 발생 비율” 같은 이분 비교는 정보를 잃는다. 각 시점에서의 위험 변화 자체를 모형화해야 한다 — 이것이 생존 분석(survival analysis) 의 출발점이다 (Schulz & Grimes, 2019, Panel 4.1).

정의: 생존 함수와 위험 함수

생존 함수 (Survival Function):

\[ S(t) = P(T > t) \]

시간 \(t\) 까지 결과(예: 사망)가 발생하지 않을 확률.

위험 함수 (Hazard Function):

\[ h(t) = \lim_{\Delta t \to 0} \frac{P(t \le T < t + \Delta t \mid T \ge t)}{\Delta t} \]

시간 \(t\) 까지 살아남은 자가 그 직후 짧은 구간 \([t, t+\Delta t)\) 에서 결과를 겪을 순간적 비율.

1.1 직관: 위험 함수는 “지금까지 무사한 사람의 위험률”

\(h(t)\) 는 누적이 아니라 순간 슬라이스다. 마치 자동차 보험 갱신 시점마다 묻는 “이번 1 년 안에 사고 날 확률” 과 같다 — 매 시점마다 갱신되며, 개인 단위로 시간에 따라 변할 수 있다. 위험률은 “현재까지 살아남은 사람” 만 분모에 둔다는 점에서 누적 발생률과 본질적으로 다르다.

2 Kaplan-Meier 추정량

KM 곡선은 모형 가정 없이 비모수적으로 생존 함수를 추정한다.

\[ \hat S(t) = \prod_{t_i \le t} \left( 1 - \frac{d_i}{n_i} \right) \]

  • \(t_i\): 결과(사건)가 발생한 시점.
  • \(d_i\): 시점 \(t_i\) 에서 결과가 발생한 사례 수.
  • \(n_i\): 시점 \(t_i\) 직전까지 위험 상태에 남아 있는 사람 수 (at risk).
직관: 곱(product) 형식의 의미

각 시점 \(t_i\) 에서 살아남을 조건부 확률은 \(1 - d_i/n_i\) — “지금까지 무사한 \(n_i\) 명 중 \(d_i\) 명을 잃지 않을 확률”. 이 조건부 확률들을 시간 순서로 곱해 가면, 시점 \(t\) 까지 누적 생존 확률이 된다.

핵심 직관: KM 은 “한 단계씩 살아남기” 의 곱셈이다. 한 시점이라도 위험률이 높으면 그 충격이 이후 모든 누적 생존에 반영된다.

2.1 왜 KM 이 단순 비율보다 우월한가

반사실: 단순 누적 발생률만 쓰면

만약 단순히 “추적 종료 시점까지의 사례 발생 비율” 만 비교하면, 늦게 등록되어 추적 기간이 짧은 사람의 정보가 왜곡된다. 예를 들어 5 년 짜리 연구에 2 년 차에 등록한 사람이 3 년 추적 후 미발생으로 끝나면, “이 사람은 무사” 라는 정보의 가치가 5 년 추적된 무발생자와 동일하게 처리된다.

KM 은 각 사람을 그가 실제로 위험에 노출된 시간만큼만(at risk 분모에 포함시켜) 사용하므로 이 정보 손실을 막는다. 이것이 censoring(절단) 처리의 본질이다.

2.2 단계 함수와 시각화

KM 곡선은 계단형(step function) 으로 그려진다 — 사건이 발생할 때마다 한 단계씩 떨어지고, 사건이 없는 구간은 평평하다.

S(t)
1.0 │■■■■
    │    ■■■■
0.8 │        ■■■
    │           ■■■■■
0.6 │                ■■■■■
    │                     ■■■■
0.4 │                         ■■
    └────────────────────────────→ t

상보적으로 누적 발생률 곡선 \(1 - S(t)\) 도 같은 정보를 위로 올라가는 형태로 표현한다.

3 Log-Rank 검정 — 두 곡선이 다른가

두 군의 KM 곡선이 통계적으로 다른지 검정한다 (Schulz & Grimes, 2019, Panel 4.1).

정의: Log-Rank 통계량 (개략)

각 사건 시점 \(t_i\) 에서 군 1 의 기대 사건 수를 \(E_{1i}\), 관찰 사건 수를 \(O_{1i}\) 라 하자. 모든 사건 시점에 대해

\[ \chi^2 = \frac{\left( \sum_i (O_{1i} - E_{1i}) \right)^2}{\sum_i V_i} \]

이 자유도 1 의 카이제곱 분포를 따른다. \(V_i\) 는 각 시점의 분산.

3.1 직관: 매 시점의 “기대 vs 관찰” 누적

\(O_{1i} - E_{1i}\)시점 \(t_i\) 에서 군 1 이 무작위 분배보다 사건을 더(또는 덜) 겪었는가의 부호다. 두 군의 위험률이 같다면 사건은 두 군에 비례적으로 배분되어 평균 0 이 된다. 검정은 이 편차들을 시간 축 전체에서 누적하여 통계량을 만든다.

비유: 농구 경기에서 매 쿼터마다 “기대 점수 vs 실제 점수” 의 차이를 전 경기에 걸쳐 합산해 우승팀이 정말 강했는지 평가하는 것과 비슷하다 — 한 쿼터의 운이 전체 결과를 흔들지 않게 시간 축 전체를 본다.

4 Cox 비례 위험 모형

Log-rank 가 두 곡선의 차이만 검정한다면, Cox PH 모형은 그 차이의 크기를 정량화하고 다변량 보정도 가능하게 한다 (Schulz & Grimes, 2019, Panel 4.1).

정의: 비례 위험 모형 (Cox PH Model)

\[ h(t \mid \mathbf{x}) = h_0(t) \exp\left( \beta_1 x_1 + \beta_2 x_2 + \cdots + \beta_p x_p \right) \]

  • \(h_0(t)\): 모든 공변량이 0 일 때의 기준 위험 함수(baseline hazard) — 시간에 따라 변할 수 있으나 형태는 자유.
  • \(\exp(\beta_j)\): 공변량 \(x_j\) 가 1 단위 증가할 때의 위험비(hazard ratio, HR) — 다른 공변량 일정 가정 하.

4.1 비례 위험 가정의 의미

가정: 두 군 간의 위험비가 시간에 따라 일정하다 — \(h_1(t) / h_0(t) = \exp(\beta) = \text{const}\).

반사실: 가정이 깨지면

비례 위험 가정이 깨지면 — 예를 들어 새 약이 초기에 큰 효과를 주지만 1 년 후 효과가 소멸한다면 — Cox PH 의 단일 HR 추정은 시간 평균을 평탄화하여 진성 효과 패턴을 가린다.

이 경우 시간 의존 공변량 또는 stratified Cox 모형으로 가정 위반을 흡수해야 한다. 검진 도구로는 Schoenfeld residuals 의 시간 추세를 본다 — 시간에 따라 0 주변에서 흐트러지는지.

4.2 직관: HR 의 일상어 해석

\(\exp(\beta_{\text{흡연}}) = 2.5\) 라면 다른 조건이 같을 때 흡연자가 비흡연자 대비 매 시점 사건 발생률이 2.5 배 라는 뜻이다. 이는 “흡연자가 비흡연자보다 2.5 배 빨리 죽는다” 가 아니라, 순간 위험률이 2.5 배 라는 더 정밀한 진술이다.

위험비는 다음과 같이 RR 과 거의 동일하게 해석되되, 시간 차원이 추가된다.

지표 시간 차원 해석
Relative Risk (RR) 없음 (특정 기간 누적) “기간 X 안에 발생할 확률 비”
Hazard Ratio (HR) 있음 (순간 위험률) “현 시점 발생 위험률 비”

희귀 결과에서는 두 값이 거의 같지만, 사건이 흔하면 HR 이 더 정확한 지표다.

4.3 부분 가능도 — 왜 Cox 가 강력한가

Cox 모형은 기준 위험 \(h_0(t)\) 의 형태를 가정하지 않고도 \(\beta\) 를 추정한다. 이는 부분 가능도(partial likelihood) 라는 천재적 통찰의 결과다 — 사건이 발생한 시점에 누가 위험 상태에 있었는지의 순서 정보만 사용한다.

직관: 순위만으로도 효과를 추정한다

비유: 경마에서 우승마가 누군지 안다고 해서 “각 말의 절대 속도” 까지 알 필요는 없다. 순위 정보만으로 어떤 말이 평균적으로 빠른지 추정 가능하다. Cox 가 baseline hazard 의 모양을 모르면서도 HR 을 추정할 수 있는 이유가 같다.

5 코호트의 약점 1 — Selection Bias

가정 위반: “비노출자 = 노출자 minus 노출”

코호트의 이상적 가정은 “비노출자는 노출자에서 노출만 빼면 동일” 이다. 그러나 관찰 코호트에서 이는 거의 성립하지 않는다.

예시 — 조깅 코호트 (Schulz & Grimes, 2019, Ch.4.3): 조깅 노출자 vs 비조깅자의 심혈관 질환 비교.

조깅을 선택하는 사람은 다른 면에서도 다르다 — 식이가 더 건강하고, 흡연이 적고, 사회경제적 지위가 높을 수 있다. 그래서 심혈관 질환 차이가 조깅의 효과인지, 다른 변수의 효과인지 구분되지 않는다.

5.1 반사실: RCT 가 이 함정에서 자유로운 이유

RCT 는 무작위 배정으로 모든 잠재 교란 변수를 두 군에 평균적으로 동일하게 분배한다. 측정되지 않은 변수까지 포함된다. 코호트는 측정된 교란만 회귀로 보정 가능하므로, 미측정 교란이 남는다.

측면 RCT Observational Cohort
측정된 교란 무작위 배정으로 자동 균형 회귀·매칭으로 보정
미측정 교란 무작위 배정으로 자동 균형 보정 불가, 잔여 교란

자기선택(self-selection) 이 IT 에서 동일 패턴을 만든다 — A/B 테스트 opt-out 사용자가 활성도 낮은 사용자라면, opt-in 사용자만 본 결과는 일반 사용자에게 일반화되지 않는다.

6 약점 2 — 희귀 결과 부적합

희귀 질환(예: 경피증) 의 발생률이 인구 10 만명당 1~3 건이라면, 100,000 명을 추적해도 사건이 1~3 건만 발생한다. 검정력이 절망적이다.

6.1 직관: 사건 수가 검정력의 본질

코호트의 검정력은 표본 크기보다 사건 수가 결정한다. 100,000 명 추적이라도 사건 5 건이면 OR 측정도, HR 측정도 모두 큰 신뢰구간을 갖는다.

대안: case-control. 희귀 결과를 가진 사례를 모은 다음, 적절한 비교군을 비효율 없이 표집한다 (cross-link: B-SCH5 시리즈 — Case-Control 묶음).

6.2 반사실: 희귀 노출 vs 희귀 결과의 분업

희귀 측면 적합 설계 이유
노출이 희귀 (이온화 방사선) Cohort 노출자 풀이 한정되어 있어 표집이 자연
결과가 희귀 (경피증) Case-Control 결과부터 시작해 사례 표본을 보장

이 분업이 두 설계의 본질적 분담이다. Schulz Ch.5 (case-control) 가 이 반대편을 다룬다.

7 약점 3 — 장기 비용

암·심혈관 등 장잠복 질환은 추적이 수십 년에 달한다. 운영 비용·인건비·표본 유지가 모두 큰 도전이다.

7.1 그러나 — 큰 코호트의 가치

직관: Framingham 의 교훈

장기 비용은 단점이지만, 잘 설계된 큰 코호트는 다음 30~50 년의 의학 지식을 결정한다. 다음 코호트들이 그 증거다 (Schulz & Grimes, 2019, Ch.4.3).

  • Framingham Heart Study (1948 시작) — 심혈관 위험 인자의 거의 모든 정량 추정의 출처.
  • Nurses’ Health Study (1976 시작) — 여성 건강과 호르몬·식이 관계 (Barbhaiya et al., 2017).
  • British Physicians’ Study (1951 시작) — Doll & Peto 의 흡연-사망 연구의 모태 (Doll et al., 2000).
  • Royal College of General Practitioners’ Oral Contraceptive Study — 경구피임약 평생 위험 (Iversen et al., 2017).

이들은 비싸지만 비교 불가능한 가치를 산출했다.

8 약점 4 — Loss to Follow-up

추적 손실은 두 가지 수준에서 문제다.

  1. 검정력 손실 — 사건 수 감소.
  2. 차별 손실(differential loss) — 노출-결과와 상관된 손실 → 편향.
가정 위반의 비용

가정: “추적 손실은 노출·결과와 무관” (missing at random 의 강한 형태).

위반 시나리오: 새 항생제 치료군에서 부작용이 심한 사람이 응답을 거부하고 사라진다. 손실되지 않은 자만 분석에 들어간다 → 이 항생제가 실제보다 좋아 보인다.

이 함정은 “관찰된 평균만 본다” 는 분석 전략의 본질적 약점이다.

8.1 회피 전략

단계 행동
등록 단계 완료 가능성 높은 자만 등록 (외적 타당도 vs 내적 타당도 트레이드오프)
등록 시점 가족·지인 연락처, 가정의 정보 사전 확보
추적 단계 차량등록·주민등록·국가 사망 색인 활용
응답 보상 시간 보상 — 응답률 유지
분석 단계 Sensitivity analysis (손실자가 모두 결과 발생/모두 미발생 가정)

대규모 동시대 코호트가 다단계 추적으로 높은 유지율을 달성한 사례는 INAS-OC 등이 보여준다 (Dinger et al., 2014).

8.2 IT 대응 — 측정 손실의 IT 판

A/B 테스트에서 로그 누락, 앱 업데이트 후 이벤트 추적 끊김, Sample Ratio Mismatch (SRM) 가 같은 패턴이다. 차별 누락 — 한 군에서만 추적이 깨지면 결과 해석 전체가 위태로워진다.

9 코드 예시 — KM + Log-rank + Cox PH

import numpy as np
import pandas as pd
from lifelines import KaplanMeierFitter, CoxPHFitter
from lifelines.statistics import logrank_test

np.random.seed(42)
n = 500

# 가상 데이터: 노출 여부와 추적 시간·사건
exposure = np.random.binomial(1, 0.5, n)
# 노출자의 위험률이 1.6 배
hazard_ratio_true = 1.6
T = np.where(
    exposure == 1,
    np.random.exponential(scale=1.0 / 0.05 / hazard_ratio_true, size=n),
    np.random.exponential(scale=1.0 / 0.05, size=n),
)
# 관측 종료 시점 8.0 년에서 행정적 censoring
event = (T <= 8.0).astype(int)
T = np.minimum(T, 8.0)

df = pd.DataFrame({"T": T, "event": event, "exposure": exposure})

# 1. Kaplan-Meier 곡선
kmf = KaplanMeierFitter()
for label, mask in [("noexpose", exposure == 0), ("expose", exposure == 1)]:
    kmf.fit(df.loc[mask, "T"], event_observed=df.loc[mask, "event"], label=label)
    print(f"{label}: 5 년 생존확률 = {kmf.survival_function_at_times(5.0).values[0]:.3f}")

# 2. Log-rank
lr = logrank_test(
    df.loc[exposure == 1, "T"], df.loc[exposure == 0, "T"],
    event_observed_A=df.loc[exposure == 1, "event"],
    event_observed_B=df.loc[exposure == 0, "event"],
)
print(f"Log-rank p = {lr.p_value:.4f}")

# 3. Cox PH
cph = CoxPHFitter()
cph.fit(df, duration_col="T", event_col="event")
print(cph.summary[["exp(coef)", "exp(coef) lower 95%", "exp(coef) upper 95%", "p"]])

해석: KM 곡선이 두 군의 시간별 생존을 시각화하고, log-rank 가 차이의 통계 유의성을, Cox PH 가 hazard ratio 와 95% CI 를 정량화한다. 진성 HR 1.6 에 가까운 추정이 나오면 모형이 잘 작동.

10 결론

생존 분석(KM, log-rank, Cox PH)은 추적 기간이 다른 코호트에서 정보 손실 없이 효과를 추정하기 위한 표준 도구다. 그 위력의 대가로 비례 위험 가정 같은 새로운 가정을 받아들여야 하고, 가정이 깨지면 시간 의존·층화 모형으로 보정해야 한다.

코호트의 4 가지 약점은 모두 무작위 배정이 없다는 사실의 그림자다 — selection bias, 희귀 결과 부적합, 장기 비용, loss to follow-up. 이들은 RCT 에서는 다른 형태로 나타나거나 제거된다. 다음 글(B8) 에서는 코호트 보고를 어떻게 평가할 것인지(4 질문)와 추적 손실 관리의 실무를 정리한다.

11 관련 주제

Subscribe

Enjoy this blog? Get notified of new posts by email: