인하대학교 공학대학원(인공지능융합전공)/시계열 분석

7. Deterministic Analysis— 회귀분석 기반 결정론적 시계열 모형

복리 엔지니어 2026. 5. 21. 15:59
시계열 분석 실습 2 — Deterministic Analysis
📅 2025년 5월 21일 📗 시계열 분석 실습 2

Deterministic Analysis
— 회귀분석 기반 결정론적 시계열 모형

이차함수 추세 + 계절성 가변수 회귀모형, 꺾인 직선(Piecewise) 모형, 모형 비교(MSE/AIC), 잔차 분석, 그리고 항공 여객 데이터(9/11 효과)까지 다룹니다.

01

결정론적 분석(Deterministic Analysis)이란?

시계열의 구성 요소(추세·계절성)를 회귀분석을 통한 수식으로 직접 모형화하는 방법입니다. 지난 시간의 decompose()가 이동평균 기반의 탐색적 분해였다면, 결정론적 분석은 각 성분의 크기와 통계적 유의성을 직접 추정·검정할 수 있습니다.

기본 모형 구조
Y_t = (추세 성분) + (계절 성분) + ε_t Y_t = β₀ + β₁t + β₂t² + γ₁M₁ + γ₂M₂ + ... + γ₁₁M₁₁ + ε_t
핵심 아이디어: 시간 t를 독립변수로 사용하고, 월별 계절성은 가변수(Dummy Variable)로 표현합니다. factor()를 사용하면 R이 1월을 기준(Reference)으로 자동으로 11개 가변수를 만들어 줍니다.
02

이차함수 추세 + 계절 가변수 회귀모형

텍사스 데이터는 1991년 7~8월을 정점으로 전체적으로 포물선(∩) 형태의 추세를 보입니다. 이를 이차항(t²)으로 표현하고, 여름철 계절성은 월별 가변수로 반영합니다.

변수 및 데이터프레임 구성

R
# 독립변수 생성
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
)

회귀모형 실행 및 시각화

R
# 모형 실행 (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² 값이 높을수록 추세+계절성이 변동을 잘 설명함
03

계절성 가설 검정 — ANOVA F-검정

계절 가변수가 통계적으로 유의미한지 검정합니다. 귀무가설(H₀): 모든 월별 계수 = 0 (계절성 없음) vs 대립가설(H₁): 적어도 하나의 월별 계수 ≠ 0 (계절성 있음)

R
# 추세만 있는 축소 모형 (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가 예상됩니다.
04

꺾인 직선 모형 — Piecewise Linear Regression

이차함수 대신, 특정 시점을 기준으로 기울기가 달라지는 직선으로 추세를 모형화합니다. 텍사스 데이터에서는 1991년 7월(31번째 데이터)이 꺾이는 시점입니다.

꺾인 직선 모형
Y_t = β₀ + β₁t + β₂·max(0, t - 31) + 계절성 + ε_t

β₁: 1991년 7월 이전의 기울기 | β₂: 이후 기울기의 변화량 (β₁+β₂가 이후 실제 기울기)

변수 생성 및 모형 실행

R
# 기준점 이후만 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 계수 해석: t_diff의 p-value가 유의미 → 1991년 7월을 기점으로 통계적으로 유의미한 구조적 추세 전환이 있었음을 의미합니다.
05

모형 비교 — MSE & AIC

이차함수 모형과 꺾인 직선 모형 중 어느 것이 텍사스 데이터를 더 잘 설명하는지 비교합니다.

이차함수 모형

model_base

전체적인 곡선 흐름을 부드럽게 포착. 하지만 1991년 급격한 반전을 완만하게만 표현

꺾인 직선 모형 ★

model_break

변곡점을 날카롭게 포착. 급격한 추세 전환이 있다면 MSE가 더 낮을 가능성이 높음

R
# 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평균 제곱 오차작을수록 예측 정확도 높음
결정계수 (설명력)클수록 변동 설명 비율 높음
AIC모수 수 패널티 포함작을수록 좋음 (과적합 방지)
06

잔차 분석 & 독립성 검정

모형이 데이터의 추세·계절성을 충분히 제거했는지 확인합니다. 잔차가 무작위(White Noise)에 가까울수록 좋은 모형입니다.

4종 진단 그래프

R
# 꺾인 직선 모형의 잔차 추출
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 독립성 검정

R
# Lag 12까지의 자기상관을 종합적으로 검정
lb_test <- Box.test(res_ts, lag = 12, type = "Ljung-Box")
print(lb_test)
판정: p-value > 0.05 → H₀(잔차가 서로 독립) 채택 → 잔차에 자기상관 없음 → 모형 적합
p-value < 0.05 → H₀ 기각 → 잔차에 자기상관 남아있음 → 모형 개선 필요
07

항공 여객 데이터 — 9/11 구조 변화 분석

airpassenger96_07.txt는 1996년 1월~2007년 5월의 월별 국내선 항공 여객 수입니다. 2001년 9월 11일 테러 이후의 구조적 변화(급격한 감소 + 추세 전환)를 회귀모형으로 분석합니다.

2001년 9월(69번째 데이터) 특이점: 전월 63,215명 → 당월 34,608명 → 급감. 이후 회복세를 보이나 계절성 패턴도 변화합니다.

데이터 읽기 & 시각화

R
# 데이터 읽기 (탭 구분)
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
R
# 기본 변수 설정
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월 단발성 충격)

R
# 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 전후 계절성 비교 검정

R
# 축소 모형: 계절성 전후 동일 가정
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)
분석 결론: d_911 계수 → 9/11 직후 절편 급락 확인 | t_after 계수 → 이후 회복 기울기 확인 | ANOVA F-검정 → 계절성 패턴이 9/11 전후로 통계적으로 다른지 여부 판단