상관은 인과가 아니다 — 변수를 잘못 추가하면 분석이 더 망가지는 두 가지 이유 (Buisson Ch.1.5~1.6)

Confounder · 다중공선성 · Collider — 회귀를 인과 도구로 쓸 때 알아야 할 세 함정

Buisson (2021) Ch.1 의 마지막 두 절 — “Why Correlation Is Not Causation: A Confounder in Action” 과 “Too Many Variables Can Spoil the Broth” 를 정리한다. 교란 변수가 가짜 상관을 만드는 메커니즘을 C-Mart 아이스크림·생수 사례로 시연하고, 변수를 무분별하게 추가할 때 발생하는 두 함정 — 다중공선성과 collider 조건부 — 을 바닐라-초콜릿 선호도 사례로 보여준다. 회귀 변수 mix 가 인과 분석에서 왜 핵심 설계 결정인지를 직관적으로 다룬다.

Experimentation
Causal Inference
저자

Kwangmin Kim

공개

2026년 05월 08일

1 정의

정의: 회귀 변수 mix 의 세 함정

회귀를 인과 분석에 사용할 때, 변수 mix 를 잘못 짜면 다음 셋 중 하나에 빠진다.

  1. Confounder 누락 (omitted confounder) — 처치와 결과 양쪽에 영향을 주는 제3의 변수를 빠뜨려 가짜 상관을 인과로 오인.
  2. 다중공선성 (multicollinearity) — 같은 정보를 담은 변수를 둘 이상 회귀에 포함하여 계수 추정이 불안정해짐.
  3. Collider 조건부 (collider conditioning) — 두 원인의 공통 결과를 회귀에 포함하여 두 원인 사이에 가짜 상관을 만듦.

세 함정 모두 회귀 결과의 계수를 인과로 해석하면 틀린 결론 으로 이어진다 (Buisson, 2021, Ch.1).

직관 — “변수가 많을수록 좋다” 가 거짓인 이유

예측 분석에서는 보통 변수를 많이 넣을수록 정확도가 올라간다 (정규화·교차 검증으로 과적합 방지). 그래서 데이터 사이언티스트의 직감은 “관련 있어 보이는 변수는 다 넣자” 다.

인과 분석에서는 정반대다. 잘못 추가한 변수가 인과 계수를 왜곡 시킨다. 변수를 더 많이 넣을수록 결과가 더 부정확해질 수 있다. 이게 인과 분석의 가장 큰 패러다임 충격이다.

2 개념 및 원리

2.1 왜 상관이 인과가 아닌가 — Confounder 의 메커니즘 재방문

이전 글 E-BUI1-2 인간 행동의 복잡성과 교란 변수 에서 confounder 정의와 편향 공식을 다뤘다. 여기서는 그 메커니즘을 비즈니스 사례로 더 깊게 시연한다.

2.1.1 C-Mart 아이스크림과 생수 — 가짜 상관의 발생

C-Mart 사례 (Buisson, 2021, Ch.1)

가상 슈퍼마켓 체인 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 가 없으려면? — 무작위 배정의 마법

직관 — RCT 가 황금 표준인 이유

만약 아이스크림 판매량을 무작위로 배정 할 수 있다면 (예: 무작위로 일부 매장에 아이스크림 진열을 두 배로 늘림), 어떤 일이 벌어질까?

  • 무작위 배정 → 아이스크림 판매량과 기온의 상관이 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)

C-Mart 아이스드커피 사례

위 분석에서 분석가가 더 정확한 추정을 위해 변수를 추가하기로 한다.

“아이스드 커피 매출도 높은 날엔 더운 날일 가능성. 추가하면 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\) 를 다른 모든 설명 변수들로 회귀했을 때의 결정계수.

직관 — VIF (Variance Inflation Factor)

수식의 마지막 항 \(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 다중공선성 해결책

실무 권고
  1. 하나만 선택 — 도메인 지식으로 더 적합한 변수 하나만 회귀에 포함. 나머지는 제외.
  2. 결합 변수 만들기 — 둘을 합친 지표 (예: “차가운 음료 매출 합계”) 로 대체.
  3. PCA 같은 차원 축소 — 강한 상관 변수들을 주성분으로 압축.
  4. 인과 분석 관점에서 판단: \(X_j\) 가 진짜 인과 변수인가, 아니면 다른 인과 변수의 proxy 인가? Proxy 라면 진짜 변수 (기온) 를 회귀에 직접 포함하는 게 옳다.

2.2.4 함정 2 — Collider 조건부 분석

이제 다중공선성보다 미묘한 두 번째 함정을 본다.

바닐라-초콜릿 선호도 사례 (Buisson, 2021, Ch.1)

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 함정의 실무 사례

의료 — Berkson’s Paradox

병원 입원 환자만 골라서 분석하면 두 질환 (예: 당뇨, 우울증) 사이 음의 상관이 나오는 경우가 많다. 하지만 일반 인구에서는 둘이 독립이거나 양의 상관일 수 있다.

이유: 병원 입원 = 충분히 심각한 질환 보유. 둘 중 하나라도 있으면 입원할 수 있으므로 입원자 안에서는 두 질환이 음의 상관처럼 보인다. 입원 이라는 collider 를 조건부로 분석한 결과.

이 현상이 Berkson’s paradox 다. 1946년 Joseph Berkson 이 처음 지적.

채용 — 합격자 분석의 함정

회사가 합격자만 분석한다.

“면접 점수 높은 사람일수록 스펙(학력·경력) 이 평범하다.”

합격자는 면접 + 스펙 합으로 결정. 합격선을 넘은 사람들 안에서는 둘이 음의 상관. 전체 지원자 데이터로 봐야 진짜 관계를 본다.

2.2.8 다중공선성 vs Collider — 비교

항목 다중공선성 Collider 조건부
발생 원인 같은 정보 담은 변수 둘을 회귀에 포함 두 원인의 공통 결과를 회귀에 포함
결과 계수의 표준오차 폭증 두 원인 사이 가짜 상관 (보통 음의)
진단 VIF > 10 DAG 그려서 collider 식별
해결 하나 제외, 합치기, PCA Collider 를 회귀에서 제외
발견 난이도 비교적 쉬움 (VIF 계산) 어려움 (도메인 지식 필요)

3 왜 필요한가 — 인과 분석의 변수 mix 설계 원칙

세 함정을 종합하면 인과 분석에서의 변수 선택 원칙이 나온다.

인과 분석의 변수 mix 3 원칙
  1. Confounder 는 반드시 포함 — 처치와 결과 양쪽에 영향 주는 변수는 모두 회귀에.
  2. 같은 정보의 중복 변수는 하나만 — VIF 점검, 도메인 지식으로 대표 변수 선택.
  3. Collider 는 절대 포함하지 않기 — 두 변수의 공통 결과를 통제하면 가짜 상관 생성.

Buisson 의 후속 챕터들이 이 원칙을 형식화한다:

  • Ch.3 — 인과 다이어그램의 기본 (Chains, Forks, Colliders 식별)
  • Ch.4 — 비즈니스 문제에서 DAG 짓는 방법
  • Ch.5 — Disjunctive Cause Criterion vs Backdoor Criterion (어떤 변수를 통제할지 결정 규칙)
직관 — 예측 vs 인과의 변수 선택 차이 정리
분석 목적 변수 선택 기준 “더 많을수록 좋은가?”
예측 예측 정확도 향상 (R², AUC) 일반적으로 그렇다 (정규화로 과적합 방지)
인과 인과 계수의 비편향 (consistency) 아니다 — 잘못 넣으면 더 나빠짐

예측 분석에서는 변수를 많이 넣고 모형이 알아서 가중치를 결정하게 한다. 인과 분석에서는 사람이 도메인 지식·DAG 로 어떤 변수를 넣을지 사전 결정 해야 한다.

4 응용 분야

영역 Confounder 사례 Collider 사례
마케팅 시즌·프로모션 (광고와 매출 양쪽 영향) 충성도 등급 (광고 노출 + 구매로 결정)
의료 환자 중증도 (치료와 회복 양쪽 영향) 입원 여부 (Berkson’s paradox)
교육 부모 교육 수준 (방과후 활동 + 성적 양쪽) 졸업 여부 (성적 + 출석으로 결정)
HR 직무 경험 (멘토링 + 성과 양쪽) 승진 여부 (성과 + 인맥으로 결정)
금융 시장 환경 (투자 결정 + 수익 양쪽) 펀드 생존 여부 (수익률 + 운용 기간)
직관 — 분석 시작 전 점검 체크리스트

비즈니스 데이터로 회귀를 돌리기 전에 다음을 점검한다.

  1. 표본 자체에 selection 이 있는가? (예: 합격자만, 입원자만, 구매자만) → Collider 조건부 가능성
  2. 시계열 데이터인가? (계절·시즌이 confounder 가 흔함)
  3. 변수 둘이 거의 같은 의미인가? (다중공선성)
  4. 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 함정")
직관 — 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
직관 — 실무 워크플로우
  1. DAG 부터 그린다 — Buisson Ch.4 절차 적용 (E-BUI4 시리즈)
  2. DAG 에서 confounder, mediator, collider 식별 — Ch.3, 5 도구 사용
  3. Backdoor criterion 적용 — 어떤 변수를 통제하면 인과 효과가 식별되는지 결정
  4. VIF 점검 — 다중공선성 확인
  5. 회귀 + 인과 효과 추정

7 관련 주제

7.1 Ch.1 의 형제 글

7.2 다음 챕터

7.4 카테고리 진입점

Subscribe

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