선형회귀분석_충족조건 [ols]

kangjuju·2023년 5월 11일
0

회귀분석

목록 보기
4/11

✔️기존 가정 충족 조건

  1. 선형성 : 독립변수(feature)의 변화에 따라 종속변수도 일정 크기로 변화해야 한다.
  2. 정규성 : 잔차항(오차항)이 정규분포를 따라야 한다.
  3. 독립성 : 독립변수의 값이 서로 관련되지 않아야 한다.
  4. 등분산성 : 그룹간의 분산이 유사해야 한다. 독립변수의 모든 값에 대한 오차들의 분산은 일정해야 한다.
  5. 다중공선성 : 다중회귀 분석 시 두 개 이상의 독립변수 간에 강한 상관관계가 있어서는 안된다

이러한 특성을 예제를 통해 판단해보자


✏️다중선형회귀 분석 (ols 예제)

        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


📝충족 조건 (5가지)


1️⃣ 선형성

"독립변수(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()

  • 선형성을 만족하지 않음 : 잔차의 추세선이 파선을 기준으로 일정하지 않다.
  • 예측값과 잔차가 비슷한 패턴 유지해야한다.

2️⃣ 정규성

"잔차항(오차항)이 정규분포를 따라야 한다."

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
  • 기준선에서 밀접하게 움직이지만 커브를 그리는 것은 예후 상 좋지 않음.
  • 데이터에 log을 씌워 분석에 참여시키면 좀 더 나은 정규성을 확인할 수 있다.

3️⃣ 독립성

"독립변수의 값이 서로 관련되지 않아야 한다."

  • Durbin-Watson 검정 결과 : 2.081
    • 회귀 모델에서 잔차의 자기 상관관계에 대한 척도이다.
    • Durbin-Watson 테스트는 0~4의 척도를 사용하며,
      0~2 값은 양의 자기 상관관계를, 2~4 값은 음의 자기 상관관계를 나타낸다.
      (2에 근접할 수록 독립적임)

4️⃣ 등분산성

"그룹간의 분산이 유사해야 한다."
"독립변수의 모든 값에 대한 오차들의 분산은 일정해야 한다."

 sns.regplot(x=fitted,y=np.sqrt(np.abs(sr)),lowess = True,line_kws={'color':'red'})
plt.show()
  • 선형성과 관련이 깊다. (1.선형성 그림 참고)
  • 평균을 기준으로 데이터가 골고루 퍼지지않음. 등분산성을 만족하지 못한다.
  • np.sqrt(np.abs(sr)) : sr 절대값의 제곱근.
    여기서 sr은 잔차를 표준화한 값이다. sr = scipy.stats.zscore(residual)

5️⃣ 다중공선성

"다중회귀 분석 시 두 개 이상의 독립변수 간에 강한 상관관계가 있어서는 안된다"

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]]) # 제거 대상 행 확인

  • 원이 비정상적으로 큰 요소들은 outliar로 의심할 수 있다.

0개의 댓글