RyanNerd
라덕'Story
RyanNerd
  • 분류 전체보기 (60) N
    • Study Note (25) N
      • Python (3)
      • R (1)
      • Airflow (7)
      • 통계 (14) N
    • 빅데이터분석기사 (1)
      • 필기 (1)
    • Programmers (28)
      • Python (13)
      • SQL (15)
    • Project (3)
      • Django (3)
    • Mac (2)
    • 맛집 (0)

블로그 메뉴

  • NaverBlog
  • 홈

최근 글

전체 방문자
오늘
어제
hELLO · Designed By 정상우.
RyanNerd

라덕'Story

Study Note/통계

선형회귀모형의 진단과 선별 (T검정, F검정, AIC, VIF)

2025. 12. 15. 13:07

선형회귀분석을 통해 모델($Y = \beta X + \epsilon$)을 만들었다면, 이제 분석가는 냉철한 심판관이 되어야 합니다.

"이 모델이 통계적으로 유의한가?", "변수끼리 겹치는 부분은 없는가?", "과적합되지는 않았는가?"

이번 포스팅에서는 회귀모형을 평가하는 통계적 검정 방법(T-test, F-test)과 진단 지표($R^2$, VIF), 그리고 최적의 모형을 고르는 정보량 기준(AIC, BIC)에 대해 정리해 보겠습니다.

1. 모형의 유의성 검정 (Testing Significance)

모델을 만들었을 때 가장 먼저 확인해야 할 두 가지 검정입니다.

1) T-검정 (T-test): "이 변수가 정말 필요한가?"

개별 독립변수($X$)의 회귀계수($\beta$)가 통계적으로 의미가 있는지 확인합니다.

  • 가설:
    • $H_0$ (귀무가설): $\beta_i = 0$ (이 변수는 $Y$에 아무런 영향을 주지 않는다.)
    • $H_1$ (대립가설): $\beta_i \neq 0$ (이 변수는 $Y$에 영향을 준다.)
  • 판단: P-value < 0.05라면, 귀무가설을 기각하고 해당 변수는 통계적으로 유의하다고 판단합니다.

2) F-검정 (F-test): "이 모델 자체가 쓸만한가?"

변수 하나하나가 아니라, 모형 전체의 설명력을 검정합니다.

  • 가설:
    • $H_0$: 모든 $\beta = 0$ (모델의 모든 변수가 $Y$를 설명하지 못한다. 즉, 모델이 쓸모없다.)
    • $H_1$: 적어도 하나의 $\beta \neq 0$ (적어도 하나의 변수는 설명력이 있다.)
  • 판단: F-통계량의 P-value < 0.05라면, 이 회귀모형은 통계적으로 유의합니다.

2. 모형의 설명력과 오차 (Evaluation Metrics)

1) 결정계수 ($R^2$, R-squared)

  • 의미: 회귀모형이 데이터를 얼마나 잘 설명하는가? (설명력)
  • 범위: $0 \le R^2 \le 1$ (1에 가까울수록 설명력이 높음)
  • 주의점: 변수($X$)를 많이 넣을수록 $R^2$는 무조건 증가하는 경향이 있어 과적합(Overfitting)의 위험이 있습니다.
    • $\rightarrow$ 대안: 변수 개수에 따른 페널티를 부여한 조정된 결정계수 (Adjusted $R^2$)를 주로 사용합니다.

2) 오차 지표 (MSE, RMSE, MAE)

예측값($\hat{y}$)과 실제값($y$)의 차이(Error)를 나타냅니다. 작을수록 좋습니다.

  • MSE (Mean Squared Error): 오차 제곱의 평균. 큰 오차에 민감함.
  • RMSE (Root MSE): MSE에 루트를 씌움. 실제값과 단위가 같아 해석이 용이함.
  • MAE (Mean Absolute Error): 오차 절댓값의 평균.

3. 다중공선성 진단 (VIF)

다중공선성(Multicollinearity)이란 독립변수들끼리 강한 상관관계가 있는 문제를 말합니다.

(예: 'BMI'와 '체중'을 같이 변수로 넣으면 서로 겹치는 정보가 많아 모델이 헷갈려 함)

  • 진단 도구: VIF (Variance Inflation Factor, 분산 팽창 지수)
  • 계산 방법: 특정 변수 $X_i$를 종속변수로 두고 나머지 $X$들로 회귀분석을 했을 때의 $R^2$를 이용.
  • $$VIF_i = \frac{1}{1 - R_i^2}$$
  • 기준:
    • $VIF > 5$: 주의 필요
    • $VIF > 10$: 심각한 다중공선성 $\rightarrow$ 변수 제거 또는 차원 축소 필요.

4. 모형의 선별 (Model Selection with AIC/BIC)

변수가 많아지면 설명력($R^2$)은 좋아지지만, 모델이 복잡해져서 새로운 데이터에 대한 예측력은 떨어집니다(과적합).

이 '적합도'와 '복잡도' 사이의 균형을 맞추기 위해 정보량 기준을 사용합니다.

AIC (Akaike Information Criterion) & BIC (Bayesian IC)

$$AIC = -2\ln(Likelihood) + 2p$$
$$BIC = -2\ln(Likelihood) + p\ln(n)$$
  • 구성: (모델이 얼마나 데이터를 잘 설명하는가) + (변수 개수 p에 따른 페널티)
  • 해석: 값이 작을수록 좋은 모델입니다.
    • 설명력이 비슷하다면, 변수가 적은(간단한) 모델을 선택합니다.
    • BIC는 변수 개수에 대한 페널티가 더 커서 더 단순한 모델을 선호합니다.

5. Python 실습 코드 (Statsmodels 활용)

의료 데이터 분석에서는 scikit-learn보다 통계적 검정 결과표(Summary)를 제공하는 statsmodels를 주로 사용합니다.

시나리오: 입원 기간(LOS) 예측

  • 데이터: 환자의 나이, BMI, 혈압, 백혈구 수치(WBC)
  • 목표: 입원 기간을 예측하고 모델 진단하기
import pandas as pd
import numpy as np
import statsmodels.api as sm
from statsmodels.stats.outliers_influence import variance_inflation_factor

# 1. 가상 데이터 생성
np.random.seed(42)
n = 100
age = np.random.randint(20, 80, n)
bmi = np.random.normal(25, 4, n)
bp = 50 + 0.5 * age + 2 * bmi + np.random.normal(0, 5, n) # 혈압(BP)은 나이, BMI와 상관관계가 높게 설정 (다중공선성 유도)
los = 2 + 0.1 * age + 0.5 * bmi + np.random.normal(0, 2, n) # 종속변수: 입원기간(Length of Stay)

df = pd.DataFrame({'Age': age, 'BMI': bmi, 'BP': bp, 'LOS': los})

# 2. 선형회귀 모델 적합 (OLS)
# 상수항(Intercept) 추가 필수
X = df[['Age', 'BMI', 'BP']]
X = sm.add_constant(X) 
y = df['LOS']

model = sm.OLS(y, X).fit()

# 3. 결과 요약 (F-test, T-test, R-squared, AIC/BIC 확인)
print(model.summary())

# 4. 다중공선성(VIF) 확인 코드
vif_data = pd.DataFrame()
vif_data["Variable"] = X.columns
vif_data["VIF"] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])]

print("\n=== VIF 결과 ===")
print(vif_data)

 

6. R 실습 코드 (기본 내장 함수 & car 패키지 활용)

R은 별도의 복잡한 설정 없이도 summary() 함수 하나로 대부분의 진단 지표를 볼 수 있다는 장점이 있습니다. 다중공선성 확인을 위해 car 패키지만 추가로 사용합니다.

시나리오: 입원 기간(LOS) 예측 및 모형 진단

 

# 필요한 패키지 로드 (VIF 계산용)
# install.packages("car")
library(car)

# 1. 가상 데이터 생성 (Python 예제와 동일한 로직)
set.seed(42)
n <- 100
age <- sample(20:80, n, replace = TRUE)
bmi <- rnorm(n, mean = 25, sd = 4)
# 혈압(BP)을 나이, BMI와 상관관계가 높게 설정 (다중공선성 유도)
bp <- 50 + 0.5 * age + 2 * bmi + rnorm(n, mean = 0, sd = 5)
# 종속변수: 입원기간(LOS)
los <- 2 + 0.1 * age + 0.5 * bmi + rnorm(n, mean = 0, sd = 2)

df <- data.frame(age, bmi, bp, los)

# 2. 선형회귀 모델 적합 (OLS)
# R은 자동으로 상수항(Intercept)을 포함합니다.
model <- lm(los ~ age + bmi + bp, data = df)

# 3. 결과 요약 (F-test, T-test, R-squared 확인)
# summary 함수 하나면 통계적 검정 결과가 모두 나옵니다.
cat("=== 회귀모형 요약 (T-test, F-test, R^2) ===\n")
print(summary(model))

# 4. 정보량 기준 (AIC, BIC) 확인
# 값이 작을수록 좋은 모델입니다.
cat("\n=== 모형 선별 기준 ===\n")
cat("AIC:", AIC(model), "\n")
cat("BIC:", BIC(model), "\n")

# 5. 다중공선성(VIF) 진단
# 10을 넘으면 다중공선성을 의심해야 합니다.
cat("\n=== 다중공선성(VIF) 진단 ===\n")
print(vif(model))

 

R을 이용해 돌려본 선형회귀분석 결과입니다. 전체적으로 모델은 훌륭하지만, 특정 변수(BP)가 유용하지 않습니다 그 이유를 숫자로 파헤쳐 봅시다.

 

 

1. 모델 성적표 (R-squared & F-test)

  • Multiple R-squared (0.6787): 이 모델은 데이터의 변동성을 약 67.9% 설명합니다. 꽤 준수한 성능입니다.
  • p-value: < 2.2e-16: 0.05보다 훨씬 작으므로, 모델 자체는 통계적으로 매우 유의합니다. 믿고 쓸 수 있는 모델이라는 뜻입니다.

핵심 포인트: 여기서도 bp(혈압)의 P-value가 0.505로 0.05를 훌쩍 넘겼습니다. "혈압은 결과에 아무런 영향을 주지 않는다"는 결론이 나오는데, 과연 진짜 그럴까요?

 

 

3. 정밀 진단: 다중공선성 (VIF)

vif(model) 결과를 보면 그 이유가 명확해집니다.

  • age: 3.28
  • bmi: 3.15
  • bp: 5.80 (주의!)

해석: 통상적으로 VIF가 5를 넘으면 다중공선성을 의심하고, 10을 넘으면 심각하다고 봅니다. bp의 VIF는 5.80으로, 다른 변수들(age, bmi)과 겹치는 정보가 많아 모델 내에서 제 역할을 못 하고 있는 상태입니다. (마치 팀플에서 다른 팀원들이 다 해버려서 할 일이 없는 상태와 비슷합니다.)

4. 최종 솔루션

VIF가 가장 높고 P-value가 유의하지 않은 bp 변수를 모델에서 제거하는 것이 좋습니다. 그러면 모델이 더 간결해지고(AIC 감소 예상), 나머지 변수들의 영향력이 더 명확해질 것입니다.

 

AIC와 BIC는 뭔가요?

  • AIC (420.6) / BIC (433.7): 모델의 '가성비' 점수입니다.
  • 이 점수 자체로는 좋고 나쁨을 알 수 없지만, 만약 bp를 뺀 새로운 모델의 AIC가 420.6보다 낮아진다면, 그 모델이 더 좋은 모델이라는 뜻입니다. (변수 선택의 기준이 됩니다.)

 

'Study Note > 통계' 카테고리의 다른 글

회귀분석의 확장: 과적합 방지와 데이터 특성에 맞는 모델링  (0) 2025.12.15
회귀모형의 진단: 잔차, 레버리지, 그리고 쿡의 거리  (0) 2025.12.15
[의료 통계] 내 BMI가 1 오르면 혈압은 얼마나 오를까? (Python vs R 선형회귀 완벽 비교)  (0) 2025.12.12
선형회귀 Part 2: 최소자승법(OLS)과 더미변수 완벽 정리  (0) 2025.12.12
[머신러닝 기초] 숫자를 예측하는 가장 강력한 직선, 선형회귀(Linear Regression) 완벽 해부  (0) 2025.12.10
    'Study Note/통계' 카테고리의 다른 글
    • 회귀분석의 확장: 과적합 방지와 데이터 특성에 맞는 모델링
    • 회귀모형의 진단: 잔차, 레버리지, 그리고 쿡의 거리
    • [의료 통계] 내 BMI가 1 오르면 혈압은 얼마나 오를까? (Python vs R 선형회귀 완벽 비교)
    • 선형회귀 Part 2: 최소자승법(OLS)과 더미변수 완벽 정리
    RyanNerd
    RyanNerd
    라이언 덕후의 일상 스토리~

    티스토리툴바