Deterministic Analysis
— 회귀분석 기반 결정론적 시계열 모형
이차함수 추세 + 계절성 가변수 회귀모형, 꺾인 직선(Piecewise) 모형, 모형 비교(MSE/AIC), 잔차 분석, 그리고 항공 여객 데이터(9/11 효과)까지 다룹니다.
결정론적 분석(Deterministic Analysis)이란?
시계열의 구성 요소(추세·계절성)를 회귀분석을 통한 수식으로 직접 모형화하는 방법입니다.
지난 시간의 decompose()가 이동평균 기반의 탐색적 분해였다면,
결정론적 분석은 각 성분의 크기와 통계적 유의성을 직접 추정·검정할 수 있습니다.
Y_t = (추세 성분) + (계절 성분) + ε_t
Y_t = β₀ + β₁t + β₂t² + γ₁M₁ + γ₂M₂ + ... + γ₁₁M₁₁ + ε_t
t를 독립변수로 사용하고,
월별 계절성은 가변수(Dummy Variable)로 표현합니다.
factor()를 사용하면 R이 1월을 기준(Reference)으로 자동으로 11개 가변수를 만들어 줍니다.
이차함수 추세 + 계절 가변수 회귀모형
텍사스 데이터는 1991년 7~8월을 정점으로 전체적으로 포물선(∩) 형태의 추세를 보입니다. 이를 이차항(t²)으로 표현하고, 여름철 계절성은 월별 가변수로 반영합니다.
변수 및 데이터프레임 구성
# 독립변수 생성 time_t <- 1:length(ts_texas) # 시간 축 (t: 1~108) time_t_sq <- time_t^2 # 이차항 (t²) # 월별 가변수: factor()로 자동 생성 (1월이 기준) months <- rep(1:12, length.out = length(ts_texas)) month_factor <- factor(months) # 데이터프레임 구성 df_reg_base <- data.frame( Murders = as.numeric(ts_texas), t = time_t, t_sq = time_t_sq, Month = month_factor )
회귀모형 실행 및 시각화
# 모형 실행 (1월이 기준, Month2~Month12 자동 생성) model_base <- lm(Murders ~ t + t_sq + Month, data = df_reg_base) summary(model_base) # 예측값 → 시계열 객체 변환 fitted_values <- ts(predict(model_base), start = c(1989, 1), frequency = 12) # 원본 + 적합값 시각화 plot(ts_texas, col = "gray70", lwd = 1, main = "Texas Murders: Quadratic + Seasonal", ylab = "Number of Murders", xlab = "Year") lines(fitted_values, col = "blue", lwd = 2) legend("topright", legend = c("Original", "Quadratic+Seasonal"), col = c("gray70", "blue"), lty = 1, lwd = c(1, 2))
·
t 계수 > 0, t_sq 계수 < 0 → 포물선(∩) 형태 확인·
Month7, Month8 계수가 크고 유의미(***) → 여름철 계절성 확인· R² 값이 높을수록 추세+계절성이 변동을 잘 설명함
계절성 가설 검정 — ANOVA F-검정
계절 가변수가 통계적으로 유의미한지 검정합니다. 귀무가설(H₀): 모든 월별 계수 = 0 (계절성 없음) vs 대립가설(H₁): 적어도 하나의 월별 계수 ≠ 0 (계절성 있음)
# 추세만 있는 축소 모형 (Reduced Model) model_trend_only <- lm(Murders ~ t + t_sq, data = df_reg_base) # Full vs Reduced 비교 (F-검정) seasonality_test <- anova(model_trend_only, model_base) print(seasonality_test)
Pr(>F) (p-value) < 0.05 → H₀ 기각 → 계절성이 통계적으로 유의미하게 존재텍사스 데이터에서는 7~8월의 반복적 급증 패턴이 뚜렷하므로 매우 작은 p-value가 예상됩니다.
꺾인 직선 모형 — Piecewise Linear Regression
이차함수 대신, 특정 시점을 기준으로 기울기가 달라지는 직선으로 추세를 모형화합니다. 텍사스 데이터에서는 1991년 7월(31번째 데이터)이 꺾이는 시점입니다.
Y_t = β₀ + β₁t + β₂·max(0, t - 31) + 계절성 + ε_t
β₁: 1991년 7월 이전의 기울기 | β₂: 이후 기울기의 변화량 (β₁+β₂가 이후 실제 기울기)
변수 생성 및 모형 실행
# 기준점 이후만 1씩 증가하는 변수 생성 break_point <- 31 time_after <- pmax(0, time_t - break_point) df_break <- data.frame( Murders = as.numeric(ts_texas), t = time_t, # 이전 기울기 t_diff = time_after, # 이후 기울기 변화량 Month = month_factor ) model_break <- lm(Murders ~ t + t_diff + Month, data = df_break) summary(model_break) # 시각화 (꺾이는 시점에 수직선 추가) fitted_break <- ts(predict(model_break), start = c(1989, 1), frequency = 12) plot(ts_texas, col = "gray70", main = "Texas Murders: Piecewise Linear + Seasonal") lines(fitted_break, col = "darkred", lwd = 2) abline(v = 1991.58, col = "blue", lty = 2) # 1991년 7월 legend("topright", legend = c("Original", "Piecewise Model", "Break (Jul 91)"), col = c("gray70", "darkred", "blue"), lty = c(1, 1, 2), lwd = c(1, 2, 1))
t_diff의 p-value가 유의미 → 1991년 7월을 기점으로
통계적으로 유의미한 구조적 추세 전환이 있었음을 의미합니다.
모형 비교 — MSE & AIC
이차함수 모형과 꺾인 직선 모형 중 어느 것이 텍사스 데이터를 더 잘 설명하는지 비교합니다.
model_base
전체적인 곡선 흐름을 부드럽게 포착. 하지만 1991년 급격한 반전을 완만하게만 표현
model_break
변곡점을 날카롭게 포착. 급격한 추세 전환이 있다면 MSE가 더 낮을 가능성이 높음
# MSE 비교 (값이 작을수록 좋음) mse_quadratic <- mean(residuals(model_base)^2) mse_break <- mean(residuals(model_break)^2) cat("이차함수 MSE: ", mse_quadratic, "\n") cat("꺾인 직선 MSE: ", mse_break, "\n") # R-squared 확인 summary(model_base)$r.squared summary(model_break)$r.squared # AIC 비교 (값이 작을수록 좋음, 모수 수 패널티 포함) AIC(model_base, model_break)
| 지표 | 의미 | 판정 기준 |
|---|---|---|
| MSE | 평균 제곱 오차 | 작을수록 예측 정확도 높음 |
| R² | 결정계수 (설명력) | 클수록 변동 설명 비율 높음 |
| AIC | 모수 수 패널티 포함 | 작을수록 좋음 (과적합 방지) |
잔차 분석 & 독립성 검정
모형이 데이터의 추세·계절성을 충분히 제거했는지 확인합니다. 잔차가 무작위(White Noise)에 가까울수록 좋은 모형입니다.
4종 진단 그래프
# 꺾인 직선 모형의 잔차 추출 res_break <- residuals(model_break) res_ts <- ts(res_break, start = c(1989, 1), frequency = 12) # 화면 2x2 분할 par(mfrow = c(2, 2)) plot(res_ts, type = "p", main = "Residuals vs Time") abline(h = 0, col = "red") acf(res_ts, main = "ACF of Residuals") hist(res_ts, main = "Histogram of Residuals", col = "lightblue") qqnorm(res_ts) qqline(res_ts, col = "red") par(mfrow = c(1, 1))
| 진단 그래프 | 확인 내용 | 좋은 모형의 모습 |
|---|---|---|
| Residuals vs Time | 시간에 따른 잔차 패턴 | 0 주변에 무작위 분포, 패턴 없음 |
| ACF | 자기상관 잔재 여부 | Lag 1 이후 모두 점선 안쪽 |
| Histogram | 정규분포 형태 | 종 모양, 좌우 대칭 |
| QQ-Plot | 정규분포 적합성 | 45° 직선 위에 점이 놓임 |
Ljung-Box 독립성 검정
# Lag 12까지의 자기상관을 종합적으로 검정 lb_test <- Box.test(res_ts, lag = 12, type = "Ljung-Box") print(lb_test)
p-value < 0.05 → H₀ 기각 → 잔차에 자기상관 남아있음 → 모형 개선 필요
항공 여객 데이터 — 9/11 구조 변화 분석
airpassenger96_07.txt는 1996년 1월~2007년 5월의
월별 국내선 항공 여객 수입니다. 2001년 9월 11일 테러 이후의
구조적 변화(급격한 감소 + 추세 전환)를 회귀모형으로 분석합니다.
데이터 읽기 & 시각화
# 데이터 읽기 (탭 구분) air_data <- read.table("airpassenger96_07.txt", header = TRUE, sep = "\t") ts_air <- ts(air_data$Passengers, start = c(1996, 1), frequency = 12) # 9/11 참조선 추가 plot(ts_air, main = "Air Passengers with 9/11 Reference", col = "blue", lwd = 1) abline(v = 2001 + 8/12, col = "red", lty = 2, lwd = 2) text(x = 2001.7, y = 35000, "9/11 Terror", col = "red", pos = 4) points(2001 + 8/12, 34608, col = "red", pch = 19)
통합 회귀모형 — 절편 변화 + 기울기 변화 + 계절성 변화
9/11 효과를 반영하기 위해 세 가지 더미 변수를 추가합니다.
| 변수 | 역할 | 값 |
|---|---|---|
d_911 |
절편 변화 (Step 더미) | 2001.09 이후 1, 이전 0 |
t_after |
기울기 변화 (Piecewise) | 2001.09 이후 시간 흐름 |
d_911:Month |
계절성 변화 (상호작용) | 전후 월별 효과 차이 |
d_sep01 |
펄스 (Pulse 더미) | 2001.09 당월만 1 |
# 기본 변수 설정 time_t <- 1:length(ts_air) month_f <- factor(rep(1:12, length.out = length(ts_air))) # 9/11 관련 더미 변수 d_911 <- ifelse(time_t >= 69, 1, 0) # Step 더미 t_after <- pmax(0, time_t - 69) # 기울기 변화 df_total <- data.frame( Passengers = as.numeric(ts_air), t = time_t, d_911 = d_911, t_after = t_after, Month = month_f ) # 통합 모형: 계절성도 9/11 전후로 달라질 수 있다고 가정 model_total <- lm(Passengers ~ t + d_911 + t_after + Month + d_911:Month, data = df_total) summary(model_total)
펄스 더미 추가 (2001년 9월 단발성 충격)
# 2001년 9월(69번째)만 1인 펄스 더미 time_axis <- time(ts_air) d_sep01 <- ifelse(time_axis == time_axis[69], 1, 0) df_pulse <- data.frame( Passengers = as.numeric(ts_air), t = 1:length(ts_air), d_911 = ifelse(time_axis >= time_axis[69], 1, 0), d_sep01 = d_sep01, # 당월 단발 충격 t_after = pmax(0, (1:length(ts_air)) - 69), Month = factor(rep(1:12, length.out = length(ts_air))) ) model_pulse <- lm(Passengers ~ t + d_911 + d_sep01 + t_after + Month + Month:d_911, data = df_pulse) summary(model_pulse)
9/11 전후 계절성 비교 검정
# 축소 모형: 계절성 전후 동일 가정 model_reduced <- lm(Passengers ~ t + d_911 + d_sep01 + t_after + Month, data = df_pulse) # 완전 모형: 계절성 전후 상이 가정 (상호작용항 포함) model_full <- lm(Passengers ~ t + d_911 + d_sep01 + t_after + Month + Month:d_911, data = df_pulse) # F-검정: 계절성이 전후로 유의미하게 달라졌는가? anova(model_reduced, model_full)
'인하대학교 공학대학원(인공지능융합전공) > 시계열 분석' 카테고리의 다른 글
| 8. 비정상 시계열을 위한 고급 예측 모형 (0) | 2026.05.29 |
|---|---|
| 6. R 기초 & 시계열 시각화— Time Plot & Smoothing (0) | 2026.05.21 |
| 5. Advanced Forecast Models for Autocorrelated Time Series (2026) (0) | 2026.05.08 |
| 4. Simple Forecast Models (2026) (0) | 2026.04.17 |
| 3. Introduction to Forecasting_(2) (2026) (0) | 2026.03.27 |