체인과 포크 — 매개와 공통 원인의 두 기본 구조 (Buisson Ch.3.2)

Chain (사슬) 과 Fork (포크) 의 구조·해석·축약·확장과 데이터 분석에서의 역할

Buisson (2021) Ch.3 의 두 번째 절을 정리한다. 인과 다이어그램의 두 기본 구조 — Chain (사슬) 과 Fork (포크) — 을 정의하고, 각 구조의 회귀 매핑·축약/확장·데이터 분석에서의 함의를 다룬다. C-Mart 의 Temperature → IcedCoffee → Donut, 아이스크림과 아이스커피의 공통 원인 (Temperature) 사례, 인구통계 변수의 fork 역할로 직관화한다.

Experimentation
Causal Inference
저자

Kwangmin Kim

공개

2026년 05월 08일

1 정의

정의: Chain (사슬) 과 Fork (포크)

세 변수를 잇는 인과 다이어그램의 두 기본 구조 (Buisson, 2021, Ch.3).

Chain (사슬): 화살표가 같은 방향으로 흐름.

A ──→ B ──→ Y

B 는 A 와 Y 의 매개 변수 (mediator).

Fork (포크): 한 변수가 두 변수의 공통 원인.

        L
       ╱ ╲
      ╱   ╲
     A     Y

L 은 A 와 Y 의 공통 원인 (common cause / confounder).

직관 — 두 구조의 본질적 차이

Chain 과 Fork 는 외형상 비슷해 보일 수 있지만 (둘 다 화살표 2개로 세 변수 연결), 화살표의 방향이 결정적으로 다르다.

구조 화살표 방향 의미
Chain 한 방향으로 흐름 “전달” — A 의 영향이 B 를 거쳐 Y 로
Fork 한 점에서 갈라짐 “공유” — L 의 영향이 A, Y 에 동시에

비유:

  • Chain: 도미노 — 첫 도미노가 둘째를 넘어뜨리고, 둘째가 셋째를 넘어뜨림
  • Fork: 분수 — 한 펌프가 두 분수에 물을 동시에 보냄. 두 분수는 직접 연결 없음

→ 같은 데이터 패턴 (A 와 Y 의 양의 상관) 이라도, 어느 구조인지에 따라 분석·의사결정이 정반대.

2 Chain — 매개의 구조

2.1 형식 정의

Chain 의 친족 관계
Temperature ──→ IcedCoffeeSales ──→ DonutSales

C-Mart 사례 — 기온이 아이스커피 매출에 영향을 주고, 아이스커피 매출이 도넛 매출에 영향을 줌 (예: 아이스커피 산 사람이 도넛도 사는 패턴).

용어:

  • Parent (부모): 화살표가 출발하는 노드 (Temperature 는 IcedCoffee 의 parent)
  • Child (자식): 화살표가 도착하는 노드 (IcedCoffee 는 Temperature 의 child)
  • Direct relationship (직접 관계): 화살표 1개로 연결 (Temperature → IcedCoffee)
  • Indirect relationship (간접 관계): 중간 변수를 거침 (Temperature ⇒ DonutSales 간접)
  • Ancestor / Descendant: 직접·간접 부모·자식의 일반화 (Temperature 는 DonutSales 의 ancestor)
  • Mediator (매개 변수): 한 chain 에서 양 끝 변수의 영향을 전달하는 중간 변수 (IcedCoffeeSales)
직관 — Chain 의 일상 예시

비즈니스 사례:

TVAd ──→ BrandAwareness ──→ Purchase
  • TV 광고가 직접 구매를 유발하는 게 아니다.
  • TV 광고 → 브랜드 인지도 향상 → 인지도가 구매로 이어짐.
  • BrandAwareness 가 매개.

일상 사례:

Rain ──→ WetGround ──→ SlipFall
  • 비가 직접 사람을 미끄러뜨리는 게 아니다.
  • 비 → 땅이 젖음 → 젖은 땅에서 미끄러져 넘어짐.
  • WetGround 가 매개.

물리 사례:

SunHeating ──→ AirTemperature ──→ IceMelting
  • 햇볕이 직접 얼음을 녹이는 것보다는, 햇볕이 공기 온도를 올려서 그 공기가 얼음을 녹임.
  • AirTemperature 가 매개.

→ Chain 은 실제로는 인과 메커니즘의 단계 를 표현한다. “A 가 Y 의 원인” 이라고 말할 때, 실제로는 항상 어떤 매개를 거친다 — 단지 우리가 그 매개를 명시할지 말지의 문제.

2.2 Chain 과 회귀 매핑

회귀식 도출

Chain 의 각 화살표를 회귀로:

\[ \text{IcedCoffeeSales} = \beta_T \cdot \text{Temperature} + \varepsilon_1 \]

\[ \text{DonutSales} = \beta_I \cdot \text{IcedCoffeeSales} + \varepsilon_2 \]

Chain 전체의 의미: Temperature 의 변화가 IcedCoffeeSales 를 거쳐 DonutSales 로 전파.

2.3 Chain Collapsing — 사슬 축약

정의 + 도출

위 두 식을 합치면:

\[ \text{DonutSales} = \beta_I \cdot (\beta_T \cdot \text{Temperature} + \varepsilon_1) + \varepsilon_2 = (\beta_I \cdot \beta_T) \cdot \text{Temperature} + (\beta_I \varepsilon_1 + \varepsilon_2) \]

새로운 단일 계수 \(\tilde{\beta}_T = \beta_I \cdot \beta_T\) 를 정의하면:

\[ \text{DonutSales} = \tilde{\beta}_T \cdot \text{Temperature} + \tilde{\varepsilon} \]

이 식의 CD:

Temperature ──→ DonutSales

체인이 축약 (collapsed) 됨. 중간 변수 (IcedCoffeeSales) 가 제거되고 직접 화살표.

직관 — 체인을 왜 축약하는가

축약이 필요한 상황:

  1. 재고 계획: “기온이 오를 때 도넛을 얼마나 더 준비해야 하나” 가 비즈니스 질문.
    • 매개 단계 (아이스커피) 의 메커니즘은 부차적
    • 직접 관계 (\(\tilde{\beta}_T\)) 만 알면 됨
  2. 의사결정 단순화: 회의에서 비즈니스 파트너에게 설명할 때 매개를 일일이 언급하면 복잡.
  3. 모형 단순화: 매개의 데이터가 부족하거나 noise 가 많을 때 직접 모형이 더 안정.

→ 축약은 실용적 단순화. 메커니즘을 모른다는 의미 아님.

2.4 Chain Expanding — 사슬 확장

정의

축약의 역. 직접 관계 사이에 매개 변수를 명시적으로 끼워 넣음.

Temperature ──→ DonutSales
       ↓ (확장)
Temperature ──→ IcedCoffeeSales ──→ DonutSales
직관 — 사슬 확장이 분석을 구원하는 사례

상황: 기온이 올랐는데 도넛 매출이 안 올랐다.

축약된 CD (Temperature → DonutSales) 만 보면:

“이상하다. \(\tilde{\beta}_T\) 가 이전엔 양수였는데 지금은 0?”

→ 진단 어려움. CD 가 너무 단순해서 어디가 부서진지 모름.

확장한 CD (Temperature → IcedCoffeeSales → DonutSales) 로 보면:

“기온이 올랐는데 아이스커피 매출이 안 올랐는가?

Yes — 매니저가 에어컨을 강하게 틀어서 가게 안이 너무 시원해서 아이스커피 수요 안 늘어남

No — 아이스커피는 늘었는데 도넛만 안 늘었다 → 새 메뉴 (쿠키) 가 도넛을 대체”

→ 두 시나리오의 처방이 다르다 (에어컨 끄기 vs 쿠키 가격 인상).

확장된 CD 만이 진단을 가능하게 한다. 매개를 분석하면 의사결정의 정밀도가 올라간다.

축약·확장의 임의성

같은 인과 구조를 축약 / 확장된 CD 로 표현 가능. 둘 다 “맞는” CD.

분석가의 선택:

  • 축약: 비즈니스 질문이 양 끝 관계만 다룸
  • 확장: 메커니즘 진단·의사결정 정밀도 필요

이 임의성은 약점이 아니라 강점. CD 가 분석 목적에 맞춰 유연하게 변신.

2.5 Mediator 통제의 역설

Mediator 를 회귀에 포함하면?

Chain Temperature → IcedCoffeeSales → DonutSales 에서 다음 회귀를 돌리면:

\[ \text{DonutSales} = \beta_T \cdot \text{Temperature} + \beta_I \cdot \text{IcedCoffeeSales} + \varepsilon \]

이 식에서 \(\beta_T\) 는 무엇을 추정하는가?

답: IcedCoffeeSales 를 고정한 상태에서 Temperature 의 직접 효과.

Chain 에서 Temperature → DonutSales 직접 경로가 없으므로, IcedCoffeeSales 통제 시 \(\beta_T \approx 0\).

→ “기온은 도넛 매출에 효과 없음” 이라는 잘못된 결론으로 이어질 수 있음.

진짜 질문은 “기온이 도넛 매출의 원인인가” 인데, mediator 통제로 인해 효과가 사라짐 (over-adjustment).

직관 — 언제 Mediator 를 통제하나
분석 목적 Mediator 통제
총 효과 (Total Effect) — Temperature 가 DonutSales 에 미치는 모든 경로의 영향 통제 안 함 — Temperature 만 회귀에
직접 효과 (Direct Effect) — IcedCoffee 를 거치지 않는 경로의 영향 (이 CD 에선 0) 통제 — IcedCoffee 를 회귀에
간접 효과 (Indirect Effect) — IcedCoffee 를 통한 경로의 영향 mediation 분석 (Ch.12)

비즈니스 일반: 보통 총 효과를 알고 싶음 (mediator 통제 안 함). 연구 일반: 메커니즘이 궁금하면 mediation 분석.

이 결정은 CD 가 명확해야 가능. CD 없이 회귀 변수를 임의로 추가하면 over-adjustment 함정.

3 Fork — 공통 원인의 구조

3.1 형식 정의

Fork

C-Mart 사례:

        Temperature
           ╱ ╲
          ╱   ╲
   IcedCoffee  IceCream
     Sales      Sales
  • Temperature 는 IcedCoffeeSales 와 IceCreamSales 양쪽의 원인
  • IcedCoffeeSales 와 IceCreamSales 사이엔 인과 관계 없음
  • 그러나 데이터에서는 양의 상관이 보임 (둘 다 더운 날 잘 팔림)
직관 — Fork 가 만드는 가짜 상관

상상해 보자. 다음 데이터:

Day Temperature IcedCoffee IceCream
1 30°C $1000 $1500
2 15°C $400 $300
3 25°C $800 $1100
4 10°C $200 $200
5 28°C $900 $1300

IcedCoffee 와 IceCream 의 상관 계수 = 0.95 (강한 양의 상관).

순진한 분석가의 결론: “아이스커피와 아이스크림 사이 강한 인과 관계.”

틀림. 둘 다 Temperature 의 결과일 뿐. 인과 관계 0.

증거: 만약 C-Mart 가 아이스커피 재고가 떨어져 매출 0 이 되어도, 아이스크림 매출은 변하지 않음. 두 변수가 인과로 연결되지 않음.

이게 Fork 가 데이터 분석의 “악의 근원” 으로 불리는 이유. 가짜 상관을 무수히 만들어냄.

3.2 Fork 와 회귀 매핑

회귀식
        Temperature
           ╱ ╲
          ╱   ╲
   IcedCoffee  IceCream

각 화살표를 회귀로:

\[ \text{IcedCoffee} = \beta_T^{\text{IC}} \cdot \text{Temperature} + \varepsilon_1 \]

\[ \text{IceCream} = \beta_T^{\text{ICr}} \cdot \text{Temperature} + \varepsilon_2 \]

두 변수 사이 직접 회귀 (no Temperature) 를 돌리면:

\[ \text{IceCream} = \alpha \cdot \text{IcedCoffee} + \varepsilon_{\text{naive}} \]

여기서 \(\alpha\) 는 0 이 아니라 양의 값. 그러나 이 \(\alpha\)인과 효과 아님 — 두 변수의 공유된 원인 (Temperature) 으로 인한 가짜 상관.

3.3 Confounding Bias — Fork 의 통계적 결과

Fork 가 confounder 를 만든다

용어:

  • Confounder (교란 변수): 처치 (treatment, A) 와 결과 (outcome, Y) 의 공통 원인 (L).
  • Confounding bias (교란 편향): confounder 를 통제하지 않을 때 A → Y 의 인과 효과 추정에 발생하는 편향.

Fork 가 confounder 를 만든다.

        L (confounder)
       ╱ ╲
      A   Y

A → Y 의 인과 효과를 추정하려고 회귀 \(Y = \alpha A\) 을 돌리면:

  • \(\alpha\) = (진짜 인과 효과) + (L 을 통한 가짜 상관)
  • 진짜 인과 효과가 0 이어도 \(\alpha \neq 0\) 가능
  • 진짜 인과 효과가 양수인데 L 의 효과로 인해 \(\alpha\) 가 음수로 보일 수도 있음 (Simpson’s paradox)
직관 — Confounder 의 처방

Confounder 의 해독제: 회귀에 confounder 포함.

\[Y = \beta_A \cdot A + \beta_L \cdot L + \varepsilon\]

이 식에서 \(\beta_A\) 는 “L 을 고정한 상태에서 A 가 Y 에 미치는 효과” — 이게 진짜 인과 효과의 추정.

C-Mart 예:

\[\text{IceCream} = \beta_{\text{IC}} \cdot \text{IcedCoffee} + \beta_T \cdot \text{Temperature} + \varepsilon\]

이때 \(\beta_{\text{IC}} \approx 0\) (가짜 상관 제거됨). \(\beta_T\) 는 양수 (Temperature 의 진짜 효과).

→ Fork 의 공통 원인을 회귀에 넣으면 가짜 상관 제거.

직관 — Buisson 의 명언

“Forks are one of the main roots of evil in the world of data analysis.”

번역: “포크는 데이터 분석 세계에서 악의 주요 근원 중 하나다.”

이유: 우리가 데이터에서 발견하는 상관의 대부분 은 직접 인과가 아니라 공통 원인 (fork) 의 결과.

비즈니스 분석에서 새로운 패턴을 발견했을 때 첫 질문:

“이 두 변수의 공통 원인은 무엇일 수 있는가?”

이 질문을 안 하면 잘못된 인과 결론으로 이어진다.

3.4 인구통계 변수 — Fork 의 가장 흔한 형태

직관 — Demographics 가 Fork 의 뿌리
        Age
       ╱ | ╲
      ╱  |  ╲
    A1  A2  A3

Age 가 수많은 변수의 공통 원인:

  • A1 = 디지털 기기 사용량
  • A2 = 소셜미디어 활동
  • A3 = 구매력
  • A4 = 건강 상태

비즈니스 분석에서 어떤 두 변수 사이 상관을 발견했을 때:

“두 변수가 공통적으로 Age 에 의존하지 않는가?”

거의 항상 답은 “Yes”. 따라서 Age 를 confounder 로 통제하지 않은 분석은 의심해야.

같은 논리가 Gender, Region, Income 등 인구통계 전체에 적용. 이게 demographic adjustment 가 비즈니스 분석의 표준 절차인 이유.

3.5 두갈래 화살표 (Two-Headed Arrow)

미지의 공통 원인 표기

때로 분석가는 두 변수가 상관되어 있음을 알지만 공통 원인의 정체를 모를 때가 있다. 이 경우 양방향 화살표 를 사용.

A ←──→ B

이 표기가 의미하는 것:

  1. A 가 B 의 원인일 수도 있고
  2. B 가 A 의 원인일 수도 있고
  3. 둘의 공통 원인이 있을 수도 있음 (정체 불명)

→ “여기에 인과 구조가 있는데, 정확한 형태는 미해결” 이라는 명시적 표현.

직관 — Two-Headed Arrow 는 솔직함의 표현

분석가가 마주치는 흔한 상황:

“A 와 B 사이 강한 상관이 있다. 그러나 도메인 지식이 부족해서 어느 게 원인인지 모르겠다.”

잘못된 처방: A → B 또는 B → A 를 임의로 선택해서 그림. 분석가의 짐작이 가설로 굳어짐.

좋은 처방: A ↔︎ B (양방향) 으로 그림. 분석가가 모른다는 사실 자체가 명시.

이 표기 덕분에:

  • 다른 분석가·도메인 전문가가 그 부분에 의견 제시 가능
  • 추가 데이터·실험으로 방향 확정할 우선순위 부여
  • 분석 결과가 그 방향에 의존하면 명시적으로 한계 보고

→ CD 의 정직함이 분석의 신뢰를 높임.

4 Chain + Fork — 결합된 구조

C-Mart 의 더 복잡한 사례
   SummerMonth ──→ Temperature ──→ IcedCoffeeSales
       │                ↓
       └────→ IceCreamSales

이 CD 에는:

  • Chain: SummerMonth → Temperature → IcedCoffeeSales (chain 1)
  • Fork: SummerMonth 가 Temperature 와 IceCreamSales 의 공통 원인
  • Collider: IceCreamSales 가 SummerMonth 와 Temperature 의 공통 결과 (다음 글에서 자세히)

4.1 결합된 구조의 분석

직관 — 분석 질문에 따라 단순화

분석가가 “SummerMonth → IcedCoffeeSales 효과” 를 추정하고 싶다고 하자.

복잡한 CD 전체를 사용할 필요 없다. 다음만 중요:

SummerMonth ──→ Temperature ──→ IcedCoffeeSales

(IceCreamSales 가지치기 — IcedCoffeeSales 의 confounder 아니므로)

→ 분석 질문에 따라 CD 를 가지치기 (prune). Buisson 표현: “체인을 축약 가능.”

같은 CD 를 보면서 다른 분석가는 다른 질문에 답한다 — 각자 필요한 부분만 사용.

5 응용 — 변환 (Transformations)

5.1 Slicing — 변수 분해

정의

한 변수를 더 세밀한 sub-component 로 분해.

IcedCoffeeSales = IcedAmericano + IcedLatte

원래 chain:

Temperature ──→ IcedCoffeeSales ──→ DonutSales

분해 후:

              ╱── IcedAmericano ──╲
Temperature ─                       → DonutSales
              ╲── IcedLatte ──────╱

새로운 회귀:

\[\text{IcedAmericano} = \beta_{TA} \cdot \text{Temperature} + \varepsilon\] \[\text{IcedLatte} = \beta_{TL} \cdot \text{Temperature} + \varepsilon\] \[\text{DonutSales} = \beta_{IA} \cdot \text{IcedAmericano} + \beta_{IL} \cdot \text{IcedLatte} + \varepsilon\]

직관 — 왜 분해하는가

비즈니스 질문이 더 정밀해지면:

  • “기온이 오를 때 어메리카노와 라떼 중 어느 게 더 많이 팔리는가” — slicing 필요
  • “도넛이 어메리카노 손님과 라떼 손님 중 어느 쪽에서 더 잘 팔리는가” — slicing 필요

분해하면:

  • 마케팅 타겟팅 (“어메리카노 손님에게 도넛 쿠폰”)
  • 재고 계획 (어메리카노·라떼·도넛 비율)

→ Slicing 은 분석의 정밀도를 한 단계 올림. 데이터에 그 분해된 컬럼이 있으면 즉시 가능.

5.2 Aggregating — 변수 통합

정의

같은 인과 관계를 가진 변수들을 하나로 통합.

Age    ──→ TasteForVanilla
Gender ──→ TasteForVanilla
       └──→ PurchasedIceCream

(통합)
DemographicCharacteristics ──→ TasteForVanilla
                          └──→ PurchasedIceCream

조건: Age 와 Gender 가 같은 직접·간접 관계 를 가져야 통합 가능.

직관 — 왜 통합하는가

CD 가 너무 복잡해지면 의사소통이 어려워진다. 분석가의 핵심 질문이 “Demographics 효과를 통제하면 X → Y 효과는?” 일 때, Demographics 를 한 박스로 묶으면:

  • CD 가 명료
  • 회의·문서에서 설명 단순
  • 회귀에서는 여전히 Age, Gender 를 별도 컬럼으로 사용

→ CD 는 가독성 을 위해 변환된다. 데이터 처리는 분해된 형태로.

주의: A/B 테스트로 무작위 배정하면 Demographics 효과가 자동 통제되므로, 회귀에 명시할 필요 없음. 그러나 CD 에는 그려둠 (관찰 데이터 분석으로 전환할 때 필요).

6 코드 예시 — Python 으로 Chain·Fork 시뮬레이션

6.1 Chain 시뮬레이션

import numpy as np
import pandas as pd
import statsmodels.api as sm

np.random.seed(42)
n = 365

# Chain: Temperature → IcedCoffee → DonutSales
temperature = np.random.normal(20, 8, n)

# IcedCoffee 는 Temperature 의 함수
beta_T_to_IC = 100  # 1도당 $100 매출 증가
iced_coffee = beta_T_to_IC * temperature + np.random.normal(0, 200, n)

# DonutSales 는 IcedCoffee 의 함수 (Temperature 직접 효과 없음)
beta_IC_to_D = 0.3  # 아이스커피 매출 1$ 당 도넛 매출 $0.3 증가
donut_sales = beta_IC_to_D * iced_coffee + np.random.normal(0, 100, n)

df = pd.DataFrame({
    "temperature": temperature,
    "iced_coffee": iced_coffee,
    "donut_sales": donut_sales,
})

# 회귀 1: Donut ~ Temperature (체인 축약)
X1 = sm.add_constant(df["temperature"])
m1 = sm.OLS(df["donut_sales"], X1).fit()
print("=== 체인 축약: Donut ~ Temperature ===")
print(f"  beta_T (총 효과) = {m1.params['temperature']:.2f}")
print(f"  이론값 (beta_T_to_IC * beta_IC_to_D) = {beta_T_to_IC * beta_IC_to_D:.2f}")

# 회귀 2: Donut ~ Temperature + IcedCoffee (mediator 통제)
X2 = sm.add_constant(df[["temperature", "iced_coffee"]])
m2 = sm.OLS(df["donut_sales"], X2).fit()
print("\n=== Mediator 통제: Donut ~ Temperature + IcedCoffee ===")
print(f"  beta_T (직접 효과, 0 예상) = {m2.params['temperature']:.2f}")
print(f"  beta_IC = {m2.params['iced_coffee']:.2f}")
직관 — 두 회귀의 비교

예상 결과:

  • 회귀 1: \(\beta_T \approx 30\) (= \(100 \times 0.3\), 총 효과)
  • 회귀 2: \(\beta_T \approx 0\) (직접 효과 — chain 에서는 0), \(\beta_{IC} \approx 0.3\)

같은 데이터, 같은 변수 — 그러나 mediator 통제 여부에 따라 Temperature 효과가 30 또는 0.

비즈니스 결론:

  • “기온은 도넛 매출에 영향을 주는가?” — Yes, $30/도 (총 효과 회귀 1)
  • “아이스커피 매출이 같다고 가정할 때 기온은 도넛 매출에 영향을 주는가?” — No, ~0 (회귀 2)

두 질문은 다른 질문. CD 가 어느 질문인지 명시.

6.2 Fork 시뮬레이션

# Fork: Temperature → IcedCoffee, Temperature → IceCream
# IcedCoffee 와 IceCream 사이엔 인과 관계 없음
np.random.seed(42)
n = 365

temperature = np.random.normal(20, 8, n)

iced_coffee_F = 100 * temperature + np.random.normal(0, 200, n)
ice_cream_F = 150 * temperature + np.random.normal(0, 300, n)

df_fork = pd.DataFrame({
    "temperature": temperature,
    "iced_coffee": iced_coffee_F,
    "ice_cream": ice_cream_F,
})

# 가짜 상관 점검
corr = df_fork[["iced_coffee", "ice_cream"]].corr().iloc[0, 1]
print(f"\n=== Fork 의 가짜 상관 ===")
print(f"IcedCoffee 와 IceCream 의 상관: {corr:.3f}")
print(f"  → 직접 인과 없는데도 강한 양의 상관")

# 순진한 회귀 (Confounder 통제 안 함)
X3 = sm.add_constant(df_fork["iced_coffee"])
m3 = sm.OLS(df_fork["ice_cream"], X3).fit()
print(f"\n=== 순진한 회귀: IceCream ~ IcedCoffee ===")
print(f"  beta_IC (편향됨) = {m3.params['iced_coffee']:.3f}")
print(f"  진짜 인과 효과 = 0 (그러나 회귀는 양수)")

# Confounder 통제 회귀
X4 = sm.add_constant(df_fork[["iced_coffee", "temperature"]])
m4 = sm.OLS(df_fork["ice_cream"], X4).fit()
print(f"\n=== Confounder 통제: IceCream ~ IcedCoffee + Temperature ===")
print(f"  beta_IC (보정됨) = {m4.params['iced_coffee']:.3f}")
print(f"  beta_T = {m4.params['temperature']:.3f}")
print(f"  → beta_IC ~ 0 으로 보정됨 (진짜 인과 0 에 가까움)")
직관 — 보정의 효과 가시화

예상 결과:

  • 순진한 회귀: \(\beta_{IC} \approx 1.5\) (강한 양의 효과로 보임)
  • Confounder 통제: \(\beta_{IC} \approx 0\) (진짜 효과)

같은 데이터에서 Temperature 를 회귀에 추가하기만 했는데 IcedCoffee 의 계수가 1.5에서 0으로 바뀐다.

이게 fork 의 위험을 단적으로 보여준다. CD 없이 회귀를 돌리면, “아이스커피가 아이스크림을 1.5배 끌어올린다” 는 틀린 결론.

이런 분석에 기반해 “아이스커피 마케팅으로 아이스크림을 살리자” 결정하면 — 마케팅 비용 낭비.

6.3 Slicing 시뮬레이션

# Slicing: IcedCoffee → IcedAmericano + IcedLatte
np.random.seed(42)
n = 365

temperature = np.random.normal(20, 8, n)
iced_americano = 60 * temperature + np.random.normal(0, 100, n)
iced_latte = 40 * temperature + np.random.normal(0, 80, n)

# DonutSales 는 두 종류 모두에서 영향
beta_AM = 0.4
beta_LA = 0.2
donut_slice = (
    beta_AM * iced_americano
    + beta_LA * iced_latte
    + np.random.normal(0, 50, n)
)

df_slice = pd.DataFrame({
    "temperature": temperature,
    "iced_americano": iced_americano,
    "iced_latte": iced_latte,
    "donut": donut_slice,
})

# 분해 회귀
X5 = sm.add_constant(df_slice[["iced_americano", "iced_latte"]])
m5 = sm.OLS(df_slice["donut"], X5).fit()
print(f"\n=== 분해 회귀: Donut ~ Americano + Latte ===")
print(f"  beta_AM = {m5.params['iced_americano']:.3f} (진짜값 0.4)")
print(f"  beta_LA = {m5.params['iced_latte']:.3f} (진짜값 0.2)")
print(f"  → 어메리카노 손님이 도넛을 2배 더 산다")
직관 — 분해 결과의 비즈니스 의미

추정: \(\beta_{AM} \approx 0.4\), \(\beta_{LA} \approx 0.2\).

해석:

  • 어메리카노 매출 $1 당 도넛 매출 $0.40 증가
  • 라떼 매출 $1 당 도넛 매출 $0.20 증가
  • 어메리카노 손님이 도넛을 라떼 손님보다 2배 더 잘 산다

마케팅 의사결정:

  • 도넛 쿠폰을 어메리카노 구매자에게 우선 배포
  • 라떼 손님에게는 다른 디저트 (예: 마카롱) 시도
  • 단순 “아이스커피 손님 = 도넛 손님” 보다 정밀한 타겟팅

이 통찰은 slicing 없이는 발견 불가능. CD 에 두 종류를 명시한 덕분에 분해된 회귀가 가능.

6.4 변수 통합 (Aggregating) 시뮬레이션

# Aggregating: Age + Gender → Demographics
np.random.seed(42)
n = 1000

age = np.random.uniform(18, 70, n)
gender = np.random.choice([0, 1], n)  # 0=female, 1=male

# Vanilla 선호도
vanilla_taste = 0.05 * (age - 40) + 0.3 * gender + np.random.normal(0, 1, n)
purchase_ic = (vanilla_taste > 0).astype(int)  # 단순화

df_agg = pd.DataFrame({
    "age": age,
    "gender": gender,
    "vanilla": vanilla_taste,
    "purchase": purchase_ic,
})

# 분리된 회귀
X6 = sm.add_constant(df_agg[["age", "gender"]])
m6 = sm.OLS(df_agg["vanilla"], X6).fit()
print(f"\n=== 분리: Vanilla ~ Age + Gender ===")
print(f"  beta_age = {m6.params['age']:.3f} (진짜값 0.05)")
print(f"  beta_gender = {m6.params['gender']:.3f} (진짜값 0.3)")

# 통합 (Demographics index)
df_agg["demographics_index"] = (
    0.05 * df_agg["age"] + 0.3 * df_agg["gender"]
)
X7 = sm.add_constant(df_agg["demographics_index"])
m7 = sm.OLS(df_agg["vanilla"], X7).fit()
print(f"\n=== 통합: Vanilla ~ Demographics Index ===")
print(f"  beta_demo = {m7.params['demographics_index']:.3f}")
print(f"  R²: 분리 {m6.rsquared:.3f} vs 통합 {m7.rsquared:.3f}")
직관 — 통합의 trade-off

분리 vs 통합:

분리 통합
정밀도 Age, Gender 각 효과 분리 단일 효과
가독성 (CD) 두 화살표 한 화살표
실용성 개별 demographic 의 효과 보고 가능 “demographic 효과” 로 단순
회귀 권장 선호 (간단할 때)

비즈니스 분석에서: CD 는 통합 으로 단순하게, 회귀는 분리 로 정밀하게 — 두 표현을 함께 사용.

7 관련 주제

7.1 Ch.3 의 형제 글

7.2 후속 챕터 (Confounding 과 Mediation)

7.5 카테고리 진입점

Subscribe

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