《실전 인과추론 시리즈 ③ - Difference-in-Differences, DiD 해부하기》

 

 

✨ 시작 질문

 

“EMR을 도입한 병원에서 투약 오류가 줄었다고 한다. 그런데 그게 진짜 EMR 덕분일까?”

 

 

단순한 전후 비교만으로는 인과를 말할 수 없다.

왜냐하면 시간이 흐르며 자연스럽게 좋아졌을 수도 있기 때문이다.

 

👉 그래서 등장한 게 차분의 차분(DiD)이다.

하지만 단순한 ‘전후 차이의 차이’를 계산하는 것 이상의 고민이 필요하다.

 

 


 

🔍 DiD의 기본 아이디어

 

“정책으로 인한 변화만 추출해보자.”

 

 

병원 유형 도입 전 오류율 도입 후 오류율 오류율 변화
EMR 병원 60 40 -20
비교 병원 65 60 -5
DiD 추정     -15

 

→ 정책이 없었더라도 -5는 자연적 변화일 수 있다.

정책으로 인한 순수한 효과는 -15

 

 


 

✅ DiD가 성립하려면?

 

1. 병렬 추세 가정
   → 개입이 없었더라면 두 집단은 비슷한 추세를 보였을 것이다.


2. 외부 충격 없음
   → 정책 외에 결과에 영향을 줄 수 있는 요인이 없어야 한다.


3. 비교군은 간접 영향 받지 않음
   → 정책 여파가 비교군에도 번지면 안 된다. (예: 정보 공유, 마케팅 확산 등)

 

 


 

🧪 DiD 모델 구조

 

df['did'] = df['treatment'] * df['post']
model = smf.ols('outcome ~ treatment + post + did', data=df).fit()

 

 

🧪 변수 정의

 

변수 이름 의미 값의 구조
treatment 처치군 여부 (정책 대상인지) 0 또는 1 (고정됨)
post 정책 시행 이후 시점인지 (시간 기준) 0 또는 1 (시점별로 달라짐)

 

비교 항목 treatment post
기준 대상(group) 시간(time)
언제 바뀌는가? 절대 안 바뀜 (고정값) 도입 시점 기준으로 바뀜
0의 의미 비교군 정책 도입 전 시점
1의 의미 정책 대상군 정책 도입 후 시점

 

 

🔍 각 항의 해석

 

계수 변수 의미
β₀ 상수항 비교군의 개입 전 결과 (baseline 수준)
β₁ treatment 개입 이전 시점에서 처치군 vs 비교군 간의 baseline 차이
β₂ post 모든 집단에 공통적으로 발생한 시간 효과 (예: 시대 변화, 기술 발전 등)
β₃ treatment × post 정책이 처치군에 미친 순수한 효과 (즉, DiD 추정치) ← 핵심

 

 


 

📌 직관 예시로 정리

 

2020년에 EMR 시스템을 도입한 병원(A), 도입하지 않은 병원(B)이 있다고 하자.

병원 연도 treatment post 해석
A 2019 1 0 도입 예정 병원, 정책 전 시점
A 2021 1 1 도입 병원, 정책 후 시점
B 2019 0 0 비교군 병원, 정책 전 시점
B 2021 0 1 비교군 병원, 정책 후 시점 (간접 영향 X)

 

계수 해석
β₁ EMR 도입 전에도 A와 B는 오류율이 달랐을 수 있다 → 그 baseline 차이
β₂ 2020년이 되며 전체 병원들의 오류율이 공통적으로 좋아졌을 수도 있다 → 그 시간 효과
β₃ A병원이 EMR 도입 덕분에 더 좋아졌는가? → 이것이 바로 DiD 추정치 (정책 효과)

 

 


 

❗ 현실에서 마주치는 3대 문제

 

문제 설명
비교군이 적절하지 않음 유사 집단이 없거나 baseline이 다름
병렬 추세 가정 위반 개입 전부터 추세가 다름
효과 지연 또는 누적 두 시점 비교로는 확인 어려움

 

 


 

① 비교군이 적절하지 않다

 

🧪 문제 요약

 

실제 분석에서는 정책을 받지 않은 유사 집단을 찾기가 매우 어렵다.

( → 예: 대형병원만 EMR을 도입했다면, 비교군은 중소병원이 될 수밖에 없다 → baseline이 다름. )

 

 

📌 해결 방법

 

✔️ Synthetic Control Method (SCM)

  • 여러 비교군을 가중합하여 “가상의 비교집단”을 만들고, 정책 효과를 추정
  • 예: A시가 EMR 도입 → B시, C시, D시를 조합해 synthetic A′시 구성

✔️ Matching + DiD

  • 병원 규모, 지역, 진료과수 등 사전 특성을 기준으로 유사한 비교군을 매칭한 후 DiD 적용
  • 예: PS Matching → 비슷한 처치 확률 가진 병원만 남기기

 

 


 

② 병렬 추세 가정이 깨진다


🧪 
문제 요약

 

정책이 도입되기 전부터 개입군과 비교군의 추세가 다르다면, DiD 추정치는 편향된다.

( → 예: EMR 도입 전부터 A병원은 지속적으로 오류율이 줄고 있었던 경우 )

 


📌 
해결 방법

 

✔️ 병렬 추세 시각화

  • 개입 전 여러 시점 데이터를 시각화해 추세 비교
import seaborn as sns
sns.lineplot(data=df, x="year", y="error_rate", hue="group")

 

 

🔍 해석 포인트:

  • 도입 전: 선이 평행해야 함 → 병렬 추세 성립
  • 도입 후: 선이 벌어진다면 → 개입 효과 가능성

 

📌 아래는 병렬 추세 예시:

가정 만족

 

가정 불만족

 

📌 병렬 추세가 보인다면 → DiD 가정이 성립할 가능성 ↑

📌 그렇지 않다면 → DiD는 쓰지 말고 아래 방법 사용

 

✔️ SCM or Matching + DiD

  • 병렬 추세가 깨지면 위 보완방법으로 비교군을 다시 구성해야 한다

 

 


 

③ 정책 효과가 지연되거나 누적된다

 

🧪 문제 요약

 

단순 DiD는 보통 정책 도입 전후 단 두 시점만 비교한다.

그런데 실제로는 효과가 서서히 나타나거나, 도입 직후에는 효과가 없을 수도 있다.

 


📌 
해결 방법

 

✔️ Event Study

  • 정책 전후의 여러 시점별 효과를 추정할 수 있는 확장된 DiD 모델
  • 시간 축을 따라 효과가 어떻게 누적·변화하는지 확인 가능

 

 


 

✔️ 대안  1. Synthetic Control Method (SCM)

 

인위적으로 만들어낸 유사 비교군
  • 정책을 시행한 집단에 대해,
  • 유사한 특성을 가진 여러 개체(예: 병원, 지역 등)를 가중 평균해서,
  •  “가상의 비교군”을 만든다.

 

🏥 예시

서울시 A병원에서 EMR 도입
→ B, C, D 병원의 데이터를 가중합해서 A병원과 유사한 경향을 보이도록 구성

 

 

✅ 장점

  • 병렬 추세를 설계 단계에서 보장
  • 비교군이 실제 존재하지 않아도 사용 가능

 

❗주의

  • 도입군이 1개일 때 특히 효과적
  • 하지만 데이터 수가 부족하거나 적절한 비교군 후보가 없으면 제한적

 


 

✔️ 대안 2. Matching + DiD

 

먼저 유사한 비교군을 짝지은 뒤 DiD 분석

 

📌 흐름

  1. 사전 시점에서 개입군과 유사한 특성을 가진 비교군을 매칭
    (예: 연도별 병상 수, 진료과 수, 평균 입원 일수 등)
  2. 매칭된 쌍끼리 차분의 차분(DiD) 수행

 

 

🏥 예시

EMR 도입 병원 10개
→ 지역, 규모, 진료 과목이 비슷한 비도입 병원 10개와 1:1 매칭
→ 이후 전후 변화량 비교 (DiD)

 

 

✅ 장점

  • 비교군이 더 현실적으로 유사해짐
  • 병렬 추세 가정이 보다 설득력 있음

 

❗주의

  • 매칭 기준 변수에 따라 결과가 민감할 수 있음
  • 매칭 품질(공변량 균형)은 SMD(Standardized Mean Difference) 등으로 꼭 점검해야 함

 

 


 

✔️ 대안 3. Event Study (이벤트 스터디)

 

정책 효과가 시간에 따라 어떻게 달라졌는지를 추적하는 방법
  • 단순히 “전후 변화”만 보는 게 아니라,
  • 정책 도입 전후 수년간의 시점별 효과를 추정하는 기법이다.
  • 정책 효과가 지연되거나, 누적되거나, 일시적일 수도 있기 때문이다.

 

📌 흐름

  1. 각 집단의 정책 도입 시점을 기준으로 event_time 변수 생성
    (예: 도입 2년 전 = -2, 도입 연도 = 0, 도입 1년 후 = +1 등)
  2. 회귀분석에서 event_time 더미를 포함
    (기준 시점은 제외하고, 나머지 연도별 효과 추정)
  3. 도입 전 추세가 평행한지 확인
    → 병렬 추세 가정 검증
  4. 도입 후 추세가 상승/하락하는지 시각화
    → 정책 효과의 시간적 구조 파악

 

 

🏥 예시

 

서울시 A병원은 2020년 EMR을 도입했다.
2023년까지 투약 오류율 변화를 추적하고 싶다.

 

 

→ A병원은 도입 기준으로

event_time = -2 (2018), -1 (2019), 0 (2020), +1 (2021), +2 (2022), +3 (2023) 등으로 정렬

 

→ 모든 병원마다 도입 기준 연도는 다르기 때문에,

event_time을 기준으로 병원을 “정렬”하는 것이 핵심

 

 

✅ 장점

  • 병렬 추세 검증을 수치와 그래프로 가능
  • 정책 효과의 지연/누적/소멸 여부 확인
  • 시계열적으로 해석 가능하여 정책 타이밍 전략 수립에 도움

 

❗주의

  • 정책 도입 시점이 다른 병원이 포함될 경우,
  • 개별 병원의 도입 시점을 기준으로 event_time을 일관되게 계산해야 함
  • 추정치가 적절하려면,
  • 각 event_time 구간에 충분한 관측치가 있어야 한다
  • 회귀식에는 개체 고정효과(병원), 시간 고정효과(연도)를 반드시 포함해야 함

 

 

🧪 실전 분석 예시 코드 (요약)

import statsmodels.formula.api as smf

# 'event_time'은 도입 기준 연도에서 몇 년 떨어졌는지 (-3 ~ +3)
model = smf.ols('outcome ~ C(event_time) + C(hospital_id) + C(year)', data=df).fit()
  • C(event_time)의 각 계수 → 시점별 효과 (B_k)
  • 기준 시점(event_time = -1)은 모델에서 제외 (비교 기준)

 

 


 

✅ 대안 요약 비교

 

방법 핵심 아이디어 언제 쓰면 좋은가?
SCM 가상의 비교군을 가중합으로 생성 개입군이 1개뿐이고 비교군이 애매할 때
Matching + DiD 유사한 집단끼리 매칭 후 DiD 분석 여러 개체가 있고 비교군 설정이 중요할 때
Event Study 정책 효과가 시간에 따라 어떻게 변하는지 추적 효과가 지연되거나 누적될 수 있을 때, 병렬 추세를 검정하고 싶을 때

 

 


 

📌 리팩토링된 흐름 요약

 

문제 해결 방법 도구/기법
비교군이 baseline과 다름 비슷한 병원만 비교 Matching + DiD, SCM
병렬 추세 성립 안됨 추세 직접 확인, 유사군 재설정 시각화, SCM
정책 효과가 지연 또는 누적됨 시간별 효과 추정 필요 Event Study

 

 


 

✍ 해석 시 유의사항

 

  • DiD는 평균 효과를 추정할 뿐
    → 개인에게 어떤 변화가 있었는지는 설명하지 못함

  • DiD 결과는 구조에 따라 다르게 나올 수 있다
    → 비교군이 달라지면 추정치도 바뀜

  • 통계적 유의성 vs 실질적 유의미성
    → 효과가 -3%라도 baseline이 0.1%면 의미 없을 수 있음

 

 


 

✅ 실무 적용 체크리스트

 

항목 질문
병렬 추세 개입 전 추세 시각화로 확인했는가?
비교군 사전 특성이 유사한가?
외부 충격 다른 정책이 겹치지 않았는가?
시간 구조 효과가 지연되거나 누적되지는 않았는가?
해석 이 효과는 실질적으로 의미 있는가?

 

 


 

🧩 최종 요약

 

  • 차분의 차분(DiD)은 비무작위 상황에서 개입의 인과효과를 추정할 수 있는 간단하면서도 강력한 도구이다.
  • 하지만 비교군 설정, 병렬 추세 가정, 시간 구조 등 현실적 제약이 많다.
  • 반드시 사전 시각화, Event Study 분석, 보완 방법(Matching, Synthetic Control 등)을 활용해 신뢰도를 높여야 한다.
  • DiD는 쉽고 널리 쓰이지만, 가장 오용되기 쉬운 방법이기도 하다.