포아송 회귀 — Person-Time 자료의 모형

Woodward Ch.11.10 — Poisson Regression

Person-time 자료의 사건 수 모형인 Poisson regression 의 수식 (offset 활용), 단순·다중 모형, SER (standardised event ratio) 비교, routine 데이터 적용을 추상 → 일상어 → 반사실 3 단계 직관으로 풀어낸다. Cox PH 와의 동치성 (일정 hazard 가정) 도 다룬다.

Experimentation
Modeling
저자

Kwangmin Kim

공개

2026년 05월 08일

1 Poisson Regression 의 정체성

정의: Poisson Regression

사건 수 \(D\) (count) 를 모형화. Person-time (PT) 가 분모.

\[D \sim \text{Poisson}(\lambda \cdot \text{PT})\]

\[\log E[D] = \log(\text{PT}) + \beta_0 + \beta_1 X_1 + \cdots + \beta_p X_p\]

\(\log(\text{PT})\)offset — 계수 1 고정.

\(\exp(\beta_j)\) = Incidence Rate Ratio (IRR).

1.1 직관 — Person-time 의 의미

직관 3 단계: Person-time 분모
  • 추상 정의: \(D / \text{PT}\) 가 incidence rate. Poisson 회귀가 이 rate 의 covariate 효과 모형.
  • 일상어 비유: 회사의 연간 사고 발생률 = 사고 수 / 직원-년. Poisson 이 이 비율의 부서·조건 효과 분석.
  • 반사실 시나리오: PT 무시하고 단순 사건 수 비교 → 추적 길이 차이의 confounding. PT 분모가 통제.

1.2 Offset 의 역할

가정 점검: Offset vs Covariate

\(\log(\text{PT})\) 가 offset (계수 1 고정) 인 이유:

\[E[D] = \text{PT} \cdot e^{\beta^T X} \quad \Rightarrow \quad \log E[D] = \log(\text{PT}) + \beta^T X\]

만약 \(\log(\text{PT})\) 의 계수가 자유라면 모형이 PT 의 효과를 \(\beta_{\text{PT}}\) 로 추정. 우리가 원하는 것은 PT 가 선형 분모라는 가정 — 따라서 계수 1 고정.

3 단계 직관:

  • 추상 정의: PT 와 사건 수의 관계가 정비례 가정. 이 가정 하에 offset 사용.
  • 일상어 비유: 사고 수가 운전 시간에 정비례 가정 — 1 시간 운전이 0.5 시간의 2 배 사고 위험.
  • 반사실 시나리오: 만약 비-선형 (예: 피로 누적) 이라면 offset 부적절. 비선형 PT 효과 모형 필요.

2 Cox PH 와의 관계

정의: Cox 와 Poisson 의 동치

Hazard 가 시간 + covariate 에 일정 (\(h(t \mid X) = \lambda e^{\beta^T X}\)) 이면:

\[D_i \mid X_i \sim \text{Poisson}(\lambda e^{\beta^T X_i} \cdot \text{PT}_i)\]

Cox PH (exponential baseline) 와 Poisson regression 거의 동치.

직관 3 단계: 두 모형의 분업
  • 추상 정의: Cox = 사건 시점 단위 분석, Poisson = 사람-시간 합산 분석. 일정 hazard 가정 충족 시 동등.
  • 일상어 비유: Cox = “각 사건이 언제 발생했는가” 분석. Poisson = “총 몇 건이 얼마의 시간 동안” 분석.
  • 반사실 시나리오: 시간 의존성 강하면 Cox 가 정밀. 인구 단위 분석 (전염병학·routine) 이면 Poisson 이 효율 ↑.

3 단순 Poisson — 단일 변수

정의: Single-Variable Poisson

\[\log E[D \mid X] = \log(\text{PT}) + \beta_0 + \beta_1 X\]

\(\exp(\beta_1)\) = X 1 단위 증가당 IRR.

3.1 Person-time 자료의 형식

직관: Person-time 합산 형식

Long-format (각 개인 + 시간 구간):

Person X PT Events
1 0 5.2 0
2 1 3.7 1

Aggregated (categorical X):

X Total PT Total Events
0 5240 80
1 3710 95

Aggregated 로 합산해도 IRR 동일 — 자료 효율 ↑.

3 단계 직관:

  • 추상 정의: Poisson 의 sufficient statistic 이 (Total PT, Total Events) 만 — 개별 자료 정보 손실 없이 합산 가능.
  • 일상어 비유: 마라톤 결승 시간 평균 — 모든 주자의 개별 시간 vs 합산 평균. Poisson 의 합산이 비슷.
  • 반사실 시나리오: Continuous covariate 에서는 합산 어려움 — long-format 사용.

4 SHHS 사례 — 흡연-CV 사망 IRR

사례: Person-year IRR

가설: SHHS 의 흡연자 vs 비흡연자의 CV 사망 IRR.

흡연 Person-years Deaths Rate (per 1000 PY)
비흡연 25,000 50 2.0
흡연 15,000 75 5.0

Crude IRR: \(5.0 / 2.0 = 2.5\).

Poisson regression: \[\log D = \log \text{PY} + \beta_0 + \beta_1 \cdot \text{smoke}\]

\(\hat\beta_1 = \log(2.5) = 0.916\) → IRR = 2.5.

95% CI for IRR: \[\exp(\hat\beta_1 \pm 1.96 \cdot \text{se}(\hat\beta_1))\]

\(\text{se} = \sqrt{1/D_{\text{smoke}} + 1/D_{\text{nonsmoke}}} = \sqrt{1/75 + 1/50} = 0.183\)

CI: \(\exp(0.916 \pm 1.96 \cdot 0.183) = (1.74, 3.58)\).

3 단계 직관:

  • 추상 정의: Poisson 이 이 단순 IRR 추정을 회귀 형태로 일반화. 다중 covariate 시 자연 확장.
  • 일상어 비유: 두 회사의 사고율 비교 (사고/직원-년) — Poisson 이 이 비교의 보정·검정 도구.
  • 반사실 시나리오: 직접 IRR 산출보다 Poisson 이 confounder 보정 가능 + Wald CI 자동.

5 다중 Poisson — Confounder 통제

정의: Multi-variable Poisson

\[\log E[D] = \log \text{PT} + \beta_0 + \beta_1 \text{smoke} + \beta_2 \text{age} + \beta_3 \text{sex}\]

\(\exp(\beta_1)\) = age + sex 보정 후 흡연 IRR.

Cox PH 와 동치 (일정 hazard 가정 하).

5.1 직관 — Confounder 통제의 IRR 변화

직관 3 단계: Crude vs Adjusted IRR
  • 추상 정의: Crude IRR 이 confounder 효과 포함. Adjusted IRR 이 conditional — confounder 일정.
  • 일상어 비유: 흡연-CV 사망에서 연령 보정 시 IRR ↓ — 흡연자가 평균 더 노년이라 crude 가 부풀려짐.
  • 반사실 시나리오: Crude IRR 만 보면 흡연 효과 + 연령 효과 결합. Adjusted 가 진성 흡연 효과 추정.

5.2 Wald 와 LR Test

import statsmodels.api as sm

# Poisson regression
df = pd.DataFrame({"D": [50, 75], "PT": [25000, 15000], "smoke": [0, 1]})

# Long-form needed for individual analysis
# Aggregated form:
model = sm.GLM(df["D"], sm.add_constant(df[["smoke"]]),
               family=sm.families.Poisson(),
               offset=np.log(df["PT"])).fit()

print(f"IRR = {np.exp(model.params['smoke']):.2f}")
print(f"CI: {np.exp(model.conf_int().loc['smoke']).values}")
print(f"Wald p: {model.pvalues['smoke']:.4f}")

6 SER (Standardised Event Ratio) 와의 비교

정의: SER

\[\text{SER} = \frac{\text{Observed events}}{\text{Expected events}}\]

Expected = \(\sum_a \text{PT}_a \cdot \text{rate}_a^{\text{ref}}\).

(B45 의 SMR 와 동일 개념 — survival 자료 일반화.)

직관: SER vs Poisson
  • 추상 정의: SER 은 외부 reference rate 와 비교. Poisson 은 자료 내 비교.
  • 일상어 비유: SER = “이 회사의 사고율이 산업 평균의 몇 배”. Poisson = “이 회사의 부서별 사고율 비교”.
  • 반사실 시나리오: 외부 rate 가 표준 (예: 인구 통계) 이면 SER 효율. 자료 내 비교라면 Poisson 우월.

7 Routine Data 활용

사례: 인구 통계의 Poisson

지역별 + 연령별 + 성별 + 사망 원인별 자료가 routine 으로 수집되는 경우 (인구 통계).

# 예: 지역 × 연령 × 성별 × 사인 합산 자료
df = pd.DataFrame({
    "deaths": [100, 200, 50, 80, ...],
    "PY": [50000, 100000, 20000, 30000, ...],
    "region": [1, 1, 2, 2, ...],
    "age_group": [...],
    "sex": [...],
})

# Region 효과 (age + sex 보정)
model = sm.GLM(df["deaths"],
               sm.add_constant(df[["region", "age_group", "sex"]]),
               family=sm.families.Poisson(),
               offset=np.log(df["PY"])).fit()

IRR_region = np.exp(model.params["region"])

3 단계 직관:

  • 추상 정의: 합산 자료 + Poisson = 인구 단위 비교의 표준 도구.
  • 일상어 비유: 정부 인구 통계의 회귀 분석 — region·age·sex 매트릭스.
  • 반사실 시나리오: 자세한 자료 (개별 사건 시점) 없는 경우 Poisson 이 거의 유일한 도구. Cox 는 자세한 자료 필요.

8 Generic Data 와 Poisson

정의: Generic Person-time Data
Cell X 값 PT Events
(i, j, k) (i, j, k) 의 covariate 조합 \(\sum\) PT \(\sum\) events

각 cell 이 한 행. 큰 자료를 합산하여 분석 효율 ↑.

9 Overdispersion 의 위험

가정 위반: Overdispersion

Poisson 가정 — \(\text{Var}(D) = E[D]\) (분산 = 평균).

실제 자료에서 \(\text{Var}(D) > E[D]\) — overdispersion. 원인: - 군집 (clustering). - 미관측 heterogeneity. - 사건 간 의존.

결과: SE 과소 추정 → CI 너무 narrow → 가짜 유의.

3 단계 직관:

  • 추상 정의: Poisson 의 분산-평균 동등 가정 위반.
  • 일상어 비유: 측정 도구의 정밀도 가정 — 실제 noise 가 가정보다 크면 결과 부풀려짐.
  • 반사실 시나리오: Negative binomial 또는 quasi-Poisson 이 overdispersion 처리. SE 보정.

9.1 Overdispersion 의 검출

# Pearson chi-square / df
pearson_chi2 = ((df["D"] - model.predict())**2 / model.predict()).sum()
dispersion = pearson_chi2 / model.df_resid

print(f"Dispersion: {dispersion:.2f}")
print(f"  > 1 → overdispersion")

dispersion > 1.5 → quasi-Poisson 또는 NB 권장.

10 A/B 테스트의 Poisson

사례: A/B 의 클릭 수 분석

A/B 테스트: - \(D\): 사용자별 클릭 수. - PT: 노출 시간.

# A/B 의 Poisson
df["log_PT"] = np.log(df["exposure_time_min"])

model = sm.GLM(df["clicks"], sm.add_constant(df[["treatment", "age"]]),
               family=sm.families.Poisson(),
               offset=df["log_PT"]).fit()

IRR_treat = np.exp(model.params["treatment"])
print(f"Treatment IRR (clicks per minute): {IRR_treat:.3f}")

3 단계 직관:

  • 추상 정의: A/B 의 사건 수 결과 (구매 횟수, 클릭 수, 페이지 뷰) 가 Poisson 자연.
  • 일상어 비유: 두 매장의 매출 (= 거래 횟수) 비교 — Poisson 이 표준.
  • 반사실 시나리오: Overdispersion 흔함 (클릭 수의 군집) → quasi-Poisson 또는 NB 권장.

11 Negative Binomial — Overdispersion 의 표준

정의: NB Regression

\[D \sim \text{NB}(\mu, k)\]

\[\text{Var}(D) = \mu + \mu^2 / k\]

여기서 \(k\) = dispersion parameter. \(k \to \infty\) 면 Poisson.

활용: Overdispersion 의 표준 처리.

직관 3 단계: NB 의 활용
  • 추상 정의: 추가 분산 모수 \(k\) 로 overdispersion 처리.
  • 일상어 비유: 측정 도구의 정밀도 ↓ 보정.
  • 반사실 시나리오: Quasi-Poisson 도 SE 보정 가능. NB 가 likelihood 기반 — AIC 비교 가능.

12 Zero-Inflated Poisson (ZIP)

정의: ZIP

자료에 0 이 과다.

\[P(D = 0) = \pi + (1 - \pi) e^{-\lambda}\] \[P(D = k) = (1 - \pi) \frac{\lambda^k e^{-\lambda}}{k!}, \quad k > 0\]

\(\pi\) = “structural zero” 비율.

직관 3 단계: ZIP 의 활용
  • 추상 정의: 두 source 의 0 — Poisson 의 “운 좋게 0” + structural “절대 0”.
  • 일상어 비유: 결제 수 0 — “이번엔 안 사줌” vs “절대 안 사는 사용자”.
  • 반사실 시나리오: 단순 Poisson 시 0 의 source 무시 → SE 부정확. ZIP 이 정직.

13 결론

Poisson regression 은 person-time 자료의 IRR 분석 도구. Offset 으로 PT 통제, \(\exp(\beta)\) 가 IRR. Cox PH 의 일정 hazard 특수 경우. NB 가 overdispersion 의 표준, ZIP 이 zero 과다의 표준. Routine 자료에서 표준 도구.

다음 글 (H-WOO11-9) 에서 pooled logistic regression 을 본다.

14 관련 주제

Statistics 크로스링크

Phase B 크로스링크

Subscribe

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