Purumir's Blog

Machine Learning, SW architect, Management, favorites

구간평균법, 지수평활법(exponential smoothing)

시계열(timeseries) 데이터 구성 요소

시계열 데이터는 ‘추세변동’, ‘순환변동’, ‘계절변동’,’우연변동’ 같은 구성요소를 가집니다.

  • 추세변동(Trend)

    시계열 데이터의 방향성

  • 순환변동(Cycle)

    시계열 데이터의 진폭을 동반한 데이터의 fluctuation

  • 계절변동(seasonal variations)

    4계절을 기준으로 각 계절에서 데이터의 fluctuation

  • 우연변동(random movement)

    특별한 사유없이 갑작스러운 데이터의 fluctuation

시계열(timeseries) 데이터 Smoothing(평활법)


시계열 데이터 평활법에는 ‘구간평균법’, ‘지수평활법’이 존재하며, ‘지수평활법’에는 ‘단순지수평활법’,’이중지수평활법’, ‘홀트-윈터지수평활법’이 존재합니다.

  • 구간평균법(Moving Average)

    과거(past) 시점의 일정기간(N)의 평균으로 다음 시점을 예측하는 방법으로 과거 정보의 평균만으로 미래를 예측하기 때문에 정확도가 높다고 보기 어려운 평활법입니다.

    smoothing을 위한 절차는 다음과 같습니다.

    1) 일정기간(N)을 결정

    2) 과거 일정기간(N) 동안 데이터 평균치를 계산

    3) 예측(Predict)

    구간지수 평활법 사례는 아래와 같습니다. N=3으로 할경우 다음과 같은 구간 평균치와 예측값을 구할수 있습니다.

    일종의 moving average형태라고 할 수 있습니다.

    구간평균법은 과거 모든 데이터에 대해서 동일한 가중치를 주기 때문에 미래의 예측값이 모두 동일하게 되는 한계를 가집니다. 그리고 N을 작게 설정할 경우 최근 데이터의 경향을 많이 반영하게 되고, N을 크게 설정할 경우 과거 데이터의 경향을 많이 반영하게 되어 smoothing하게 예측하게 됩니다.

timestep dataset 구간평균치 예측값
0
1 10
2 20
3 30 20
=(10+20+30)/3
4 40 30
=(20+30+40)/3
5 50 40
=(30+40+50)/3
1 40
(마지막 레벨 계산값이 예측치)
2 40
1
2
3
4
5
6
7
8
9
import pandas as pd

df = pd.DataFrame({'dataset': [0, 10, 20, 30, 40, 50]},columns=['dataset'])

def moving_avg(dframe, t, n=3):
predict = (1/n)*sum(row['dataset'] for i, row in dframe.iloc[(t-1)+1-n:t+1,:].iterrows())
return predict

moving_avg(df, 6 , n=3) # 40이 출력된다.
  • 지수평활법(Exponential Smoothing)

    지수 평활법은 구간평균값과 달리 가중평균(weighted average)을 사용하는 기법으로 지수적인 모양에 따른 가중치를 결정합니다. 이것을 이용하여 최신성을 가지는 데이터에 보다 많은 가중치를 부여하고, 과거 데이터일수록 적은 가중치를 부여합니다.

    • 단순지수 평활법(Simple Exponential Smoothing)
    • 이중지수 평활법(Double Exponential Smoonthing)
    • 홀트-윈터 지수 평활법(Holt-Winter Exponential Smoothing)