Statsmodel을 활용한 회귀분석
- statsmodels 패키지에서는 OLS 클래스를 사용하여 선형 회귀분석을 실시한다
- 독립변수와 종속변수가 모두 포함된 데이터프레임이 생성되며, 상수항 결합은 하지 않아도 된다.
- from_formula 메서드의 인수로 종속변수와 독립변수를 지정하는 formula 문자열을 넣는다. data 인수로는 독립변수와 종속변수가 모두 포함된 데이터프레임을 넣는다.
- EX) model = OLS.from_formula(formula, data=df)
- 또한 독립변수만 있는 데이터프레임 X와 종속변수만 있는 데이터프레임 y를 인수로 넣어서 만들 수도 있다. 이 때는 독립변수만 있는 데이터프레임 X가 상수항을 가지고 있어야 한다.
- EX) model = OLS(dfy, dfX)
- fit 메서드로 모형 추정. scikit-learn 패키지와 달리 추정 결과는 별도의 RegressionResults 클래스 객체로 출력된다
- EX) result = model.fit()
- RegressionResults 클래스 객체는 결과를 보기 위한 summary 메서드와 예측을 위한 prediction 메서드를 제공한다.
- EX) print(result.summary())
- EX) y_new = result.predict(x_new)
- 예측을 위한 데이터는 추정시와 동일하게 상수항 결합을 해 주어야 한다.
- RegressionResults클래스는 가중치 백터를 보여주는 params와 잔차백터를 보여주는 resid속성을 가지고 있다.
OLS 회귀분석 및 결과 설명
from sklearn.datasets import load_boston
boston = load_boston()
dfX = pd.DataFrame(boston.data, columns=boston.feature_names)
dfy = pd.DataFrame(boston.target, columns=["MEDV"])
df = pd.concat([dfX, dfy], axis=1)
model1 = sm.OLS.from_formula("MEDV ~ " + "+".join(boston.feature_names), data=df)
result1 = model1.fit()
print(result1.summary())
첫번째 표
분석 결과 | 설명 |
no.observations | "Number of observations"으로 총 표본 수 |
DF Residuals | 잔차의 자유도, 전체 표본 수에서 측정되는 변수들(종속변수 및 독립변수)의 개수를 뺀것 즉, DF Residuals = 표본수 - 종속변수 개수 - 독립변수 개수 (492 = 506 - 13 - 1) |
DF Model | 독립변수의 개수 |
R-squared | 결정계수, 전체 데이터 중 해당 회귀모델이 설명할 수 있는 데이터의 비율, 회귀식의 설명력을 나타낸다성능을 나타냄(1에 가까울수록 성능이 좋음) 참고 : https://ysyblog.tistory.com/168 |
Adj. R-squared | 모델에 도움이 되는 데이터에 따라 조정된 결정계수 위 모델은 해당 회귀모델은 데이터의 73.4%을 설명한다. |
F-statistics | F 통계량으로 도출된 회귀식이 적절한지 볼 수 있음, 0과 가까울 수록 적절한 것 |
Prob(F-statistics) | 회귀식이 유의미한지 판단. (0.05이하일 경우 변수 끼리 매우 관련있다고 판단) 참고 : https://ysyblog.tistory.com/174 |
AIC | 표본의 개수와 모델의 복잡성을 기반으로 모델을 평가하며, 수치가 낮을 수록 좋음 |
BIC | AIC와 유사하나 패널티를 부여하여 AIC보다 모델 평가 성능이 더 좋으며, 수치가 낮을 수록 좋음 |
두번째 표
분석 결과 | 설명 |
coef(Coefficient) | 회귀계수 |
std err | 계수 추정치의 표준오차(standard error), 값이 작을 수록 좋음 |
t | t-test, 독립변수와 종속변수 사이의 상관관계, 값이 클 수록 상관도가 큼 |
p-value(P > |t|) | 독립변수들의 유의 확률, 0.05보다 작아야 유의미함. 위 모델의 변수들의 p-value를 살펴보면 INDUS, AGE가 0.05보다 크므로 통계적으로 유의하지 않다. 참고 : https://ysyblog.tistory.com/165 |
[0.025 0.975] | 회귀 계수의 신뢰구간 |
세번째 표
분석결과 | 설명 |
Omnibus | 디아고스티노 검정(D'Angostino's Test), 비대칭도와 첨도를 결합한 정규성 테스트이며 값이 클 수록 정규분포를 따름. |
Prob(Omnibus) | 디아고스티노 검정이 유의한지 판단 (0.05이하일 경우 유의하다고 판단) |
Skew(왜도) | 평균 주위의 잔차들의 대칭하는지를 보는 것이며, 0에 가까울수록 대칭이다. |
Kurtosis(첨도) | 잔차들의 분포 모양이며, 3에 가까울 수록 정규분포이다. (음수이면 평평한 형태, 양수는 뾰족한 형태) |
Durbin - Watson | 더빈왓슨 정규성 검정이며, 잔차의 독립성 여부를 판단. (1.5 ~ 2.5 사이일때 잔차는 독립적이라고 판단하며 0이나 4에 가까울 수록 잔차들은 자기상관을 가지고 있다고 판단) 참고 : https://ysyblog.tistory.com/120 |
Jarque - Bera (JB) | 자크베라 정규성 검정, 값이 클 수록 정규분포의 데이터를 사용했다는 것. |
Cond. No | 다중공선성 검정. 독립변수간 상관관계가 있는지 보는 것이며, 10이상이면 다중공선성이 있다고 판단. 참고 : https://ysyblog.tistory.com/122 |
Warning
- "[2] The condition number is large, 1.51e+04. This might indicate that there are strong multicollinearity or other numerical problems."은 다중공선성이 있다는 것을 알려주는 것이다.
범주형 변수 처리
- 범주형 변수 앞에 C를 붙여서 처리한다.
feature_names = list(boston.feature_names)
feature_names.remove("CHAS")
feature_names = [name for name in feature_names] + ["C(CHAS)"] #범주형 변수는 앞에 C를 붙여서 처리한다.
model2 = sm.OLS.from_formula("MEDV ~ 0 + " + "+".join(feature_names), data=df)
result2 = model2.fit()
print(result2.summary())
연속형 변수 스케일링
- 변수애 scale()를 씌워서 처리한다.
feature_names = list(boston.feature_names)
feature_names.remove("CHAS")
feature_names = ["scale({})".format(name) for name in feature_names] + ["CHAS"]
model3 = sm.OLS.from_formula("MEDV ~ " + "+".join(feature_names), data=df)
result3 = model3.fit()
print(result3.summary())
다변량회귀분석 해석 예시
- Cars93데이터의 EngineSize,RPM,Weight의 독립변수들과 Price라는 종속변수 회귀분석 모델의 해석
mtcars = pd.read_csv('Cars93.csv', index_col=0)
model2 = sm.OLS.from_formula("Price ~ EngineSize+RPM+Weight", data=mtcars)
result2 = model2.fit()
print(result2.summary())
- 상수항을 포함한 모두 회귀계수의 p-value가 0.05보다 낮아 다 통계적으로 유의함
- 수정된 결정계수가 0.547로 전체의 54.67%를 설명할 수 있다. -> 잘 설명하고 있다고 보기 힘듬
- F-statistic은 37.98, p-value는 6.75e-16로 통계적으로 유의하다.
- 결정계수가 낮기 때문에 모형이 데이터에 가지는 설명력은 낮지만, 회귀계수들이 통계적으로 유읳마ㅡ로, 자동차의 가격을 엔진크기와 RPM,무게로 추정할 수 있다.
728x90
반응형
'Data Analysis & ML > 회귀분석' 카테고리의 다른 글
[회귀분석] 회귀분석 실습(3) - 변수선택법 (R) (1) | 2023.07.23 |
---|---|
[회귀분석] 회귀분석 실습(2) - 잔차분석 (Python) (0) | 2023.07.23 |
[회귀분석] 로지스틱 회귀분석(2) - 로지스틱 회귀식과 회귀계수 추정(최대 우도 추정법(MLE)) (2) | 2023.01.24 |
[회귀분석] 로지스틱 회귀분석(1) - 오즈와 로짓 (0) | 2023.01.24 |
[회귀분석] 다중선형회귀분석(2) - 다중선형회귀모형 개념/활용/검증 (0) | 2023.01.24 |