[Python] 데이터 사이언스 스쿨 - 4.6 확률론적 선형 회귀모형

Updated:

데이터 사이언스 스쿨 자료를 토대로 공부한 내용입니다.

실습과정에서 필요에 따라 내용의 누락 및 추가, 수정사항이 있습니다.


기본 세팅

import numpy as np
import pandas as pd

import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns

import warnings
%matplotlib inline
%config InlineBackend.figure_format = 'retina'

mpl.rc('font', family='NanumGothic') # 폰트 설정
mpl.rc('axes', unicode_minus=False) # 유니코드에서 음수 부호 설정

# 차트 스타일 설정
sns.set(font="NanumGothic", rc={"axes.unicode_minus":False}, style='darkgrid')
plt.rc("figure", figsize=(10,8))

warnings.filterwarnings("ignore")

4.6 확률론적 선형 회귀모형

4.6.1 모형구조

회귀분석에서 오차항과 $y$의 분포는 다음과 같다.

\[\epsilon \sim \ N(0,\sigma^{2}) , \quad Y = X\beta + \epsilon \; \rightarrow Y \sim \ N(X\beta,\sigma^{2})\]

그리고 추정회귀계수 $\hat{\beta}$ 의 분포는 다음과 같다.

\[\hat{\beta} \sim \ MN(\beta, \ \sigma^{2}(X^{T}X)^{-1})\]

$\hat{\beta}$ 의 분포는 아래와 같이 표준정규분포로 바꿔 줄 수 있다.

\[\dfrac{\hat{\beta_{i}} - \beta_{i}}{\sqrt{\sigma^{2}((X^{T}X)^{-1})_{ii}}} \sim \ Z\]

MSE(Mean Squared Error)는 아래와 같이 자유도가 $n-k$인 카이제곱분포를 따른다.

\[\quad \sqrt{\dfrac{(n-k)MSE}{\sigma^{2}}} \ = \sqrt{\dfrac{RSS}{\sigma^{2}}} \sim \ \chi^{2}(n-k)\]

표준정규분포 / 루트(카이제곱분포/자유도)는 T분포를 따르는 성질을 이용하면 $\hat{\beta}$ 의 분포는 다음과 같다.

\[\dfrac{\hat{\beta_{i}} - \beta_{i}}{\sqrt{\sigma^{2}((X^{T}X)^{-1})_{ii}}} \div \sqrt{\dfrac{MSE}{\sigma^{2}}} \ = \dfrac{\hat{\beta_{i}} - \beta_{i}}{\sqrt{MSE((X^{T}X)^{-1})_{ii}}} \sim T_{(n-k)}\]

위 설명을 다음과 같이 요약할 수 있다.

  • 오차항은 정규성, 독립성, 등분산성등을 고려해 가정한다.

  • 종속변수는 선형회귀모형으로서 모수인 회귀계수가 주어졌을 때 정규분포를 따르게 된다.

  • 추정회귀계수도 종속변수의 선형결합 형태이므로 정규분포를 따르나 실제로 모분산을 알 수 없으므로 검정에선 MSE를 사용하여 T분포를 사용한다.

4.6.2 회귀계수의 검정

from sklearn.datasets import load_boston
import statsmodels.api as sm

boston = load_boston()

df_boston = pd.DataFrame(boston.data, columns=boston.feature_names)
df_boston["MEDV"] = boston.target

# 카테고리 피처 풀랭크 방식
feature_names = list(boston.feature_names)
feature_names.remove("CHAS")
feature_names = [name for name in feature_names] + ["C(CHAS)"]

model2 = sm.OLS.from_formula("MEDV ~ 0 + " + "+".join(feature_names), data=df_boston)
result2 = model2.fit()

print(result2.summary())
                            OLS Regression Results                            
==============================================================================
Dep. Variable:                   MEDV   R-squared:                       0.741
Model:                            OLS   Adj. R-squared:                  0.734
Method:                 Least Squares   F-statistic:                     108.1
Date:                Fri, 11 Jun 2021   Prob (F-statistic):          6.72e-135
Time:                        21:56:55   Log-Likelihood:                -1498.8
No. Observations:                 506   AIC:                             3026.
Df Residuals:                     492   BIC:                             3085.
Df Model:                          13                                         
Covariance Type:            nonrobust                                         
================================================================================
                   coef    std err          t      P>|t|      [0.025      0.975]
--------------------------------------------------------------------------------
C(CHAS)[0.0]    36.4595      5.103      7.144      0.000      26.432      46.487
C(CHAS)[1.0]    39.1462      5.153      7.597      0.000      29.023      49.270
CRIM            -0.1080      0.033     -3.287      0.001      -0.173      -0.043
ZN               0.0464      0.014      3.382      0.001       0.019       0.073
INDUS            0.0206      0.061      0.334      0.738      -0.100       0.141
NOX            -17.7666      3.820     -4.651      0.000     -25.272     -10.262
RM               3.8099      0.418      9.116      0.000       2.989       4.631
AGE              0.0007      0.013      0.052      0.958      -0.025       0.027
DIS             -1.4756      0.199     -7.398      0.000      -1.867      -1.084
RAD              0.3060      0.066      4.613      0.000       0.176       0.436
TAX             -0.0123      0.004     -3.280      0.001      -0.020      -0.005
PTRATIO         -0.9527      0.131     -7.283      0.000      -1.210      -0.696
B                0.0093      0.003      3.467      0.001       0.004       0.015
LSTAT           -0.5248      0.051    -10.347      0.000      -0.624      -0.425
==============================================================================
Omnibus:                      178.041   Durbin-Watson:                   1.078
Prob(Omnibus):                  0.000   Jarque-Bera (JB):              783.126
Skew:                           1.521   Prob(JB):                    8.84e-171
Kurtosis:                       8.281   Cond. No.                     2.01e+04
==============================================================================

Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
[2] The condition number is large, 2.01e+04. This might indicate that there are
strong multicollinearity or other numerical problems.
  • 기본적으로 회귀분석 결과에 각 회귀계수가 0인지에 대해 p-value 및 신뢰구간이 나타난다.

단일계수 검정

print(result2.t_test("CRIM = -0.1"))
                             Test for Constraints                             
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
c0            -0.1080      0.033     -0.244      0.808      -0.173      -0.043
==============================================================================
  • p-value가 0.808로서 $H_{0}: \ CRIM = -0.1$을 채택한다.

  • 이 외에도 신뢰구간에 포함되는 값을 기준으로 검정하면 모두 채택될 것이다.

print(result2.t_test("C(CHAS)[0.0] = C(CHAS)[1.0]"))
                             Test for Constraints                             
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
c0            -2.6867      0.862     -3.118      0.002      -4.380      -0.994
==============================================================================
  • 현재 풀랭크 방식으로 CHAS=0 변수와 CHAS=1 변수를 사용하였다.

  • CHAS가 0과 1일 때 차이가 있다는 것을 알 수 있다.

전체 회귀계수 검정

  • $H_{0}: \ \beta_{0} = \beta_{1} = \beta_{2} = … = 0$

  • 모든 회귀계수가 0이 아닌지(유의한지) 확인하는 것으로 이는 결정계수가 0인지에 대한 귀무가설과 동일하다.

  • 회귀분석 결과의 F값과 p-value를 통해서 확인 할 수 있다.

Leave a comment