이러한 특성을 예제를 통해 판단해보자
tv radio newspaper sales
0 230.1 37.8 69.2 22.1
1 44.5 39.3 45.1 10.4
tv / radio
에 투자한 광고비가 sales
판매량에 얼마나 영향을 끼치는지 분석해보았다.lmodel_mul = smf.ols(formula='sales ~ tv + radio',data=advdf).fit()
print(lmodel_mul.summary())
#예측 : 새로운 tv radio 값으로 sales를 추정
x_new2 = pd.DataFrame({'tv':[110,220,500],'radio':[10,30,60]})
pred_new2 = lmodel_mul.predict(x_new2)
print('추정값 : \n',pred_new2.values) #sales = [9.83 18.62 37.07]
Adj. R-squared
: 0.896
Prob (F-statistic)
: 4.83e-98
"독립변수(feature)의 변화에 따라 종속변수도 일정 크기로 변화해야 한다."
fitted = lmodel_mul.predict(advdf.iloc[:,0:2])
residual = advdf['sales'] - fitted
print('실제값 : ',advdf['sales'][:5].values)
print('예측값 : ',fitted[:5].values)
print('잔차값 : ',residual[:5].values)
실제값 : [22.1 10.4 9.3 18.5 12.9]
예측값 : [20.55 12.34 12.33 17.61 13.22]
잔차값 : [ 1.54 -1.94 -3.03 0.88 -0.32]
잔차값 평균 : 5.53e-15
( 잔차항 = 실제값 - 예측값 )
import seaborn as sns
sns.regplot(x=fitted,y=residual,lowess = True,line_kws={'color':'red'}) #추세선
plt.plot([fitted.min(),fitted.max()],[0,0],'--',color='grey') #기준선
plt.show()
"잔차항(오차항)이 정규분포를 따라야 한다."
sns.scatterplot(x=x,y=y)
plt.plot([-3,3],[-3,3],'--',color='grey')
plt.show()
# 잔차의 정규성.
print('shapiro test : ',scipy.stats.shapiro(residual).pvalue)
shapiro test : 4.19e-09 < 0.05
이므로 정규성 만족 X"독립변수의 값이 서로 관련되지 않아야 한다."
"그룹간의 분산이 유사해야 한다."
"독립변수의 모든 값에 대한 오차들의 분산은 일정해야 한다."
sns.regplot(x=fitted,y=np.sqrt(np.abs(sr)),lowess = True,line_kws={'color':'red'})
plt.show()
np.sqrt(np.abs(sr))
: sr 절대값의 제곱근.sr = scipy.stats.zscore(residual)
"다중회귀 분석 시 두 개 이상의 독립변수 간에 강한 상관관계가 있어서는 안된다"
from statsmodels.stats.outliers_influence import variance_inflation_factor
print(variance_inflation_factor(advdf.values,1)) #tv = 12.57 (다중공선성의심)
print(variance_inflation_factor(advdf.values,2)) #radio = 3.15
VIF
: 분산 팽창 인수. 이 값은 다중회귀분석에서 독립변수가
다중 공산성(Multicollnearity)의 문제를 갖고 있는지 판단하는 기준이며,
주로 10보다 크면 그 독립변수는 다중공산성이 있다고 말한다.
두 독립변수에 대한 다중공선성 분석이다. 숫자가 클수록(10이상) 다중공선성을 의심해야한다.
Cook's distance : 아웃라이어 확인 지표
from statsmodels.stats.outliers_influence import OLSInfluence
cd , _ = OLSInfluence(lmodel_mul).cooks_distance
print(cd.sort_values(ascending = False).head())
# OLSInfluence를 이용한 outliar 가 의심되는 값들이 출력된 모습.
# 130 0.258065
# 5 0.123721
# 35 0.063065
# 178 0.061401
# 126 0.048958
OLSInfluence(lmodel_mul).cooks_distance
: 극단값을 확인할 수 있는 지표를 반환함시각화
import statsmodels.api as sm
sm.graphics.influence_plot(lmodel_mul,criterion='cooks')
plt.show()
print(advdf.iloc[[130,5,35,178,126]]) # 제거 대상 행 확인