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/
728x90
'분석 Python > 구현 및 자료' 카테고리의 다른 글
Python) most frequent speed test (0) | 2021.12.24 |
---|---|
선형 Kalman Filtering 알아보기 (0) | 2021.10.08 |
notion-py를 사용하여 캘린더 만들기 (0) | 2021.08.08 |
Python) Yield 에 대해서 알아보기 (0) | 2021.08.07 |
or-tools) 제한 조건 만족하는 특정 인자에 대한 경우의 수 찾기 (0) | 2021.08.01 |