일반 가법 모델(GAM)의 이해: 선형회귀를 넘어 유연한 곡선 패턴을 잡는 마법

선형 회귀(직선)의 한계를 넘어 설명변수들의 유연한 비선형 관계(곡선)를 가법적으로 더해나가는 일반 가법 모델(GAM)의 스플라인, 벌점 파라미터의 작동 원리와 R mgcv 실전 활용법을 정리합니다.
데이터·통계
저자

Ikmyung Terran

공개

2026년 6월 30일

데이터 분석과 회귀 예측을 진행할 때 연구자들이 가장 많이 처하는 딜레마 중 하나는 “실제 데이터의 복잡성”“모델의 해석 편의성” 사이의 충돌입니다.

기본적인 선형 회귀 모형은 독립변수가 증가함에 따라 종속변수도 직선 형태로만 비례해서 변한다고 가정합니다. 그러나 현실의 수많은 지표(예: 기온과 전력 수요, 연령과 체력 등)는 직선이 아닌 올랐다가 내려가는 구불구불한 곡선 패턴을 보입니다.

선형 모델을 지나치게 꺾어 쓰기 위해 복잡한 고차 다항식(\(x^2, x^3\))을 일일이 수동으로 집어넣다 보면 해석도 어렵고 과적합(Overfitting)의 늪에 빠지기 쉽습니다.

이러한 문제를 우아하고 수학적으로 완벽하게 풀어내는 통계 모형이 바로 일반 가법 모델(GAM, Generalized Additive Models)입니다.


1. GAM의 직관적 이해: “막대기를 고무호스로!”

선형 회귀와 일반화 선형모형(GLM) 그리고 일반 가법 모델(GAM)의 개념적 발전 과정을 도식으로 나타내면 다음과 같습니다.

graph TD
    Linear[선형 회귀 Linear Regression <br> 딱딱한 막대기 직선 관계 <br> Y = b0 + b1*X]
    GLM[일반화 선형모형 GLM <br> 정규분포가 아닌 Y값에 직선 피팅 <br> g*EY = b0 + b1*X]
    GAM[일반 가법 모델 GAM <br> 유연한 고무호스 곡선 관계 <br> g*EY = b0 + f1*X1 + f2*X2]

    GAM --> Feature1[가법성 Additive <br> 각 변수가 그리는 개별 곡선들을 단순히 더함]
    GAM --> Feature2[평활화 Smoothing <br> 구간 스플라인과 벌점을 사용해 부드러운 선 구현]
    
    style Linear fill:#ffebee,stroke:#b71c1c
    style GLM fill:#ffebee,stroke:#b71c1c
    style GAM fill:#e8f5e9,stroke:#1b5e20,stroke-width:2px
    style Feature1 fill:#fffdf0,stroke:#333
    style Feature2 fill:#fffdf0,stroke:#333

  • 선형 회귀 (Linear Regression): “나이가 들수록 소득은 직선으로 계속 우상향한다.” (현실과 거리가 있음)
  • 일반 가법 모델 (GAM): “소득은 연령별로 오르다가 은퇴 시점에 꺾여 내려오는 구불구불한 곡선이다.”
  • 핵심 철학: 독립변수 하나하나가 결과에 미치는 개별 곡선 효과인 \(f(x)\)를 추정한 뒤, 이 영향력들을 단순히 더해서(Additive) 최종 값을 만듭니다.

선형 회귀와 GAM의 실제 피팅 라인 비교

선형 모형(GLM)과 일반 가법 모델(GAM)의 피팅선 형태 비교

1.1 GAM의 수학적 구조

\[ Y = \beta_0 + f_1(x_1) + f_2(x_2) + \dots + \epsilon \]

  • \(f_1(x_1)\): 첫 번째 독립변수(예: 기온)가 매출에 미치는 고유 곡선 효과
  • \(f_2(x_2)\): 두 번째 독립변수(예: 광고비)가 매출에 미치는 고유 곡선 효과
  • 각 효과를 개별 함수 \(f(x)\)로 유연하게 가져가되, 전체 합 연산 구조는 유지하므로 “가법(Additive) 모델”이라 칭합니다.

2. 부드러운 곡선을 뽑아내는 원리: 스플라인과 벌점

GAM이 데이터를 설명하는 최적의 곡선을 찾아내는 밑바탕에는 스플라인벌점이라는 두 가지 안전장치가 작동합니다.

2.1 스플라인 (Spline): 매끄러운 밧줄 연결

데이터 전체를 관통하는 단 하나의 거대한 수식을 만드는 것은 매우 어렵습니다. 스플라인은 데이터를 여러 조각의 구역으로 분할한 뒤 각 구역별로 3차 다항식 곡선을 그려내고, 이 조각들이 만나는 경계 지점인 매듭(Knots)에서 끊어지지 않고 물 흐르듯 매끄럽게 흐르도록 본드로 붙여 연결하는 수학적 보간법입니다.

2.2 벌점 (Penalty): “과도하게 구부리지 마라”

만약 스플라인 모형의 자유도를 완전히 풀어두면, 모형은 훈련 데이터의 모든 점을 억지로 뚫고 지나가려고 용틀임을 치는 심각한 과적합(Overfitting) 선을 그리게 됩니다.

이를 방지하기 위해 데이터 적합 성능을 높이면서도 곡선의 꺾임률이 심해질수록 벌금을 매기는 평활 파라미터(Smoothing Parameter, \(\lambda\))를 목적 식에 도입합니다.

\[ \text{목적 함수} = \text{최소화 } \left( \text{오차(RSS)} + \lambda \int [f''(x)]^2 dx \right) \]

  • \(\lambda\)극도로 큼: 곡선을 꺾을 때 드는 세금이 무지막지하므로 결국 고무호스가 팽팽하게 당겨져 선형 직선 회귀(\(\beta x\))로 수렴합니다.
  • \(\lambda\)0에 수렴: 세금이 0원이므로 데이터 모든 점에 구겨 맞추는 요동치는 꼬불꼬불한 선이 됩니다.
  • R의 mgcv 패키지는 이 최적의 타협 세율(\(\lambda\))을 데이터 학습 과정에서 자동으로 산출해 줍니다.

3. R mgcv 패키지를 활용한 실무 구현

R 진영에서 일반 가법 모델링을 수행할 때 표준으로 사용되는 패키지가 mgcv입니다.

3.1 회귀 문제 (연속형 종속변수) 실습

# 1. 패키지 설치 및 로드
if(!require(mgcv)) install.packages("mgcv")
library(mgcv)

# 2. 비선형 가상 데이터 생성
set.seed(123)
n <- 200
x1 <- runif(n, 0, 10)
x2 <- runif(n, 0, 5)

# x1은 물결파(Sin), x2는 2차 포물선 형태의 참값 관계 설정
y <- sin(x1) + 0.5 * x2^2 + rnorm(n, sd = 0.5)
dat <- data.frame(y, x1, x2)

# 3. GAM 모델 적합
# s() 함수: 스무딩(Smoothing) 곡선 효과를 적용할 설명 변수를 감싸줍니다.
# method = "REML": 평활 파라미터 최적화 기법 중 가장 통계적으로 강건한 표준 옵션입니다.
gam_model <- gam(y ~ s(x1) + s(x2), data = dat, method = "REML")

# 4. 결과 요약 분석
summary(gam_model)

3.2 모델 요약 결과(summary) 해석 핵심 포인트

summary 보고서에서 모델러가 반드시 파악해야 하는 것은 유효 자유도(edf)입니다.

Approximate significance of smooth terms:
          edf Ref.df      F p-value
s(x1)   4.254  5.187  45.32  <2e-16 ***
s(x2)   1.954  2.412 110.12  <2e-16 ***
  • edf (Effective Degrees of Freedom, 유효 자유도):
    • edf = 1: 데이터 꺾임이 필요 없다는 것을 의미하며, 사실상 선형 직선 회귀입니다.
    • edf > 1 (예: 2~5 이상): 곡선 패턴이 존재함을 의미합니다. edf 숫자가 클수록 모형이 꺾이는 횟수가 많아 구불구불해집니다.
  • p-value: 해당 곡선 효과가 통계적으로 확실히 존재하는지 유의성을 판정합니다.

3.3 부분 효과 그래프 시각화

# 각 변수의 부분 곡선 영향력을 시각화
# shade = TRUE: 95% 신뢰수준 구간을 옅은 회색 그늘로 묘사해 줍니다.
plot(gam_model, pages = 1, shade = TRUE)

x축에 따른 종속변수의 한계 변화량이 2차원 공간 상에 곡선으로 유려하게 매핑됩니다.


4. 분류 문제 (이항 분류: 0 또는 1)

만약 타겟 변수가 성공/실패, 혹은 환자/정상과 같은 범주형 데이터라면 로지스틱 회귀와 마찬가지로 연결 함수(Link Function)를 연결해 줍니다.

# 로지스틱 일반 가법 모델링
# family = binomial: 로지스틱 분석 임을 선언하는 표준 파라미터
gam_logistic <- gam(y_binary ~ s(x1) + s(x2), 
                    data = dat_binary, 
                    family = binomial(link = "logit"), 
                    method = "REML")

# 예측 수행 시 확률 값 도출
# type = "response"로 설정해야 log-odds가 아닌 0~1 사이의 직관적 '확률'이 출력됩니다.
predict_probs <- predict(gam_logistic, newdata = new_data, type = "response")

5. GAM 모델러의 실전 응용 팁

5.1 선형과 비선형의 융합

모든 변수를 s()로 묶어 곡선화할 필요는 없습니다. 성별, 직급과 같은 명목형 변수나 직선 관계가 명확한 피처는 그냥 평형항으로 투입하여 모델의 간결성을 유지합니다.

# x1은 곡선, x2와 gender(성별)는 선형(직선) 효과로 통합 추정
gam(y ~ s(x1) + x2 + gender, data = dat)

5.2 3차원 면적 상호작용 (te)

위도와 경도처럼 두 연속형 변수가 동시에 맞물려 종속변수에 영향을 주는 다차원 공간 효과는 텐서곱(te())을 활용해 모델링합니다.

# 두 변수의 조합이 만드는 3차원 등고선 형태의 곡면 영향력을 학습
gam(y ~ te(latitude, longitude), data = spatial_data)

요약

일반 가법 모델(GAM)은 설명변수 각각의 부드러운 곡선 효과를 가법적으로 합산하여 비선형 데이터 분포를 부드럽게 피팅하는 고성능 통계 모델입니다.

R의 mgcv 패키지를 구동하여 유효 자유도(edf)를 점검하고 REML 기법을 기반으로 최적의 곡선 고삐(\(\lambda\))를 컨트롤함으로써, 해석 불가능한 머신러닝 모델의 단점을 극복하고 뛰어난 설명력과 높은 예측력을 동시에 확보해 보시기 바랍니다.


함께 읽으면 좋은 글