충돌 변수와 경로 — Collider, Paths, Cycles 의 함정과 처리 (Buisson Ch.3.3)

Fork 의 거울 이미지인 Collider, 모든 경로의 일반화, 그리고 순환 구조 다루기

Buisson (2021) Ch.3 의 마지막 절을 정리한다. Collider (충돌 변수) 의 정의·역설적 성질 (조건부 보정이 가짜 상관을 만든다) · selection bias 와의 연관, Paths (경로) 의 일반화된 정의, Cycles (순환) — substitution effect 와 feedback loop — 의 처리 방법을 다룬다. 아이스크림 맛 사례·매장 대기 줄 사례로 직관화한다.

Experimentation
Causal Inference
저자

Kwangmin Kim

공개

2026년 05월 08일

1 정의

정의: Collider (충돌 변수)

두 개 이상의 변수가 같은 결과 변수를 가리키는 인과 다이어그램 구조 (Buisson, 2021, Ch.3).

A     Y
 ╲   ╱
  ╲ ╱
   C

C 가 collider — A 와 Y 의 화살표가 C 에서 “충돌” 한다.

직관 — Collider 라는 이름의 어원

“Collider” 는 입자 가속기 (Large Hadron Collider) 처럼 여러 입자 흐름이 한 점에서 만난다 는 의미.

CD 에서:

  • 두 (이상) 의 화살표가 하나의 노드에서 만남 → 화살표들이 거기서 “충돌”
  • 그 노드가 두 원인의 공통 결과 (effect)
Fork 와 Collider 의 거울 이미지 관계
구조 모양 비조건부 (no control) 조건부 (control C/L)
Fork A ← L → Y A, Y 에 가짜 상관 발생 가짜 상관 제거
Collider A → C ← Y A, Y 가 독립 (상관 없음) 가짜 상관 생성

Collider 는 fork 의 거울 이미지. 행동이 정반대.

→ Fork 는 통제하면 좋고, Collider 는 통제하지 말아야 한다.

이 비대칭이 데이터 분석의 가장 큰 함정 중 하나다 — “모든 변수를 회귀에 넣자” 는 단순 직감이 collider 를 통해 새로운 편향을 만들 수 있음.

2 Collider 의 형식

2.1 C-Mart 아이스크림 맛 사례

두 맛이 한 매출로

C-Mart 매대가 바닐라와 초콜릿 두 맛만 판다고 하자.

TasteForVanilla     TasteForChocolate
        ╲                ╱
         ╲              ╱
          ╲            ╱
   QuantityOfIceCreamPurchased
  • 바닐라 선호 (TFV) 가 강하면 아이스크림을 많이 산다.
  • 초콜릿 선호 (TFC) 가 강하면 아이스크림을 많이 산다.
  • 두 맛 선호는 서로 인과 관계 없음 (한 사람이 둘 다 좋아할 수도, 둘 중 하나만 좋아할 수도).

Quantity 가 collider — TFV 와 TFC 의 공통 결과.

회귀 매핑

각 화살표를 회귀로:

\[ \text{Quantity} = \beta_V \cdot \text{TFV} + \beta_C \cdot \text{TFC} + \varepsilon \]

비조건부 (Quantity 를 회귀에서 제외) 분석에서 TFV 와 TFC 의 상관 계수를 보면:

\[ \text{corr}(\text{TFV}, \text{TFC}) \approx 0 \]

(전체 인구에서 두 맛 선호는 독립으로 가정한 경우)

2.2 Collider 통제 시의 가짜 상관 — 시연

“초콜릿을 많이 산 사람은 바닐라를 적게 산다?”

상황: 분석가가 “아이스크림을 많이 산 고객” 만 데이터로 추출 (Quantity ≥ 5 같은 조건).

이 부분 표본에서 TFV 와 TFC 의 상관을 보면:

\[ \text{corr}(\text{TFV}, \text{TFC} \mid \text{Quantity} \geq 5) < 0 \]

음의 상관이 발생.

해석: “고객이 아이스크림을 많이 사려면 두 맛 중 하나라도 강해야 한다” — 둘 다 약하면 표본에서 제외됨.

→ 표본에서 한 맛이 약하면 다른 맛이 반드시 강해야 함 (안 그러면 Quantity 5 미만으로 표본에서 빠짐) → 두 맛 사이 음의 상관 인공 생성.

직관 — Collider Bias 의 일상 사례

영화 평론과 흥행 사례:

영화 평론 점수 ──→ 영화 인기 ←── 마케팅 예산
                       (collider)
  • 좋은 영화 (평론 점수 ↑) → 인기 ↑
  • 큰 마케팅 → 인기 ↑
  • 평론 점수와 마케팅 예산 자체는 일반적으로 무관

분석가가 “인기 영화” (인기 = 1) 만 표본으로 분석하면:

“낮은 평론 점수의 영화가 마케팅 예산이 더 크다”

→ 인공 상관. 평론이 낮은데도 인기 있는 영화는 마케팅으로 끌어올렸을 가능성이 큼 → 평론 ↓ + 마케팅 ↑ 조합이 표본에 더 많이 들어옴.

따라서 “인기 영화 표본에서 평론과 마케팅이 음의 상관” 은 사실이지만 인과 관계 아님. 선택 편향 (Selection Bias).

직관 — Berkson’s Paradox

의학 사례:

병1 ──→ 병원 입원 ←── 병2
        (collider)

병원에 입원한 환자 표본에서 보면 병1 과 병2 가 음의 상관 — “병1 환자는 병2 가 적음” 처럼 보임.

실제로는 두 병의 인과 관계 없음 (또는 양의 상관). 병원 입원이라는 조건이 collider 를 통제해서 가짜 음의 상관을 만든 것.

→ Berkson 이 1946 년에 발견한 이 역설은 collider bias 의 원형.

2.3 Collider 의 학술적 함의

인과 추론에서의 의미

A → C ← Y 에서:

  • A 의 효과를 추정할 때 C 를 통제하면 안 된다 — A → Y 의 직접 인과 효과를 가짜 상관이 오염시킴
  • 회귀에 변수를 추가하는 단순 직감이 위험한 이유 — collider 일 가능성

분석가가 항상 자문해야 할 질문:

“이 변수가 분석 대상의 공통 결과 (collider) 인가, 공통 원인 (confounder/fork) 인가?”

답에 따라 회귀 포함 여부가 정반대.

3 세 구조의 동시 존재 — 한 CD 에 chain, fork, collider

C-Mart 의 종합 사례
   SummerMonth ────→ IceCreamSales
        │                ↑
        │                │
        ↓                │
   Temperature ──────────┘
        │
        └──→ IcedCoffeeSales

세 구조 모두 존재:

  • Chain: SummerMonth → Temperature → IcedCoffeeSales (사슬)
  • Fork: SummerMonth 가 Temperature 와 IceCreamSales 의 공통 원인 (포크)
  • Collider: IceCreamSales 가 SummerMonth 와 Temperature 의 공통 결과 (충돌)
직관 — 한 노드가 여러 역할

같은 노드가 다른 노드들과 다른 종류의 관계를 동시에 가질 수 있다.

  • SummerMonth 는 IceCreamSales 의 직접 부모 (parent)
  • 동시에 Temperature 를 거쳐 IceCreamSales 의 ancestor (간접 부모)

이 다중 역할은 분석을 복잡하게 만들지만 현실적인 인과 구조를 충실히 표현.

→ CD 가 복잡해 보이는 건 실제 인과 구조가 그만큼 복잡하기 때문. 단순화는 가능하지만 (chain collapsing 등) 복잡성을 부정하면 분석이 잘못됨.

4 Paths — 일반화된 경로

4.1 정의

Path (경로)

두 변수 사이에 화살표를 따라 (방향 무관) 가는 경로. 단, 같은 변수를 두 번 거치지 않음.

   SummerMonth ────→ IceCreamSales
        │                ↑
        ↓                │
   Temperature ──────────┘
        │
        └──→ IcedCoffeeSales

SummerMonth 와 IcedCoffeeSales 사이의 경로:

  1. Path 1 (chain): SummerMonth → Temperature → IcedCoffeeSales
  2. Path 2 (collider 통과): SummerMonth → IceCreamSales ← Temperature → IcedCoffeeSales
직관 — 왜 방향 무관?

Path 의 정의가 “방향 무관” 인 이유는, 분석가가 경로 따라 변수를 통제할 때 의 효과가 방향에 무관하게 발생하기 때문.

  • Chain (모두 같은 방향): 통제 → 경로 차단
  • Fork (한 점에서 갈라짐): 통제 → 경로 차단
  • Collider (한 점에서 만남): 통제 → 경로 개방 (역설)

→ 어느 방향이든 변수가 경로 위에 있으면 통제 효과가 있다. 따라서 경로의 정의에서 방향을 무시하고 일반화.

직관 — Path 가 분석에 중요한 이유

Backdoor Criterion (Pearl 의 인과 추론 이론) 의 핵심: “두 변수 사이 모든 비-인과 경로 (backdoor paths) 를 차단해야 인과 효과를 식별 가능.”

이 정의에서 “경로” 가 정확히 위 정의의 path. 방향 무관, 변수 중복 없음.

비즈니스 분석가가 “어떤 변수를 회귀에 포함할지” 결정할 때, 단순한 직감 (“이 변수는 confounder 같다”) 대신 backdoor path 를 모두 식별하고 차단하는 절차로 작업한다 (E-BUI5-2 에서 자세히).

4.2 Path 가 가르치는 분석 절차

“변수를 더 넣자” 는 직감의 위험 (재방문)

CD 의 path 를 분석하면 다음이 보인다.

경로 종류 변수 통제 효과
Chain 경로 (A → B → Y) B 통제 → 차단 (간접 효과 제거)
Fork 경로 (A ← L → Y) L 통제 → 차단 (가짜 상관 제거)
Collider 경로 (A → C ← Y) C 통제 → 개방 (가짜 상관 생성)

→ 변수의 역할 (mediator, confounder, collider) 에 따라 통제 효과가 정반대.

분석가가 회귀에 변수를 무작정 추가하면 (1) chain 의 mediator 통제 → over-adjustment, (2) collider 통제 → selection bias 등 새로운 편향. CD 와 path 분석 없이는 어떤 효과가 발생할지 모름.

5 Cycles — 순환 구조

5.1 정의

Cycle 의 의미

지금까지의 CD 는 DAG (Directed Acyclic Graph) — 화살표를 따라가다 같은 변수로 돌아오지 않음.

현실에서는 변수들이 서로 인과적으로 영향을 주고받는 경우가 많다 — 이를 cycle (순환) 이라 부름.

A ──→ B
 ↑    │
 └────┘

또는 두 변수 간 상호 인과:

A ←──→ B  (양방향 인과)

5.2 Cycle 의 두 흔한 원인

5.2.1 대체 효과 (Substitution Effect)

직관 — C-Mart 의 음료 대체
IcedCoffee ←──→ HotCoffee

상황: 어떤 손님은 아이스커피와 핫커피 중 하나를 선택. 이 주에 아이스커피를 많이 마셨으면, 핫커피를 적게 마실 수도 있고 (다양성 추구), 그 반대도 가능.

→ 두 변수는 서로 음의 인과 관계. 양방향.

경제학적 의미:

  • 커피와 차의 가격 변동
  • 우버와 택시
  • Netflix 와 Disney+ 시청 시간

대체재가 있는 거의 모든 비즈니스에서 cycle 발생.

5.2.2 피드백 루프 (Feedback Loop)

직관 — 매장 대기 줄 사례
NbCustomersWaiting ──→ AvgWaitingTime ──→ NbLinesOpen
        ↑                                       │
        │                                       │
        └───────────────────────────────────────┘

C-Mart 매장 시나리오:

  • 손님이 많이 줄을 섬 (Customers ↑)
  • 평균 대기 시간 증가 (WaitingTime ↑)
  • 매니저가 새 계산대 오픈 (LinesOpen ↑)
  • 새 계산대가 손님을 분산시켜 대기 시간 감소 (WaitingTime ↓)
  • 손님이 빠르게 처리되며 줄도 감소 (Customers ↓)
  • 다시 사이클…

이 cycle 은 자체 조절 (self-regulating) 시스템. 매니저의 반응이 시스템을 안정화.

다른 예:

  • 광고 → 매출 → 마케팅 예산 (피드백)
  • 사용자 활성도 → 콘텐츠 추천 → 사용자 활성도
  • 가격 → 수요 → 가격 (시장 균형)

5.3 Cycle 처리 방법

5.3.1 시간 인덱싱 (Time-Indexing)

Cycle 을 시간으로 펼치기

대기 줄 사례의 cycle 을 풀려면 시간 단위로 변수를 분리.

        WaitingTime(t)
              │
              ├─→ NbCustomersWaiting(t+15min)
              │           │
              ├─→ NbLinesOpen(t+15min)
              │           │
              │           ↓
              └─→ WaitingTime(t+15min)

각 변수가 시점 별로 독립 — cycle 이 사라짐.

회귀:

\[ \text{NbCustomers}(t+15) = \beta_1 \cdot \text{WaitingTime}(t) \]

\[ \text{NbLines}(t+15) = \beta_2 \cdot \text{WaitingTime}(t) \]

\[ \text{WaitingTime}(t+15) = \beta_3 \cdot \text{NbCustomers}(t+15) + \beta_4 \cdot \text{NbLines}(t+15) \]

직관 — 왜 시간이 cycle 을 푸는가

Cycle 이 발생하는 이유: 변수 A 와 B 의 영향이 즉시 일어난다고 가정했을 때.

현실에서는 거의 항상 시간 지연이 있음. 매니저가 “줄이 길다” 를 인지하고 새 계산대 오픈하기까지 5~15분 걸림. 손님 대기 시간이 정착되기까지도 시간 걸림.

시간 단위를 쪼개면:

  • t 시점의 A 는 t 시점의 B 에 영향 안 줌 (시간 차)
  • t 시점의 A 는 t+5 시점의 B 에 영향 줌
  • t+5 시점의 B 는 t+10 시점의 A 에 영향 줌

→ 모든 영향이 시간을 따라 한 방향으로만 흐름. DAG 가 됨.

이 분해는 진짜 비즈니스 시스템을 더 정확히 표현하기도 함 (즉시 효과 가정이 비현실적).

5.3.2 단순화 (Simplification)

직관 — 약한 피드백 무시
Temperature → IcedCoffee → HotCoffee → IcedCoffee (cycle)

이 cycle 에서:

  • Temperature → IcedCoffee 효과 (강함, \(\beta = 100\) 가정)
  • IcedCoffee → HotCoffee 대체 효과 (중간, \(\beta = -0.3\) 가정)
  • HotCoffee → IcedCoffee 역피드백 (약함, \(\beta = -0.05\) 가정)

분석가의 1차 근사: 가장 약한 화살표를 무시.

Temperature → IcedCoffee → HotCoffee

(HotCoffee → IcedCoffee 가지치기)

이 단순화된 CD 는 cycle 없음 → 정상 분석 가능.

오류 정도: 작음 (약한 피드백을 무시하므로).

→ 비즈니스 분석에서 1차 근사로 충분한 경우가 많음. 정밀 모형이 필요할 때만 cycle 을 시간 인덱싱·SEM 등으로 처리.

5.3.3 Structural Equation Modeling (SEM)

정밀 모형

Cycle 을 정확히 처리하려면 SEM (Structural Equation Modeling) 같은 고급 기법이 필요.

  • 변수들의 상호 영향을 동시 추정
  • 안정 상태 (steady state) 를 가정하고 균형값 계산
  • 시계열 데이터의 경우 VAR (Vector Autoregression) 등 사용

비즈니스 분석에서 이 정도까지 가는 경우는 많지 않음. 대부분 시간 인덱싱이나 단순화로 충분.

6 응용 — Collider 함정의 비즈니스 사례

6.1 사례 1: 채용 분석

“고학력자가 인성 평가가 낮다?”
고학력 ──→ 합격 ←── 좋은 인성

분석가: “합격자만 데이터로 추출 (현직 직원). 학력과 인성 점수 분석.”

발견: “고학력자가 인성 평가 점수 낮음.”

해석 함정: “공부 잘하는 사람은 인성이 부족하다.”

실제로는: 합격이라는 collider 통제로 인한 가짜 음의 상관. 합격하려면 (학력 OR 인성) 둘 중 하나가 좋아야 함 → 합격자 표본에서 둘이 음의 상관처럼 보임.

→ 합격하지 못한 지원자를 포함한 전체 지원자 집단에서 분석해야 진짜 학력-인성 관계를 봄.

6.2 사례 2: 마케팅 분석

“광고 클릭한 사람은 가격 민감도가 낮다?”
가격 민감도 ──→ 광고 클릭 ←── 시간 여유

분석가: “광고 클릭한 사용자만 분석. 가격 민감도와 시간 여유 측정.”

발견: “광고 클릭자는 가격 민감도와 시간 여유가 음의 상관.”

해석 함정: “가격 민감한 사람일수록 시간 여유 없음.”

실제로는: 광고 클릭이 collider. 클릭하려면 (가격 민감 OR 시간 여유) 둘 중 하나가 충분해야 함.

→ 광고 클릭이 아닌 사용자도 포함해 전체 분석 필요.

6.3 사례 3: 의료 데이터

“운동하는 환자가 흡연을 더 한다?”
운동 ──→ 병원 방문 ←── 흡연

분석가: “병원에 정기 검진 오는 환자만 분석. 운동량과 흡연량 측정.”

발견: “운동량 많은 환자가 흡연량 더 많음.”

해석 함정: “운동이 흡연을 부추긴다.”

실제로는: 병원 방문이 collider. 정기 검진 오는 사람은 (운동으로 건강 의식 OR 흡연으로 건강 걱정) 둘 중 하나일 가능성.

→ 병원 방문 안 하는 사람 포함한 전체 인구 표본이 필요.

7 코드 예시 — Python 으로 Collider Bias 시뮬레이션

7.1 기본 시뮬레이션

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

np.random.seed(42)
n = 5000

# 진짜 인과 구조: TFV 와 TFC 는 독립
tfv = np.random.normal(0, 1, n)  # 바닐라 선호
tfc = np.random.normal(0, 1, n)  # 초콜릿 선호

# Quantity 는 두 선호의 합 + noise
beta_V = 1.0
beta_C = 1.0
noise = np.random.normal(0, 1, n)
quantity = beta_V * tfv + beta_C * tfc + noise

df = pd.DataFrame({
    "tfv": tfv,
    "tfc": tfc,
    "quantity": quantity,
})

# 비조건부 상관 (전체 인구)
corr_full = df[["tfv", "tfc"]].corr().iloc[0, 1]
print(f"=== 비조건부 ===")
print(f"전체 인구: corr(TFV, TFC) = {corr_full:.4f}  (진짜값 0)")

# Collider 통제 — Quantity 상위 50% 만 추출
threshold = df["quantity"].median()
df_high = df[df["quantity"] > threshold]
corr_high = df_high[["tfv", "tfc"]].corr().iloc[0, 1]

df_low = df[df["quantity"] <= threshold]
corr_low = df_low[["tfv", "tfc"]].corr().iloc[0, 1]

print(f"\n=== Collider 통제 (Quantity 분할) ===")
print(f"많이 산 사람 (Q > median): corr = {corr_high:.4f}  ← 음의 상관!")
print(f"적게 산 사람 (Q ≤ median): corr = {corr_low:.4f}  ← 음의 상관!")
직관 — 시뮬레이션이 보여주는 것

예상 결과:

  • 비조건부: corr ≈ 0 (진짜값)
  • Collider 통제 (분할): corr ≈ -0.4 ~ -0.5 (가짜 음의 상관)

같은 데이터에서 분석 표본을 어떻게 잘랐느냐로 음의 상관이 나타남. 데이터 자체엔 그 상관이 없음.

이게 비즈니스 분석에서 가장 흔한 함정. “VIP 고객만 분석”, “활성 사용자만 분석” 같은 표본 추출이 collider 통제와 같은 효과.

→ 표본을 자를 때마다 “이 자르는 변수가 collider 인가” 자문해야.

7.2 회귀에 collider 추가 시뮬레이션

# Quantity 를 회귀에 추가하면?
np.random.seed(42)
n = 5000

tfv = np.random.normal(0, 1, n)
tfc = np.random.normal(0, 1, n)
quantity = tfv + tfc + np.random.normal(0, 0.5, n)

df = pd.DataFrame({
    "tfv": tfv,
    "tfc": tfc,
    "quantity": quantity,
})

# 회귀 1: TFV ~ TFC (비조건부)
X1 = sm.add_constant(df["tfc"])
m1 = sm.OLS(df["tfv"], X1).fit()
print(f"=== 회귀 1: TFV ~ TFC (collider 무시) ===")
print(f"  beta = {m1.params['tfc']:.4f}  (진짜값 0)")

# 회귀 2: TFV ~ TFC + Quantity (collider 포함)
X2 = sm.add_constant(df[["tfc", "quantity"]])
m2 = sm.OLS(df["tfv"], X2).fit()
print(f"\n=== 회귀 2: TFV ~ TFC + Quantity (collider 통제) ===")
print(f"  beta_TFC = {m2.params['tfc']:.4f}  ← 음의 가짜 상관")
print(f"  beta_Q = {m2.params['quantity']:.4f}")
직관 — 회귀의 가짜 음의 상관

예상 결과:

  • 회귀 1 (collider 무시): \(\beta_{TFC} \approx 0\) (정확)
  • 회귀 2 (collider 추가): \(\beta_{TFC} \approx -0.5\) (가짜 음)

분석가가 단순히 “Quantity 도 통제하자” 며 회귀에 추가하면 TFV 와 TFC 사이 인공적인 음의 상관이 추정됨.

이 결과를 본 분석가의 잘못된 결론: “초콜릿 선호도가 강할수록 바닐라 선호도가 약함.”

→ 진짜는 “둘이 독립” 인데 collider 통제로 음의 상관이 만들어짐.

7.3 Cycle 의 시간 인덱싱 시뮬레이션

# 매장 대기 줄 cycle 시뮬레이션
np.random.seed(42)
T = 100  # 100 개 시간 step

# 초기값
n_customers = np.zeros(T)
wait_time = np.zeros(T)
n_lines = np.zeros(T)
n_customers[0] = 10
wait_time[0] = 5
n_lines[0] = 2

# 시간 따라 cycle 시뮬레이션
for t in range(1, T):
    # 손님이 줄로 들어오기 (외부 input + 대기 시간 영향)
    arrival = 5 + np.random.poisson(3)
    n_customers[t] = max(0, n_customers[t-1] + arrival - n_lines[t-1] * 2)

    # 매니저가 대기 시간 보고 라인 조정
    if wait_time[t-1] > 6:
        n_lines[t] = min(5, n_lines[t-1] + 1)  # 라인 늘림
    elif wait_time[t-1] < 3:
        n_lines[t] = max(1, n_lines[t-1] - 1)  # 라인 줄임
    else:
        n_lines[t] = n_lines[t-1]

    # 새 대기 시간 계산
    wait_time[t] = n_customers[t] / max(1, n_lines[t])

df_cycle = pd.DataFrame({
    "t": range(T),
    "n_customers": n_customers,
    "wait_time": wait_time,
    "n_lines": n_lines,
})

# t 시점 변수와 t+1 시점 변수 분리 (시간 인덱싱)
df_cycle["wait_time_lag"] = df_cycle["wait_time"].shift(1)
df_cycle["n_customers_lag"] = df_cycle["n_customers"].shift(1)
df_cycle = df_cycle.dropna()

# 회귀 1: 현재 손님 수 ~ 이전 대기 시간
X3 = sm.add_constant(df_cycle["wait_time_lag"])
m3 = sm.OLS(df_cycle["n_customers"], X3).fit()
print(f"=== Cycle 의 시간 인덱싱 회귀 ===")
print(f"NbCustomers(t) ~ WaitingTime(t-1)")
print(f"  beta = {m3.params['wait_time_lag']:.3f}")
직관 — 시간 인덱싱의 효과

원래 cycle:

NbCustomers ←──→ WaitingTime

이 직접 회귀는 reverse causality 로 인해 추정이 부정확.

시간 인덱싱 후:

NbCustomers(t-1) → WaitingTime(t-1) → NbCustomers(t) → ...

각 시점은 다른 시점에 영향을 주지만, 동시 시점 내에서는 cycle 이 없음. 회귀가 자연스럽게 처리.

→ 시계열 데이터가 있으면 cycle 처리는 어렵지 않다. 단지 lag 변수를 만들면 됨.

7.4 DAG 시각화 — 종합

import networkx as nx
import matplotlib.pyplot as plt

# 종합 CD: chain + fork + collider 모두 포함
G = nx.DiGraph()
G.add_edges_from([
    ("SummerMonth", "Temperature"),       # chain 의 시작
    ("SummerMonth", "IceCreamSales"),     # fork (또는 collider 일부)
    ("Temperature", "IcedCoffeeSales"),   # chain 의 끝
    ("Temperature", "IceCreamSales"),     # collider 일부
])

pos = {
    "SummerMonth": (0, 1),
    "Temperature": (1, 1),
    "IcedCoffeeSales": (2, 1),
    "IceCreamSales": (1, 0),
}

plt.figure(figsize=(10, 6))
nx.draw(G, pos,
        with_labels=True,
        node_color=["lightblue", "lightgreen", "yellow", "salmon"],
        node_size=3000,
        font_size=8,
        arrows=True,
        arrowsize=20,
        edge_color="gray")
plt.title("Chain + Fork + Collider 모두 포함")
plt.tight_layout()
plt.savefig("cd_combined.png", dpi=80)
plt.show()

print("\n구조 분석:")
print("  Chain: SummerMonth → Temperature → IcedCoffeeSales")
print("  Fork: SummerMonth → {Temperature, IceCreamSales}")
print("  Collider: IceCreamSales ← {SummerMonth, Temperature}")
직관 — 분석 절차 표준

CD 를 그린 후 분석가가 따라야 할 표준 절차:

  1. 각 노드의 역할 식별 — 분석 대상 (treatment, outcome) 결정
  2. 모든 path 열거 — treatment 와 outcome 사이 경로
  3. 각 path 의 종류 분류 — chain/fork/collider 식별
  4. 통제할 변수 결정:
    • Confounder (fork 의 L) — 통제
    • Mediator (chain 의 B) — 분석 목적에 따라 (총 효과면 통제 X, 직접 효과면 통제)
    • Collider — 통제 안 함
  5. 회귀 적합 + 결과 해석

이 절차를 따르면 collider bias, confounder bias, over-adjustment 모두 회피.

8 관련 주제

8.1 Ch.3 의 형제 글

8.2 후속 챕터 (Collider 와 Path 의 본격 활용)

8.5 카테고리 진입점

Subscribe

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