매개 비율과 이항 매개 — Logistic Mediator 의 처리 (Buisson Ch.12.2)

Binary Mediator 의 logistic regression, Reference Point 평균, Per-row 평균

Buisson (2021) Ch.12 의 이항 mediator 절을 자세히 정리한다. Mediator 가 binary 일 때의 logistic regression, sigmoid 함수의 비선형성, Reference Point 방법과 Per-row 평균 방법, 두 접근의 trade-off, AirCnC 사례의 단계별 적용을 시연한다.

Experimentation
Causal Inference
저자

Kwangmin Kim

공개

2026년 05월 08일

1 정의

정의: 이항 Mediator

Mediator 가 0/1 binary 변수 (Buisson, 2021, Ch.12). 예:

  • \(X\) → “재예약 (Y/N)” → \(Y\)
  • \(X\) → “이메일 클릭 (Y/N)” → \(Y\)
  • \(X\) → “약 복용 (Y/N)” → \(Y\)

수치형 mediator 와의 차이:

수치형 mediator:
   X → M (numeric, e.g., visit time) → Y
   Linear regression for X → M

이항 mediator:
   X → M (binary, e.g., clicked) → Y
   Logistic regression for X → M

Logistic 의 비선형성 → mediation 추정 더 복잡.

직관 — 이항 vs 수치 의 차이

수치 mediator (visit duration):

  • \(X = 1\)\(M\) 이 평균 12.6 분 ↑
  • 모든 customer 에 동일 효과 (linear)
  • Indirect effect = \(\beta_{XM} \cdot \beta_{MY}\)

이항 mediator (clicked):

  • \(X = 1\)\(M\) 의 확률이 logistic shift
  • 효과의 크기가 baseline 확률에 따라 다름 (nonlinear)
  • 평균 효과 추정에 reference point 필요

→ 이항 mediator 가 추가 복잡성. 그러나 같은 mediation framework.

2 Logistic Regression for X → M

2.1 Sigmoid 함수

Linear vs Logistic

수치 mediator:

\[ M = \alpha_0 + \alpha_X \cdot X + \epsilon \]

이항 mediator (logistic):

\[ P(M = 1) = \sigma(\alpha_0 + \alpha_X \cdot X) \]

여기서 \(\sigma(z) = 1 / (1 + e^{-z})\) (sigmoid).

특징:

  • \(P(M = 1) \in [0, 1]\) (확률)
  • Z (linear predictor) 의 비선형 변환
직관 — Sigmoid 의 형태
P(M=1)
   1.0 |               ╱─────
       |           ╱
   0.5 |       ╱
       |   ╱
   0.0 |─────────────────── z
      -5     0     +5

특징:

  • z = 0 일 때 P = 0.5
  • z = +∞ 일 때 P = 1
  • z = -∞ 일 때 P = 0
  • 가운데 (0 근처) 에서 가파름
  • 양 끝에서 saturate

이 모양이 logistic 의 핵심.

2.2 \(\alpha_X\) 의 비선형 효과

효과 크기의 baseline 의존

같은 \(\alpha_X = 0.5\) 의 의미:

Baseline P(M=1) \(\alpha_X = 0.5\) 의 효과
0.5 +0.12 (50% → 62%)
0.9 +0.04 (90% → 94%)
0.1 +0.06 (10% → 16%)

같은 logistic coefficient 가 다른 absolute 효과.

→ 이항 mediator 의 effect 가 baseline 에 의존.

직관 — 비선형의 비유

비유: 운동의 효과.

  • Sedentary 에서 운동 시작: 큰 효과 (체중 -5 kg)
  • Athlete 가 추가 운동: 작은 효과 (-1 kg)

같은 “운동 시작” 이 다른 효과. 시작점에 의존.

이항 mediator 도 같음:

  • Baseline 0.5 (가운데) 에서 큰 absolute shift
  • Baseline 0.9 (saturate) 에서 작은 shift

→ 평균 효과 보고 시 reference point 명시.

3 Mediated Effect 의 계산

3.1 수식

도출

이항 M 의 mediation:

\[ P(M = 1 \mid X) = \sigma(\alpha_0 + \alpha_X \cdot X) \]

\[ Y = \beta_0 + \beta_X \cdot X + \beta_M \cdot M \]

\(M\) 을 그 기댓값으로 substitute:

\[ Y = \beta_0 + \beta_X \cdot X + \beta_M \cdot P(M = 1 \mid X) \]

\[ = \beta_0 + \beta_X \cdot X + \beta_M \cdot \sigma(\alpha_0 + \alpha_X X) \]

이게 X 의 Y 에 대한 marginal effect 의 비선형 함수.

직관 — 구조의 차이

수치 mediator:

\[ \frac{\partial Y}{\partial X} = \beta_X + \alpha_X \beta_M \quad \text{(constant)} \]

이항 mediator:

\[ \frac{\partial Y}{\partial X} = \beta_X + \alpha_X \beta_M \cdot \sigma'(z) \quad \text{(varies with X)} \]

여기서 \(\sigma'(z)\) 는 sigmoid 미분 (X 에 따라 다름).

→ 효과가 X 의 값에 의존.

4 Reference Point 방법

4.1 평균 X 사용

단순 접근

전체 X 의 평균에서 평가:

import numpy as np

x_mean = df["X"].mean()
z_mean = alpha_0 + alpha_X * x_mean
sigma_prime = sigmoid_derivative(z_mean)
indirect_effect = alpha_X * beta_M * sigma_prime

이 single value 가 “평균적 mediation 효과”.

장점:

  • 단순
  • 보고 쉬움

단점:

  • X 의 분포 가정 (예: 고정 평균)
  • Heterogeneity 무시
문제 — Outlier 영향

만약 X 의 분포가 skewed:

  • 평균이 outlier 의 영향
  • Reference point 가 representative 안 됨
  • Indirect effect 부정확

해결:

  • Median 사용
  • 또는 다른 robust statistic
  • 또는 per-row 평균 (다음 절)

5 Per-Row 평균 방법

5.1 각 customer 별 효과

Buisson 의 권장

각 row 의 individual indirect effect 계산 후 평균:

def per_row_indirect(df, alpha_0, alpha_X, beta_M):
    """각 row 의 indirect effect."""
    df["z"] = alpha_0 + alpha_X * df["X"]
    df["sigma_prime"] = np.exp(-df["z"]) / (1 + np.exp(-df["z"])) ** 2
    df["indirect"] = alpha_X * beta_M * df["sigma_prime"]
    return df["indirect"].mean()


avg_indirect = per_row_indirect(df, alpha_0, alpha_X, beta_M)

장점:

  • Heterogeneity 반영
  • 분포의 진짜 평균
  • Outlier 영향 낮음

단점:

  • 계산 더 복잡
  • 보고할 single value 에 모든 정보 압축
직관 — Per-row 의 가치

비유: 학교 학생들의 키 향상.

  • 평균 키 학생: 1년에 +5 cm
  • 작은 학생: 1년에 +8 cm (catch-up)
  • 큰 학생: 1년에 +2 cm (saturate)

평균 효과:

  • Reference point (평균 키 학생): +5 cm
  • Per-row 평균: 분포 가중 평균 ~ +5 cm (그러나 작은 학생의 큰 효과 반영)

비즈니스 분석:

  • 단순 보고 → reference point
  • 정확한 평균 효과 → per-row
  • Heterogeneous 효과 보고 → per-row + segmentation

6 두 방법의 비교

6.1 C-Mart Binary 사례 — Refund 신청

시나리오

PA → Refund 신청 (Y/N) → Net Revenue.

  • \(X\): PlayArea (binary)
  • \(M\): 환불 신청 여부 (binary)
  • \(Y\): Net Revenue ($)

가설:

  • PA → 만족도 ↑ → 환불 ↓
  • 환불 ↓ → Net Revenue ↑

회귀:

# Stage 1: X → M (logistic)
m_xm = smf.logit("refund ~ play_area", data=df).fit()
alpha_X = m_xm.params["play_area"]  # -0.5

# Stage 2: Y ~ X + M
m_my = smf.ols("net_revenue ~ play_area + refund", data=df).fit()
beta_X = m_my.params["play_area"]  # 5
beta_M = m_my.params["refund"]  # -50

# Reference point
x_mean = df["play_area"].mean()
z_mean = m_xm.params["Intercept"] + alpha_X * x_mean
sigma_prime = np.exp(-z_mean) / (1 + np.exp(-z_mean)) ** 2
indirect_ref = alpha_X * beta_M * sigma_prime
print(f"Reference point indirect: {indirect_ref:.2f}")

# Per-row 평균
df["z"] = m_xm.params["Intercept"] + alpha_X * df["play_area"]
df["sigma_prime"] = np.exp(-df["z"]) / (1 + np.exp(-df["z"])) ** 2
df["indirect"] = alpha_X * beta_M * df["sigma_prime"]
indirect_avg = df["indirect"].mean()
print(f"Per-row average indirect: {indirect_avg:.2f}")
직관 — 두 결과의 차이

가상 결과:

  • Reference point indirect: +6.25 (\(-0.5 \times -50 \times 0.25\))
  • Per-row indirect: +5.80

차이 약 7%. 분포의 skewness 따라 다름.

비즈니스 분석가의 결정:

  • 단순 보고 → Reference point
  • 정밀 분석 → Per-row

Buisson 의 권장: per-row (정확).

7 Bootstrap CI

7.1 Logistic 의 robust 추정

CI 함수
import numpy as np
import statsmodels.formula.api as smf

def bootstrap_binary_mediation(df, B=1000):
    """이항 mediator 의 indirect effect Bootstrap."""
    indirects = []
    for _ in range(B):
        s = df.sample(len(df), replace=True)
        # Logistic X → M
        m_xm = smf.logit("refund ~ play_area", data=s).fit(disp=False)
        # OLS Y ~ X + M
        m_my = smf.ols("net_revenue ~ play_area + refund", data=s).fit()

        alpha_X = m_xm.params["play_area"]
        beta_M = m_my.params["refund"]
        alpha_0 = m_xm.params["Intercept"]

        # Per-row indirect
        z = alpha_0 + alpha_X * s["play_area"]
        sigma_prime = np.exp(-z) / (1 + np.exp(-z)) ** 2
        indirect = (alpha_X * beta_M * sigma_prime).mean()
        indirects.append(indirect)

    return np.percentile(indirects, [5, 95])


ci = bootstrap_binary_mediation(df)
print(f"Indirect Effect 90% CI: {ci}")

가상 결과: [+5.2, +6.5].

→ Indirect effect 의 robust 검증.

8 비즈니스 응용

8.1 마케팅 — 이메일 → Click → Purchase

8.2 시나리오

이메일 (X) → 클릭 (M, binary) → 구매 (Y, $).

분석:

  • Stage 1: Logit(Click ~ Email) → \(\alpha_X\)
  • Stage 2: OLS(Purchase ~ Email + Click) → \(\beta_X, \beta_M\)
  • Indirect: per-row 평균

비즈니스 결정:

  • 클릭률 (M) 의 marginal 효과 측정
  • 클릭 한 customer 의 구매 효과 (β_M)
  • 이메일의 indirect path 정량화

8.3 헬스케어 — 처방 → 복용 → 회복

8.4 시나리오

약 처방 (X) → 복용 여부 (M, binary) → 증상 회복 (Y).

분석:

  • Stage 1: Logit(약 복용 ~ 처방) → 처방의 compliance 효과
  • Stage 2: OLS(회복 ~ 처방 + 복용) → 복용의 회복 효과
  • Indirect: 처방 → 복용 → 회복

CACE 와 유사 구조.

9 종합 — 이항 Mediator 의 default

9.1 분석가의 default

1. Mediator 가 binary 식별
2. Stage 1: Logistic regression (M ~ X)
3. Stage 2: Linear regression (Y ~ X + M)
4. Indirect 계산:
   a. Per-row 권장 (정확)
   b. 또는 Reference point (단순)
5. Bootstrap CI
6. PM 계산 + 보고

이 워크플로가 표준.

10 관련 주제

Subscribe

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