머신러닝/머신러닝: 실전 프로젝트 학습

아파트 경매 가격 예측 프로젝트 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)