머신러닝/머신러닝: 실전 프로젝트 학습
아파트 경매 가격 예측 프로젝트 1 : 데이터 분석 및 기본 예측
qordnswnd123
2025. 1. 7. 14:34
1. 데이터 로드
import pandas as pd
train = pd.read_csv('train.csv')
test = pd.read_csv('test.csv')
submission = pd.read_csv('sample_submission.csv')
result = pd.read_csv('Auction_result.csv')
2. 데이터 확인
train.head(5)
train.info()
result
※ 결과 해석
이번 프로젝트는 가격을 예측하는 문제이므로 회귀문제입니다.
총 41개의 피처가 존재하며 1933개의 행으로 이루어져 있습니다.
또한 6개의 피처에는 결측치가 존재합니다.
result 에서 Auction_key 열의 값이 1일 때 Appraisal_price(감정가) 값이 감소한 것을 확인할 수 있으나, 감소하기 전과 후의 차이가 약 5년이므로, 건물 가격에 감가상각이 반영된 것으로 보입니다.
또한, '유찰'이 발생할 때 Minimum_sales_price(최저매각가격) 값이 감소합니다.
3. 열(column) 이름 변경
train = train.rename(columns={'point.y':'point_y', 'point.x' : 'point_x'})
test = test.rename(columns={'point.y':'point_y', 'point.x' : 'point_x'})
4. 문자형 변수 & 결측값 처리
Auction_key 열(column), 문자열 값을 가지는 열, 결측값이 존재하는 열을 모두 제거합니다.
train = train.drop(labels = ['Auction_key', 'Auction_class', 'Bid_class', 'Appraisal_company', 'Appraisal_date',
'First_auction_date', 'Final_auction_date', 'Final_result', 'Creditor',
'addr_do', 'addr_si', 'addr_dong' , 'addr_li', 'addr_san','addr_bunji1',
'addr_bunji2','addr_etc', 'Apartment_usage', 'Preserve_regist_date', 'Specific',
'Share_auction_YorN', 'road_name', 'road_bunji1', 'road_bunji2', 'Close_date',
'Close_result'], axis = 1)
test = test.drop(labels = ['Auction_key', 'Auction_class', 'Bid_class', 'Appraisal_company', 'Appraisal_date',
'First_auction_date', 'Final_auction_date', 'Final_result', 'Creditor',
'addr_do', 'addr_si', 'addr_dong' , 'addr_li', 'addr_san', 'addr_bunji1',
'addr_bunji2','addr_etc', 'Apartment_usage', 'Preserve_regist_date', 'Specific',
'Share_auction_YorN', 'road_name', 'road_bunji1', 'road_bunji2', 'Close_date',
'Close_result'], axis = 1)
5. 종속변수 & 독립변수 설정
original_y = train['Hammer_price']
features = ['Claim_price', 'Auction_count', 'Auction_miscarriage_count',
'Total_land_gross_area', 'Total_land_real_area',
'Total_land_auction_area', 'Total_building_area',
'Total_building_auction_area', 'Total_appraisal_price',
'Minimum_sales_price', 'Total_floor', 'Current_floor', 'point_y',
'point_x']
original_x = train[features]
6. train/validation 분리 및 formula 회귀분석을 위해서 concat 결합
formula 회귀분석을 원활하게 학습하려면 인자에 피처와 타겟이 합쳐진 데이터셋을 넣어 주어야 합니다.
from sklearn.model_selection import train_test_split
X_train, X_valid, y_train, y_valid = train_test_split(original_x, original_y, test_size=0.3, random_state=42)
xy_train = pd.concat(objs=[X_train, y_train], axis = 1)
7. 회귀분석을 위한 Formula 작성
formula = """
Hammer_price ~ Claim_price + Auction_count
+ Auction_miscarriage_count + Total_land_gross_area
+ Total_land_real_area + Total_land_auction_area
+ Total_building_area + Total_building_auction_area
+ Total_appraisal_price + Minimum_sales_price + Total_floor
+ Current_floor + point_x + point_y
"""
※ 결과 해석
코드에서 종속변수 ~ 독립변수1 + 독립변수2...의 형태로 formula 변수를 정의하였습니다.
statsmodels 라이브러리의 from_formula() 메서드를 사용하기 위해 문자열로 회귀식을 정의한 것입니다.
8. Hammer_price 모델 학습 & 예측
- statsmodels.api 패키지를 sm으로 임포트합니다.
- from_formula() 메서드를 사용하여 회귀식에 기반한 OLS(Ordinary Least Squares) 회귀 모델 객체를 생성합니다.
formula에는 회귀식이 포함된 문자열을, data에는 회귀식에 사용된 데이터프레임인 Xy_train을 전달합니다. - fit() 메서드를 사용하여 생성된 회귀 모델을 데이터에 적합(fit)시킵니다.
- 피팅된 모델을 바탕으로 predict() 메서드를 사용하여 X_valid 데이터에 대한 예측을 수행합니다.
predict() 메서드는 주어진 독립변수 데이터(X_valid)를 기반으로 종속변수(Hammer_price)에 속하는 예측 값을 반환하며, 이를 통해 검증 데이터에 대한 예측 결과를 반환합니다.
import statsmodels.api as sm
model = sm.OLS.from_formula(formula, data = xy_train)
model = model.fit()
predict = model.predict(X_valid)
※ 결과 해석
OLS 클래스의 from_formula()는 최소자승법(잔차 제곱의 합을 최소화)이라는 통계적인 방법을 사용한 모델입니다.
독립변수와 종속변수 간의 관계를 가장 잘 나타내는 회귀선을 추정하는데 사용하며,
데이터의 실제 값과 예측 값 간의 차이를 최소화하는 방향으로 회귀선을 조정합니다.
9. RMSE 평가
from sklearn.metrics import mean_squared_error
RMSE = mean_squared_error(y_valid, predict)**0.5
RMSE
131097975.89278454
10. 모든 데이터 결합하기
original_xy = pd.concat([original_x, original_y], axis=1)
11. Hammer_price 모델 학습 & 예측
model = sm.OLS.from_formula(formula, data = original_xy)
model = model.fit()
predict = model.predict(test)
predict.head()
0 2.102551e+08
1 2.122806e+08
2 2.110490e+08
3 2.105021e+08
4 2.094083e+08
dtype: float64
12. submission 파일에 예측값 입력 및 저장
submission['Hammer_price'] = predict
submission.to_csv('submission.csv', index=False)