Python) 회귀 분석 기본 사용법 정리(scikit-learn, statsmodels)

2021. 8. 11. 21:30분석 Python/구현 및 자료

파이썬에서 Linear Regression 하는 것에서 기본적인 것이 Scikit-Learn이 있는데, 통계분석을 같이 하고 싶다면 statsmodels 을 쓰는 것이 더 좋다.

 

그래서 오랜만에 쓸 기회가 있어서 사용하다가 정리를 해봤다.

목차

     

     

    Library

    import statsmodels.api as sm
    import numpy as np
    import pandas as pd
    from sklearn.linear_model import LinearRegression

    연속형 변수

    data

    spector_data = sm.datasets.spector.load(as_pandas=True)
    df = spector_data.raw_data
    y_col = ["GRADE"]
    x_cols = ["GPA","TUCE","PSI"]

    1. scikit-learn

    X = df[x_cols].values
    y = df[y_col].values
    reg = LinearRegression().fit(X, y)
    print(reg.predict(X))

    2. statsmodels(OLS)

    model = sm.OLS.from_formula("GRADE ~ GPA+TUCE+PSI", data=df)
    result = model.fit()
    result.predict(df[x_cols])
    print(result.summary())

     

    범주형 변수+ 연속형 변수 

    다들 알겠지만, 범주형 변수를 회귀 분석에 사용하려면 인코딩 방법을 사용하고, 그 중에 많이 사용되는 방법이 더미 방식이다. 그래서 이번 글에서는 더미 방식으로 처리하는 방법을 같이 소개한다.

    Data

    DATA LINK : https://www.kaggle.com/aungpyaeap/fish-market/

    df = pd.read_csv("./Fish.csv")
    y_col = ["Weight"]
    x_cols = list(set(df).difference(set(y_col)))
    fac_col = df[x_cols].select_dtypes("object").columns.tolist()
    num_col = list(set(x_cols).difference(set(fac_col)))
    for col in fac_col :
        df[col] = pd.Categorical(df[col])
    x_onehot= pd.get_dummies(df)
    new_x_cols = list(set(x_onehot).difference(set(y_col)))

    1. scikit-learn

    X = x_onehot[new_x_cols].values
    y = x_onehot[y_col].values
    reg = LinearRegression().fit(X, y)
    reg.predict(X)

     

    2. statsmodels(OLS)

    2.1 Categorical 사용해서 하는 방법

    model = sm.OLS.from_formula(f"{y_col[0]}~"+"+".join(x_cols), data=df)
    result = model.fit()
    result.predict(df[x_cols])
    result.summary()

     

     2.2 Categorical 안쓰고 하는 방법

    df = pd.read_csv("./Fish.csv")
    y_col = ["Weight"]
    x_cols = list(set(df).difference(set(y_col)))
    fac_col = df[x_cols].select_dtypes("object").columns.tolist()
    num_col = list(set(x_cols).difference(set(fac_col)))
    formula = f"{y_col[0]}~"+"+".join(num_col) + "+" + "+".join([f"C({i})"for i in fac_col])
    model = sm.OLS.from_formula(formula, data=df)
    result = model.fit()

     

      통계적인 분석이 필요한 경우에는 statsmodels이 좋으며, 교호작용이나 polynomial을 할 때도 같은 형태로 formula만 재 정의하면 되서, statsmodels이 더 좋을 것 같다. 

       

       

       

      https://www.datarobot.com/blog/multiple-regression-using-statsmodels/

       

      Multiple Regression Using Statsmodels

      Learn how multiple regression using statsmodels works, and how to apply it for machine learning automation.

      www.datarobot.com

       

      728x90