1 정의
회귀를 인과 분석에 사용할 때, 변수 mix 를 잘못 짜면 다음 셋 중 하나에 빠진다.
- Confounder 누락 (omitted confounder) — 처치와 결과 양쪽에 영향을 주는 제3의 변수를 빠뜨려 가짜 상관을 인과로 오인.
- 다중공선성 (multicollinearity) — 같은 정보를 담은 변수를 둘 이상 회귀에 포함하여 계수 추정이 불안정해짐.
- Collider 조건부 (collider conditioning) — 두 원인의 공통 결과를 회귀에 포함하여 두 원인 사이에 가짜 상관을 만듦.
세 함정 모두 회귀 결과의 계수를 인과로 해석하면 틀린 결론 으로 이어진다 (Buisson, 2021, Ch.1).
예측 분석에서는 보통 변수를 많이 넣을수록 정확도가 올라간다 (정규화·교차 검증으로 과적합 방지). 그래서 데이터 사이언티스트의 직감은 “관련 있어 보이는 변수는 다 넣자” 다.
인과 분석에서는 정반대다. 잘못 추가한 변수가 인과 계수를 왜곡 시킨다. 변수를 더 많이 넣을수록 결과가 더 부정확해질 수 있다. 이게 인과 분석의 가장 큰 패러다임 충격이다.
2 개념 및 원리
2.1 왜 상관이 인과가 아닌가 — Confounder 의 메커니즘 재방문
이전 글 E-BUI1-2 인간 행동의 복잡성과 교란 변수 에서 confounder 정의와 편향 공식을 다뤘다. 여기서는 그 메커니즘을 비즈니스 사례로 더 깊게 시연한다.
2.1.1 C-Mart 아이스크림과 생수 — 가짜 상관의 발생
가상 슈퍼마켓 체인 C-Mart 의 데이터에서 다음을 본다.
“아이스크림 매출이 높은 날에는 생수 매출도 높다.”
상관계수가 0.85. 그래서 마케팅 매니저는 결론짓는다.
“아이스크림 = 갈증 유발 → 생수 매출 증가. 따라서 아이스크림 광고를 늘리면 생수도 더 팔린다.”
이 결론은 옳은가?
날씨를 생각해 보면 답이 보인다.
- 더운 날 → 사람들이 갈증 → 생수 ↑ + 아이스크림 ↑
- 추운 날 → 둘 다 ↓
기온이 둘 다의 공통 원인 이다. 기온이 confounder.
이 상황에서 아이스크림 광고를 늘려도 생수 매출이 늘어날 이유가 없다. 두 변수의 상관은 인과가 아닌 공통 원인 에서 나왔다.
이 함정은 직관적으로 명백해 보이지만, 변수가 50개·100개로 늘어나면 어떤 것이 confounder 인지 사람의 직관으로 잡기 어렵다. 그래서 인과 다이어그램(causal diagram) 같은 형식적 도구가 필요하다 — Buisson 의 Part II 에서 본격 다룬다.
2.1.2 수식으로 다시 보는 confounder 편향
이전 글의 공식을 한 번 더 본다.
\[ \tilde{\beta}_A = \beta_A + \underbrace{\beta_L \cdot \frac{\text{Cov}(A, L)}{\text{Var}(A)}}_{\text{omitted variable bias}} \]
여기서 \(\tilde{\beta}_A\) 는 \(L\) 을 뺀 회귀의 계수, \(\beta_A\) 는 진짜 인과 효과.
편향 항은 곱(product) 이다. 두 인자 모두 0 이 아닐 때만 편향 발생.
- 첫 번째 인자 \(\beta_L\): \(L\) 이 \(Y\) 에 미치는 효과
- 두 번째 인자 \(\text{Cov}(A, L)/\text{Var}(A)\): \(A\) 와 \(L\) 의 상관
C-Mart 의 아이스크림-생수 사례:
- \(A\) = 아이스크림 판매량, \(Y\) = 생수 판매량, \(L\) = 기온
- \(\beta_L\) = 기온이 생수에 미치는 효과 (큼, 양수)
- \(\text{Cov}(A, L)\) = 아이스크림과 기온의 상관 (큼, 양수)
- → 편향 항 큼 → \(\tilde{\beta}_A\) 가 0보다 매우 큰 값으로 추정 → “아이스크림이 생수 매출의 인과적 원인” 으로 오인
2.1.3 Confounder 가 없으려면? — 무작위 배정의 마법
만약 아이스크림 판매량을 무작위로 배정 할 수 있다면 (예: 무작위로 일부 매장에 아이스크림 진열을 두 배로 늘림), 어떤 일이 벌어질까?
- 무작위 배정 → 아이스크림 판매량과 기온의 상관이 0 으로 떨어짐 (\(\text{Cov}(A, L) = 0\))
- → 편향 항 0 → \(\tilde{\beta}_A = \beta_A\)
- → confounder 가 있어도 (기온이 여전히 생수에 영향) 편향 없음
RCT 의 본질: 처치 변수를 무작위 배정함으로써 모든 confounder 와의 상관을 0 으로 만든다. 알려진 confounder 든 모르는 confounder 든 상관 없이.
이게 RCT 가 인과 추론의 황금 표준인 이유다. 단 한 줄의 메커니즘 — 처치 ⊥⊥ confounder — 으로 모든 omitted variable bias 를 제거한다.
2.2 Too Many Variables — 변수 추가가 망가뜨리는 두 패턴
이제 반대 함정을 본다. 분석가가 “더 많이 넣자” 의 직감으로 변수를 추가하면 발생하는 두 가지 문제.
2.2.1 함정 1 — 다중공선성 (Multicollinearity)
위 분석에서 분석가가 더 정확한 추정을 위해 변수를 추가하기로 한다.
“아이스드 커피 매출도 높은 날엔 더운 날일 가능성. 추가하면 confounder 통제에 도움될 듯.”
회귀에 아이스드 커피 매출 변수를 추가한다.
ice_cream_sales ~ water_sales + iced_coffee_sales + temperature
결과:
- 아이스크림 계수의 표준오차가 3 배 증가
- 신뢰구간이 매우 넓어짐
- 계수 추정값이 회귀를 다시 돌릴 때마다 크게 변동
무슨 일이 일어났는가?
아이스드 커피와 아이스크림 매출은 거의 같은 정보 를 담고 있다. 둘 다 더운 날 잘 팔린다. 회귀가 둘 중 어느 것에 효과를 귀속시킬지 결정 못 한다.
비유:
두 사람이 손을 잡고 들어왔다. “누가 문을 열었는가?” 라고 묻는다. 둘 다 동시에 열었으므로 개별 기여를 분리할 수 없다.
회귀 계수 분리도 같다. 아이스드 커피 ≈ 1.0 × 아이스크림 + 작은 noise 라면, 회귀가 두 변수의 계수를 분리할 수 없다. 분리하려고 하면 표준오차가 폭증한다.
2.2.2 다중공선성의 수학적 표현
OLS 회귀에서 계수의 분산은 다음과 같다.
\[ \text{Var}(\hat{\beta}_j) = \frac{\sigma^2}{(n-1) \cdot \text{Var}(X_j) \cdot (1 - R_j^2)} \]
여기서 \(R_j^2\) 는 변수 \(X_j\) 를 다른 모든 설명 변수들로 회귀했을 때의 결정계수.
수식의 마지막 항 \(1/(1 - R_j^2)\) 가 바로 VIF (분산 팽창 계수) 다.
- \(X_j\) 가 다른 변수들로 거의 결정되면 \(R_j^2 \to 1\) → VIF \(\to \infty\) → 표준오차 폭증
- 실무 임계값: VIF > 5 또는 10 이면 다중공선성 의심
C-Mart 사례:
- 아이스드 커피와 아이스크림이 거의 같이 움직이면 두 변수 사이 \(R^2 \approx 0.9\)
- VIF \(\approx 1/0.1 = 10\)
- 표준오차가 \(\sqrt{10} \approx 3.2\) 배 증가
2.2.3 다중공선성 해결책
- 하나만 선택 — 도메인 지식으로 더 적합한 변수 하나만 회귀에 포함. 나머지는 제외.
- 결합 변수 만들기 — 둘을 합친 지표 (예: “차가운 음료 매출 합계”) 로 대체.
- PCA 같은 차원 축소 — 강한 상관 변수들을 주성분으로 압축.
- 인과 분석 관점에서 판단: \(X_j\) 가 진짜 인과 변수인가, 아니면 다른 인과 변수의 proxy 인가? Proxy 라면 진짜 변수 (기온) 를 회귀에 직접 포함하는 게 옳다.
2.2.4 함정 2 — Collider 조건부 분석
이제 다중공선성보다 미묘한 두 번째 함정을 본다.
C-Mart 가 새 가맹점을 평가한다. 두 종류 아이스크림 (바닐라, 초콜릿) 매출 데이터를 본다.
데이터에서: 인기 매장만 골라서 보면, 바닐라 매출과 초콜릿 매출이 음의 상관 이다.
“바닐라가 잘 팔리는 매장은 초콜릿이 안 팔리는구나. 두 맛은 경쟁 관계다.”
이 결론은 맞는가?
전체 매장 데이터를 보면 바닐라와 초콜릿 매출은 양의 상관 (좋은 매장은 둘 다 잘 팔림). 그런데 인기 매장만 골라서 (= 매장 인기로 조건부 분석) 보면 음의 상관이 나타난다.
왜 이런 일이? 매장 인기 (= total sales) 가 두 매출의 공통 결과 (=collider) 이기 때문이다.
바닐라 매출 ──┐
├──→ 매장 인기 (= total sales)
초콜릿 매출 ──┘
매장 인기를 일정 수준 (예: 인기 매장 = 총 매출 상위 25%) 으로 고정 (조건부) 하면, 바닐라가 잘 팔린 매장은 초콜릿이 적게 팔려야만 그 임계값을 넘었을 것이다 — 그래서 음의 상관이 인공적으로 발생한다.
2.2.5 Collider 의 일상 비유
또 다른 사례:
노벨상 수상자만 골라서 보면, 외모가 잘생긴 사람일수록 IQ 가 낮다.
이게 사실일까? 아니다. 노벨상은 외모 × 학문적 업적 의 공통 결과 (collider) 가 아니다. 그러나 비슷한 구조의 더 명확한 예:
“유명한 영화배우” 만 골라서 보면, 미모가 출중하지 않은 사람일수록 연기력이 뛰어나다.
이유: 유명 영화배우가 되려면 미모 또는 연기력 둘 중 하나는 뛰어나야 한다. 이 임계값을 넘은 사람들 안에서는 둘 사이에 음의 상관 이 발생한다 — 미모가 평범한 사람은 연기력으로 뚫고, 미모가 뛰어난 사람은 연기력 평범해도 통한다.
전체 인구로 보면 미모와 연기력은 무관하지만, 유명 영화배우 라는 collider 를 조건부로 보면 음의 상관이 만들어진다.
2.2.6 Collider 의 수학적 표현
세 변수 \(A\) (바닐라), \(B\) (초콜릿), \(C\) (총 매출 = \(A+B+\varepsilon\)) 가 있다고 하자. \(A\) 와 \(B\) 는 독립.
- 비조건부: \(\text{Cov}(A, B) = 0\)
- 조건부 (\(C = c\) 고정): \(\text{Cov}(A, B | C=c) = -\text{Var}(\varepsilon)\) 같은 음의 값
\(C = A + B + \varepsilon = c\) 가 고정이면, \(A + B = c - \varepsilon\). 즉 \(A\) 가 크면 \(B\) 가 그만큼 작아야 합이 일정하다. 합 제약(constraint) 이 음의 상관을 강제한다.
확률 변수의 합을 고정하는 것 = collider 조건부 = 가짜 음의 상관 발생.
2.2.7 Collider 함정의 실무 사례
병원 입원 환자만 골라서 분석하면 두 질환 (예: 당뇨, 우울증) 사이 음의 상관이 나오는 경우가 많다. 하지만 일반 인구에서는 둘이 독립이거나 양의 상관일 수 있다.
이유: 병원 입원 = 충분히 심각한 질환 보유. 둘 중 하나라도 있으면 입원할 수 있으므로 입원자 안에서는 두 질환이 음의 상관처럼 보인다. 입원 이라는 collider 를 조건부로 분석한 결과.
이 현상이 Berkson’s paradox 다. 1946년 Joseph Berkson 이 처음 지적.
회사가 합격자만 분석한다.
“면접 점수 높은 사람일수록 스펙(학력·경력) 이 평범하다.”
합격자는 면접 + 스펙 합으로 결정. 합격선을 넘은 사람들 안에서는 둘이 음의 상관. 전체 지원자 데이터로 봐야 진짜 관계를 본다.
2.2.8 다중공선성 vs Collider — 비교
| 항목 | 다중공선성 | Collider 조건부 |
|---|---|---|
| 발생 원인 | 같은 정보 담은 변수 둘을 회귀에 포함 | 두 원인의 공통 결과를 회귀에 포함 |
| 결과 | 계수의 표준오차 폭증 | 두 원인 사이 가짜 상관 (보통 음의) |
| 진단 | VIF > 10 | DAG 그려서 collider 식별 |
| 해결 | 하나 제외, 합치기, PCA | Collider 를 회귀에서 제외 |
| 발견 난이도 | 비교적 쉬움 (VIF 계산) | 어려움 (도메인 지식 필요) |
3 왜 필요한가 — 인과 분석의 변수 mix 설계 원칙
세 함정을 종합하면 인과 분석에서의 변수 선택 원칙이 나온다.
- Confounder 는 반드시 포함 — 처치와 결과 양쪽에 영향 주는 변수는 모두 회귀에.
- 같은 정보의 중복 변수는 하나만 — VIF 점검, 도메인 지식으로 대표 변수 선택.
- Collider 는 절대 포함하지 않기 — 두 변수의 공통 결과를 통제하면 가짜 상관 생성.
Buisson 의 후속 챕터들이 이 원칙을 형식화한다:
- Ch.3 — 인과 다이어그램의 기본 (Chains, Forks, Colliders 식별)
- Ch.4 — 비즈니스 문제에서 DAG 짓는 방법
- Ch.5 — Disjunctive Cause Criterion vs Backdoor Criterion (어떤 변수를 통제할지 결정 규칙)
| 분석 목적 | 변수 선택 기준 | “더 많을수록 좋은가?” |
|---|---|---|
| 예측 | 예측 정확도 향상 (R², AUC) | 일반적으로 그렇다 (정규화로 과적합 방지) |
| 인과 | 인과 계수의 비편향 (consistency) | 아니다 — 잘못 넣으면 더 나빠짐 |
예측 분석에서는 변수를 많이 넣고 모형이 알아서 가중치를 결정하게 한다. 인과 분석에서는 사람이 도메인 지식·DAG 로 어떤 변수를 넣을지 사전 결정 해야 한다.
4 응용 분야
| 영역 | Confounder 사례 | Collider 사례 |
|---|---|---|
| 마케팅 | 시즌·프로모션 (광고와 매출 양쪽 영향) | 충성도 등급 (광고 노출 + 구매로 결정) |
| 의료 | 환자 중증도 (치료와 회복 양쪽 영향) | 입원 여부 (Berkson’s paradox) |
| 교육 | 부모 교육 수준 (방과후 활동 + 성적 양쪽) | 졸업 여부 (성적 + 출석으로 결정) |
| HR | 직무 경험 (멘토링 + 성과 양쪽) | 승진 여부 (성과 + 인맥으로 결정) |
| 금융 | 시장 환경 (투자 결정 + 수익 양쪽) | 펀드 생존 여부 (수익률 + 운용 기간) |
비즈니스 데이터로 회귀를 돌리기 전에 다음을 점검한다.
- 표본 자체에 selection 이 있는가? (예: 합격자만, 입원자만, 구매자만) → Collider 조건부 가능성
- 시계열 데이터인가? (계절·시즌이 confounder 가 흔함)
- 변수 둘이 거의 같은 의미인가? (다중공선성)
- DAG 를 그릴 수 있는가? (없으면 Buisson Ch.4 절차 적용)
이 4 점검만으로도 회귀 결과 해석의 큰 함정을 피할 수 있다.
5 예시 — Confounder, 다중공선성, Collider 시뮬레이션
세 함정을 모두 코드로 시연한다.
5.1 Confounder 함정 (이전 글 복습)
import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression
np.random.seed(42)
n = 1000
# Confounder: 기온
temperature = np.random.normal(20, 8, n)
# 처치 (아이스크림): 기온의 영향
ice_cream = 5 + 0.8 * temperature + np.random.normal(0, 2, n)
# 결과 (생수): 기온의 영향. 아이스크림과 직접 인과 관계 없음
water = 3 + 0.6 * temperature + np.random.normal(0, 2, n)
df = pd.DataFrame({"ice_cream": ice_cream, "water": water, "temperature": temperature})
# [잘못] confounder 빠진 회귀
m1 = LinearRegression().fit(df[["ice_cream"]], df["water"])
print(f"[1] 아이스크림만: 계수 = {m1.coef_[0]:.3f}")
print(f" → 진짜 효과는 0인데 0.7~0.8 정도로 추정됨 (confounder 편향)")
# [올바름] confounder 통제
m2 = LinearRegression().fit(df[["ice_cream", "temperature"]], df["water"])
print(f"\n[2] 아이스크림 + 기온: 아이스크림 계수 = {m2.coef_[0]:.3f}")
print(f" → 진짜 0 에 가까움")5.2 다중공선성 함정
# Confounder 시뮬레이션에 아이스드 커피 추가
# 아이스드 커피도 기온의 함수 → 아이스크림과 거의 같은 정보
iced_coffee = 4 + 0.75 * temperature + np.random.normal(0, 1.5, n)
df["iced_coffee"] = iced_coffee
# [잘못] 다중공선성: 아이스크림 + 아이스드 커피 둘 다 (둘 다 기온 proxy)
import statsmodels.api as sm
X = sm.add_constant(df[["ice_cream", "iced_coffee"]])
m3 = sm.OLS(df["water"], X).fit()
print("[3] 아이스크림 + 아이스드 커피 (다중공선성):")
print(m3.summary().tables[1])
# VIF 계산
from statsmodels.stats.outliers_influence import variance_inflation_factor
vif = pd.DataFrame()
vif["변수"] = ["const", "ice_cream", "iced_coffee"]
vif["VIF"] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])]
print("\nVIF:")
print(vif)
print("→ 아이스크림·아이스드 커피 둘 다 VIF 매우 높음, 표준오차 폭증")아이스드 커피와 아이스크림은 둘 다 기온의 거의 동일한 proxy 다. 회귀가 둘의 계수를 분리하지 못하므로 표준오차가 매우 커진다 — VIF 5~10 이상이 일반적이다.
해결: 아이스드 커피를 빼고 기온을 직접 회귀에 포함 (이전 [2] 회귀처럼). 도메인 지식으로 진짜 인과 변수를 식별하는 것이 핵심이다.
5.3 Collider 함정
# 두 독립 원인 + 그들의 합인 collider
np.random.seed(42)
n = 2000
# 두 변수는 서로 독립
vanilla_demand = np.random.normal(50, 10, n)
chocolate_demand = np.random.normal(50, 10, n)
# Collider: 매장 총 매출 (합)
total_sales = vanilla_demand + chocolate_demand + np.random.normal(0, 5, n)
df_collider = pd.DataFrame({
"vanilla": vanilla_demand,
"chocolate": chocolate_demand,
"total": total_sales,
})
# 비조건부 상관: 0 에 가까움
corr_unconditional = df_collider[["vanilla", "chocolate"]].corr().iloc[0, 1]
print(f"전체 매장 — 바닐라 vs 초콜릿 상관: {corr_unconditional:.3f} (≈ 0)")
# 조건부 분석 — 인기 매장만 (총 매출 상위 25%)
top_threshold = df_collider["total"].quantile(0.75)
top_stores = df_collider[df_collider["total"] >= top_threshold]
corr_conditional = top_stores[["vanilla", "chocolate"]].corr().iloc[0, 1]
print(f"인기 매장만 — 바닐라 vs 초콜릿 상관: {corr_conditional:.3f}")
print(f"→ 가짜 음의 상관 발생 — collider 함정")- 비조건부 상관 ≈ 0 (참)
- 조건부 상관 ≈ -0.4 (가짜)
이 -0.4 의 음의 상관을 보고 “바닐라와 초콜릿이 경쟁 관계” 로 결론 내리면 잘못이다. 진짜는 두 변수가 독립이고, 인기 매장 (collider) 을 통한 selection 이 음의 상관을 만들었다.
해결: collider 를 회귀에서 빼고, 전체 표본 으로 분석. 또는 인기 매장만 분석하더라도 collider 가 만든 가짜 상관을 인식하고 인과 해석을 자제한다.
6 코드 예시 — 회귀 변수 mix 결정 흐름도
실무에서 적용할 의사결정 트리.
def variable_selection_for_causal(treatment, outcome, candidates, dag=None):
"""
인과 분석의 변수 선택 의사결정 (개념적 의사코드).
실제 구현은 dowhy, causalml 같은 라이브러리 권장.
"""
final_vars = []
for var in candidates:
# 1. Confounder 인가? (treatment + outcome 양쪽에 인과적 영향)
if dag and is_confounder(var, treatment, outcome, dag):
final_vars.append(var)
continue
# 2. Collider 인가? (treatment, outcome 또는 다른 confounder 의 결과)
if dag and is_collider(var, treatment, outcome, dag):
# 절대 포함하지 않음
continue
# 3. 매개 변수 (mediator) 인가? (treatment → var → outcome)
if dag and is_mediator(var, treatment, outcome, dag):
# 매개 효과 분석이 목적이면 포함, total effect 가 목적이면 제외
# 자세한 건 Mediation 분석 (E-BUI12)
continue
# 4. 다른 변수와 강하게 상관? (다중공선성)
if max_correlation_with(var, final_vars) > 0.9:
# 도메인 지식으로 더 적합한 변수 선택
continue
# 그 외: predictive 변수로 포함 가능
final_vars.append(var)
return final_vars- DAG 부터 그린다 — Buisson Ch.4 절차 적용 (E-BUI4 시리즈)
- DAG 에서 confounder, mediator, collider 식별 — Ch.3, 5 도구 사용
- Backdoor criterion 적용 — 어떤 변수를 통제하면 인과 효과가 식별되는지 결정
- VIF 점검 — 다중공선성 확인
- 회귀 + 인과 효과 추정
7 관련 주제
7.1 Ch.1 의 형제 글
- E-BUI1-0 Causal-Behavioral Framework overview — Ch.1 전체 흐름
- E-BUI1-1 인과 분석의 필요성과 분석 유형 — 분석 3 유형
- E-BUI1-2 인간 행동의 복잡성과 교란 변수 — Confounder 의 메커니즘 + 편향 공식
7.2 다음 챕터
- E-BUI2-0 행동 데이터 이해 overview — Buisson Ch.2: 인간 행동의 5 구성요소
- E-BUI3-0 인과 다이어그램 도입 — Buisson Ch.3: Chains, Forks, Colliders 의 본격 도입
- E-BUI5-0 Deconfounding overview — Buisson Ch.5: Backdoor Criterion 으로 confounder 제거 결정 규칙
7.3 Hernan 정통 cross-link
- Causal_Inference/06 DAG와 인과 다이어그램 — Chains, Forks, Colliders 의 학술 정의
- Causal_Inference/07 교란 — Confounder 의 형식적 처리, backdoor criterion
- Causal_Inference/08 선택 편향 — Collider conditioning 으로 인한 selection bias
7.4 카테고리 진입점
- Experimentation 학습 로드맵 — 11 Phase × 7 교재 매핑