
0. OLS 기본 개념
1. SST / SSR / SSE 개념
- SST: 설명변수X를 고려하지 않았을 때 실제 관측지 y값들의 평균을 중심으로 퍼져있는 정도
- SSR: y값의 평균을 기준으로 회귀모형에 의헤 설명되는 변동의 제곱의 합
- SSE: y값의 평균을 기준으로 회귀모형으로도 설명이 되지 않는 변동의 제곱의 합

2. SST = SSR + SSE
3. 자유도
SST (전체 자유도) → n−1
- 편차의 합은 항상 0이 되어야 한다는 제약조건 (∑(yi−yˉ)=0)
- n−1개의 편차가 정해지면 마지막 1개의 편차는 자동으로 결정
- 독립변수의 개수(k)와 관계없이 항상 n−1로 고정
SSR (회귀 자유도) → k
- k는 독립변수(기울기)의 개수 (intercept는 포함 안됨)
- 단순선형회귀(Y=β0+β1X)라면 β1가 정해지면 β0는 자동으로 결정됨으로 k=1
SSE (잔차/오차 자유도) → n−k−1
- n개의 데이터에서 회귀 모형을 만들기 위해 총 k+1개의 파라미터를 추정
- 파라미터를 추정할 때마다 자유도를 1씩 소모
- n−(k+1)=n−k−1
4. F-table
| 변동 요인 (Source) | 제곱합 (SS) | 자유도 (df) | 평균제곱 (MS) | F-통계량 |
|---|
| 회귀 (Regression) | SSR | k | MSR=kSSR | F=MSEMSR |
| 오차 (Error) | SSE | n−k−1 | MSE=n−k−1SSE | |
| 전체 (Total) | SST | n−1 | | |
5. lm에 대한 ANOVA

회귀계수 쪽으로 이동
5. 회귀 계수 검증 방법
-
β구하는 행렬식
β^=(XTX)−1XTy
-
공통 노이즈 기준으로 MSE
MSE=n−k−1SSE
- 각각 독립 변수의 개별 차이 계산
- 공분산에서 분산이 크면 공분산의 역수를 곱해줌으로 분산은 작아짐
- 즉, 분산이 므면 양끝을 늘려주는 닻이 길게 꼽혀있어서 β의 분산은 작아짐
Var(β^)=MSE⋅(XTX)−1
- 가설검정: H0: 모집단에서의 기울기(β)는 0
- 중심이 0이고 폭이 위에서 계산된 Var(β^)인 분포를 그림
- 실제 데이터에서 구한 기울기 값(예: 2.5)을 이 곡선 위에 찍어봤을 때의 통계량 & p-value
- 개별 통계량(t-value) 도출
SE(β^j)=Var(β^j)
tj=SE(β^j)β^j
6. CODE
X_data = np.column_stack((X1, X2))
X_sm = sm.add_constant(X_data)
model = sm.OLS(y, X_sm)
results = model.fit()
results.summary()
X = X_sm
k = X.shape[1]
df = n-k
beta_hat = np.linalg.inv(X.T @ X) @ X.T @ y
y_pred = X @ beta_hat
SSE = np.sum((y - y_pred) ** 2)
MSE = SSE / df
var_beta_matrix = MSE * np.linalg.inv(X.T @ X)
se = np.sqrt(np.diag(var_beta_matrix))
t_stats = beta_hat / se
p_values = 2 * (1 - stats.t.cdf(np.abs(t_stats), df))
print(f"회귀 계수 (Beta): {beta_hat}")
print(f"표준 오차 (SE): {se}")
print(f"t-통계량 (t): {t_stats}")
print(f"p-value: {p_values}")