세줄 코딩(실무용 알고리즘)

시계열 예측방식, 그리고 가장 간단한 시계열 예측 알고리즘

정데만 2023. 11. 17. 11:03
728x90

시계열 데이터 예측 방식

이전 포스트에서는 시계열 분해 알고리즘(관련 포스트)을 활용하여 시계열 데이터를 구성하는 추세/계절성/주기성을 알아보았다.
 
시계열 예측은 이러한 요소들을 조합하여 최적화 된 예측값을 계산하는 알고리즘으로 데이터에 따라 단일 값(단변량)을 이용하는 예측하는 방법과 같은 시기에 측정된 여러 데이터(다변량)을 활용하는 방식으로 나눌 수 있다.
 
단일 값을 이용한 예측 방식은 앞서 알아본 배추값의 사례처럼 월별 배추값으로 추세와 계절성 등을 분해하고 이를 조합하여 예측하는 방식으로 진행된다. 이는 결국 과거 자신의 값에서 규칙성을 발견하여 미래를 예측하는 방식이라 볼 수 있다. 그러나 여러 데이터를 이용한 시계열 예측 방법은 과거 자신의 값 뿐만 아니라 해당 값에 영향을 주는 값들도 예측에 활용한다.
 
이해를 돕기 위해 모델 데이터 구성방법을 그림으로 표현하면 다음과 같다. 먼저, 단변량 시계열 예측은 예측하려는 데이터의 과거 패턴과 추세, 변동성을 적절하게 더하여 최적값을 찾아내는 방식이다.

 


 
그리고, 다변량 시계열 예측모델은 단변량에서 사용했던 추세와 패턴에 동일 시기에 관측한 데이터와의 상관관계를 추가하여 시계열을 예측한다.
 
 

 

배추값을 예측할 경우 같은 시기의 배추가격에 영향을 줄만한 시계열 데이터를 같이 사용한다면 예측하려는 시기에 앞서 관련 데이터들이 먼저 영향을 줄테니 예측 결과가 좀 더 정확하게 나타날 것이다. 
 
참고로 앞서 AutoML로 알아봤던(관련 포스트) 예측/분류 모델로 미래 시점의 타겟변수를 예측하려면 다음과 같이 데이터를 구성하면 된다.
 

 
 
예측/분류 모델은 보통 타겟변수(연체여부)를 예측하기 위해 설명변수(부채 총액 등)를 지정한다. 그래서 시점에 대한 제한이 없으며, 미래시점을 예측하려면 과거 데이터의 수집기간과 현재(미래)데이터의 예측기간을 설정하여 데이터를 학습하면 된다. 예를 들어 과거 1년간의 평균 소득과 연체 경험 등을 수집하여 앞으로 1달 내 연체여부를 예측하는 방식으로 데이터를 구성하는 것이다. 
 
시계열 예측은 수집 가능한 데이터와 예측 정확도, 그리고 목적에 따라 개발 방식을 선택할 수 있으며 각 모델에 따라 결과물의 방식도 다르다.
 
시계열 예측은 예측/분류모델이 알려주는 예측결과와 조금 차이가 나는데 알고리즘을 직접 사용 해보면서 알아보자


단변량 시계열 예측하는 방법

시계열 예측은 전통적인 ARIMA부터, 금융에서 많이 사용하는 GARCH, 딥러닝 방식의 RNN/LSTM 등 다양한 알고리즘이 있지만, 각각 파라미터에 따라 결과가 크게 바뀌는 경향이 있어 충분히 경험해보지 않으면 활용하기 쉽지 않다.
 
이번 포스트에서 사용하려는 알고리즘은 페이스북(현 메타)에서 발표한 딥러닝 방식으로 개발한 것으로 예언자라는 이름을 가진 Neural Prophet다. 이 알고리즘은 다른 알고리즘들과 달리 파라미터를 조절하지 않아도 뛰어난 성능을 보여준다는 장점을 가지고 있다.
 
우선, 시계열분류에서 사용했던 10년간의 월별 배추 값 데이터를 이용하여 단변량 시계열 예측을 시험해보자.  Neural Prophet 을 이용할 때는 데이터의 컬럼명을 날짜는 ds, 그리고 예측하려는 변수는 y라고 이름으로 바꿔줘야한다.
 
예측 성능을 검증하기 위해 최근 5개월치(23.6~10월)를 삭제하고 코랩에 업로드 후 아래 코드를 이용해 X변수에 데이터를 할당한다.

import pandas as pd
X = pd.read_csv('napa_cabbage_10year_train.csv')

 
코랩은 사용하려는 라이브러리가 설치되어 있지 않을 경우 !pip명령어를 이용해서 추가로 설치할 수 있는데, 보통 라이브러리명만 기재하면 되지만, 최신버전에 오류가 있어 아래처럼 다운받을 라이브러리가 위치한 주소를 기재하여 설치한다. 

!pip install git+https://github.com/ourownstory/neural_prophet.git

 
이제, 시계열 예측 모델을 만들어보자.

from neuralprophet import NeuralProphet
model = NeuralProphet()
metrics = model.fit(X, freq="MS")

 
첫줄에서 라이브러리를 호출하고, 두번째줄에 라이브러리를 model이라는 이름으로 지정한다. 그리고 마지막 세번째줄에 업로드한 데이터 X, 그리고 월별 데이터라는 의미의 파라미터 freq="MS"를 입력해주면 된다.(freq셑팅 시 월:MS / 일:D / 시간:H를 이용한다.)
 
이제 생성한 모델을 이용하여 원하는 기간만큼 예측을 해보자. 아래 2줄의 코드를 입력하면 된다.

future = model.make_future_dataframe(X, periods=5)
forecast = model.predict(future)

 
첫번째줄은 데이터X의 형태를 참고하여 5개의 기간(periods)에 해당하는 데이터를 생성하는 코드이며, 두번째줄은 먼저 생성한 모델을 이용해 데이터에 예측값을 추가하는 명령어이다.
 
이렇게 하면 forecast라는 변수에 추가한 5개월간의 예측값이 yhat1이라는 컬럼으로 생성된다.
 

 
yhat1값을 복사하여 원본데이터에 추가해준 후 차트를 그려보니 위와 같은 그래프가 생성되었다. 대부분은 실제값이 가격이 일치하여 훌륭한 예측성능을 보여주었지만, 가격이 급등하는 9월의  실제 배추 값은 5,309원으로 예측값 6,182원보다 낮게 나온 것을 알 수 있다. 
 

다변량 시계열 예측하는 방법

농업신문에서는 배추값 변동요인으로 수입김치에 대해 지적하고 있다.(관련 기사) 업계의 자세한 사정에 대해서는 잘 모르지만, 농식품 수출정보(https://www.kati.net/)에서 수입 김치와 수입 배추에 대한 데이터를 추가하여 테스트해보려고 한다.
 
우선 수입김치(중량)와 배추 가격에 대한 월별 차트를 살펴보자. 월별 변동폭은 다르지만 2016년부터 2020년까지는 수입김치의 수입량이 이전보다 증가하였고, 같은 시기에 배추값도 상승한 것을 보면 어느정도 상관관계가 있는 것처럼 보인다. 이후 수입량과 가격이 같이 감소했지만 작년 9월에는 또 다시 치솟았다.
 

 
다음으로는 배추 수입현황이다. 배추는 수입량이 전혀 없는 달도 많아 물량을 조절하는 것으로 보이는데, 이 역시 배추값이 상승했을 때는 덩달아 오르는 경향을 보이고 있다.
 

 
 
김치와 배추사입량이 추가된 데이터를 코랩에 업로드하고 X변수에 할당한다.

import pandas as pd
X = pd.read_csv('napa_cabbage_10year_multi.csv')

 
다변량 시계열분석에서는 예측에 사용되는 데이터를 지정해줘야하는데, 2번째줄에 파라미터가 추가되었으며 3번째 줄이 추가된다.

from neuralprophet import NeuralProphet
model = NeuralProphet(n_forecasts=5, n_lags=1)
model = model.add_lagged_regressor(names=['kimch', 'import'])
metrics = model.fit(X, freq="MS")

 
두번째줄에서 n_forecasts=5는 향후 5개의 값을 예측한다는 의미로 다변량에서는 모델 설정 시 지정해줘야 한다. 그리고 n_lags=1은 1달 전의 데이터를 참고하여 예측한다는 의미로 이 또한 다변량 예측에서는 미리 지정해줘야한다. 만약  n_lags를 2로 바꾼다면 2달전의 데이터를 참고하여 예측하는 것이며 보통은 1로 설정해두면 된다.
 
세번째줄은 kimch(김치 수입량)와 import(배추 수입량)데이터를 예측 시 추가하는 코드로 변수가 늘어날 경우 이 부분을 수정해주면 된다.
 

future = model.make_future_dataframe(X)
forecast = model.predict(future)

 
예측하려는 기간은 모델 개발 시 설정했으므로 make_futre_dataframe에서 예측하려는 기간을 입력하는 periods를 삭제하고 코드를 입력하면 아래와 같은 결과를 얻을 수 있다.
 

 

 

9월의 실제 배추 값은 5,309원으로 예측 값은 6,395원으로 단변량 예측 시보다 오차가 크게 나타났다. 예측결과가 좋아지지 않을 걸 보면 김치와 배추의 수입량이 시계열 예측에는 크게 도움이 되지 않거나 방법을 바꿔 볼 필요가 있어 보인다.


728x90