1 정의
Moderation 의 두 형태 (수학적으로 동일한 interaction term, 다른 비즈니스 의미):
Symmetric Interaction:
X1 * X2 (같은 type 의 두 변수)
예: PlayArea × LoungeArea (두 비즈니스 정책)
Self-Moderation (Nonlinearity):
X * X (같은 변수의 자기 interaction)
예: Emails² (감소 효과)
수식 (둘 다 같은 형태):
\[ Y = \beta_0 + \beta_1 X_1 + \beta_2 X_2 + \beta_i (X_1 \cdot X_2) + \epsilon \]
차이는 변수 type 과 비즈니스 해석.
분석가의 시각:
| 형태 | 통계 도구 | 비즈니스 의미 |
|---|---|---|
| Segmentation | \(X \times M\) | 누구에게? (개인화) |
| Interaction | \(X_1 \times X_2\) | 함께 시너지? (정책 결합) |
| Nonlinearity | \(X \times X\) | 효과 변화? (regime change) |
같은 회귀 도구, 다른 의사결정.
→ 분석가가 변수 type 인식 + 적절한 framing.
2 Symmetric Interaction — 시너지와 substitution
2.1 PlayArea × LoungeArea 사례
C-Mart 의 두 정책:
- PlayArea: 자녀 동반 customer 의 visit 시간 ↑
- LoungeArea: 자녀 없는 customer 의 visit 시간 ↑
가설:
- 두 정책 결합 시 시너지 — 한 customer 가 두 곳 모두 활용 (자녀가 PlayArea + 부모는 LoungeArea)
수식:
\[ \text{Duration} = \beta_0 + \beta_P \cdot P + \beta_L \cdot L + \beta_i \cdot (P \cdot L) \]
\(\beta_i > 0\): 시너지 (1+1 > 2). \(\beta_i = 0\): 독립 (1+1 = 2). \(\beta_i < 0\): substitution (1+1 < 2).
비유: 음식 조합.
- 빵 단독: +5 만족
- 잼 단독: +3 만족
- 빵 + 잼: +12 만족 (시너지: \(\beta_i = +4\))
- 빵 + 빵: +6 만족 (substitution: \(\beta_i = -4\), 같은 카테고리)
비즈니스 정책:
- PlayArea + LoungeArea = 시너지 → 둘 다 설치 우선
- PlayArea + KidsZone = substitution → 둘 중 하나만
이게 interaction 의 비즈니스 가치.
2.2 CD 표현
PlayArea ─────→
╲
↘
→ VisitDuration
↗
╱
LoungeArea ──→
두 화살표가 합쳐져서 outcome 으로. 어느 쪽이 moderator 인지 asymmetry 없음.
→ Symmetric interaction.
비교:
- Segmentation (asymmetric): “Children 이 PlayArea 의 효과를 modify”
- Children 이 moderator (개인 특성)
- Interaction (symmetric): “PlayArea 와 LoungeArea 가 함께 시너지”
- 둘 다 비즈니스 정책, 어느 쪽이 main 인지 모호
수학적으로:
\[ P \cdot L = L \cdot P \]
같은 식. 그러나 비즈니스 의사결정의 framing 다름.
→ CD 표기가 framing 강조 도구.
2.3 ML 과의 연결
Buisson 의 통찰:
“Random Forest, XGBoost, Neural Network 의 power 가 interaction 자동 캡처에서 옴.”
이유:
- Tree 기반 ML: 각 split 이 interaction 가능
- Neural Network: hidden layer 가 interaction 학습
- 회귀: interaction 명시 추가 필요
회귀 vs ML:
| 측면 | 회귀 (with interaction) | ML |
|---|---|---|
| Interpretability | High | Low |
| Interaction capture | Manual | Automatic |
| Causal inference | Possible | Difficult |
| Prediction | OK | Better |
비즈니스 분석에서:
- 의사결정 도구 → 회귀 (interaction 명시)
- 단순 prediction → ML
- Hybrid: ML 로 interaction discover → 회귀로 검증
→ 두 도구의 보완적 사용.
3 Nonlinearity — Self-Moderation
3.1 Decreasing Returns (감소 효과)
Emails/month Avg Purchases
1 0.5
3 1.2
5 1.6
7 1.9
10 2.0
15 1.95 (오히려 감소!)
Decreasing returns:
- 첫 1~3 emails: 큰 효과
- 5~10 emails: 점차 감소
- 10+ emails: 거의 효과 없음
- 15+ emails: annoying → 부정 효과
수식 (quadratic):
\[ \text{Purchases} = \beta_0 + \beta_1 \cdot E + \beta_2 \cdot E^2 \]
\(\beta_1 > 0, \beta_2 < 0\) → concave (감소 효과).
비유: 밥 한 그릇.
- 첫 숟가락: 매우 만족
- 다섯째 숟가락: 만족
- 열째 숟가락: 무관
- 열다섯째 숟가락: 부담
각 숟가락의 marginal utility 가 점차 감소.
비즈니스에서 이 pattern 흔함:
- Marketing 빈도
- 가격 인하 (할인 폭)
- 광고 노출 횟수
- 영업 사원 방문 빈도
→ Quadratic term 으로 모델링. Optimal point 식별 가능.
3.2 Increasing Returns (증가 효과)
스타트업의 흔한 패턴:
Users Value per user
100 $1
1,000 $5
10,000 $20
100,000 $80
Network effect:
- 사용자 ↑ → platform 가치 ↑ → 더 많은 사용자
수식:
\[ \text{Value} = \beta_0 + \beta_1 \cdot N + \beta_2 \cdot N^2 \]
\(\beta_1 > 0, \beta_2 > 0\) → convex (증가 효과).
비유: AirBnB 같은 platform.
- Property 100 개: 사용자 별 적은 선택
- Property 10,000 개: 풍부한 선택
- Property 1M 개: 모든 도시 cover
Property 추가의 marginal value 가 증가.
비즈니스에서 increasing returns:
- 양면 시장 (marketplace)
- Social network
- Communication tool (Metcalfe’s Law)
→ Quadratic 의 부호로 구분. 비즈니스 strategy 직접 영향.
4 Linear Regression 의 정확한 정의
4.1 “Linear” 의 의미
오해: “Quadratic = Nonlinear regression.”
정확한 정의:
“Linear regression 은 계수 (coefficients) 에 대해 linear.”
수식:
- Linear in coefficients: \(Y = \beta_1 X + \beta_2 X^2\)
- \(\beta_1, \beta_2\) 에 대해 linear
- 표준 OLS 로 적합 가능
- Nonlinear in coefficients: \(Y = e^{\beta_1 X}\)
- \(\beta_1\) 에 대해 nonlinear
- Nonlinear regression 필요
→ Quadratic, polynomial, log transform 등 모두 linear regression 의 영역.
Linear regression 으로 가능:
- \(Y = \beta_0 + \beta_1 X\)
- \(Y = \beta_0 + \beta_1 X + \beta_2 X^2\)
- \(Y = \beta_0 + \beta_1 \log(X)\)
- \(Y = \beta_0 + \beta_1 \exp(X)\)
- \(Y = \beta_0 + \beta_1 X_1 + \beta_2 X_2 + \beta_i (X_1 X_2)\)
모두 OLS 로 적합. Coefficients 에 대해 linear.
진정한 nonlinear:
- \(Y = e^{\beta_1 X}\)
- \(Y = \beta_0 / (1 + \beta_1 X)\)
- \(Y = \beta_0 \cdot X^{\beta_1}\)
이런 모형은 nonlinear regression (scipy.optimize.curve_fit 등).
→ 분석가가 “nonlinear relationship” 의 의미 정확히 인지.
5 Quadratic Regression 의 코드
5.1 R / Python
R:
Python:
I() (Identity function) 의 역할:
- Formula 의 일부분을 그대로 전달
- 회귀 algorithm 이 misinterpret 안 하도록
R 의 ^, Python 의 ** 가 다름. Identity 안에서:
- R:
I(Emails^2)→ \(X^2\) - Python:
I(Emails ** 2)→ \(X^2\)
R 에서 Emails^2 만 쓰면:
Emails^2이 model formula 의 special operator (interaction)- 잘못 interpret
Python 에서 Emails ** 2:
- 같은 위험
→ 항상 I() 안에 사용. 안전하게.
5.2 결과 해석
가상 결과:
Estimate
(Intercept) 0.50
Emails 0.30
I(Emails ** 2) -0.02
해석:
- Intercept: email 0 일 때 baseline (0.5 purchases)
- Emails: marginal effect at email = 0
- I(Emails²): “감소 속도”
전체 model:
\[ \text{Purchases} = 0.5 + 0.3 \cdot E - 0.02 \cdot E^2 \]
각 email 의 marginal effect:
\[ \frac{d \text{Purchases}}{d E} = 0.3 - 0.04 \cdot E \]
값별:
- E = 0: marginal = 0.30 (첫 email 에 큰 효과)
- E = 5: marginal = 0.10 (감소)
- E = 7.5: marginal = 0 (peak)
- E = 10: marginal = -0.10 (negative!)
- E = 15: marginal = -0.30 (큰 negative)
해석:
- 7.5 emails 까지는 추가 가치
- 그 이후는 negative ROI
→ Marginal effect plot 이 의사결정의 핵심 도구.
6 Optimal Point 도출
6.1 1 차 미분
Quadratic function:
\[ f(E) = \beta_0 + \beta_1 E + \beta_2 E^2 \]
1 차 미분 = 0:
\[ f'(E) = \beta_1 + 2 \beta_2 E = 0 \]
\[ E^* = -\frac{\beta_1}{2 \beta_2} \]
조건:
- \(\beta_2 < 0\) (concave): \(E^*\) 가 maximum
- \(\beta_2 > 0\) (convex): \(E^*\) 가 minimum (피해야 할 점)
가상 사례: \(\beta_1 = 0.30, \beta_2 = -0.02\).
\(E^* = -0.30 / (2 \times -0.02) = 7.5\).
→ 1 개월 7~8 emails 가 optimal.
Optimal email 빈도:
- 7.5 emails/month 가 매출 최대
- 그보다 적으면 sub-optimal (추가 email 가치 있음)
- 그보다 많으면 negative ROI
비즈니스 결정:
- 현재 5 emails → 7~8 로 늘리기
- 현재 12 emails → 7~8 로 줄이기
이 결정이 quadratic 의 직접 산출물.
6.2 Optimal 의 confidence interval
\(E^* = -\beta_1 / (2 \beta_2)\) 의 추정 = \(\hat{\beta}_1\) 과 \(\hat{\beta}_2\) 의 ratio.
Ratio 의 분포 = 비선형 → 표준 SE 부정확.
해결: Bootstrap.
import numpy as np
def bootstrap_optimal(df, B=1000):
optimals = []
for _ in range(B):
sample = df.sample(len(df), replace=True)
m = smf.ols("Purchases ~ Emails + I(Emails ** 2)", data=sample).fit()
b1 = m.params["Emails"]
b2 = m.params["I(Emails ** 2)"]
if b2 < 0:
optimal = -b1 / (2 * b2)
optimals.append(optimal)
return np.percentile(optimals, [2.5, 97.5])
ci = bootstrap_optimal(df_email)
print(f"Optimal email frequency 95% CI: {ci}")가상 결과:
- Optimal point 추정: 7.5
- 95% CI: [6.2, 8.8]
해석:
- Optimal 이 6~9 사이
- 정확한 값은 sampling 잡음
- 7~8 emails 가 안전한 권장
비즈니스 의사결정:
- 7 emails 로 시작
- 결과 monitoring 후 8 emails 로 조정
- CI 넓으면 더 많은 데이터 수집
→ Bootstrap 이 불확실성 정량화.
8 When to Look for Moderation
8.1 Average Effect 우선 vs Moderation 우선
8.2 함정: Moderation 을 너무 빨리 찾기
분석가의 흔한 실수:
“전체 효과가 0 인데 30 세 남자 + Kansas + 화요일 응답자 만 +50%!”
문제:
- Moderation = second-order effect
- Power 가 main effect 보다 매우 낮음 (10~20 배 더 큰 sample 필요)
- False positive 위험 큼
- P-hacking 함정
8.3 Buisson 의 권장
1. 1 차 실험: Average effect 측정 (moderation 없음)
2. 결과 분석: Subgroup 의 patterns 점검 (탐색)
3. 2 차 실험: Promising moderator 의 정식 검증
- Power 더 큰 sample
- Pre-registered hypothesis
이 단계별 접근이:
- False positive 줄임
- 자원 효율적 사용
- 정확한 결론
비즈니스 분석에서 표준.
8.4 직관 — Confirmation 우선
분석가의 default:
- 첫 실험: “이 treatment 가 평균적으로 효과 있는가?”
- 효과 있음 + budget 남음: “어느 segment 에 큰 효과?”
- 효과 없음: 다음 단계 안 감
Discovery (탐색적 segmentation) 보다 Confirmation (사전 가설 검증) 우선.
→ 분석가의 신뢰성 보호.
8.5 Sanity Check
8.6 표준편차 비교
Moderation 의 빠른 sanity check:
만약 표준편차가 그룹 간 매우 다름:
- 그룹 내 heterogeneity 다름
- Moderation 가능성 ↑
같으면:
- Moderation 가능성 ↓ (그러나 단순 진단)
8.7 직관 — 표준편차의 의미
비유: 운동의 효과.
- Group A (운동 안 함): 평균 60 kg, std 5 kg
- Group B (운동): 평균 55 kg, std 12 kg
Group B 의 std 가 매우 큼 → 일부는 큰 효과 (-15 kg), 일부는 작음 (-1 kg) → moderation 가능성.
분석가의 다음 단계:
- 어떤 변수가 효과 차이 설명? (age? gender? baseline weight?)
- Moderation 회귀로 정량화
9 Upper Bound on Moderation
9.1 Moderation 의 수학적 한계
평균 효과가 5%p 일 때 한 segment 의 최대 효과:
\[ \text{Max effect}_{\text{segment}} = \frac{\text{Avg effect}}{\text{Proportion of segment}} \]
예:
- 평균 5%p, segment 가 50% 인구 → 최대 10%p (다른 segment 0%)
- 평균 5%p, segment 가 10% 인구 → 최대 50%p (다른 segment 0%)
작은 segment 일수록 큰 효과 가능.
그러나:
- “무한히 작은 segment 에서 무한히 큰 효과” — 위험 (false discovery)
- 큰 segment 에서 큰 효과 → 더 robust
→ 분석가의 default: large segment 의 moderation 우선.
9.2 직관 — Mediocre Average 의 함정
“Average effect 는 거의 0 인데, 일부 segment 에서 큰 효과 발견.”
이런 결과의 해석:
- 평균 0 = 일부 positive + 일부 negative cancel
- “Positive segment 에 적용 + negative segment 회피” → ROI ↑?
- 가능하지만 follow-up 실험으로 검증 필수
Buisson 의 경고:
“Moderation cannot save a mediocre average effect.”
작은 average 효과는 보통 진짜 작은 효과. Subgroup 의 큰 효과는 종종 sampling noise.
→ Average effect 가 promising 하지 않으면 moderation 도 promising 안 함.
10 코드 예시 — 종합
10.1 Quadratic + Optimal
import numpy as np
import pandas as pd
import statsmodels.formula.api as smf
import matplotlib.pyplot as plt
# 가상 email 데이터
np.random.seed(42)
n = 5000
df = pd.DataFrame({
"emails": np.random.uniform(0, 15, n),
})
# True quadratic
beta_0 = 0.5
beta_1 = 0.3
beta_2 = -0.02
df["purchases"] = (
beta_0 + beta_1 * df["emails"] + beta_2 * df["emails"] ** 2
+ np.random.normal(0, 0.5, n)
)
# Linear vs Quadratic
m_linear = smf.ols("purchases ~ emails", data=df).fit()
m_quad = smf.ols("purchases ~ emails + I(emails ** 2)", data=df).fit()
print(f"Linear R²: {m_linear.rsquared:.4f}")
print(f"Quadratic R²: {m_quad.rsquared:.4f}")
# Optimal
b1 = m_quad.params["emails"]
b2 = m_quad.params["I(emails ** 2)"]
optimal = -b1 / (2 * b2)
print(f"\nOptimal emails: {optimal:.2f}")10.2 직관 — R² 비교
예상:
- Linear R²: 0.50 (부분 fit)
- Quadratic R²: 0.85 (좋은 fit)
R² 큰 차이 → quadratic 이 데이터 더 잘 설명.
Linear 만 사용 시:
- Optimal point 식별 못 함
- Marginal effect = constant (잘못)
Quadratic 사용 시:
- Optimal 명확
- Marginal effect = decreasing
- 의사결정 정확
10.3 Marginal Effect Plot
fig, axes = plt.subplots(1, 2, figsize=(12, 5))
# Plot 1: Predicted purchases
emails_grid = np.linspace(0, 15, 100)
linear_pred = m_linear.params["Intercept"] + m_linear.params["emails"] * emails_grid
quad_pred = (
m_quad.params["Intercept"]
+ m_quad.params["emails"] * emails_grid
+ m_quad.params["I(emails ** 2)"] * emails_grid ** 2
)
axes[0].scatter(df["emails"], df["purchases"], alpha=0.1, label="Data")
axes[0].plot(emails_grid, linear_pred, "r--", label="Linear")
axes[0].plot(emails_grid, quad_pred, "g-", label="Quadratic")
axes[0].axvline(optimal, linestyle=":", color="blue", label=f"Optimal = {optimal:.2f}")
axes[0].set_xlabel("Emails")
axes[0].set_ylabel("Purchases")
axes[0].set_title("Linear vs Quadratic Fit")
axes[0].legend()
# Plot 2: Marginal effect
marginal = b1 + 2 * b2 * emails_grid
axes[1].plot(emails_grid, marginal, "g-")
axes[1].axhline(0, linestyle=":", color="red", label="Zero marginal")
axes[1].axvline(optimal, linestyle=":", color="blue", label=f"Optimal = {optimal:.2f}")
axes[1].set_xlabel("Emails")
axes[1].set_ylabel("Marginal Effect")
axes[1].set_title("Marginal Effect of Each Email")
axes[1].legend()
plt.tight_layout()
plt.savefig("quad_marginal.png", dpi=80)
plt.show()10.4 직관 — 시각화의 가치
두 plot 이 비즈니스 파트너에게:
- Predicted purchases: Quadratic 의 dome 모양, Linear 의 straight line 비교
- Marginal effect: 각 추가 email 의 가치, 0 횡단점
비즈니스 결정 도구:
- “현재 5 emails. Marginal = 0.10. 추가 가치 있음.”
- “10 emails 면 Marginal = -0.10. 손해.”
- “7~8 이 최적.”
→ 시각화가 의사결정의 직접 communication.
10.5 Symmetric Interaction
# PlayArea × LoungeArea
np.random.seed(42)
n = 5000
df_int = pd.DataFrame({
"play_area": np.random.binomial(1, 0.4, n),
"lounge_area": np.random.binomial(1, 0.4, n),
})
beta_0 = 20
beta_p = 5
beta_l = 4
beta_i = 8 # 시너지
df_int["duration"] = (
beta_0
+ beta_p * df_int["play_area"]
+ beta_l * df_int["lounge_area"]
+ beta_i * df_int["play_area"] * df_int["lounge_area"]
+ np.random.normal(0, 5, n)
)
m_int = smf.ols("duration ~ play_area * lounge_area", data=df_int).fit()
print(m_int.summary().tables[1])
# 4 시나리오 평균
print("\n=== 4 시나리오 평균 ===")
for p in [0, 1]:
for l in [0, 1]:
mean = df_int[(df_int["play_area"] == p) & (df_int["lounge_area"] == l)]["duration"].mean()
print(f" PA={p}, LA={l}: {mean:.2f}")10.6 직관 — 시너지의 정량화
예상 결과:
4 시나리오 평균:
PA=0, LA=0: 20.0
PA=0, LA=1: 24.0 (+4 from LA)
PA=1, LA=0: 25.0 (+5 from PA)
PA=1, LA=1: 37.0 (+17 from both, expected 4+5=9, synergy +8)
Synergy 의 비즈니스 의미:
- 두 정책 결합: 17 분 추가 (5 + 4 + 8)
- 단순 합 (5+4=9) 보다 8 분 더 — synergy
- 두 정책 모두 설치 권장 (각각보다 큰 ROI)
→ Symmetric interaction 의 직접 의사결정.
11 종합 — 분석가의 결정 트리
11.1 Interaction / Nonlinearity 의 사용
1. Symmetric Interaction (X1 × X2):
- 두 비즈니스 정책의 시너지 측정
- 결합 정책 vs 단독 정책 결정
- 시너지 (β_i > 0) → 결합
- Substitution (β_i < 0) → 단독
2. Nonlinearity (X²):
- Decreasing/Increasing returns 모델링
- Optimal point 식별
- Linear regression 의 영역 (오해 금지)
3. Hidden Moderator 의 진단:
- Self-moderation 발견 시 행동 근거 점검
- 근거 약하면 hidden 변수 가설
- 변수 추가 후 self-moderation 사라지나 점검
4. Bootstrap CI:
- Optimal point 의 불확실성
- Interaction term 의 robustness
5. Average Effect 우선:
- 1 차 실험: average
- 2 차 실험: moderation
- Discovery 보다 Confirmation
이 워크플로가 interaction/nonlinearity 의 표준.
12 관련 주제
12.1 Ch.11 의 형제 글
- E-BUI11-0 Moderation overview — Ch.11 전체 흐름
- E-BUI11-1 세분화 분석 — Segmentation 자세히
- E-BUI11-3 다중 조절 변수와 부트스트랩 — 다중 moderator + Bootstrap
12.2 이전 챕터
- E-BUI3-2 체인과 포크 구조 — Mediator 와의 차이
12.3 후속 챕터
- E-BUI12-0 Mediation·IV overview — Ch.12: Mediation
12.4 카테고리 진입점
- Experimentation 학습 로드맵 — 11 Phase × 7 교재 매핑