회귀 분석
가정
- 선형성 : 종속 변수와 독립 변수 간의 관계가 선형
- 정규성 : 오차는 정규분포를 따라야 한다.
- 등분산성 : 오차의 분산은 독립 변수와 상관없이 일정
- 독립성 : 각각의 관측은 서로 독립, 어떤 관측치의 오차가 다른 관측치의 오차에 영향을 미치지 않아야 함.
ㄴ 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']'개발 > Python' 카테고리의 다른 글
| 이원분산분석 (Two-Way ANOVA) (1) | 2025.08.16 |
|---|---|
| 결정 트리 (부스팅) (3) | 2025.08.15 |
| 결정 트리 (분기 전후의 지니 불순도 감소량) (1) | 2025.08.15 |
| 일원분산분석 비교 (f_oneway vs anova_lm) (2) | 2025.08.15 |
| 데이터 범주화, 구간화 (1) | 2025.08.15 |
댓글