Project & Kaggle

보스턴 집 값 예측 - Boston Housing price Regression

판교데싸 2020. 4. 24. 10:03

1. 분석 목적

Linear Regression을 활용하여 Boston Price를 예측하기

 

2.변수 설명 :

Feature Description

  • TOWN : 지역 이름
  • LON, LAT : 위도, 경도 정보
  • CMEDV : 해당 지역의 집값(중간값)
  • CRIM : 근방 범죄율
  • ZN : 주택지 비율
  • INDUS : 상업적 비즈니스에 활용되지 않는 농지 면적
  • CHAS : 경계선에 강에 있는지 여부
  • NOX : 산화 질소 농도
  • RM : 자택당 평균 방 갯수
  • AGE : 1940 년 이전에 건설된 비율
  • DIS : 5 개의 보스턴 고용 센터와의 거리에 다른 가중치 부여
  • RAD : radial 고속도로와의 접근성 지수
  • TAX : 10000달러당 재산세
  • PTRATIO : 지역별 학생-교사 비율
  • B : 지역의 흑인 지수 (1000(B - 0.63)^2), B는 흑인의 비율.
  • LSTAT : 빈곤층의 비율

3. 타겟변수

  • 1978 보스턴 주택 가격
  • 506개 타운의 주택 가격 중앙값 (단위 1,000 달러)

 

%matplotlib inline       #시각화 라이브러리 설치 ,판다스 ,넘파이 설치 등
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

import warnings
warnings.filterwarnings("ignore")

 

df.head()  #  5개의 Column 들을 확인하여 대략적인 느낌을 확인한다 

df.shape # 행과 열을 확인

(506,17)

 

df.is.null().sum()   # null값을 확인 -> null값이 하나도 없는 데이터로 구성 

 

df.info() -> # 데이터의 대략적인 타입 확인 -> 뉴메릭값이 어떤 것이 있는지

 

df['CMEDV'].describe() ->  # CMEDV(해당지역의 집값) 컬럼에 대한 통계값을 확인한다

 

df['CMEDV'].hist(bins=50) -> # CMEDV(해당지역의 집값) 컬럼의 hist를 확인하고 막대를 50개로 나눈다

 

df.boxplot(column=['CMEDV']) -> # CMEDV(해당지역의 집값)의 Boxplot 을 확인한다.

 

numerical_columns = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 
                     'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 
                     'B', 'LSTAT']

fig = plt.figure(figsize = (16, 20))
ax = fig.gca()

df[numerical_columns].hist(ax=ax)
plt.show()  #설명변수들 (16,20)으로의 크기로 뉴메리컬한 컬럼 시각화

cols=['CRIM','ZN','INDUS','CHAS','NOX','RM','AGE','DIS','RAD','TAX','PTRATIO','B','LSTAT']
corr=df[cols].corr(method='pearson')   # 설명변수들의 상관관계 보기  ,  RM과 CMEDV가 상관관계가 높음을 알 수있음

fig=plt.figure(figsize=(16,20))
ax=fig.gca()

sns.set(font_scale=1.5)
hm=sns.heatmap(corr.values,annot=True,fmt='.2f',annot_kws={'size':15},yticklabels=cols,xticklabels=cols,ax=ax)
plt.tight_layout()
plt.show() #설명 변수와 종속 변수의 관계 탐색 (RM과 CMEDV)

 

 

 

 

 

 

plt.plot('LSTAT', 'CMEDV', 
         data=df, 
         linestyle='none', 
         marker='o', 
         markersize=5, 
         color='blue', 
         alpha=0.5) 
plt.title('Scatter Plot') 
plt.xlabel('LSTAT') 
plt.ylabel('CMEDV') 
plt.show()  # Lstat 과 CMEDV는 음의 상관관계가큼

 

 

 집값 예측 분석 : 회귀분석

    데이터 전처리

from sklearn.preprocessing import StandardScaler

# feature standardization
scaler = StandardScaler()
scale_columns = ['CRIM', 'ZN', 'INDUS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT']
df[scale_columns] = scaler.fit_transform(df[scale_columns])  #feature 표준화

 

from sklearn import linear_model
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
from math import sqrt

# dataset split to train/test
X = df[scale_columns]
y = df['CMEDV']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=33)  #데이터셋 8:2로 분리

 

# train regression model
lr = linear_model.LinearRegression()
model = lr.fit(X_train, y_train)    # 회귀 모델 학습

# print coef
print(lr.coef_)  #회귀계수 출력

# print r2 score
print(model.score(X_train, y_train))
print(model.score(X_test, y_test))

0.7423254512717083, 0.7058382423177554

 

# print rmse
y_predictions = lr.predict(X_train)
print(sqrt(mean_squared_error(y_train, y_predictions)))

y_predictions = lr.predict(X_test)
print(sqrt(mean_squared_error(y_test, y_predictions)))

4.734144294797511, 4.576957797795082

import statsmodels.api as sm

X_train = sm.add_constant(X_train)
model = sm.OLS(y_train, X_train).fit()
model.summary()  # featrue 유의성 검정

#다중공선성 확인

from statsmodels.stats.outliers_influence import variance_inflation_factor

vif = pd.DataFrame()
vif["VIF Factor"] = [variance_inflation_factor(X_train.values, i) for i in range(X_train.shape[1])]
vif["features"] = X_train.columns
vif.round(1)

  vif가 10이상이면 다중공선성이 높은것

다중공선성이 높은 것 이 없으므로 마무리

 

 

 

 

 

 

 

 

 

 

 

 

반응형
반응형