카테고리 없음
[머신러닝] 캐글 : 집값 예측 분석
simplecode
2021. 7. 17. 16:55
이 분석은 다음 안내된 캐글의 자료를 인용하였습니다.
데이터셋은 미국 시애틀 King County 지역에서 2014년 5월부터 ~ 2015년 5월 까지 주택 판매 가격 데이터입니다.
https://www.kaggle.com/harlfoxem/housesalesprediction?select=kc_house_data
House Sales in King County, USA
Predict house price using regression
www.kaggle.com
우선 가장 먼저 데이터 셋을 불러옵니다
# 데이터 불러오기
import pandas as pd
import numpy as np
df = pd.read_csv('https://ds-lecture-data.s3.ap-northeast-2.amazonaws.com/kc_house_data/kc_house_data.csv')
들어가기 전에, 가격과 다른 칼럼들의 관계를 살펴볼까요?
#price와 특정 칼럼들의 관계 살펴보기
import matplotlib.pyplot as plt
import seaborn as sns
cols = ['bedrooms','bathrooms','sqft_living', 'grade', 'sqft_above','sqft_basement','sqft_living15','sqft_lot15' ]
sns.set_style("whitegrid")
fig, ax = plt.subplots(1,7, figsize = (50,8))
for i in range(0,7):
sns.scatterplot(x = cols[i], y = 'price', data = df, ax = ax[i])
#sns.scatterplot(x = 'bathrooms', y = 'price', data = df, ax = ax[0])
#sns.scatterplot(x = 'sqft_living', y = 'price', data = df, ax = ax[1])

1) 특성들과 타겟(Price)과의 연관성을 알아보기 위하여 가장 먼저 상관계수를 계산해보겠습니다.
# 상관계수 확인하기
df_corr = df.corr()
fig = plt.figure(figsize = (12,12))
sns.heatmap(df_corr, cmap = 'YlGnBu', annot = True)

1-2) 이 중에서 가장 상관관계가 높은 특성을 찾아보겠습니다.
#sqft_living이 상관관계가 제일 높음을 알 수 있습니다.
df_corr[['price']].sort_values('price',ascending=False)

price와 가장 관련이 높은 것은 sqft_living인 것을 확인할 수 있습니다.
1-3) 다음으로 타겟과의 관계를 시각화하겠습니다.
sns.regplot(x = 'sqft_living', y = 'price',
data = df, scatter_kws={"color": "pink"}, line_kws={"color": "grey"});

2) grade 와 price의 scatter plot을 그려보겠습니다.
# grade 와 price의 scatter plot
predict = df['price'].mean()
x = df['grade']
y = df['price']
sns.lineplot(x=x, y = predict, color = 'grey')
sns.scatterplot(x=x, y = y, color = 'pink');

2-2) 기준모델을 시각화해보겠습니다.

3) 특성 grade에 대한 선형회귀모델을 만들어보겠습니다.(Scikit-Learn 라이브러리 사용)
## Scikit-Learn 라이브러리에서 사용할 예측모델 클래스를 Import
from sklearn.linear_model import LinearRegression
## 예측모델 인스턴스를 만들기
model = LinearRegression()
## X 특성들의 테이블과, y 타겟 벡터 만들기
feature = ['grade']
target = ['price']
X_train = df[feature]
y_train = df[target]
## 모델 학습(fit)
model.fit(X_train, y_train)
## 새로운 데이터 한 샘플을 선택해 학습한 모델을 통해 예측해 보기
X_test = [[6]]
y_pred = model.predict(X_test)
print(f'{X_test[0][0]} grade를 가지는 주택의 예상 가격은 ${int(y_pred)} 입니다.')
>> 6 grade를 가지는 주택의 예상 가격은 $194700 입니다.
4) 만든 모델을 사용해 새로운 데이터에 대해 예측해보겠습니다.
X_test = [[15]]
y_pred = model.predict(X_test)
print(f'{X_test[0][0]} grade를 가지는 주택의 예상 가격은 ${int(y_pred)} 입니다.')
>> 15 grade를 가지는 주택의 예상 가격은 $2070818 입니다.
4-2) coefficient를 사용해 설명해보겠습니다.
#grade 특성에 대한 회귀계수
model.coef_
>>array([[208457.56245838]])
def explain_prediction(grade):
y_pred = model.predict([[grade]])
pred = f"{int(grade)} grade 주택 가격 예측: ${int(y_pred[0])} (1 grade당 추가금: ${int(model.coef_[0])})"
return pred
print(explain_prediction(15))
>> 15 grade 주택 가격 예측: $2070818 (1 grade당 추가금: $208457)

5) sqft_living 특성을 사용하여 모델을 만들어 보고 두 모델을 비교해보겠습니다.
sns.set(style='whitegrid', context='notebook')
cols = ['price', 'sqft_living','grade']
sns.pairplot(df[cols], height=2);

5-2) sqft_living에 대한 회귀계수는 다음과 같습니다.
print('회귀계수: ',model2.coef_)
print('절편: ',model2.intercept_)
>> 회귀계수: [[280.6235679]] 절편: [-43580.74309447]
다음과 같이 simple regression을 사용하여 분석을 해보았습니다.
감사합니다.