[Python]다중회귀분석 실습 - 데이터 불러오기부터 회귀계수까지

2020. 6. 13. 15:46ML in Python/Python

실습에 사용될 데이터 : 보스턴 주택 데이터

Target Data

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

Feature Data

CRIM: 범죄율
INDUS: 비소매상업지역 면적 비율
NOX: 일산화질소 농도
RM: 주택당 방 수
LSTAT: 인구 중 하위 계층 비율
B: 인구 중 흑인 비율
PTRATIO: 학생/교사 비율
ZN: 25,000 평방피트를 초과 거주지역 비율
CHAS: 찰스강의 경계에 위치한 경우는 1, 아니면 0
AGE: 1940년 이전에 건축된 주택의 비율
RAD: 방사형 고속도로까지의 거리
DIS: 직업센터의 거리
TAX: 재산세율'''

Boston_house.csv
0.03MB


import pandas as pd         #DataFrame 활용 라이브럴
import numpy as np          #행렬 활용 라이브러리
import statsmdels.api as sm #통계기법 활용 라이브러리

# 데이터 불러오기 

boston = pd.read_csv("./Boston_house.csv")   
# 파이썬 파일과 동일한 폴더 내에 csv파일이 존재해야함.
boston

boston.csv File 

boston_data = boston.drop(['Target'],axis=1)   # Feature에서 Target Data 분리

target = boston[['Target']] # Target 변수저장
x_data = boston[["CRIM","RM","LSTAT"]]
# df[[col]] - DataFrame형태로 컬럼 추출 / df[col] - Series형태로 컬럼추출

x_data.head()

x_data.head()   (CRIM,RM,LSTAT) 

# 회귀분석을 하기 위한 B_0, 상수항 추가
x_data1 = sm.add_constant(x_data, has_constant = "add")

# 회귀모델 적합
multi_model = sm.OLS(target, x_data1)
fitted_multi_model = multi_model.fit()

# summary함수를 통해 OLS 결과 출력
fitted_multi_model.summary()

OLS summary

 위의 sm.OLS(target, x_data1).fit().summary()를 통해 나온 결과는 다중공선성, 오차항의 정규성, 등분산성 등의 기본가정의 문제가 위배된 경우를 처리하여 분석해주지 않는다. 이는 분석가의 역량이며, 다음에 다중공선성을 확인하는 과정을 진행하겠다.

## 다중선형회귀모델의 회귀 계수
print(fitted_multi_model.params)

회귀계수 print

 OLS summary와 동일하다. 

# 행렬 연산을 통해 beta구하기
# (X'X)^(-1)*X'Y

from numpy import linalg                      #행렬의 역행렬을 구하기 위한 라이브러리

ba = linalg.inv(np.dot(x_data1.T, x_data1))   #inverse matrix in python
np.dot(np.dot(ba, x_data1.T),target)

# 위에 다중선형회귀모델의 회귀계수와 정확히 일치하는 것을 확인가능.
# analytic한 솔루션 = 식이 존재해서 그식을 한 번에 풀 수 있는 방식이 존재

행렬연산 다중회귀분석

행렬 연산을 통해 구한 beta와 OLS fit을 통한 parameters와 동일하다.

# y_hat 구하기

pred4 = fitted_multi_model.predict(x_data1)

# residual plot 구하기

fitted_multi_model.resid.plot()
plt.xlabel("residual_number")
plt.show()

다중회귀분석을 통한 residual plot

# 단순선형회귀분석 / 이전 게시글에서 확인 / 동일한 방법 반복
fitted_midel1.resid.plot(label = "crim")
fitted_midel2.resid.plot(label = "rm")
fitted_midel3.resid.plot(label = "lstat")

# 다중회귀분석 
fitted_multi_model.resid.plot(label = "full")
plt.legend()

단순선형회귀분석과 다중회귀분석 잔차비교 plot

 위의 잔차그래프를 확인하면, full model이 가장 잔차가 적다. 그 이유는 3개의 변수를 사용한 다중회귀분석이 R^2(결정계수)가 가장 높기 때문이다. 하지만, R^2가 높아도 다중공선성의 문제가 발생할 수 있다. 그리고 더 좋은 변수가 있는지 또한 데이터에서 검정을 통해 확인하는 작업이 필요하다.