Python에서 vif를 계산하는 방법
회귀분석에서 다중공선성은 두 개 이상의 설명변수가 서로 높은 상관관계를 갖고 있어서 회귀모델에서 고유하거나 독립적인 정보를 제공하지 않는 경우에 발생합니다.
변수 간의 상관 정도가 충분히 높으면 회귀 모델을 피팅하고 해석할 때 문제가 발생할 수 있습니다.
다중 공선성을 탐지하는 한 가지 방법은 회귀 모델 에서 설명 변수 간의 상관 관계 및 상관 강도를 측정하는 분산 팽창 계수(VIF) 라는 측정항목을 사용하는 것입니다.
이 튜토리얼에서는 Python에서 VIF를 계산하는 방법을 설명합니다.
예: Python에서 VIF 계산
이 예에서는 농구 선수 10명의 속성을 설명하는 데이터 세트를 사용합니다.
import numpy as np import pandas as pd #create dataset df = pd.DataFrame({'rating': [90, 85, 82, 88, 94, 90, 76, 75, 87, 86], 'points': [25, 20, 14, 16, 27, 20, 12, 15, 14, 19], 'assists': [5, 7, 7, 8, 5, 7, 6, 9, 9, 5], 'rebounds': [11, 8, 10, 6, 6, 9, 6, 10, 10, 7]}) #view dataset df rating points assists rebounds 0 90 25 5 11 1 85 20 7 8 2 82 14 7 10 3 88 16 8 6 4 94 27 5 6 5 90 20 7 9 6 76 12 6 6 7 75 15 9 10 8 87 14 9 10 9 86 19 5 7
점수를 응답 변수로 사용하고 포인트, 어시스트, 리바운드를 설명 변수로 사용하여 다중 선형 회귀 모델을 적합화한다고 가정합니다.
모델의 각 설명 변수에 대한 VIF를 계산하려면 statsmodels 라이브러리의 variance_inflation_factor() 함수를 사용할 수 있습니다.
from patsy import damatrices from statsmodels.stats.outliers_influence import variance_inflation_factor #find design matrix for linear regression model using 'rating' as response variable y, X = dmatrices('rating ~ points+assists+rebounds', data=df, return_type='dataframe') #calculate VIF for each explanatory variable vivid = pd.DataFrame() vive['VIF'] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])] vivid['variable'] = X.columns #view VIF for each explanatory variable lively Variable VIF 0 101.258171 Intercept 1 1.763977 points 2 1.959104 assists 3 1.175030 rebounds
각 설명 변수에 대한 VIF 값을 관찰할 수 있습니다.
- 포인트: 1.76
- 어시스트: 1.96
- 리바운드: 1.18
참고: 이 값은 관련이 없으므로 템플릿의 “가로채기”에 대한 VIF를 무시하십시오.
VIF 값을 해석하는 방법
VIF 값은 1부터 시작하며 상한이 없습니다. VIF를 해석하는 일반적인 규칙은 다음과 같습니다.
- 값 1은 주어진 설명 변수와 모델의 다른 설명 변수 사이에 상관 관계가 없음을 나타냅니다.
- 1과 5 사이의 값은 주어진 설명 변수와 모델의 다른 설명 변수 사이의 중간 정도의 상관 관계를 나타내지만 특별한 주의가 필요할 만큼 심각하지는 않은 경우가 많습니다.
- 5보다 큰 값은 주어진 설명 변수와 모델의 다른 설명 변수 사이에 잠재적으로 심각한 상관 관계가 있음을 나타냅니다. 이 경우 회귀 결과의 계수 추정치와 p-값은 신뢰할 수 없을 가능성이 높습니다.
우리 회귀 모델의 설명 변수의 각 VIF 값은 1에 가깝기 때문에 우리 예에서는 다중 공선성이 문제가 되지 않습니다.