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

시계열 데이터를 간단하게 분석하는 방법

정데만 2023. 11. 10. 11:31
728x90

시계열 데이터는 설명하기 쉽다!?

시계열 데이터란 간별로 측하고 나한 데이터를 말한다. 흔히 보는 주식시세나 월별 매출, 일자별 기온 등은 모두 같은 방식으로 기록한 데이터를 시간순으로 나열한 시계열 데이터이다.

 

시계열 데이터는 차트로 구성해보면 일정한 패턴과 추세를 볼 수 있는 경우가 많은 데, 당장 기온만 하더라도 자전으로 인해 밤낮으로 등락을 반복하고 공전에 따라 계절별로 바뀌는 패턴을 가지고 있어 누구나 쉽게 인지할 수 있으며, 최근 100년간 꾸준히 상승하면서 인류 모두가 추세를 실감하고 있다.

 

한반도 100년의 기후변화(국립기상과학원)

 

시간에 따른 데이터의 변화는 굳이 어렵게 분석하지 않아도 패턴을 감지하거나, 복잡한 분석 기법을 적용하지 않아도 차트로 파악할 수 있다는 장점 때문에 누구나 쉽게 분석하고 공감할 수 있다는 장점을 가지고 있다.

 

하지만, 분석하기 쉽다고 해서 임의로 추세선을 긋거나 명확하지 않은 패턴에 따라 결과를 제시한다면 다수의 공감대를 얻기 힘들다. 그래서 모든 통계 분석이 그렇듯이 널리 이용되는 방법을 사용하여 신빙성을 확보하고, 확률적으로 가장 유리한 값을 찾는 것이 좋다. 

 


시계열 분석의 활용 범위

시계열 분석은 예측모델 만큼이나 오해와 원망을 많이 받는 모델이다.

그도 그럴 것이 데이터 기반 예측은 높은 기대치를 가지는 데 비해 실제론 예측에 필요한 모든 데이터를 확보하지 못하거나 정치/경제적인 이슈에는 대응할 수 없기 때문이다.

 

시계열 분석결과는 어디까지나 시간에 따른 변동성 리스크를 줄이고 중장기 추세를 예측하는 데 적용되어야 한다. 예를 들어 판매량에 대한 시계열 분석을 진행한다면, 공장 가동률과 물류 비용, 제고 관리 등을 훨씬 효과적으로 운용할 수 있다.

 


 

시계열 데이터의 특징 3가지

일상에서 흔하게 접하는 데이터기 때문에 이미 다들 알고있지만, 시계열 데이터의 특징은 Trend(추세), Seasonality(계절성), Cycle(주기성) 3가지로 크게 나눌 수 있다.

 

첫번째, 추세(Trend)는 말그대로 방향성을 나타낸다. 지구 온난화 현상으로 인한 평균기온 변화, 의학기술 발달로 인한 기대수명 연장 등 데이터가 관측되는 환경 자체가 변화하면 방향성에 영향를 주게 된다.

 

두번째는 계절성(Seasonality)으로 지구와 인간사회에서 발생하는 수 많은 데이터가 계절의 영향을 받는다. 하지만 여기서 계절성이란 단지 봄, 여름, 가을, 겨울만 말하는 것이 아니라 계절처럼 일정 기간 동안 반복된 패턴을 보이는 것을 계절성으로 통칭한다. 매월 초에 반복적으로 거래가 증가하거나 매년 추석에만 판매가 늘어나는 현상은 모두 계절성으로 분류된다.

 

세번째, 계절성처럼 일정하게 반복되진 않지만 더 장기적으로 싸이클을 가진다면 주기성(Cycle)으로 분류한다. 인플레이션과 경제 성장 등의 싸이클이 주기성에 해당한다.


시계열 분해 알고리즘 사용해보기

시계열 예측 알고리즘으로 바로 넘어가 보는 것도 좋지만, 시계열 예측 시 발생할 수 있는 실수를 줄이고 시계열 데이터의 특성을 좀 더 쉽게 이해할 수 있는 시계열 분해 알고리즘을 먼저 알아보려고 한다.

 

시계열 분해란 시계열 데이터를 앞서 알아본 3가지 특성으로 분류해주는 방법으로 결과가 매우 직관적이라 이해하기 쉽고, 분석결과를 바로 써먹을 수 있을 뿐 아니라 시계열 예측 시 사전 탐색이나 모델 개선을 목적으로 활용할 수 있다.

 

먼저, 농산물 유통정보(https://www.kamis.or.kr/)에서 최근 10년간 월별 배추가격 데이터를 다운받아 보자.

 

월별 배추 1포기 소매가격(중급기준)

 

엑셀에서 추세선만 그어봐도 2013년 2천원대에서 2023년 4천원으로 2배 가량 오른 것을 알 수 있다. 그리고 매년 8~9월에는 평상 시보다 2~3배 이상 가격이 올라 8천원까지 상승한 것을 볼 수 있다.

 

seasonal_decompose.csv
0.00MB

 

자, 이제 이러한 요인들을 seasonal_decompose 알고리즘을 이용해 정량화해보자. 우선 구글 코랩에 배추 가격 데이터를 업로드 한 후 아래의 코드를 이용해서 X변수에 데이터를 등록해준다.

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

 

그리고 다음과 같이 3줄을 입력해주면 바로 시계열 분류 결과를 볼 수 있다.

from statsmodels.tsa.seasonal import seasonal_decompose
result = seasonal_decompose(X.price, model='addictive', period=12)
result.plot()

 

첫번째줄은 seasonal_decompose라는 시계열 분류 알고리즘을 호출하는 문장으로 그대로 복사하면 된다.

 

두번째줄은 함수를 실행하는 부분으로 총 3개의 인자로 구성되어있다. 첫번째 인자는 데이터로 price라는 컬럼명을 지정하였다. 두번째 인자는 분류 방법으로 보통 addictive를 그대로 사용한다. 마지막 세번째 인자 Period는 데이터의 계절성 주기를 말하며 월별데이터는 12(개월), 주별데이터는 7(일)을 입력한다.

 

세번째줄은 result에 저장한 분석결과에 plot()을 실행하는 보여주는 것으로 아래와 같은 차트가 표시된다.

 

seasonal_decompose 분석 결과

 

맨 윗줄은 입력했던 데이터이고 순서대로 Trend(추세) / Seasonal(계절성) / Residual(나머지값)으로 분해되었으며, 모두 더해주기만 하면 원래의 차트가 완성된다.

 

차트를 해석해보면 배추값은 2천원부터 4천원까지 등락하고 있지만 상승추세이며, 매년 -500원에서 +2천원정도의 계절적 요인을 가지고 있다. 그리고 2가지 요인을 제외하고 -2천~+2천정도의 변동성을 가지고 있다.

※차트에 표기된 실제값을 추출하고자 한다면, Result.seasonal / .resid / .trend를 입력하면 월별 값을 확인할 수 있다.

 

추세와 나머지 값의 변동폭이 커서 아주 만족스러운 결과는 아니지만, 규칙성을 가지고 있으며 계절성은 일정수준을 유지하기 때문에 각 값을 활용하면 좀 더 정확한 월별 배추값을 예측할 수 있다.

예) Trend값의 월 평균 상승률 + 전년 동기 Seasonal값 + 최근 1년간 Resid평균 값

 

다음 포스트에서는 이러한 요인들을 모두 감안하여 시계열 데이터를 예측해주는 알고리즘을 알아보도록 하겠다.


728x90