코딩걸음마

다중선형회귀분석에서 다중공선성 확인 및 제거하기 (with VIF) 본문

딥러닝_Pytorch

다중선형회귀분석에서 다중공선성 확인 및 제거하기 (with VIF)

코딩걸음마 2022. 6. 21. 16:23
728x90
단순 선형회귀 분석과 다르게 다중 선형 회귀 분석은 다중공선성을 주의해야 합니다.

다중공선성(Multicollinearity) 이란?

독립변수들이 강한 선형관계에 있을때 다중 공선성이 있다고 할수 있다.
종속변수를 설명하기 위한 독립변수가 매우 비슷한 영역을 설명하고 있다.
다중공선성이 있으면 잘못된 변수의 해석이나 예측의 정확도 하락의 결과를 가져올수 있다.
독립변수들의 잔차가 강한 상관관계를 갖는경우
 
 
아래 코드로 다중공선성을 제거하는 과정을 봅시다.

1. 기초 모듈불러오기

%config InlineBackend.figure_formats = {'png', 'retina'}

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

import warnings
warnings.filterwarnings('ignore')

2. 데이터프레임 불러오기

df = pd.read_csv("advertising.csv")
df.tail(2)

3.시각화로 확인해보기

plt.scatter(df["TV"], df["sales"], label="TV")
plt.scatter(df["radio"], df["sales"], label="radio", c='r')
plt.scatter(df["newspaper"], df["sales"], label="newspaper")
plt.legend()
plt.show()

feature간의 독립성이 있는지(상관관계가 낮은지)파악하자

4.상관계수로 확인해보기

sns.heatmap(df.drop(columns=["sales"]).corr(), annot=True)
plt.show()

5. VIF(Variance inflation factor)로 파악하기

- 분산 팽창 요인 분석
- 변수들간의 correlation을 진단하는 방법
- 특정 feature를 y값으로 설정하여 모델을 만들었을때 나오는 결정계수(r-squared)로 아래의 수식을 연산
- 결정계수가 1에 가까울수록 VIF가 커진다..
- VIF가 10이상인 경우 다중공선성으로 판단(10이라는 수치가 절대적이진 않다)
features_df = df.drop(columns=["sales"])
features_df.tail(2)

VIF 계산

import statsmodels.api as sm

feature = features_df[["radio", "newspaper"]]
target = features_df["TV"]
model = sm.OLS(target, feature).fit()
1 / (1 - model.rsquared)
from statsmodels.stats.outliers_influence import variance_inflation_factor
variance_inflation_factor(features_df.values, 0)

 

DataFrame으로 출력

pd.DataFrame({
    "VIF Factor": [variance_inflation_factor(features_df.values, idx) for idx in range(features_df.shape[1])],
    "features": features_df.columns,
})
보통 10이상이면 다중공선성이 있다고 판단한다.
VIF 지표로는 빼야할 feature가 없는걸로 나옴 > 모든 지표가 절대적이지 않음
 
728x90
Comments