🏡 Housing EBM + DoWhy 리포트
California Housing — EBM 회귀 모델 + DoWhy 인과추론 통합 분석
EBM Regressor
R²=0.8474
DoWhy Backdoor
18,350 rows
데이터 준비
California Housing 원본 20,640개 레코드에서 이상치 제거 후 18,350개 블록을 분석에 사용한다.
ℹ️ IQR 이상치 제거 범위: AveRooms, AveOccup, Population 3개 피처에만 적용. MedHouseVal(결과 변수)은 제거 대상에서 제외 — 5.0 천장값(1,071 rows = 5.2%)은 데이터 수집 제한으로 유지.
20,640
원본 레코드
18,350
이상치 제거 후
5.2%
집값 천장값 비율
from sklearn.datasets import fetch_california_housing
import pandas as pd
data = fetch_california_housing(as_frame=True)
housing = data.frame # 20,640 rows
# IQR 이상치 제거 (결과 변수 제외)
outlier_cols = ['AveRooms', 'AveOccup', 'Population']
mask = pd.Series(True, index=housing.index)
for col in outlier_cols:
Q1, Q3 = housing[col].quantile([0.25, 0.75])
IQR = Q3 - Q1
mask &= (housing[col] >= Q1 - 1.5*IQR) & (housing[col] <= Q3 + 1.5*IQR)
housing_clean = housing[mask] # 18,350 rows
EDA 핵심 인사이트
상관관계
MedInc ↔ MedHouseVal
피어슨 상관 r = 0.688 — 피처 중 집값과 가장 강한 선형 상관을 보이는 변수. EBM이 이를 인과 분석의 처치 변수로 지목.
분포 특성
집값 천장값 (Ceiling)
MedHouseVal = 5.0 (즉 $500,000)에 1,071건(5.2%) 집중. 1990년 데이터 수집 제한으로 발생. EBM이 비선형 포화 효과를 포착.
지리적 클러스터
LA / SF 이중 봉우리 분포
Latitude·Longitude 산점도에서 로스앤젤레스(34°N)와 샌프란시스코(37.5°N) 두 클러스터가 명확히 분리된다. 두 도시의 집값 구조가 다르므로 지리 좌표가 EBM 피처 중요도 1·2위를 차지.
EBM 회귀 모델 결과
from interpret.glassbox import ExplainableBoostingRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score
import numpy as np
X = housing_clean.drop(columns=['MedHouseVal'])
y = housing_clean['MedHouseVal']
X_temp, X_test, y_temp, y_test = train_test_split(
X, y, test_size=0.1, random_state=42)
X_train, X_val, y_train, y_val = train_test_split(
X_temp, y_temp, test_size=0.1111, random_state=42)
ebm = ExplainableBoostingRegressor(
max_bins=256,
interactions=5,
random_state=42
)
ebm.fit(X_train, y_train)
val_pred = ebm.predict(X_val)
print(f"Val RMSE: {np.sqrt(mean_squared_error(y_val, val_pred)):.4f}")
print(f"Val R²: {r2_score(y_val, val_pred):.4f}")
print(f"Test R²: {r2_score(y_test, ebm.predict(X_test)):.4f}")
0.4599
Val RMSE
0.8474
Val R²
0.8377
Test R²
✅ R² 0.8474 — EBM이 Black-box 수준의 예측 성능을 내면서 각 피처 기여도를 Shape Function으로 완전히 설명. Val → Test 성능 차이(0.0097)가 작아 과적합 없음.
EBM 피처 중요도
지리 좌표(위도·경도)가 1·2위를 차지하는 것은 LA/SF 이중 클러스터 구조 때문이다. 소득(MedInc)은 3위로, 강한 인과 후보 피처임을 확인.
| 피처 | 중요도 | 역할 |
|---|---|---|
| Latitude | ~0.95 | 지역 위치 (EBM 예측용) |
| Longitude | ~0.83 | 지역 위치 (EBM 예측용) |
| MedInc | ~0.45 | 처치 변수 (DoWhy 인과분석) |
| AveOccup | ~0.28 | 교란 변수 (DoWhy DAG) |
| AveRooms | ~0.20 | 교란 변수 (DoWhy DAG) |
| HouseAge | ~0.15 | 교란 변수 (DoWhy DAG) |
DoWhy 인과분석 — MedInc → MedHouseVal
EBM이 MedInc를 3위 중요 피처로 지목하면, DoWhy가 이것이 실제 인과 효과인지 검증한다. 지리 좌표(Latitude, Longitude)를 추가 교란 변수로 통제.
from dowhy import CausalModel
model = CausalModel(
data=housing_clean,
treatment='MedInc',
outcome='MedHouseVal',
graph="""
digraph {
Latitude -> MedInc; Latitude -> MedHouseVal;
Longitude -> MedInc; Longitude -> MedHouseVal;
AveRooms -> MedInc; AveRooms -> MedHouseVal;
AveOccup -> MedInc; AveOccup -> MedHouseVal;
MedInc -> MedHouseVal;
}
"""
)
identified = model.identify_effect(proceed_when_unidentifiable=True)
estimate = model.estimate_effect(
identified,
method_name="backdoor.linear_regression"
)
print(f"ATE: {estimate.value:.4f}") # 단위: $100,000
⚠️ Housing EBM+DoWhy에서 Latitude/Longitude를 교란 변수로 추가하는 이유: 지리적 위치가 소득 구조(MedInc)와 집값(MedHouseVal) 모두에 영향을 미치는 교란이기 때문이다.
+$35,390
MedInc $10K 상승 시 ATE
(Latitude/Longitude 통제 후)
(Latitude/Longitude 통제 후)
4개
통제 교란 변수
(Lat/Lon/AveRooms/AveOccup)
(Lat/Lon/AveRooms/AveOccup)
종합 인사이트
EBM이 밝힌 것
집값의 지리 의존성
위도·경도가 1·2위 — California 집값은 "어디에 있는가"가 "어떤 집인가"보다 중요하다. LA/SF 이중 시장 구조를 EBM Shape Function이 비선형으로 포착.
DoWhy가 밝힌 것
소득의 순수 인과 효과
지역 특성을 모두 통제해도 소득 $10K 상승 → 집값 +$35,390의 인과 효과가 남는다. 부유층 유입이 실제로 집값을 밀어올린다는 인과적 증거.
"EBM은 '어디서 얼마짜리 집인지' 예측하고, DoWhy는 '소득이 오르면 집값이 얼마나 오르는지' 인과적으로 측정한다. 두 방법의 조합이 데이터 과학의 전체 그림이다."