YSY의 데이터분석 블로그

[회귀분석] 회귀분석 실습(1) - OLS 회귀분석 결과 해석 및 범주형 변수 처리 (Statsmodel) 본문

Data Analysis & ML/회귀분석

[회귀분석] 회귀분석 실습(1) - OLS 회귀분석 결과 해석 및 범주형 변수 처리 (Statsmodel)

YSY^ 2023. 7. 23. 21:39

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())

스케일링을 하니 다중공선성이 해소된 것을 알 수 있다.

 

EX) 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
반응형
Comments