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)

     

    결과값