효과 수정과 상호작용

Effect Modification & Interaction — 처리 효과의 이질성과 공동 개입

효과 수정(effect modification)과 상호작용(interaction)의 정의, 차이, 식별 방법을 다룬다. 가산적·승법적 효과 수정, 층화 분석, 반사실적 반응 유형, 충분원인 모형을 소개한다. Hernán & Robins (2020) Ch.4-5를 기반으로 작성하였다.

Experimentation
Causal Inference
저자

Kwangmin Kim

공개

2026년 03월 20일

1 정의

정의: 효과 수정 (Effect Modification)

변수 \(V\)가 처리 \(A\)의 결과 \(Y\)에 대한 평균 인과 효과를 변화시킬 때, \(V\)를 효과 수정자(effect modifier)라 한다.

가산적 효과 수정 (Additive):

\[ E[Y^{a=1} - Y^{a=0} \mid V=1] \neq E[Y^{a=1} - Y^{a=0} \mid V=0] \]

승법적 효과 수정 (Multiplicative):

\[ \frac{\Pr[Y^{a=1}=1 \mid V=1]}{\Pr[Y^{a=0}=1 \mid V=1]} \neq \frac{\Pr[Y^{a=1}=1 \mid V=0]}{\Pr[Y^{a=0}=1 \mid V=0]} \]

  • 역학: Effect Modification, Effect-Measure Modification
  • IT: Heterogeneous Treatment Effect (HTE), Subgroup Analysis
정의: 상호작용 (Interaction)

두 처리 \(A\)\(E\)공동 개입(joint intervention) 하에서, \(A\)의 인과 효과가 \(E\)의 수준에 따라 달라질 때 상호작용이 존재한다.

가산적 상호작용:

\[ \Pr[Y^{a=1,e=1}=1] - \Pr[Y^{a=0,e=1}=1] \neq \Pr[Y^{a=1,e=0}=1] - \Pr[Y^{a=0,e=0}=1] \]

  • 역학: Interaction, Biological Interaction
  • IT: Interaction Effect, Treatment × Feature Interaction
역학 용어 IT 용어 비고
Effect Modification HTE, Subgroup Effect 단일 처리의 효과 이질성
Interaction Interaction Effect 두 처리의 공동 효과
Stratification Subgroup Analysis 층화 분석
Qualitative EM Directional HTE 방향이 역전되는 효과 수정
Transportability External Validity 효과의 다른 모집단 적용 가능성

2 개념 및 원리

2.1 효과 수정: ATE는 “하나의 숫자”가 아니다

심장 이식 예시 (Hernán & Robins, 2020, Ch.4, Table 4.1): 20명 모집단에서 전체 ATE = 0.

하지만 성별(\(V\))로 나누면:

하위 집단 \(\Pr[Y^{a=1}=1 \mid V]\) \(\Pr[Y^{a=0}=1 \mid V]\) CRD CRR
여성 (\(V=1\)) 0.6 0.4 +0.2 1.5
남성 (\(V=0\)) 0.4 0.6 −0.2 0.67
전체 0.5 0.5 0.0 1.0

여성에게 이식은 해롭고, 남성에게는 유익하다. 전체 ATE = 0은 두 효과가 상쇄된 결과이다. 성별 \(V\)는 가산적·승법적 효과 수정자이다.

이것은 질적 효과 수정(qualitative effect modification)이다 — 하위 집단에서 효과의 방향이 역전된다.

2.2 가산적 vs. 승법적 효과 수정

효과 수정은 효과 지표의 선택에 의존한다 (effect-measure modification).

상황 CRD (\(V=1\)) CRD (\(V=0\)) CRR (\(V=1\)) CRR (\(V=0\)) 가산적 EM 승법적 EM
예시 1 +0.2 −0.2 1.5 0.67
예시 2 +0.1 +0.1 1.125 2.0

예시 2에서 기저 위험(baseline risk)이 \(V=1\)에서 0.8, \(V=0\)에서 0.1이면, CRD는 동일(+0.1)하지만 CRR은 다르다 (1.125 vs. 2.0).

공중 보건/비즈니스 의사결정에는 가산적 척도가 더 유용하다 — “어떤 집단에 개입하면 가장 많은 사건을 예방하는가?”에 답하기 때문이다 (Hernán & Robins, 2020, Ch.4).

2.3 상호작용: 공동 개입의 효과

상호작용은 두 처리 모두에 대해 개입 가능할 때 정의된다.

  • 효과 수정: \(V\)는 배경 변수 (개입 대상이 아님). \(A\)의 효과만 관심.
  • 상호작용: \(A\)\(E\) 모두 개입 가능. 공동 잠재 결과 \(Y^{a,e}\) 사용.

가산적 상호작용이 없으면:

\[ \Pr[Y^{a=1,e=1}=1] - \Pr[Y^{a=0,e=0}=1] = \underbrace{(\Pr[Y^{a=1,e=0}=1] - \Pr[Y^{a=0,e=0}=1])}_{\text{A의 단독 효과}} + \underbrace{(\Pr[Y^{a=0,e=1}=1] - \Pr[Y^{a=0,e=0}=1])}_{\text{E의 단독 효과}} \]

공동 효과 = 각 단독 효과의 합. 상호작용이 있으면 이 등식이 깨진다.

2.4 효과 수정 vs. 상호작용

측면 효과 수정 상호작용
변수의 역할 \(V\)는 배경 변수 (불평등한 지위) \(A\), \(E\) 모두 처리 (평등한 지위)
잠재 결과 \(Y^a\) (단일 처리) \(Y^{a,e}\) (공동 처리)
식별 조건 \(A\)에 대해서만 필요 \(A\)\(E\) 모두에 대해 필요
\(E\)가 무작위 배정될 때 효과 수정 = 상호작용 효과 수정 = 상호작용

\(E\)가 무작위 배정되면 두 개념은 동치이다 (Hernán & Robins, 2020, Ch.5).

2.5 반사실적 반응 유형 (Response Types)

단일 이원 처리 \(A\)에서 4가지 반응 유형:

유형 \(Y^{a=0}\) \(Y^{a=1}\) 해석
Doomed 1 1 처리 무관하게 사망
Helped 1 0 처리로 구제
Hurt 0 1 처리로 피해
Immune 0 0 처리 무관하게 생존

두 이원 처리 \((A, E)\)에서는 \(2^4 = 16\)가지 반응 유형이 존재한다. 이 중 6가지(type 1, 4, 6, 11, 13, 16)에서는 \(A\)의 효과가 \(E\)의 수준에 무관하다 → 상호작용 없음. 나머지 10가지에서는 상호작용이 존재한다 (Hernán & Robins, 2020, Ch.5).

2.6 층화 분석과 보정

\(V\)에 의한 효과 수정을 식별하려면:

  1. \(V\)의 각 층에서 \(A\)의 인과 효과 계산
  2. 교란 변수 \(L\)에 대해서는 표준화/IPW로 보정
  3. \(V\)에 의한 층화 + \(L\)에 의한 보정 = 분리 가능

층화를 보정(adjustment)으로 사용하는 것과 효과 수정 식별을 위해 사용하는 것은 다르다. 보정은 교환가능성을 달성하기 위한 것이고, 효과 수정 식별은 효과 이질성을 탐지하기 위한 것이다.


3 직관적 설명

3.1 “평균의 함정”: IT에서의 비유

A/B 테스트에서 전체 ATE = 0이라면 “효과 없음”으로 결론내리기 쉽다. 그러나:

  • 모바일 사용자에게는 +5%p 전환율 향상
  • 데스크톱 사용자에게는 −5%p 전환율 하락

플랫폼(\(V\))이 효과 수정자이다. 전체 효과가 0인데도 모바일에만 배포하면 이득이다. 효과 수정을 무시하면 최적의 의사결정을 놓친다.

3.2 대리 효과 수정자 vs. 인과 효과 수정자

국적(\(V\))이 심장 이식의 효과를 수정한다고 해서, 국적이 원인인 것은 아니다. 실제로는 “수술 품질”이 국가 간에 다른 것이 원인일 수 있다. 국적은 대리 효과 수정자(surrogate effect modifier)이고, 수술 품질이 인과 효과 수정자(causal effect modifier)이다.

IT에서: “가입 경로”가 효과를 수정한다면, 실제로는 가입 경로와 상관된 “사용자 의도”가 진짜 원인일 수 있다.

3.3 상호작용의 일상 예시

커피(\(A\))와 수면제(\(E\))를 동시에 복용하면?

  • 커피만: 각성 효과
  • 수면제만: 수면 유도
  • 커피 + 수면제: 상호 상쇄 (또는 예측 불가)

커피의 효과가 수면제 복용 여부에 따라 달라진다 → 상호작용 존재. 이때 \(A\)(커피)와 \(E\)(수면제) 모두 “개입 가능한 처리”이므로 효과 수정이 아닌 상호작용이다.


4 왜 필요한가

4.1 비즈니스 의사결정에서 효과 이질성의 중요성

시나리오 전체 ATE HTE 발견 최적 의사결정
새 추천 알고리즘 +1%p 신규 유저 +5%p, 기존 유저 −1%p 신규 유저에게만 배포
할인 쿠폰 −$2/user 가격 민감 세그먼트 +$5, 나머지 −$4 가격 민감 세그먼트만 타겟
UI 변경 0 모바일 +3%p, 데스크톱 −3%p 모바일만 적용

효과 수정 분석 없이는 “전면 배포” 또는 “전면 롤백”밖에 선택지가 없다. HTE를 활용하면 개인화된 의사결정이 가능하다.

4.2 Transportability: 다른 모집단에 적용 가능한가?

효과 수정자의 분포가 다른 모집단에서는 같은 실험 결과를 기대할 수 없다.

  • 한국에서 A/B 테스트한 UI 변경이 미국에서도 같은 효과를 보일까?
  • 효과 수정자(언어, 문화, 기기 분포)가 다르면 전이 불가(non-transportable)
  • 효과 수정자로 층화한 조건부 효과가 더 전이 가능할 수 있다

5 응용 분야

분야 역학/의학 IT/비즈니스 구체적 예시
하위 그룹 분석 연령·성별별 약물 효과 차이 세그먼트별 기능 효과 차이 신규 vs. 기존 유저
개인화 정밀 의학 (precision medicine) 개인화 추천 Causal forest로 CATE 추정
약물 상호작용 병용 투여 효과 기능 조합 효과 추천 + 알림의 공동 효과
외적 타당도 임상시험 → 실제 진료 전이 파일럿 국가 → 전체 출시 효과 수정자 보정 후 전이
정책 타겟팅 고위험군 우선 예방 고가치 세그먼트 우선 적용 가산적 효과 수정 기준

6 예시

6.1 역학: 심장 이식의 성별 효과 수정

Table 4.1 데이터를 기반으로:

여성 (V=1):
  Pr[Y^{a=1}=1 | V=1] = 6/10 = 0.60
  Pr[Y^{a=0}=1 | V=1] = 4/10 = 0.40
  CRD = +0.20, CRR = 1.50 → 이식이 해롭다

남성 (V=0):
  Pr[Y^{a=1}=1 | V=0] = 4/10 = 0.40
  Pr[Y^{a=0}=1 | V=0] = 6/10 = 0.60
  CRD = −0.20, CRR = 0.67 → 이식이 유익하다

전체:
  CRD = 0, CRR = 1.0 → 효과 없음 (상쇄)

질적 효과 수정: 효과의 방향이 하위 집단에서 역전된다. 이 경우 전체 ATE만 보고하는 것은 위험하다.

6.2 IT: A/B 테스트의 플랫폼별 HTE

플랫폼 Control 전환율 Treatment 전환율 Uplift (CRD) Lift (CRR)
모바일 8% 12% +4%p 1.50
데스크톱 15% 12% −3%p 0.80
전체 10% 12% +2%p 1.20

전체로는 +2%p이지만, 데스크톱에서는 오히려 역효과. 플랫폼별 배포 결정이 최적이다.


7 코드 예시

7.1 효과 수정 탐지: 하위 그룹 분석

import numpy as np
import pandas as pd
from scipy import stats

np.random.seed(42)
n = 10000

# V: 효과 수정자 (0=데스크톱, 1=모바일)
V = np.random.binomial(1, 0.6, n)

# A: 무작위 배정 (RCT)
A = np.random.binomial(1, 0.5, n)

# Y: 결과 — 효과가 V에 따라 다름
# 모바일: ATE = +0.04, 데스크톱: ATE = -0.03
ate_mobile = 0.04
ate_desktop = -0.03
baseline = 0.10 + 0.05 * V  # 모바일이 기저 전환율 높음
true_ate = np.where(V == 1, ate_mobile, ate_desktop)
prob_y = baseline + true_ate * A
Y = np.random.binomial(1, np.clip(prob_y, 0, 1))

df = pd.DataFrame({"V": V, "A": A, "Y": Y})

# --- 전체 ATE ---
overall_ate = df[df.A == 1].Y.mean() - df[df.A == 0].Y.mean()
print(f"전체 ATE: {overall_ate:+.4f}")

# --- 하위 그룹별 ATE ---
for v, label in [(1, "모바일"), (0, "데스크톱")]:
    sub = df[df.V == v]
    ate_v = sub[sub.A == 1].Y.mean() - sub[sub.A == 0].Y.mean()

    # 신뢰구간 (Wald)
    n1 = (sub.A == 1).sum()
    n0 = (sub.A == 0).sum()
    p1 = sub[sub.A == 1].Y.mean()
    p0 = sub[sub.A == 0].Y.mean()
    se = np.sqrt(p1 * (1 - p1) / n1 + p0 * (1 - p0) / n0)
    ci_lo = ate_v - 1.96 * se
    ci_hi = ate_v + 1.96 * se

    print(f"{label} (V={v}): ATE = {ate_v:+.4f}, 95% CI = [{ci_lo:+.4f}, {ci_hi:+.4f}]")

# --- 상호작용 검정 (가산적) ---
# ATE_mobile - ATE_desktop ≠ 0?
mobile = df[df.V == 1]
desktop = df[df.V == 0]
ate_m = mobile[mobile.A == 1].Y.mean() - mobile[mobile.A == 0].Y.mean()
ate_d = desktop[desktop.A == 1].Y.mean() - desktop[desktop.A == 0].Y.mean()
diff = ate_m - ate_d

# SE of difference
se_m = np.sqrt(
    mobile[mobile.A == 1].Y.var() / (mobile.A == 1).sum() +
    mobile[mobile.A == 0].Y.var() / (mobile.A == 0).sum()
)
se_d = np.sqrt(
    desktop[desktop.A == 1].Y.var() / (desktop.A == 1).sum() +
    desktop[desktop.A == 0].Y.var() / (desktop.A == 0).sum()
)
se_diff = np.sqrt(se_m**2 + se_d**2)
z_interaction = diff / se_diff
p_interaction = 2 * (1 - stats.norm.cdf(abs(z_interaction)))

print(f"\n가산적 효과 수정 검정:")
print(f"  ATE 차이 (모바일 - 데스크톱): {diff:+.4f}")
print(f"  z-statistic: {z_interaction:.3f}, p-value: {p_interaction:.4f}")

7.2 두 처리의 상호작용 분석

np.random.seed(123)
n = 8000

# A: 추천 알고리즘 변경, E: 푸시 알림 활성화
A = np.random.binomial(1, 0.5, n)
E = np.random.binomial(1, 0.5, n)

# Y: 구매 — A와 E 사이에 초가산적(superadditive) 상호작용
baseline = 0.10
effect_A = 0.03
effect_E = 0.02
interaction_AE = 0.04  # A + E 동시 적용 시 추가 효과

prob_y = baseline + effect_A * A + effect_E * E + interaction_AE * A * E
Y = np.random.binomial(1, np.clip(prob_y, 0, 1))

df2 = pd.DataFrame({"A": A, "E": E, "Y": Y})

# 네 가지 공동 처리 수준의 결과
print("=== 공동 처리 결과 ===")
for a in [0, 1]:
    for e in [0, 1]:
        sub = df2[(df2.A == a) & (df2.E == e)]
        print(f"A={a}, E={e}: Pr[Y=1] = {sub.Y.mean():.4f} (n={len(sub)})")

# 상호작용 추정
p11 = df2[(df2.A == 1) & (df2.E == 1)].Y.mean()
p10 = df2[(df2.A == 1) & (df2.E == 0)].Y.mean()
p01 = df2[(df2.A == 0) & (df2.E == 1)].Y.mean()
p00 = df2[(df2.A == 0) & (df2.E == 0)].Y.mean()

# 가산적 상호작용 (RERI)
reri = p11 - p10 - p01 + p00
print(f"\n가산적 상호작용 (RERI): {reri:+.4f}")
print(f"  A의 효과 (E=0): {p10 - p00:+.4f}")
print(f"  A의 효과 (E=1): {p11 - p01:+.4f}")
print(f"  → A의 효과가 E=1일 때 더 크면 초가산적 상호작용")

8 관련 주제

이전/다음

같은 카테고리

다른 카테고리


9 참고 문헌

  • Hernán, M. A. & Robins, J. M. (2020). Causal Inference: What If, Ch.4-5. Chapman & Hall/CRC.
  • VanderWeele, T. J. & Knol, M. J. (2014). A tutorial on interaction. Epidemiologic Methods, 3(1), 33-72.
  • Rothman, K. J. (1976). Causes. American Journal of Epidemiology, 104(6), 587-592.

Subscribe

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