결정계수와 조정 R², F-검정으로 회귀모형 평가하기
결정계수 R², 조정 R², F-검정의 계산식과 해석 범위, 회귀모형 선택·검증·운영 모니터링 시 주의점을 정리한다.
2026-08-14 · 최초 발행 2024-04-29
R²만으로는 회귀모형을 판단하기 어렵다
회귀모형의 적합도를 볼 때 결정계수(R²)는 가장 먼저 확인하는 값이다. 다만 설명변수를 추가하면 단순 R²는 감소하지 않으므로, 이 값만으로 변수 추가나 모형 우위를 결정하면 과적합 신호를 놓칠 수 있다.
조정 R²는 설명변수 수에 따른 벌점을 반영하며, F-검정은 모형 전체의 설명력이 통계적으로 유의한지를 다룬다. 세 지표는 서로 다른 판단을 맡는다.
-
R²는 응답변수 분산 가운데 모형이 설명하는 비율을 나타낸다. 절편을 포함한 OLS에서는 0~1 범위이며, 다음과 같이 계산한다.
R² = 1 − SSE/SST여기서 SSE는 잔차제곱합, SST는 총제곱합, SSR은 회귀제곱합이다. 절편을 포함하면
SST = SSR + SSE가 성립한다. -
조정 R²는 변수 수가 늘어나는 데 따른 복잡도를 반영한다. 표본 크기를 n, 절편을 제외한 설명변수 수를 p라고 하면 식은 다음과 같다.
Adjusted R² = 1 − (1 − R²) × ((n − 1)/(n − p − 1))불필요한 변수를 추가하면 조정 R²는 하락할 수 있고, 실제 신호를 보태면 상승할 수 있다.
-
F-검정은 절편을 제외한 모든 회귀계수가 0이라는 귀무가설을 평가한다. 대립가설은 최소 하나의 회귀계수가 0이 아니라는 것이다. 정규성·동분산·독립성 가정 아래 F 통계량은 다음과 같다.
F = (SSR/p) / (SSE/(n − p − 1)) = (R²/p) / ((1 − R²)/(n − p − 1))
적합부터 유의성 판단까지의 흐름
입력은 (X, y), 표본 크기 n, 설명변수 수 p, 유의수준 α다. OLS를 적합한 뒤 적합값과 잔차로 SSE 및 SST를 구하고, R²·조정 R²·F 통계량·p-값을 산출한다. 최종적으로 모형을 채택할지, 단순화할지, 대안 모형을 검토할지를 판단한다.
계산은 다음 순서로 정리할 수 있다.
y_hat = Xβ,e = y − y_hat를 구하고SSE=∑e²,SST=∑(y − ȳ)²를 계산한다.R²=1−SSE/SST와Adjusted R²=1−(1−R²)×((n−1)/(n−p−1))를 계산한다.F=(R²/p)/((1−R²)/(n−p−1))와p-값=Pr(F_{p,n−p−1} ≥ F)를 구한다.
절편이 없는 모형에서는 SST 분해가 성립하지 않고 R²가 음수가 될 수 있다. 이 경우 조정 R² 공식과 해석에도 주의가 필요하다. 다중공선성이 심하면 F-검정은 유의하지만 개별 t-검정은 비유의일 수 있다. 이분산 또는 오차 상관이 있으면 고전 F-검정이 왜곡될 수 있으므로, 이분산-강건 F(예: HC3 기반 Wald)를 사용한다.
변수 추가와 모형 비교에 쓰는 기준
R²는 스케일에 불변이며 선형 변환에서는 안정적이지만, 비선형 관계에서는 과소평가될 가능성이 있다. 따라서 설명력만을 적합도의 전부로 보기는 어렵다.
기준선 모형에 후보 변수 블록을 더할 때는 부분 F-검정에서 p<α인지, 조정 R²가 상승하는지를 함께 확인한다. 이어 교차검증 R²가 유지되거나 상승하는지도 확인해야 외삽 성능을 담보할 수 있다.
선형, 다항, 정규화 회귀(릿지/라쏘)를 후보군으로 둘 수 있다. 선형계열은 조정 R²와 F-검정을 활용하고, 정규화 모형은 보류집합 R² 및 AIC/BIC 등의 정보기준으로 비교한다. 중첩 모형이라면 부분 F-검정으로 추가 변수 블록의 기여도를 평가할 수 있다.
외적 타당성은 교차검증 R²(predicted R²)로 보완한다. 이분산·비정규성·종속성이 존재하면 강건 추정과 대안 검정(Wald/락-스케일 변환)을 병행해야 한다.
배포 후에는 설명력 변화를 추적한다
운영 중에는 기간별 R²와 Adjusted R²를 추적해 데이터 분포 변화 또는 피쳐 성능 저하를 감지할 수 있다. 이동평균 대비 R²가 10%p 하락하면 재학습을 트리거하는 방식으로 경보 임계값을 설정할 수 있다.
조정 R²에 근거해 변수를 줄이면 피쳐 수를 2040% 축소하면서 검증 R²를 동일 수준으로 유지할 가능성을 높일 수 있다. F-검정으로 변수 블록을 선택하면 평균 추정분산(잔차분산)이 515% 감소할 것으로 기대할 수 있으며, 이는 도메인과 SNR에 의존한다. 모형 단순화와 해석 가능성 향상, 유지보수 비용 절감, 과적합 리스크의 조기 탐지, 재현 가능한 선택 기준 확보도 함께 기대할 수 있다.
statsmodels로 중첩 모형을 비교하는 예시
전제조건: Python 3.10+, statsmodels 0.14+, numpy, pandas
import numpy as np
import pandas as pd
import statsmodels.api as sm
from statsmodels.stats.anova import anova_lm
# 데이터 생성
rng = np.random.default_rng(0)
n = 200
X1 = rng.normal(size=n)
X2 = 0.5 * X1 + rng.normal(scale=0.5, size=n) # 상관 변수
X3 = rng.normal(size=n)
noise = rng.normal(scale=1.0, size=n)
y = 2.0 + 1.5*X1 + 0.0*X2 + 0.8*X3 + noise # X2 계수=0(불필요 변수)
df = pd.DataFrame({'y': y, 'X1': X1, 'X2': X2, 'X3': X3})
# 모형: 기본(절편포함), 확장(X2 추가)
X_base = sm.add_constant(df[['X1', 'X3']])
X_ext = sm.add_constant(df[['X1', 'X2', 'X3']])
m_base = sm.OLS(df['y'], X_base).fit()
m_ext = sm.OLS(df['y'], X_ext).fit(cov_type="HC3") # 이분산 강건 분산 사용 예시
print("R²(base), Adj R²(base):", round(m_base.rsquared, 4), round(m_base.rsquared_adj, 4))
print("R²(ext), Adj R²(ext):", round(m_ext.rsquared, 4), round(m_ext.rsquared_adj, 4))
# 중첩 모형 F-검정(고전식): 공분산 기본 OLS 기준
f_stat, p_val, df_diff = m_ext.compare_f_test(m_base)
print("부분 F-검정: F=%.4f, p=%.4g, df_diff=%d" % (f_stat, p_val, df_diff))
# ANOVA 테이블(참고)
anova_tbl = anova_lm(sm.OLS(df['y'], X_base).fit(), sm.OLS(df['y'], X_ext).fit())
print(anova_tbl)
rsquared, rsquared_adj에서 R²와 조정 R²를 확인한다. compare_f_test는 중첩 모형 간 부분 F-검정을 수행한다. cov_type="HC3"로 강건 표준오차를 사용할 수 있으나, compare_f_test에는 강건 공분산이 반영되지 않는다. 강건 Wald 검정이 필요하면 wald_test를 사용한다.
지표별 역할과 가정 위반 대응
R²와 Adjusted R²는 적합도를, F-검정은 통계적 유의성을 평가한다. 예측력은 교차검증 R² 또는 보류집합 성능으로 별도 보완한다.
이분산 또는 상관오차가 있으면 고전 F 대신 강건 검정(Wald, HC3/HC1)을 적용하고 잔차를 진단한다. p ~ n 또는 p > n 환경에서는 고전 F-검정이 부적합하므로 CV 기반 선택, 정보기준(AICc/BIC), 정규화 경로 분석을 사용한다.
절편을 생략하면 R² 해석이 왜곡되거나 음수가 될 수 있다. 데이터 중심화 또는 절편 포함 원칙을 적용하는 편이 낫다. 기준선 수립, 단계적 변수 추가, 조정 R²·부분 F-검정 확인, 교차검증 R² 검증, 잔차 진단 및 강건화, 배포 후 R² 모니터링을 하나의 흐름으로 운영한다.