Certificate/ADP

[ADP 데이터분석 전문가- 통계편] 다중선형회귀분석, multi linear regression, 다중공선성, vif, 허용오차, 원핫인코딩, 라벨인코딩, 변수선택법, 단계적선택법 코드, 실습

Olivia-BlackCherry 2023. 10. 24. 15:26

1. 다중선형회귀분석 multilinear regression

  • 2개 이상의 독립변수가 종속변수에 미치는 영향을 추정하는 통계기법
  • 회귀식은 일반적으로 1차항으로 구성된 다항식

 

2. 검토사항

1. 데이터가 전제하는 가정을 만족하는가?

    1. 독립변수와 종속변수 간 선형성
    1. 오차의 정규성
    1. 오차의 등분산성
    1. 오차의 독립성

2. 회귀모델이 통계적으로 유의한가? (F통계량)

  • H0: 회귀모델이 유의하지 않다.
  • H1: 회귀모델이 유의하다.

3. 모델은 데이터를 얼마나 설명하는가?

  • 수정된 결정계수 확인

4. 모델 내의 회귀계수는 유의한가? (T통계량)

  • 모든 회귀계수가 유의한지 검정한 후, 해당 회귀계수로 식을 만들어 해석하기

5. 모델이 데이터를 잘 적합하는가?

  • 모형의 잔차와 종속변수에 대한 산점도를 그리고 회귀진단하여 판단

 

 

 

<실습>

kc_house_data.csv
2.02MB

 

 

컬럼 삭제

- drop, axis

 

데이터 탐색

 

범주형-> 수치형 변환

- get_dummies()  원핫인코딩

- .cat.codes 정수형 변환

카테고리컬 데이터= 범주형 데이터
- 삭제를 하면 정보 손실이 일어나기 때문에, categorical data는 두 가지 방법으로 처리한다.
  1. One hot encoding (주로 쓰임) = 더미변수화
  2. Label encoding

---> 자세한 내용 이전 게시글 참조: 범주형> 수치형

https://olivia-blackcherry.tistory.com/575

 

categorical data to numerical data, value_counts(), Categorical(), qcut(), .cat.codes, get_dummies(), pivot(), heatmap

목차 Categorical data Data that is divided into a limited number of qualitative groups 어떠한 기준에 의해 분류되는 데이터이다. 데이터분석에서는 카테고리테이터를 numerical data, 숫자형 데이터로 바꾸는 작업이

olivia-blackcherry.tistory.com

 

 

 

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 규제화를 통해 해결

 

 

<실습>

Cars93.csv
0.01MB

 

 

컬럼명 바꾸기 

- . 포함되어있는 것은 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)

 

결과값