본문 바로가기
ML/Time-Series Analysis

[ML][Time - Series Analysis] MA(Moving Aveage) 모델

by 어떻게든 되겠지~ 2024. 8. 25.

MA(Moving Aveage) 모델이란?

MA 모델은 트렌드(평균 혹은 시계열 그래프에서 y값)가 변화하는 상황에 적합한 회귀모델     
MA 모델에서는 "윈도우(Window)"라는 개념을 사용하는데, 시계열을 따라 윈도우 크기만큼 sliding 된다로 하여 이동 평균 모델이라 한다

MA 모델 수식

$${\large  Z_{t}= \mu + \epsilon_{t} + \theta_{1}\epsilon_{t-1} + \theta_{2}\epsilon_{t-2} + \cdots + \theta_{p}\epsilon_{t-p}}$$

 

$Z_{t}$ : 현재 시점에서의 시계열 값      
$\mu$ : 평균
$\epsilon_{t} + \theta_{1}\epsilon_{t-1} + \theta_{2}\epsilon_{t-2} + \cdots + \theta_{p}\epsilon_{t-p}$ : 매개변수($\theta$)에 과거 시점의 오차를 곱한 것        
$\epsilon_{t}$ : 시계열 분석에서 오차항을 의미하며 백색 잡음이라고도 한다 

Moving Average 모델에서의 $\epsilon_{t}$는 오차항을 의미한다고 하였다. 즉, AR 모델처럼 이전 데이터의 상태로부터 현재 데이터의 상태를 추론하는 것이 아닌, 이전 데이터의 오차에서 현재 데이터의 상태를 추론하겠다는 의미이다

 

MA모델의 특징

  • 과거 오차의 영향 : 과거의 오차항들의 영향을 받아 현재 값을 예측하는 모델이기 때문에 무작위 변동성을 설명하는데 유용
  • 차수 q 의 결정 : q라는 차수를 결정해야하며 이 차수는 과거의 몇개의 오차 항을 현재 값의 예측에 사용할지 결정
  • 단기 예측에 유용 : MA 모델은 단기 예측에 주로 사용한다

MA모델의 한계 

  • 장기 예측의 한계 :오차 항의 영향이 시간이 지남에 따라 감소하기 때문에 MA 모델은 장기 예측에 적합하지 않다
  • 비정상 시계열 데이터에의 적용성 :비정상 시계열 데이터에는 추가적인 처리가 필요할 수 있다

MA(Moving Aveage) 모델 예제 코드

1) 필요한 라이브러리 Import

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


통계분석 라이브러리인 statsmodels에서 시계열 분석을 위한 tsa 모듈을 사용한다.

tsa 모듈에서 ARIMA Class를 불러와 차수를 조절하여 MA 모델로써 사용한다.

2) 랜덤으로 예제 데이터 생성

# 예제 데이터 생성
data = np.random.randn(100).cumsum() + 100

# 예제 데이터를 Time Series Data로 변환
ts = pd.Series(data)

# 학습 데이터와 테스트 데이터로 분리
train, test = ts[:80], ts[80:]

3) ARIMA Class를 통해 MA 모델 생성 및 Fitting

# MA 모델 fitting
# ARIMA 모델의 parameter로 MA 모델 생성(p, d를 0으로, q=50)
model = ARIMA(train, order=(0, 0, 50))
model_fit = model.fit()

# 예측
predictions = model_fit.predict(start=len(train), end=len(train) + len(test)-1)

 

4) 성능 평가 및 결과 시각화

# 테스트 데이터와 예측 결과를 시각화
plt.figure(figsize=(10, 5))
plt.plot(train, label='Train')
plt.plot(test.index, test, label='Test', color='gray')
plt.plot(test.index, predictions, label='Predicted', color='red')
plt.title('Moving Average Model')
plt.legend()
plt.show()

# 모델의 성능 평가
mse = mean_squared_error(test, predictions)
print(mse)

반응형