어제는 변수 하나의 분포를 봤다. 오늘은 변수 사이의 관계를 본다. 두 변수가 함께 움직이는가, 그렇다면 얼마나 강하게 어느 방향으로 움직이는가, 그리고 가장 위험한 질문 — 함께 움직인다고 한쪽이 다른 쪽의 원인인가?
MLS-C01 Domain 2는 상관 분석을 EDA의 핵심 도구로 다룬다. 상관은 특성 선택, 다중공선성 진단, "이 피처를 넣어야 하나?" 판단을 이끈다. 그러나 상관과 인과를 혼동하는 것은 데이터 과학에서 가장 비싼 실수다.
상관계수(correlation coefficient)는 두 변수가 함께 변하는 정도를 수치화한다. 종류마다 측정 대상과 가정이 다르다.
계수
측정 대상
가정·성질
범위
Pearson
선형 관계
연속형, 정규성 선호, 이상치에 민감
−1 ~ +1
Spearman
단조 관계
순위 기반, 비선형·이상치에 강건
−1 ~ +1
Kendall's τ
순위 일치도
순위 기반, 표본이 작거나 동점이 많을 때 강건
−1 ~ +1
+1: 완전한 양의 관계(하나가 오르면 다른 하나도 오른다)
0: 선형(또는 단조) 관계 없음
−1: 완전한 음의 관계
Pearson은 선형 관계만 잡는다. U자형처럼 강한 비선형 곡선은 Pearson r이 0 근처여도 실제로는 강하게 연관돼 있다. 그럴 때는 순위 기반 Spearman이 더 유용하다.
강한 양의 선형 강한 U자형(비선형) 이상치 하나가 만든 가짜 상관
· · · ·
· · · · ← 이 한 점이
· · · ···· r을 끌어올림
· ··· ····
r ≈ +0.95 (Pearson OK) r ≈ 0 (Pearson 실패) r 높지만 실체 없음
→ Spearman·산점도 → 산점도로 확인 필수
import pandas as pddf = pd.read_csv("data/marketing.csv")# Pearson: 선형 관계print(df[["ad_spend", "revenue"]].corr(method="pearson"))# Spearman: 단조 관계 (비선형·이상치에 강건)print(df[["ad_spend", "revenue"]].corr(method="spearman"))# 전체 상관행렬 (특성 선택·다중공선성 점검)corr_matrix = df.corr(numeric_only=True)
Pearson r은 두 변수를 표준화한 뒤의 공분산이며, 회귀의 R²와 직접 연결된다(단순 선형 회귀에서 R² = r²). r = 0.7이면 R² = 0.49로, 한 변수가 다른 변수 분산의 약 49%를 설명한다는 뜻이다. 중요한 것은 r이 선형성만 측정한다는 점이다. 앤스컴의 4중주는 r이 같아도 산점도가 완전히 다를 수 있음을 보여 준다. 상관계수는 언제나 산점도와 함께 해석해야 한다.
import seaborn as snsimport matplotlib.pyplot as pltfrom statsmodels.stats.outliers_influence import variance_inflation_factor# 상관 히트맵: 다중공선성 1차 스캔corr = df.corr(numeric_only=True)sns.heatmap(corr, annot=True, cmap="coolwarm", center=0)plt.show()# 정량 진단: VIFX = df[["ad_spend", "impressions", "clicks"]]vif = pd.DataFrame({ "feature": X.columns, "VIF": [variance_inflation_factor(X.values, i) for i in range(X.shape[1])],})print(vif) # VIF > 10이면 강한 다중공선성
트리 기반 모델(Random Forest, XGBoost)은 다중공선성에 상대적으로 둔감하다. 분할할 때 상관된 변수들 중 하나만 선택하면 되므로 예측 성능이 크게 떨어지지 않는다. 다만 상관된 변수들이 중요도를 나눠 가져 개별 중요도가 과소평가될 수 있다. 반면 선형·로지스틱 회귀는 계수 추정 자체가 불안정해진다. 다중공선성 민감도는 알고리즘에 따라 다르다는 점이 시험 포인트다.