본문 바로가기
개발/Python

statsmodels ols 결과 출력하기

by 피로물든딸기 2025. 8. 15.
반응형

전체 링크

회귀 분석

가정

- 선형성 : 종속 변수와 독립 변수 간의 관계가 선형
- 정규성 : 오차는 정규분포를 따라야 한다. 
- 등분산성 : 오차의 분산은 독립 변수와 상관없이 일정
- 독립성 : 각각의 관측은 서로 독립, 어떤 관측치의 오차가 다른 관측치의 오차에 영향을 미치지 않아야 함.

Durbin-Watson 통계량으로 잔차와 독립변수 간의 상관관계가 없는지 확인

- 다중공선성 부재 : 독립 변수 각각을 종속변수로 했을 때 오차가 없이 완전히 설명이 가능한 변수가 존재하지 않아야 함.

ㄴ 다중공선성 문제가 클수록 독립 변수들의 회귀 계수의 변동성이 커지고, 신뢰 구간은 넓어진다.

 

더빈 왓슨 (Durbin Watson) 검정

- 오차항이 독립성을 만족하는지를 검정
- 통계량이 2에 가까울수록 오차항의 자기상관이 없음을 의미
- 0에 가까우면 양의 상관관계, 4에 가까우면 음의 상관관계 → 회귀식이 부적합

 

결과 해석

- 전체 회귀모형은 통계적으로 유의한가? : F검정으로 확인
    H0 : 회귀계수가 0이다. β1=β2=…=βp=0    (다중선형회귀 모든 회귀계수가 0이다.)
    H1 : 회귀계수가 0이 아니다.
        
- 개별 회귀계수는 통계적으로 유의한가? : t-검정으로 확인
    H0 : i 번째 회귀계수가 0이다. βi = 0
    H1 : i 번째 회귀계수가 0이 아니다.
        
- 모형은 데이터를 얼마나 설명할 수 있는가? 
    결정계수 R^2 = SSR / SST


회귀분석의 영향력 진단 방법

Leverage H

- i번째 대각원소로 관측치가 다른 관측치 집단으로부터 떨어진 정도 

- 2 x (p + 1) / n 보다 크면 영향치

- 값이 클수록 회귀 계수 추정에 큰 영향

 

Cooks Distance 

- 각 개별 값이 전체 데이터에 대한 영향력을 판단

- Full model에서 i번째 관측치를 포함하여 계산한 적합치와 그렇지 않은 적합치 사이의 거리 

- 값이 클수록 영향력이 크다고 판단 (1보다 크면 영향치)

- 레버리지와 잔차를 고려


DFBETAS 

- Difference in Betas, 절대값이 커지면 i번째 관측치가 영향치 혹은 이상치일 가능성이 높다.

- 절댓값이 크면 해당 관측치가 계수에 큰 영향

 

DFFITS 

- i번째 관측치 제외 시 종속변수의 예측치의 변화정도를 측정한 값

- DFFITS의 절대값이 기준값인 sqrt(2 x (p + 1)) / n보다 클수록 영향치

- 절댓값이 크면 해당 점이 예측에 큰 영향

    

* 영향력이 크다 → 모델에 포함해야 한다 vs 데이터 오류나 실수다 vs 특수한 케이스거나 예외적인 상황이다.
→ 왜 영향력이 큰지는 데이터와 도메인 지식을 통해 해석해야 한다.

 

Mallows Cp

- 예측식이 가진 수행능력을 예측값의 변이를 기준으로 평가하기 위해 예측값에 대한 잔차제곱합(SSE)을 이용

- 여러 후보 모형 중에서 편향(bias)과 분산(variance)을 동시에 고려해서 적당히 좋은 모형을 고르는 기준

- 변수가 너무 적으면 편향이 커지고 (과소적합), 변수를 많이 사용하면 분산이 크다. → 변수 개수에 대해 패널티 부여

- 정규성, 등분산성 가정

- Cp 값이 작고 선택된 독립 변수의 수에 가까운 모형으로 선택 (Cp ≈ p면 좋은 모형, 회귀 변수 선택이 목적)

- Cp가 크면 중요한 변수를 빼서 편향이 커졌거나 불필요하게 복잡한 경우

- Cp가 너무 작으면 우연적 적합 가능성이 존재


선형회귀 결과 후, summary에 있는 값을 하나씩 출력해보자.

import numpy as np
import pandas as pd

np.random.seed(1234)

n_samples = 100

x1 = np.random.randn(n_samples)
x2 = np.random.randn(n_samples)
x3 = np.random.randn(n_samples)

# 임의의 계수
a, b, c, d = 2.0, -1.5, 3.0, 5.0

# 종속 변수 생성 + noise
noise = np.random.randn(n_samples) * 0.5
y0 = a * x1 + b * x2 + c * x3 + d + noise

df = pd.DataFrame({'X1': x1, 'X2': x2, 'X3': x3, 'y': y0})
df.head()

 

출력 결과는 다음과 같다.

from statsmodels.formula.api import ols
import pandas as pd

model = ols('y ~ X1 + X2 + X3', data=df).fit()

model.summary()

 

  • Dep. Variable: 종속변수 이름 (y)
  • Model: 사용한 모델 유형 (OLS = 최소제곱법)
  • Method: 적합 방식 (Least Squares)
  • No. Observations: 데이터 개수
  • Df Residuals: 잔차 자유도 = (n - 변수 개수 - 1)
    •  변수 개수 3개 + 절편 1개 + 잔차 자유도 96개 → 총 100개의 표본
  • Df Model: 독립변수 개수
  • R-squared: 결정계수 (설명력)
  • Adj. R-squared: 수정 결정계수 (변수 개수 보정)
    • 종속 변수와 상관없이 독립 변수가 증가하면 R-squared가 증가 → Adj. R-squared로 보정
  • F-statistic: 전체 회귀모형의 유의성 검정값
  • Prob (F-statistic): F-검정의 p-value
  • Log-Likelihood: 로그우도 값
  • AIC / BIC: 모형 선택 지표 (작을수록 좋음)

 

  • coef: 회귀계수 추정값
  • std err: 계수의 표준오차
  • t: t-통계량 = coef / std err
  • P>|t|: t-검정의 p-value (0.05↓이면 유의)
  • [0.025, 0.975]: 95% 신뢰구간

 

  • Omnibus / Prob(Omnibus): 잔차의 정규성 검사
  • Skew / Kurtosis: 잔차의 왜도/첨도
  • Durbin-Watson: 잔차의 자기상관 (≈2가 이상적)
  • Jarque-Bera (JB) / Prob(JB): 정규성 추가 검정
  • Cond. No: 다중공선성 지표 (크면 위험)

 

다중공선성

- VIF가 지정한 임계값을 초과하는지로 확인

- 독립변수의 상관도가 높으면 다중공선성 가능성이 증가

- 다중공선성이 클수록 → 회귀계수 표준 오차 ↑ → 각 회귀계수에 대한 신뢰 구간 ↑ → 추정치 불안정, p-value ↑


대표적으로 사용되는 변수는 다음과 같다.

Report에 있는 변수명과 달라서 일일이 외우기 힘들다. (ex. P>|t| = pvalues)

params = model.params         # 회귀계수
pvalues = model.pvalues       # p-value
tvalues = model.tvalues       # t-통계량
rsquared = model.rsquared     # R^2
fvalue = model.fvalue         # F-통계량
f_pvalue = model.f_pvalue     # F-검정 p-value
bse = model.bse               # 표준오차

 

dir로 모델을 출력하면 model에 어떤 변수가 있는지 쉽게 알 수 있다.

dir(model)

['HC0_se',
...
 'aic',
 'bic',
 'bse',
...
 'df_resid',
 'diagn',
 'eigenvals',
 'el_test',
 'ess',
 'f_pvalue',
 'f_test',
 'fittedvalues',
 'fvalue',
 'get_influence',
 'get_prediction',
 'get_robustcov_results',
 'initialize',
 'k_constant',
 'llf',
 'load',
 'model',
 'mse_model',
 'mse_resid',
 'mse_total',
...
 'wresid']
반응형

댓글