graph TD
Start[관심 지점 x0 선정] --> Step1[1. 윈도우 설정 <br> x0 주변의 이웃 비중인 Span 크기 필터링]
Step1 --> Step2[2. 거리 기반 가중치 부여 <br> x0와 거리가 가까운 점일수록 가중치 가산]
Step2 --> Step3[3. 국소 회귀 적합 Local Regression <br> 가중최소자승법을 통한 로컬 1차/2차식 도출]
Step3 --> Step4[4. 예측치 산출 <br> 로컬 방정식에 x0 대입하여 y0 예측값 플로팅]
style Start fill:#fffdf0,stroke:#333
style Step1 fill:#e1f5fe,stroke:#01579b,stroke-width:2px
style Step2 fill:#e1f5fe,stroke:#01579b,stroke-width:2px
style Step3 fill:#e8f5e9,stroke:#1b5e20,stroke-width:2px
style Step4 fill:#fff9c4,stroke:#f57f17,stroke-width:2px
산점도(Scatterplot) 상에 흩뿌려진 복잡한 데이터 분석을 시작할 때, 우리는 가장 먼저 변수 간의 “전반적인 흐름과 추세”를 눈으로 파악하고자 합니다.
그러나 데이터가 직선 관계를 따르지 않고 파도처럼 구불구불 요동칠 때 단순 선형 회귀나 고차 함수 적합은 데이터의 국소적인 왜곡을 유발하기 쉽습니다.
이때 데이터를 아우르는 단일 방정식을 만드는 대신, 특정 지점 주변(Local)의 이웃들만 모아 가중 회귀를 반복 실행하여 매끄러운 곡선 추세를 그리는 비모수 기법이 바로 LOESS(로컬 회귀, Locally Weighted Scatterplot Smoothing)입니다.
이번 포스트에서는 LOESS의 작동 매커니즘, 튜닝 파라미터, 그리고 성능과 수식을 모두 잡을 수 있는 다른 비선형 방법론들(MARS, GAM)과의 체계적 비교까지 정리해 보겠습니다.
1. LOESS의 본질과 작동 원리
1.1 핵심 정의
LOESS(또는 LOWESS)는 데이터 전체를 설명하는 하나의 고정된 수식을 수립하지 않습니다. 그 대신 특정 관심 관측치(\(x_0\)) 주변에 위치한 이웃 데이터들을 필터링하고 가까운 데이터에는 높은 가중치를, 먼 데이터에는 낮은 가중치를 부여하는 가중 최소자승법(Weighted Least Squares) 회귀를 반복 연산하여 최적의 부드러운 흐름선을 그려 냅니다.
1.2 작동 4단계 프로세스
컴퓨터가 특정 지점 \(x_0\)에서의 로컬 예측 값 \(\hat{y}_0\)을 도출하기 위해 수행하는 연산 절차입니다.
이 계산 과정을 모든 데이터 표본 지점을 훑어 나가며 반복 실행하여 최적의 로컬 연결 곡선을 완성합니다.
2. LOESS의 핵심 조절 파라미터
LOESS 결과선은 모수 검정이 아니므로 분석가가 조율하는 파라미터(Knobs) 세팅에 따라 형상이 크게 달라집니다.
- 스무딩 파라미터 (
span또는f):- 로컬 윈도우 설정 시 포함할 이웃 데이터의 비율(0~1)을 조절합니다.
- 작은
span(예: 0.2): 좁은 범위만 보고 즉각 피팅하므로 곡선이 날카롭고 복잡하게 요동칩니다 (과적합 Underfitting 위험). - 큰
span(예: 0.8): 넓은 범위를 함께 평균 내므로 곡선이 매우 뭉툭하고 직선에 가깝게 평활해집니다 (과소적합 Overfitting 위험).
- 로컬 차수 (
degree):- 로컬 구간에서 적합할 회귀 방정식의 차수(보통 1차 직선 또는 2차 다항식 곡선)입니다. 2차식일 때 데이터 변곡점을 잡는 데 유리합니다.
- 이상치 처리 방식 (
family):gaussian은 최소자승법 방식을 그대로 쓰지만,symmetric을 선택하면 잔차가 큰 이상치(Outlier)의 가중치를 자동 감쇄하여 왜곡 없는 강건한(Robust) 곡선을 그려 줍니다.
3. 비선형 데이터 삼총사 비교: LOESS vs MARS vs GAM
비선형 데이터 시각화와 예측 모델링에서 대안이 되는 3대 기법의 특징을 명확히 대조해 드립니다.
| 비교 항목 | LOESS (로컬 회귀) | MARS (다변량 적응 회귀) | GAM (일반 가법 모델) |
|---|---|---|---|
| 핵심 철학 | “나무를 보며 숲을 그린다” 국소적 이웃들의 평균 흐름 매핑 |
“꺾인 막대기를 이어 붙인다” 힌지 함수 조립을 통한 수식 도출 |
“유연한 고무호스를 더한다” 변수별 스플라인 효과의 결합 |
| 출력 형태 | 부드러운 시각적 곡선 | \(y = \beta_0 + \beta_1 \max(0, x-t) \dots\) 와 같은 수학 공식 | \(y = \beta_0 + f(x_1) + f(x_2)\) 와 같은 스무딩 곡선의 합 |
| 주요 파라미터 | span (시야 범위 비율) |
Knot (꺾임 매듭 지점) |
edf (유효 자유도) |
| 압도적 장점 | 직관적으로 흐름을 파악하기 가장 좋은 EDA 솔루션 | 고차원 다변량 데이터에서도 변수 기여도 파악 및 예측 수식 획득 가능 | 통계적 추론에 적합하며 신뢰구간(Confidence Interval) 제공 |
| 치명적 단점 | 외삽(Extrapolation) 예측이 불가능하며 범용 예측식 부재 | 데이터 샘플 수가 매우 적을 때 곡선이 지나치게 각진 형태로 나옴 | 모형이 커질수록 텐서곱(te()) 연산 복잡도가 급상승함 |
4. 실전 R 분석 템플릿: 탐색부터 모델링, 검증까지
실무 보고서에 수록하기 가장 이상적인 분석 시나리오인 (1) LOESS를 통한 추세선 시각화 \(\rightarrow\) (2) MARS를 이용한 핵심 수식 및 변수 중요도 도출 \(\rightarrow\) (3) GAM을 활용한 불확실성(신뢰구간) 검증 순으로 R 코드를 실행해 보겠습니다.
4.1 데이터 로드 및 탐색적 시각화 (LOESS)
airquality 기상 데이터를 사용하여 기온(Temp)에 따른 오존 지수(Ozone)의 비선형 변화를 추적합니다.
library(dplyr)
library(ggplot2)
library(earth)
library(mgcv)
# 1. 데이터 클렌징 (결측값 제거)
df_clean <- airquality %>%
filter(complete.cases(Ozone, Temp, Wind, Solar.R))
# 2. EDA 단계: LOESS 곡선을 통한 비선형 굴곡 확인
ggplot(df_clean, aes(x = Temp, y = Ozone)) +
geom_point(alpha = 0.4, color = "gray40") +
# 국소 변동 포착 (span = 0.3, 파란 점선)
geom_smooth(method = "loess", span = 0.3, se = FALSE, linetype = "dotted", color = "blue") +
# 전체적인 거시 추세선 (span = 0.75, 파란 실선)
geom_smooth(method = "loess", span = 0.75, se = FALSE, size = 1.2, color = "blue") +
labs(title = "기온에 따른 오존 농도의 비선형 EDA (LOESS)",
subtitle = "실선(span=0.75)은 전체 거시적 추세를, 점선(span=0.3)은 세부 변곡 정보를 의미함") +
theme_minimal()4.2 예측 공식 수립 및 피처 기여도 분석 (MARS)
# 1. MARS 모델 생성 (상호작용 반영 degree = 2)
mars_model <- earth(Ozone ~ Temp + Wind + Solar.R, data = df_clean, degree = 2)
# 2. 꺾인 매듭 지점(Knot) 및 회귀 계수 공식 확인
summary(mars_model)
# 3. 오존 형성에 기여도가 높은 핵심 변수 랭킹 도출
evimp(mars_model)4.3 신뢰구간 검증 및 보고서용 그래프 완성 (GAM)
LOESS는 가중 갱신 연산 방식이라 통계적인 신뢰구간을 안정적으로 보여주기 어렵습니다. 따라서 보고서 본문에 수록할 신뢰대 시각화는 GAM 모델을 활용해 구현합니다.
# 1. 일반 가법 모델 적합 (REML을 통한 최적 곡선 고삐 자동 튜닝)
gam_model <- gam(Ozone ~ s(Temp) + s(Wind) + s(Solar.R), data = df_clean, method = "REML")
# 2. 바람과 일사량을 평균값으로 고정한 통제 변수 조건 데이터 생성
grid_data <- data.frame(
Temp = seq(min(df_clean$Temp), max(df_clean$Temp), length.out = 300),
Wind = mean(df_clean$Wind),
Solar.R = mean(df_clean$Solar.R)
)
# 3. 예측값 및 표준오차(se.fit) 산출을 통한 95% 신뢰구간 도출
predictions <- predict(gam_model, newdata = grid_data, se.fit = TRUE)
grid_data$fit <- predictions$fit
grid_data$low <- predictions$fit - 1.96 * predictions$se.fit
grid_data$high <- predictions$fit + 1.96 * predictions$se.fit
# 4. 보고서용 최종 그래프 작도
ggplot() +
geom_point(data = df_clean, aes(x = Temp, y = Ozone), alpha = 0.3, color = "black") +
# 신뢰 구간 그늘대 시각화
geom_ribbon(data = grid_data, aes(x = Temp, ymin = low, ymax = high), alpha = 0.2, fill = "red") +
# 최종 예측 추세선
geom_line(data = grid_data, aes(x = Temp, y = fit), color = "red", size = 1.2) +
labs(title = "온도 제어에 따른 오존 농도 비선형 분석 (GAM)",
subtitle = "기타 외생 변수(바람, 일사량)의 영향력을 제어한 후의 순수 온도 반응선",
x = "Temperature (F)", y = "Ozone (ppb)",
caption = "그늘진 회색 영역은 95% 통계적 신뢰구간을 나타냄") +
theme_minimal()요약
LOESS 로컬 회귀는 데이터의 국소적인 가중 분포를 추적해 부드럽고 직관적인 비선형 그래프 추세를 그리는 훌륭한 탐색 도구입니다.
다만 수식 획득과 다차원 일반화에는 한계가 있으므로, 실무 분석 보고서를 꾸릴 때는 본 가이드라인의 시나리오대로 LOESS로 추세를 시각적으로 탐색하고, MARS를 통해 정량적인 수식과 변수 중요도를 도출하며, GAM으로 최종적인 통계 검증과 신뢰구간을 보고하는 하이브리드 루틴을 적용해 완결성 높은 의사결정 자료를 기획하시기 바랍니다.