목차
1. 다중선형회귀분석 multilinear regression
- 2개 이상의 독립변수가 종속변수에 미치는 영향을 추정하는 통계기법
- 회귀식은 일반적으로 1차항으로 구성된 다항식
2. 검토사항
1. 데이터가 전제하는 가정을 만족하는가?
-
- 독립변수와 종속변수 간 선형성
-
- 오차의 정규성
-
- 오차의 등분산성
-
- 오차의 독립성
2. 회귀모델이 통계적으로 유의한가? (F통계량)
- H0: 회귀모델이 유의하지 않다.
- H1: 회귀모델이 유의하다.
3. 모델은 데이터를 얼마나 설명하는가?
- 수정된 결정계수 확인
4. 모델 내의 회귀계수는 유의한가? (T통계량)
- 모든 회귀계수가 유의한지 검정한 후, 해당 회귀계수로 식을 만들어 해석하기
5. 모델이 데이터를 잘 적합하는가?
- 모형의 잔차와 종속변수에 대한 산점도를 그리고 회귀진단하여 판단
<실습>
컬럼 삭제
- drop, axis
데이터 탐색
범주형-> 수치형 변환
- get_dummies() 원핫인코딩
- .cat.codes 정수형 변환
카테고리컬 데이터= 범주형 데이터
- 삭제를 하면 정보 손실이 일어나기 때문에, categorical data는 두 가지 방법으로 처리한다.
- One hot encoding (주로 쓰임) = 더미변수화
- Label encoding
---> 자세한 내용 이전 게시글 참조: 범주형> 수치형
https://olivia-blackcherry.tistory.com/575
formula 만들기
ols 모델 만들기
4. 다중공선성
- 모형의 일부 독립변수가 다른 독립변수와 상관관계가 높을 때 발생
- 회귀계수의 분산이 증가하므로 불안전하고 해석하기 어려움 -> 정확한 회귀계수 추정이 어려움
- 따라서 다중회귀분석 모델이 안정적이려면 두 개 이상의 독립변수들이 서로 밀접하게 관련되지 않아야 한다.
- 다시 말해 이 변수들이 linearity하게 관련되지 않아야 한다.
<검사방법>
1) 독립변수의 상관계수
- corr()
- 0.9이상이면 다중공선성 높음
2) 허용 오차
- 0.1 이하이면 다중공선성 높음.
- 1-R²
- 한 독립변수의 분산 중 다른 독립변수들에 의해 설명되지 않은 부분
3) ★ VIF(분산팽창요인)
- Variance Inflation Factors 허용오차의 역수
- 1부터 시작함
- 5 이상이면 주의가 필요함
- 10 이상이면 다중공선성 높음.
4) p-value와 결정계수
- 결정계수 값은 높으나, 독립변수의 유의확률 값이 커서 개별 독립변수가 유의하지 않다면 다중공선성을 의심해봐야 함
<핸들링>
- 다중공선성 높은 변수 삭제
- 남은 데이터로 새로운 변수 생성
- 자료부족이 원인이라면 자료 보완
- Ridge 규제화를 통해 해결
<실습>
컬럼명 바꾸기
- . 포함되어있는 것은 ols formula 적용 안됨
- A.replace(B)
A를 B로 바꿈
상관계수-> 다중공선성 확인
- 0.9이상이면 매우 높음
모델 빌딩하기
회귀식의 독립변수, 종속변수 확인하기
VIF 확인하기
- variance_inflation_factor(어디서, 몇번)
- 10 이상이면 다중공선성 높음
변수 제거 : MPGcity
- 유의확률 높은 length 변수 제거
- 최종적으로 AIC 낮아짐, 전체적인 유의확률 낮아짐
5. 변수선택법
- 요즘은 릿지, 라소를 이용해서 변수선택법을 현업에서 쓰지는 않지만 ADP 문제를 대비하여 배운다
- 변수를 선택할 때는 F-통계량, AIC(패널티) 같은 특정 기준을 근거로 변수를 제거하거나 선택한다.
- F-통계량이 높을 수록, AIC가 낮을 수록 좋다.
- 전진선택법/후진제거법/단계선택법
<코드 실습>
- 전진 선택법
- 후진 제거법
- 단계 선택법
import time
import itertools
def processSubset(X,y, feature_set):
model= sm.OLS(y, X[list(feature_set)])
regr=model.fit()
AIC=regr.aic
return {"model": regr, "AIC":AIC}
# 전진선택법
def forward(X, y, predictors):
remaining_predictors= [p for p in X.columns.difference(['Intercept']) if p not in predictors]
results=[]
for p in remaining_predictors:
results.append(processSubset(X=X, y=y, feature_set=predictors +[p]+['Intercept']))
models= pd.DataFrame(results)
best_model= models.loc[models['AIC'].argmin()]
print("Processed", models.shape[0], "models on", len(predictors)+1, "predictors in")
print('Selected predictors:', best_model['model'].model.exog_names, 'AIC:', best_model[0])
return best_model
# 후진소거법
def backward(X,y,predictors):
tic= time.time()
results=[]
for combo in itertools.combinations(predictors, len(predictors)-1):
results.append(processSubset(X=X, y=y, feature_set=list(combo)+['Intercept']))
models= pd.DataFrame(results)
best_model= models.loc[models['AIC'].argmin()]
toc= time.time()
print("Processed ", models.shape[0], "models on", len(predictors)-1, "predictors in", (toc - tic))
print('Selected predictors:', best_model['model'].model.exog_names, 'AIC:', best_model[0])
return best_model
# 단계적 선택법
def stepwise_model(X, y):
Stepmodels = pd.DataFrame(columns=['AIC', 'model'])
tic= time.time()
predictors=[]
Smodel_before = processSubset(X, y, predictors+['Intercept'])['AIC']
for i in range(1, len(X.columns.difference(['Intercept']))+1):
Forward_result = forward(X=X, y=y, predictors=predictors)
print('forward')
Stepmodels.loc[i]=Forward_result
predictors= Stepmodels.loc[i]['model'].model.exog_names
predictors = [k for k in predictors if k !='Intercept']
Backward_result= backward(X=X, y=y, predictors=predictors)
if Backward_result['AIC']< Forward_result['AIC']:
Stepmodels.loc[i] = Backward_result
predictors= Stepmodels.loc[i]["model"].model.exog_names
Smodel_before= Stepmodels.loc[i]['AIC']
predictors= [k for k in predictors if k!= 'Intercept']
print('backward')
if Stepmodels.loc[i]['AIC']> Smodel_before:
break
else:
Smodel_before= Stepmodels.loc[i]["AIC"]
toc= time.time()
print("Total elapsed time:", (toc-tic), "seconds")
return (Stepmodels['model'][len(Stepmodels['model'])])
가능한 단계적 선택법을 취하며, 최적의 모델을 구하는 코드
# 최적의 모델
Stepwise_best_model= stepwise_model(X=X, y=Y)
결과값