개발일지

데이터분석 4주차 숙제 - 📄 앞서 배운 다양한 회귀 분석을 통해서 보스턴 주택 가격을 예측해봅시다. 본문

강의/데이터분석

데이터분석 4주차 숙제 - 📄 앞서 배운 다양한 회귀 분석을 통해서 보스턴 주택 가격을 예측해봅시다.

MotherCarGasoline 2022. 1. 30. 12:50

각 변수의 의미는 다음과 같습니다: 
( 저희 데이터에는 원문 링크에 있는 열이 일부 없지만 무시하셔도 괜찮습니다 🙂 )

TOWN: 소속 도시 이름  
TOWN_Number : 소속 도시의 고유 번호  
LON : 경도(Longitudes)  
LAT : 위도(Latitudes)    
**CMEDV: 주택 가격 중앙값**  
CRIM: 도시시(Town) 별 1인당 범죄율  
ZN: 25,000 평방 피트를 초과하는 거주지역의 비율  
INDUS: 비소매상업지역이 점유하고 있는 토지 비율  
CHAS: 찰스강에 대한 더미 변수(강의 경계에 위치한 경우는 1, 아니면 0)  
NOX: 소속 도시의 농축 일산화질소  
RM: 주택 1가구당 평균 방의 개수  
AGE: 1940년 이전에 건축된 소유주택의 비율  
DIS: 5개의 보스턴 직업센터까지의 접근성 지수  
RAD: 방사형 도로까지의 접근성 지수  
TAX: 10,000 달러 당 재산세율  
PTRATIO: 자치시(Town)별 학생/교사 비율  
B: 1000(Bk - 0.63)^2, 여기서 Bk는 도시(Town)별 흑인의 비율을 말한다.   
LSTAT: 하위 계층 비율

👻 Q1. 탐색적 데이터 분석을 통해 히트맵으로 시각화해봅시다.

     Q2. 앞서 자전거 수요 예측하기에서 사용했던 다음의 선형 회귀 모델을 학습합니다.

     Q3. 자전거 수요 예측 때와 마찬가지로 각 특성들의 coefficients 값을 출력해보세요.

 

  • 선형회귀 모델 학습 코드 참고
    lr = LinearRegression()
    lr.fit(x_train, y_train)
    
  • from sklearn.linear_model import LinearRegression
  • Coefficients 값 출력 예시

 

 

 


코랩시작

 

 

#데이터 로드하기

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

boston_df = pd.read_csv('Sparta_CodingClub_Boston.csv')
boston_df

해당 데이터의 각 열에 대한 설명 원문(영어)은 아래의 링크에서 확인 가능합니다.

https://www.rdocumentation.org/packages/spdep/versions/0.6-15/topics/boston

각 변수의 의미는 다음과 같습니다:

TOWN: 소속 도시 이름

TOWN_Number : 소속 도시의 고유 번호

LON : 경도(Longitudes)

LAT : 위도(Latitudes)

CMEDV: 주택 가격 중앙값

CRIM: 도시시(Town) 별 1인당 범죄율

ZN: 25,000 평방 피트를 초과하는 거주지역의 비율

INDUS: 비소매상업지역이 점유하고 있는 토지 비율

CHAS: 찰스강에 대한 더미 변수(강의 경계에 위치한 경우는 1, 아니면 0)

NOX: 소속 도시의 농축 일산화질소

RM: 주택 1가구당 평균 방의 개수

AGE: 1940년 이전에 건축된 소유주택의 비율

DIS: 5개의 보스턴 직업센터까지의 접근성 지수

RAD: 방사형 도로까지의 접근성 지수

TAX: 10,000 달러 당 재산세율

PTRATIO: 자치시(Town)별 학생/교사 비율

B: 1000(Bk - 0.63)^2, 여기서 Bk는 도시(Town)별 흑인의 비율을 말한다.

LSTAT: 하위 계층 비율

#결측값 확인 후 열 삭제

boston_df.isnull().sum()

마을 이름이 주어져있으므로, 굳이 TOWN #열은 있을 필요가 없음.

TOWN# 열은 제거

del boston_df['TOWN#']

boston_df

#상관관계 분석

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

corr = boston_df[columns].corr(method = 'pearson')
corr

# 아래의 두 커맨드를 통해 히트맵에서의 크기 조정 가능
fig = plt.figure(figsize = (14, 10))
ax = fig.gca()

# 레이블의 폰트 사이즈를 조정
sns.set(font_scale=1.5)
hm = sns.heatmap(corr.values,
            cbar=True,
            annot=True, 
            square=True,
            fmt='.2f',
            annot_kws={'size': 15},
            yticklabels=columns,
            xticklabels=columns,
            ax=ax)

plt.tight_layout()
plt.show()

CMEDV - 주택 가격은 RM - 자택당 평균 방 갯수(0.7) 및 LSTAT - 빈곤층의 비율(-0.74)과 강한 상관관계를 보이고 있다는 것을 알 수 있습니다.  
**주의할 점은 상관 계수가 -1에 가깝다고해서 상관관계가 낮은 것이 아니라 음의 상관관계가 높은 것입니다.**

#선형 회귀

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()  # 평균 0, 표준편차 1
columns = ['CRIM', 'ZN', 'INDUS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT']
boston_df[columns] = scaler.fit_transform(boston_df[columns])

boston_df

from sklearn.model_selection import train_test_split

X = boston_df[columns]
y = boston_df['CMEDV']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=777)

#회귀 분석

from sklearn.linear_model import LinearRegression

lr = LinearRegression()
lr.fit(X_train, y_train)

print(lr.score(X_test, y_test))
print(lr.score(X_train, y_train))

print(lr.coef_)

coefs = pd.DataFrame(zip(boston_df[columns].columns, lr.coef_), columns = ['feature', 'coefficients'])
coefs

위의 분석 결과에 근거한 집값 예측의 수식은 다음과 같습니다.

$y = 22.5460−0.9112\text{ CRIM}+1.1255\text{ ZN}+0.1906\text{ INDUS}−2.1860\text{ NOX}+2.4701\text{ RM}+0.0345\text{ AGE}−3.4834\text{ DIS}+2.2827\text{ RAD}−2.3896\text{ TAX}−2.0444\text{ PTRATIO}+0.7542\text{ B}−4.1742\text{ LSTAT}$

 

잘모르고 가볍게 무의식에 넣는다는 식으로 보고있다. 기초를 배우고 다시 돌려봐야할듯
Comments