주택 가격 예측¶
Kaggle House Prices 데이터 기반 회귀 분석 프로젝트
개요¶
Kaggle의 House Prices 데이터셋을 활용한 주택 가격 예측 프로젝트. 다양한 회귀 모델을 비교하고 앙상블 기법을 적용하여 예측 성능을 최적화했다.
- 데이터 출처: Kaggle House Prices
- 분석 도구: Python, scikit-learn, XGBoost, LightGBM
문제정의¶
주택 가격은 다양한 특성(위치, 면적, 연식 등)에 의해 결정된다.
핵심 질문: 1. 어떤 특성이 주택 가격에 가장 큰 영향을 미치는가? 2. 범주형 변수와 가격 간의 상관관계는? 3. 어떤 모델이 가장 좋은 예측 성능을 보이는가?
데이터¶
데이터셋 구조¶
| 구분 | 설명 |
|---|---|
| Train | 1,460건 |
| Test | 1,459건 |
| Features | 79개 (수치형 + 범주형) |
| Target | SalePrice (주택 판매가격) |
주요 특성¶
| 특성 | 타입 | 설명 |
|---|---|---|
| LotArea | 수치형 | 부지 면적 |
| OverallQual | 수치형 | 전반적 품질 (1-10) |
| YearBuilt | 수치형 | 건축 연도 |
| TotalBsmtSF | 수치형 | 지하실 면적 |
| GrLivArea | 수치형 | 지상 생활 면적 |
| Neighborhood | 범주형 | 동네 |
분석/모델링¶
1. 범주형 변수 상관관계 분석¶
# 원-핫 인코딩 후 상관관계 계산
correlation_dict = {}
for col in categorical_cols:
dummies = pd.get_dummies(df[col], prefix=col)
for dummy_col in dummies.columns:
corr = dummies[dummy_col].corr(df['SalePrice'])
correlation_dict[dummy_col] = corr
2. 이상치 처리¶
# train 데이터의 극단치를 test 평균값으로 대체
for col in ['LotFrontage', 'LotArea']:
mask = train[col] > test[col].max()
train.loc[mask, col] = test[col].mean()
3. 모델 학습¶
Lasso Regression
Gradient Boosting
from sklearn.ensemble import GradientBoostingRegressor
gbm = GradientBoostingRegressor(n_estimators=100, max_depth=5)
gbm.fit(X_train, y_train)
결과¶
모델별 예측 성능¶

Lasso 회귀 모델의 실제값 vs 예측값 - 대각선에 점들이 밀집

Gradient Boosting 모델의 실제값 vs 예측값
성능 비교¶
| 모델 | RMSE | R2 Score |
|---|---|---|
| Linear Regression | 0.142 | 0.89 |
| Lasso | 0.128 | 0.91 |
| Ridge | 0.130 | 0.90 |
| Gradient Boosting | 0.118 | 0.93 |
| XGBoost | 0.115 | 0.94 |
배운 점¶
- 특성 중요도: OverallQual, GrLivArea가 가격에 가장 큰 영향
- 이상치 처리: train/test 분포 차이를 고려한 처리 필요
- 앙상블 효과: 단일 모델보다 앙상블(Stacking)이 더 좋은 성능
기술 스택¶
| 분류 | 도구 |
|---|---|
| 언어 | Python |
| 분석 | pandas, numpy |
| 모델링 | scikit-learn, XGBoost, LightGBM |
| 시각화 | matplotlib, seaborn |