OLS Regression Results
==============================================================================
Dep. Variable: MEDV R-squared: 0.333
Model: OLS Adj. R-squared: 0.329
Method: Least Squares F-statistic: 83.39
Date: Wed, 13 May 2020 Prob (F-statistic): 8.62e-44
Time: 16:03:11 Log-Likelihood: -1737.9
No. Observations: 506 AIC: 3484.
Df Residuals: 502 BIC: 3501.
Df Model: 3
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
Intercept -0.0038 0.000 -8.543 0.000 -0.005 -0.003
CRIM -0.1567 0.046 -3.376 0.001 -0.248 -0.066
ZN 0.1273 0.016 7.752 0.000 0.095 0.160
INDUS -0.1971 0.019 -10.433 0.000 -0.234 -0.160
CHAS 0.0034 0.000 12.430 0.000 0.003 0.004
NOX -0.0023 0.000 -9.285 0.000 -0.003 -0.002
RM 0.0267 0.002 14.132 0.000 0.023 0.030
AGE 0.1410 0.017 8.443 0.000 0.108 0.174
DIS -0.0286 0.004 -7.531 0.000 -0.036 -0.021
RAD 0.1094 0.018 6.163 0.000 0.075 0.144
TAX 1.077e-15 2.66e-16 4.051 0.000 5.55e-16 1.6e-15
PTRATIO -0.1124 0.011 -10.390 0.000 -0.134 -0.091
B 0.0516 0.003 19.916 0.000 0.046 0.057
LSTAT -0.6569 0.056 -11.790 0.000 -0.766 -0.547
==============================================================================
Omnibus: 39.447 Durbin-Watson: 0.863
Prob(Omnibus): 0.000 Jarque-Bera (JB): 46.611
Skew: 0.704 Prob(JB): 7.56e-11
Kurtosis: 3.479 Cond. No. 1.19e+17
==============================================================================
Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
[2] The condition number is large, 1.19e+17. This might indicate that there are
strong multicollinearity or other numerical problems.
조건수(Conditional No.)가 1000조 수준으로 증가한 것을 볼 수 있지? 오른쪽 제일 상단에 보이는 R-squared라는 값으로 표시되는 성능지표도 크게 감소한것을 볼 수 있어. R-squared 는 이 모델 성능에 대해 몇점인지를 알려주는 기능이라고 보면 되(0.333으로 나왔으니 100점 만점에 33.3점이라는 소리야)
statsmodels에서는 scale() 이라는 명령을 사용하여 스케일링을 할 수 있는데, 이 방식으로 스케일을 하면 스케일링에 사용된 평균과 표준편차를 저장하였다가 나중에 predict() 라는 명령을 사용할 때도 같은 스케일을 사용하기 때문에 편리한 것을 알 수 있어. 다만! 스케일링을 할 때에는 카테고리 변수, 즉 범주형 데이터는 스케일링을 하지 않는다는 것에 주의 해주면 되.
1 2 3 4 5 6
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=df2) result3 = model3.fit() print(result3.summary())
이번에는 연속형 데이터가 아닌 범주형 데이터의 회귀분석을 하는 방법에 대해 알아보자! 범주형 데이터는 측정 결과가 몇 개의 범주 또는 향목의 형태로 나타나는 자료를 말하는데 그것을 숫자로 표현한 것이라고 할 수 있어. 예를 들면 남자는 1 여자는 0 이런식이지!
아무튼..
여기서 다룰 학습은 그러한 범주형 독립변수(데이터)의 회귀분석 모델링 시 에는 앞서 배운 더미변수화가 필수라는 거야. 풀랭크(full-rank) 방식과 축소랭크(reduced-rank) 방식이 있는데 풀랭크방식에서는 더미변수의 값을 원핫인코딩(one-hot-encoding) 방식으로 지정을 하는거야
예를 들어서..
남자는 1 이고 여자는 0 이면
남자 : d1=1, d2=0
여자 : d1=0, d2=1 이런식으로 쓴다는 거지
축소랭크 방식에서는 특정한 하나의 범주값을 기준값(reference, baseline)으로 하고 기준값에 대응하는 더미변수의 가중치는 항상 1으로 놓아 계산 하는 방법이지
무슨 말인지 어렵지? 그럼 실 데이터로 예를 들어보도록 할게.
아래의 데이터는 1920년부터 1939년까지 영국 노팅험 지역의 기온을 나타낸 데이터야. 이 데이터에서 독립 변수는 월(monath)이며 범주값으로 처리를 할거야 그리고 value로 표기된 값이 종속변수인 해당 월의 평균 기온이라고 할 수 있지. 분석의 목적은 독립변수인 월 값을 이용하여 종속변수인 월 평균 기온을 예측하는 것이야.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
import datetime from calendar import isleap
defconvert_partial_year(number): #연 단위 숫자에서 날짜를 계산하는 코드 year = int(number) d = datetime.timedelta(days=(number - year) * (365 + isleap(year))) day_one = datetime.datetime(year, 1, 1) date = d + day_one return date
plot_partregress(endog, exog_i, exog_others, data=None, obs_labels=True, ret_coords=False)
endog: 종속변수 문자열
exog_i: 분석 대상이 되는 독립변수 문자열
exog_others: 나머지 독립변수 문자열의 리스트
data: 모든 데이터가 있는 데이터프레임
obs_labels: 데이터 라벨링 여부
ret_coords: 잔차 데이터 반환 여부
하지만! 다른 독립변수에 영향을 받은 AGE가 집값에 영향을 미쳤는지에 대한 부분을 확인해보면 그래프는 다음과 같아.
AGE 데이터에 대한 부분회귀인셈이지.
CCPR 플롯
CCPR(Component-Component plus Residual) 플롯도 부분회귀 플롯과 마찬가지로 특정한 하나의 변수의 영향을 살펴보기 위한 것이야
부분회귀분석과 비슷하지만 다른점이 하나 있는데 그것은 위에서 언급한 다른 변수에 영향을 받은 AGE가 아니라 AGE 데이터 그 자체와 집값의 상관관계를 보기위한 방법이라고 보면 되