✨ 시작 질문
“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 분석
📌 흐름
- 사전 시점에서 개입군과 유사한 특성을 가진 비교군을 매칭
(예: 연도별 병상 수, 진료과 수, 평균 입원 일수 등) - 매칭된 쌍끼리 차분의 차분(DiD) 수행
🏥 예시
EMR 도입 병원 10개
→ 지역, 규모, 진료 과목이 비슷한 비도입 병원 10개와 1:1 매칭
→ 이후 전후 변화량 비교 (DiD)
✅ 장점
- 비교군이 더 현실적으로 유사해짐
- 병렬 추세 가정이 보다 설득력 있음
❗주의
- 매칭 기준 변수에 따라 결과가 민감할 수 있음
- 매칭 품질(공변량 균형)은 SMD(Standardized Mean Difference) 등으로 꼭 점검해야 함
✔️ 대안 3. Event Study (이벤트 스터디)
정책 효과가 시간에 따라 어떻게 달라졌는지를 추적하는 방법
- 단순히 “전후 변화”만 보는 게 아니라,
- 정책 도입 전후 수년간의 시점별 효과를 추정하는 기법이다.
- 정책 효과가 지연되거나, 누적되거나, 일시적일 수도 있기 때문이다.
📌 흐름
- 각 집단의 정책 도입 시점을 기준으로 event_time 변수 생성
(예: 도입 2년 전 = -2, 도입 연도 = 0, 도입 1년 후 = +1 등) - 회귀분석에서 event_time 더미를 포함
(기준 시점은 제외하고, 나머지 연도별 효과 추정) - 도입 전 추세가 평행한지 확인
→ 병렬 추세 가정 검증 - 도입 후 추세가 상승/하락하는지 시각화
→ 정책 효과의 시간적 구조 파악
🏥 예시
서울시 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는 쉽고 널리 쓰이지만, 가장 오용되기 쉬운 방법이기도 하다.
'실전 인과추론' 카테고리의 다른 글
《실전 인과추론 시리즈 ⑤ - G-Computation 해부하기》 (1) | 2025.05.13 |
---|---|
《실전 인과추론 시리즈 ④ - RDD(단절설계) 해부하기》 (2) | 2025.05.12 |
《실전 인과추론 시리즈 ② - Instrumental Variable(도구변수) 해부하기》 (0) | 2025.05.08 |
《실전 인과추론 시리즈 ① - PSM, IPTW 해부하기》 (2) | 2025.05.06 |
[인과추론] 입문자용 연구 흐름 로드맵 🧠 (0) | 2025.04.28 |