데이터 사이언스 - 11. 시계열 데이터 분석 (11.2 시계열 모델링 (Time Series Modeling))

2025. 3. 20. 17:25데이터 분석/데이터 사이언스

11.2 시계열 모델링 (Time Series Modeling)

시계열 모델링은 시간에 따라 변하는 데이터를 분석하고 미래를 예측하는 기법이다.
전통적인 통계 모델인 ARIMA, SARIMA와 딥러닝을 활용한 LSTM 모델이 대표적인 방법이다.

이 장에서는 ARIMA, SARIMA 모델과 LSTM을 활용한 시계열 예측 기법을 다룬다.


11.2.1 ARIMA 모델 (AutoRegressive Integrated Moving Average)

1) ARIMA란?

ARIMA(자기회귀 누적 이동 평균)는 시계열 데이터를 기반으로 미래 값을 예측하는 대표적인 통계적 모델이다.
이 모델은 자기회귀(AR), 차분(I), 이동 평균(MA)의 조합으로 시계열 데이터를 분석한다.

ARIMA 모델 구성 요소

  • AR (AutoRegressive, 자기회귀): 과거 값(시간 t 이전 값들)을 사용하여 현재 값을 예측
  • I (Integrated, 차분): 데이터의 안정성을 확보하기 위해 차분 연산 수행
  • MA (Moving Average, 이동 평균): 과거의 예측 오차를 사용하여 현재 값을 예측

📌 ARIMA 모델 수식

Y_t = c + φ_1 * Y_{t-1} + φ_2 * Y_{t-2} + ... + θ_1 * e_{t-1} + θ_2 * e_{t-2} + ... + e_t
  • Y_t: 현재 값
  • φ: 자기회귀 계수
  • θ: 이동 평균 계수
  • e_t: 예측 오차

2) ARIMA 모델 적용 (Python 코드 예제)

📌 Python 코드 예제 (ARIMA 모델을 활용한 시계열 예측)

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.tsa.arima.model import ARIMA

# 가상의 시계열 데이터 생성
date_range = pd.date_range(start="2023-01-01", periods=100, freq="D")
np.random.seed(42)
data = np.cumsum(np.random.normal(loc=0, scale=2, size=100)) + 100
df = pd.DataFrame({"Date": date_range, "Value": data})
df.set_index("Date", inplace=True)

# ARIMA 모델 학습 (p=2, d=1, q=2 설정)
model = ARIMA(df["Value"], order=(2, 1, 2))
model_fit = model.fit()

# 예측 수행 (향후 10일)
forecast = model_fit.forecast(steps=10)

# 결과 시각화
plt.figure(figsize=(10, 5))
plt.plot(df, label="Actual Data")
plt.plot(pd.date_range(start=df.index[-1], periods=11, freq="D")[1:], forecast, label="ARIMA Forecast", linestyle="dashed", color="red")
plt.xlabel("Date")
plt.ylabel("Value")
plt.title("ARIMA 모델 예측 결과")
plt.legend()
plt.show()

ARIMA 모델 활용

  • order=(p, d, q)에서
    • p: 자기회귀 차수
    • d: 차분 차수
    • q: 이동 평균 차수
  • model_fit.forecast(steps=n)을 사용해 미래 n일 예측 가능

11.2.2 SARIMA 모델 (Seasonal ARIMA, 계절성 ARIMA)

1) SARIMA란?

SARIMA는 ARIMA 모델에 계절성(Seasonality) 요소를 추가한 모델이다.
계절성을 포함하는 시계열 데이터(예: 월별 판매량, 계절별 온도 변화)에서는 ARIMA보다 SARIMA가 더 적합하다.

SARIMA 모델 구성 요소

  • ARIMA(p, d, q) 모델을 기반으로 계절성 요소 추가
  • 계절성 차수(P, D, Q, m)가 추가됨
    • P: 계절성 자기회귀 차수
    • D: 계절성 차분 차수
    • Q: 계절성 이동 평균 차수
    • m: 계절 주기 (예: 월별 데이터라면 m=12)

📌 SARIMA 모델 수식

SARIMA(p, d, q) × (P, D, Q, m)
  • 일반 ARIMA(p, d, q) 모델에 계절성 요소 (P, D, Q, m)를 포함

2) SARIMA 모델 적용 (Python 코드 예제)

📌 Python 코드 예제 (SARIMA 모델을 활용한 시계열 예측)

from statsmodels.tsa.statespace.sarimax import SARIMAX

# SARIMA 모델 학습 (p=1, d=1, q=1) × (P=1, D=1, Q=1, m=12)
sarima_model = SARIMAX(df["Value"], order=(1, 1, 1), seasonal_order=(1, 1, 1, 12))
sarima_fit = sarima_model.fit()

# 예측 수행 (향후 10일)
sarima_forecast = sarima_fit.forecast(steps=10)

# 결과 시각화
plt.figure(figsize=(10, 5))
plt.plot(df, label="Actual Data")
plt.plot(pd.date_range(start=df.index[-1], periods=11, freq="D")[1:], sarima_forecast, label="SARIMA Forecast", linestyle="dashed", color="red")
plt.xlabel("Date")
plt.ylabel("Value")
plt.title("SARIMA 모델 예측 결과")
plt.legend()
plt.show()

SARIMA 모델 활용

  • seasonal_order=(P, D, Q, m)를 설정하여 계절성 반영 가능
  • 주기적 변동이 있는 데이터에서 강력한 성능 발휘

11.2.3 LSTM을 활용한 시계열 예측

1) LSTM이란?

LSTM(Long Short-Term Memory)은 딥러닝 기반의 시계열 예측 모델로,
장기적인 패턴을 학습할 수 있어 ARIMA, SARIMA보다 더 복잡한 데이터 패턴을 예측하는 데 유리하다.

LSTM의 특징

  • 장기 의존성(Long-Term Dependency) 학습 가능
  • 비선형 관계를 학습할 수 있어 복잡한 시계열 데이터에 적합
  • 대량의 데이터에서 강력한 성능 발휘

2) LSTM을 활용한 시계열 예측 (Python 코드 예제)

📌 Python 코드 예제 (LSTM 기반 시계열 예측 모델 구현)

import tensorflow as tf
from tensorflow.keras import layers
from sklearn.preprocessing import MinMaxScaler

# 데이터 정규화 (LSTM은 데이터 정규화 필요)
scaler = MinMaxScaler()
df["Scaled_Value"] = scaler.fit_transform(df[["Value"]])

# 입력 데이터 생성 (과거 10일 데이터를 기반으로 예측)
sequence_length = 10
X, y = [], []
for i in range(len(df) - sequence_length):
    X.append(df["Scaled_Value"].values[i:i+sequence_length])
    y.append(df["Scaled_Value"].values[i+sequence_length])

X, y = np.array(X), np.array(y)

# LSTM 모델 생성
model = tf.keras.Sequential([
    layers.LSTM(50, return_sequences=True, input_shape=(sequence_length, 1)),
    layers.LSTM(50, return_sequences=False),
    layers.Dense(1)
])

# 모델 컴파일 및 학습
model.compile(optimizer="adam", loss="mse")
model.fit(X, y, epochs=20, batch_size=16)

# 예측 수행
y_pred = model.predict(X)

# 결과 시각화
plt.figure(figsize=(10, 5))
plt.plot(df.index[sequence_length:], y, label="Actual Data", alpha=0.5)
plt.plot(df.index[sequence_length:], y_pred, label="LSTM Prediction", linestyle="dashed", color="red")
plt.xlabel("Date")
plt.ylabel("Value")
plt.title("LSTM 모델 예측 결과")
plt.legend()
plt.show()

LSTM 활용

  • 데이터 정규화 필요 (MinMaxScaler)
  • 과거 데이터를 기반으로 미래 값 예측 가능

결론

ARIMA → 단기적인 예측에 강점, 간단한 시계열 분석에 적합
SARIMA → 계절성을 반영한 시계열 분석에 적합
LSTM → 복잡한 패턴을 학습하고 장기 예측에 강력한 성능 발휘

적절한 시계열 모델을 선택하면 데이터 패턴을 분석하고 미래를 효과적으로 예측할 수 있다.