기능 데이터 분석으로 곡선형 데이터를 예측하는 방법
기능 데이터 분석의 평활화, Functional PCA, Functional Linear Models를 연결해 시계열·센서 곡선 데이터를 예측·해석하는 방법을 정리한다.
2026-08-14 · 최초 발행 2024-04-29
곡선으로 관측된 데이터를 함수로 다루는 이유
시간이나 공간을 따라 연속적으로 수집되는 데이터는 단순한 고정 길이 벡터보다 곡선 또는 함수 객체로 보는 편이 적합할 때가 있다. 기능 데이터 분석(Functional Data Analysis, FDA)은 이런 데이터를 함수로 근사해 추정, 차원 축소, 예측에 사용하는 방법론이다.
시계열, 센서 신호, 곡선형 관측값에 잡음이 섞여 있을 때는 평활화로 신호를 정리하고, Functional PCA로 주요 변동을 압축한 다음, Functional Linear Models로 반응을 예측하는 흐름을 구성할 수 있다.
관측값은 조밀한 그리드 위 벡터로 고정하지 않고 B-spline, Fourier 같은 기저함수의 선형결합으로 표현한 함수 (f_i(t))로 근사한다. 입력은 함수 (X_i(t)), 반응은 스칼라 또는 함수 (y_i)가 될 수 있다. 이 표현에서는 불규칙 샘플링, 결측, 이질적인 잡음을 고려해야 한다.
평활화에서 예측까지 이어지는 모델링 흐름
Smoothing Splines는 관측값과 추정 곡선 사이의 거리를 줄이면서 2차 도함수, 즉 곡률에 벌점을 부여한다. 이 방식은 과적합을 억제하면서 곡선의 형태를 보존하는 데 쓰인다. 평활화 정도를 정하는 하이퍼파라미터 (\lambda)는 GCV 또는 LOOCV로 선택할 수 있으며, 기저 차수와 노드 수 사이에도 트레이드오프가 있다.
평활화된 함수는 Functional PCA(FPCA)로 압축할 수 있다. FPCA는 공분산 연산자의 고유함수 (\phi_k(t))와 점수 (z_{ik})를 구해 다음과 같은 형태로 함수를 저차원화한다.
[ X_i(t) \approx \mu(t) + \Sigma_k z_{ik}\phi_k(t) ]
성분 수는 누적 설명분산을 기준으로 선택한다. 다만 이상치나 경계 구간은 모드 해석에 영향을 줄 수 있으므로 결과를 읽을 때 주의가 필요하다.
Functional Linear Models(FLM)는 함수 입력과 반응의 관계를 회귀로 연결한다. 스칼라 반응의 경우 다음과 같이 나타낼 수 있다.
[ y_i = \alpha + \int \beta(t)X_i(t)dt + \epsilon ]
함수-온-함수, 함수-온-스칼라 형태로도 확장할 수 있다. (\beta(t))는 기저 전개 뒤 roughness penalty를 적용하거나 PC 축에서 회귀하는 방식으로 추정한다. 특정 시간대가 반응에 미치는 영향을 읽을 수 있다는 점이 FLM의 강점이다.
데이터 품질과 정규화가 모델 해석을 좌우한다
시간축 정렬, 결측 보간, 이상치의 로버스트 처리는 함수화 이전에 다뤄야 한다. 중심화와 표준화는 스케일 차이를 줄이고 경계효과를 완화하는 데 사용한다.
B-spline 기반 평활화는 구간별 다항식과 연결 조건을 이용하므로 계산이 빠르고 국소 특징을 유지하기 좋다. 스무딩 스플라인은 전역적으로 최적화하며 (\lambda)를 통해 편차와 분산의 균형을 조절한다.
FPCA는 함수 데이터를 점수 벡터로 바꿔 다운스트림 모델에 전달한다. 누적 설명분산 90~99%를 기준으로 (q)를 정하면 모델 복잡도를 낮출 수 있다. FLM에서는 (\beta(t))에 (\int(\beta''(t))^2dt) 벌점을 적용해 과적합을 제어한다. FPCA 점수를 입력으로 선형 회귀, 리지 회귀, 엘라스틱넷 회귀를 적용하는 방법도 예측력과 안정성을 확보하는 대안이다.
(\lambda), (q), 벌점은 K-fold CV로 선택할 수 있다. 추정된 (\beta(t))의 신뢰구간과 유효 시간대, 즉 영향 창을 함께 해석하면 도메인 관점의 인사이트를 얻을 수 있다.
기법별로 보는 선택 기준
| 기법 | 성능 | 확장성 | 일관성 | 안정성 | 운영 편의 |
|---|---|---|---|---|---|
| Smoothing Splines | 노이즈 억제 우수, 국소 패턴 보존 | T가 커도 효율적, 분산 처리 용이 | λ로 재현성 확보 | 경계 민감성 존재(보간점 설계 필요) | 하이퍼파라미터 단순(GCV 자동화) |
| Functional PCA | 고차원→저차원 손실 최소화 | 큰 n,T에서도 효율(랜덤화/증분형 가능) | 누적분산 기준으로 일관 선택 | 이상치 민감(로버스트 FPCA 고려) | 점수 기반 다운스트림 연동 용이 |
| Functional Linear Models | 해석 가능성과 예측 균형 | 고차원 시 벌점·PC로 안정화 | 벌점·기저 고정 시 재현성 우수 | 과적합 방지에 민감도 낮음(정규화) | 배포·설명 용이(β(t) 시각화) |
곡선 데이터가 나오는 업무에서의 활용
전력 수요와 부하 예측에서는 일중 부하 곡선을 평활화하고 FPCA와 FLM을 연결해 기온 및 요일 효과를 반영할 수 있다. 시간대별 (\beta(t))는 피크에 기여하는 구간을 식별하는 데 쓰인다.
웨어러블 생체신호에서는 심박 또는 가속도 곡선을 스플라인으로 평활화한 뒤 FPCA 점수로 이상상태를 분류할 수 있다. FLM은 특정 시간대 패턴과 피로 지표의 관계를 추정하는 데 사용된다.
공정 품질 모니터링에서는 온도와 압력 프로파일로 기능형 관리도를 구성하고, FPCA 잔차를 바탕으로 이상을 탐지할 수 있다. 이상이 발생한 원인 시간대를 역추적하는 용도에도 연결된다.
금융 이자율 곡선은 함수로 모델링할 수 있으며, FPCA의 레벨·기울기·굽힘 성분으로 요인화할 수 있다. FLM 또는 동태모형과 결합하면 리스크와 시나리오 분석에 활용할 수 있다.
R에서 평활화, FPCA, FLM을 연결하기
전제조건은 다음과 같다.
- R ≥ 4.2
- 패키지: fda (>=2.4), refund (>=0.1-24), mgcv (>=1.9)
예제 데이터는 fda::CanadianWeather의 일별 기상 데이터(온도·강수)다.
# 패키지 설치(최초 1회)
# install.packages(c("fda", "refund", "mgcv"))
library(fda)
library(refund)
library(mgcv)
# 1) 데이터 로드
data(CanadianWeather)
day <- 1:365
temp_mat <- CanadianWeather$dailyAv[, , "Temperature.C"] # 365 x 35
precip_mat <- CanadianWeather$dailyAv[, , "Precipitation.mm"]
# 2) 스무딩 스플라인(여기서는 B-spline + 벌점)으로 함수 객체 생성
nbasis <- 35
basis <- create.bspline.basis(rangeval = c(1, 365), nbasis = nbasis, norder = 4)
lambda <- 1e4
fdParobj <- fdPar(basis, Lfdobj = int2Lfd(2), lambda = lambda)
temp_fd <- smooth.basis(argvals = day, y = temp_mat, fdParobj)$fd
# 3) FPCA: 주요 모드 및 점수 획득
pca_res <- pca.fd(temp_fd, nharm = 5, centerfns = TRUE)
round(pca_res$varprop, 3) # 각 성분 설명분산
scores <- pca_res$scores # 35 x 5
# 4) 스칼라 반응 생성: 연간 총 강수량의 로그
precip_y <- log1p(colSums(precip_mat)) # 길이 35
# 4-a) FPCA 점수 기반 리지 회귀(간단·튼튼)
ridge_df <- data.frame(y = precip_y, scores)
ridge_fit <- glmnet::cv.glmnet(as.matrix(scores), precip_y, alpha = 0)
ridge_rmse <- sqrt(min(ridge_fit$cvm))
# 4-b) FLM: pfr로 β(t) 추정(스칼라-온-함수)
X <- t(eval.fd(day, temp_fd)) # 35 x 365 (n x T)
set.seed(7)
K <- 5
fold_id <- sample(rep(1:K, length.out = length(precip_y)))
cv_rmse <- numeric(K)
for (k in 1:K) {
idx_tr <- which(fold_id != k); idx_te <- which(fold_id == k)
fit_flm <- pfr(precip_y[idx_tr] ~ lf(X[idx_tr, ], argvals = day,
basistype = "bs", k = 20),
family = gaussian())
pred <- predict(fit_flm, newdata = list(X = X[idx_te, ]))
cv_rmse[k] <- sqrt(mean((precip_y[idx_te] - pred)^2))
}
flm_rmse <- mean(cv_rmse)
list(RMSE_ridge = ridge_rmse, RMSE_flm = flm_rmse)
# β(t) 시각화
fit_flm_full <- pfr(precip_y ~ lf(X, argvals = day, basistype = "bs", k = 20))
plot(fit_flm_full, select = 1, shade = TRUE, main = "β(t): 온도가 강수량 로그에 미치는 영향")
(\lambda), nbasis, k는 K-fold CV 또는 GCV로 선택한다. FPCA 점수 기반 회귀는 견고하고 배포가 단순한 반면, FLM은 해석력에 강점이 있다. 시간축이 불규칙하거나 결측이 많은 경우에는 등록(alignment)과 로버스트 FPCA를 고려한다.
운영에서 기대할 수 있는 변화
원시 고차원 벡터와 비교하면 산업과 도메인에 따라 RMSE가 1030% 개선될 수 있다. 누적 설명분산 95%를 기준으로 (q≈310)까지 축소하면 학습 및 추론 시간을 줄일 수 있다.
(\beta(t))는 영향 시간대를 드러내므로 피크 관리나 알람 창을 정하는 운영 의사결정에 활용할 수 있다. 벌점과 CV를 기반으로 하이퍼파라미터를 선택하면 데이터 드리프트 상황에서도 성능 변동을 완화하는 데 도움이 된다.
전처리, 평활화, FPCA, 모델링, 검증의 파이프라인을 표준화하면 재현성과 운영 편의성을 확보할 수 있다. 도메인별 하이퍼파라미터 튜닝과 모델 모니터링을 함께 구성하는 방식이 실무 적용에 맞는다.