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이상이면 다중공선성이 높은것
다중공선성이 높은 것 이 없으므로 마무리
'Project & Kaggle' 카테고리의 다른 글
Dog and cat Classification with CNN (0) | 2020.12.15 |
---|---|
주택 가격 예측 with Deep Neural network (0) | 2020.12.11 |
Deep learning( CNN을 활용한 Mnist classification kernel) (0) | 2020.11.30 |
사내 직원 이탈 모델링 (2) | 2020.09.04 |
전설의 포켓몬 Classification (0) | 2020.05.06 |