Study/time series forecasting with python

Chapter 9. Moving Average Smoothing

황공진 2021. 7. 12. 14:19

Chapter 9에서는
* Moving Average Smoothing의 원리와 data에 대한 기대치
* data 작성 및 feature enginerring을 위한 Moving Average Smoothing 사용방법

* Moving Average Smoothing을 이용하여 예측하는 방법에 대해 배운다.

 

Monving Average Smoothing


* Moving Average을 계산하려면 값이 원래 시계열의 원시 관측 값 평균으로 구성된 새 시리즈를 생성해야합니다.
* Moving Average을 사용하려면 창 너비라는 창 크기를 지정해야합니다.
* Moving Average의 목표는 노이즈를 제거하고 근본적인 인과 과정의 신호를 더 잘 노출 시키는 것이다.
* 이 기법을 적절하게 적용하면 근본적인 추세, 계절 및 주기적 구성 요소를보다 명확하게 보여준다.

Centered Moving Average
* Moving Average에서 변화된 y(t)값은 y(t)와 이전 및 이후의 원시 관측 값의 평균으로 계산된다.
* ex) window size=3인 centered moving average => y(t)=mean(obs(t-1),obs(t),obs(t+1))
* t+1 등의 미래값을 사용하므로 dataset을 더 잘 이해하기 위해 사용하고 예측할 때는 자주 사용하지 않는다.

Trailing Moving Average
* Moving Average에서 변화된 y(t)값은 y(t)와 그 이전의 원시 관측 값의 평균으로 계산된다.
* ex) window size=3인 trailing moving average => y(t)=mean(obs(t-2),obs(t-1),obs(t))
* trailing moving average는 과거 관측값만 사용하므로 time series forecasting에 많이 사용된다.

Daily Female Birth Dataset
* 1959년 365일동안의 일일 여성 출생 수에 대한 dataset
* https://raw.githubusercontent.com/jbrownlee/Datasets/master/daily-total-female-births.csv

Moving Average as Data Preparation
* Pandas에서 제공되는 rolling()함수를 통해 관측을 window로 자동 그룹화할 수 있다.
* window size를 지정할 수 있으며 default로는 trailing window가 사용된다. center=True로 하면 centered moving average
* min_priod를 setting함으로서 data가 window size 만큼 없어도 nan 대신 값을 반환하도록 설정할 수도 있다.
* 아래는 window size=3의 형태이며, 이를 통해 이상치에 대한 가중치가 줄어듬을 확인할 수 있다.
* 또한 앞의 2개의 곽측치는 3개의 평균을 사용하므로 제외해야됨을 알 수 있다.

# moving average smoothing as data preparation
from pandas import read_csv
from matplotlib import pyplot
series = read_csv('daily-total-female-births.csv', header=0, index_col=0, parse_dates=True,
squeeze=True)
# tail-rolling average transform
rolling = series.rolling(window=3)
rolling_mean = rolling.mean()
print(rolling_mean.head(10))
# plot original and transformed dataset
series.plot()
rolling_mean.plot(color='red')
pyplot.show()
# zoomed plot original and transformed dataset
series[:100].plot()
rolling_mean[:100].plot(color='red')
pyplot.show()

 

date
1959-01-01          NaN
1959-01-02          NaN
1959-01-03    32.333333
1959-01-04    31.000000
1959-01-05    35.000000
1959-01-06    34.666667
1959-01-07    39.333333
1959-01-08    39.000000
1959-01-09    42.000000
1959-01-10    36.000000
Name: births, dtype: float64

 

Moving Average as Feature Engineering

# moving average smoothing as feature engineering
from pandas import read_csv
from pandas import DataFrame
from pandas import concat
series = read_csv('daily-total-female-births.csv', header=0, index_col=0, parse_dates=True,
squeeze=True)
df = DataFrame(series.values)
width = 3
lag1 = df.shift(1)
lag3 = df.shift(2) #2번 shift > nan nan data ~
window = lag3.rolling(window=width) # nan nan data data를 window=3으로 하면 nan nan nan nan data data ~~
means = window.mean()
dataframe = concat([means, lag1, df], axis=1)
dataframe.columns = ['mean', 't', 't+1']
print(dataframe.head(10))

 

        mean     t  t+1
0        NaN   NaN   35
1        NaN  35.0   32
2        NaN  32.0   30
3        NaN  30.0   31
4  32.333333  31.0   44
5  31.000000  44.0   29
6  35.000000  29.0   45
7  34.666667  45.0   43
8  39.333333  43.0   38
9  39.000000  38.0   27

 

Moving Average as Prediction

# moving average smoothing as a forecast model
from math import sqrt
from pandas import read_csv
from numpy import mean
from sklearn.metrics import mean_squared_error
from matplotlib import pyplot
series = read_csv('daily-total-female-births.csv', header=0, index_col=0, parse_dates=True,
squeeze=True)
# prepare situation
X = series.values # dataset의 value
window = 3
history = [X[i] for i in range(window)]

test = [X[i] for i in range(window, len(X))]

predictions = list()
# walk forward over time steps in test
for t in range(len(test)):
    length = len(history)
    yhat = mean([history[i] for i in range(length-window,length)]) #history에 대한 moving average window=3인 경우의 formula
    obs = test[t]
    predictions.append(yhat)
    history.append(obs)
    print('predicted=%f, expected=%f' % (yhat, obs))
rmse = sqrt(mean_squared_error(test, predictions))
print('Test RMSE: %.3f' % rmse)
# plot
pyplot.plot(test)
pyplot.plot(predictions, color='red')
pyplot.show()
# zoom plot
pyplot.plot(test[:100])
pyplot.plot(predictions[:100], color='red')
pyplot.show()

 

predicted=32.333333, expected=31.000000
predicted=31.000000, expected=44.000000
predicted=35.000000, expected=29.000000
predicted=34.666667, expected=45.000000
predicted=39.333333, expected=43.000000
predicted=39.000000, expected=38.000000
predicted=42.000000, expected=27.000000
predicted=36.000000, expected=38.000000
predicted=34.333333, expected=33.000000
predicted=32.666667, expected=55.000000
predicted=42.000000, expected=47.000000
predicted=45.000000, expected=45.000000
predicted=49.000000, expected=37.000000
predicted=43.000000, expected=50.000000
predicted=44.000000, expected=43.000000
predicted=43.333333, expected=41.000000
predicted=44.666667, expected=52.000000
predicted=45.333333, expected=34.000000
predicted=42.333333, expected=53.000000
predicted=46.333333, expected=39.000000
predicted=42.000000, expected=32.000000
predicted=41.333333, expected=37.000000
predicted=36.000000, expected=43.000000
predicted=37.333333, expected=39.000000
predicted=39.666667, expected=35.000000
predicted=39.000000, expected=44.000000
predicted=39.333333, expected=38.000000
predicted=39.000000, expected=24.000000
predicted=35.333333, expected=23.000000
predicted=28.333333, expected=31.000000
predicted=26.000000, expected=44.000000
predicted=32.666667, expected=38.000000
predicted=37.666667, expected=50.000000
predicted=44.000000, expected=38.000000
predicted=42.000000, expected=51.000000
predicted=46.333333, expected=31.000000
predicted=40.000000, expected=31.000000
predicted=37.666667, expected=51.000000
predicted=37.666667, expected=36.000000
predicted=39.333333, expected=45.000000
predicted=44.000000, expected=51.000000
predicted=44.000000, expected=34.000000
predicted=43.333333, expected=52.000000
predicted=45.666667, expected=47.000000
predicted=44.333333, expected=45.000000
predicted=48.000000, expected=46.000000
predicted=46.000000, expected=39.000000
predicted=43.333333, expected=48.000000
predicted=44.333333, expected=37.000000
predicted=41.333333, expected=35.000000
predicted=40.000000, expected=52.000000
predicted=41.333333, expected=42.000000
predicted=43.000000, expected=45.000000
predicted=46.333333, expected=39.000000
predicted=42.000000, expected=37.000000
predicted=40.333333, expected=30.000000
predicted=35.333333, expected=35.000000
predicted=34.000000, expected=28.000000
predicted=31.000000, expected=45.000000
predicted=36.000000, expected=34.000000
predicted=35.666667, expected=36.000000
predicted=38.333333, expected=50.000000
predicted=40.000000, expected=44.000000
predicted=43.333333, expected=39.000000
predicted=44.333333, expected=32.000000
predicted=38.333333, expected=39.000000
predicted=36.666667, expected=45.000000
predicted=38.666667, expected=43.000000
predicted=42.333333, expected=39.000000
predicted=42.333333, expected=31.000000
predicted=37.666667, expected=27.000000
predicted=32.333333, expected=30.000000
predicted=29.333333, expected=42.000000
predicted=33.000000, expected=46.000000
predicted=39.333333, expected=41.000000
predicted=43.000000, expected=36.000000
predicted=41.000000, expected=45.000000
predicted=40.666667, expected=46.000000
predicted=42.333333, expected=43.000000
predicted=44.666667, expected=38.000000
predicted=42.333333, expected=34.000000
predicted=38.333333, expected=35.000000
predicted=35.666667, expected=56.000000
predicted=41.666667, expected=36.000000
predicted=42.333333, expected=32.000000
predicted=41.333333, expected=50.000000
predicted=39.333333, expected=41.000000
predicted=41.000000, expected=39.000000
predicted=43.333333, expected=41.000000
predicted=40.333333, expected=47.000000
predicted=42.333333, expected=34.000000
predicted=40.666667, expected=36.000000
predicted=39.000000, expected=33.000000
predicted=34.333333, expected=35.000000
predicted=34.666667, expected=38.000000
predicted=35.333333, expected=38.000000
predicted=37.000000, expected=34.000000
predicted=36.666667, expected=53.000000
predicted=41.666667, expected=34.000000
predicted=40.333333, expected=34.000000
predicted=40.333333, expected=38.000000
predicted=35.333333, expected=35.000000
predicted=35.666667, expected=32.000000
predicted=35.000000, expected=42.000000
predicted=36.333333, expected=34.000000
predicted=36.000000, expected=46.000000
predicted=40.666667, expected=30.000000
predicted=36.666667, expected=46.000000
predicted=40.666667, expected=45.000000
predicted=40.333333, expected=54.000000
predicted=48.333333, expected=34.000000
predicted=44.333333, expected=37.000000
predicted=41.666667, expected=35.000000
predicted=35.333333, expected=40.000000
predicted=37.333333, expected=42.000000
predicted=39.000000, expected=58.000000
predicted=46.666667, expected=51.000000
predicted=50.333333, expected=32.000000
predicted=47.000000, expected=35.000000
predicted=39.333333, expected=38.000000
predicted=35.000000, expected=33.000000
predicted=35.333333, expected=39.000000
predicted=36.666667, expected=47.000000
predicted=39.666667, expected=38.000000
predicted=41.333333, expected=52.000000
predicted=45.666667, expected=30.000000
predicted=40.000000, expected=34.000000
predicted=38.666667, expected=40.000000
predicted=34.666667, expected=35.000000
predicted=36.333333, expected=42.000000
predicted=39.000000, expected=41.000000
predicted=39.333333, expected=42.000000
predicted=41.666667, expected=38.000000
predicted=40.333333, expected=24.000000
predicted=34.666667, expected=34.000000
predicted=32.000000, expected=43.000000
predicted=33.666667, expected=36.000000
predicted=37.666667, expected=55.000000
predicted=44.666667, expected=41.000000
predicted=44.000000, expected=45.000000
predicted=47.000000, expected=41.000000
predicted=42.333333, expected=37.000000
predicted=41.000000, expected=43.000000
predicted=40.333333, expected=39.000000
predicted=39.666667, expected=33.000000
predicted=38.333333, expected=43.000000
predicted=38.333333, expected=40.000000
predicted=38.666667, expected=38.000000
predicted=40.333333, expected=45.000000
predicted=41.000000, expected=46.000000
predicted=43.000000, expected=34.000000
predicted=41.666667, expected=35.000000
predicted=38.333333, expected=48.000000
predicted=39.000000, expected=51.000000
predicted=44.666667, expected=36.000000
predicted=45.000000, expected=33.000000
predicted=40.000000, expected=46.000000
predicted=38.333333, expected=42.000000
predicted=40.333333, expected=48.000000
predicted=45.333333, expected=34.000000
predicted=41.333333, expected=41.000000
predicted=41.000000, expected=35.000000
predicted=36.666667, expected=40.000000
predicted=38.666667, expected=34.000000
predicted=36.333333, expected=30.000000
predicted=34.666667, expected=36.000000
predicted=33.333333, expected=40.000000
predicted=35.333333, expected=39.000000
predicted=38.333333, expected=45.000000
predicted=41.333333, expected=38.000000
predicted=40.666667, expected=47.000000
predicted=43.333333, expected=33.000000
predicted=39.333333, expected=30.000000
predicted=36.666667, expected=42.000000
predicted=35.000000, expected=43.000000
predicted=38.333333, expected=41.000000
predicted=42.000000, expected=41.000000
predicted=41.666667, expected=59.000000
predicted=47.000000, expected=43.000000
predicted=47.666667, expected=45.000000
predicted=49.000000, expected=38.000000
predicted=42.000000, expected=37.000000
predicted=40.000000, expected=45.000000
predicted=40.000000, expected=42.000000
predicted=41.333333, expected=57.000000
predicted=48.000000, expected=46.000000
predicted=48.333333, expected=51.000000
predicted=51.333333, expected=41.000000
predicted=46.000000, expected=47.000000
predicted=46.333333, expected=26.000000
predicted=38.000000, expected=35.000000
predicted=36.000000, expected=44.000000
predicted=35.000000, expected=41.000000
predicted=40.000000, expected=42.000000
predicted=42.333333, expected=36.000000
predicted=39.666667, expected=45.000000
predicted=41.000000, expected=45.000000
predicted=42.000000, expected=45.000000
predicted=45.000000, expected=47.000000
predicted=45.666667, expected=38.000000
predicted=43.333333, expected=42.000000
predicted=42.333333, expected=35.000000
predicted=38.333333, expected=36.000000
predicted=37.666667, expected=39.000000
predicted=36.666667, expected=45.000000
predicted=40.000000, expected=43.000000
predicted=42.333333, expected=47.000000
predicted=45.000000, expected=36.000000
predicted=42.000000, expected=41.000000
predicted=41.333333, expected=50.000000
predicted=42.333333, expected=39.000000
predicted=43.333333, expected=41.000000
predicted=43.333333, expected=46.000000
predicted=42.000000, expected=64.000000
predicted=50.333333, expected=45.000000
predicted=51.666667, expected=34.000000
predicted=47.666667, expected=38.000000
predicted=39.000000, expected=44.000000
predicted=38.666667, expected=48.000000
predicted=43.333333, expected=46.000000
predicted=46.000000, expected=44.000000
predicted=46.000000, expected=37.000000
predicted=42.333333, expected=39.000000
predicted=40.000000, expected=44.000000
predicted=40.000000, expected=45.000000
predicted=42.666667, expected=33.000000
predicted=40.666667, expected=44.000000
predicted=40.666667, expected=38.000000
predicted=38.333333, expected=46.000000
predicted=42.666667, expected=46.000000
predicted=43.333333, expected=40.000000
predicted=44.000000, expected=39.000000
predicted=41.666667, expected=44.000000
predicted=41.000000, expected=48.000000
predicted=43.666667, expected=50.000000
predicted=47.333333, expected=41.000000
predicted=46.333333, expected=42.000000
predicted=44.333333, expected=51.000000
predicted=44.666667, expected=41.000000
predicted=44.666667, expected=44.000000
predicted=45.333333, expected=38.000000
predicted=41.000000, expected=68.000000
predicted=50.000000, expected=40.000000
predicted=48.666667, expected=42.000000
predicted=50.000000, expected=51.000000
predicted=44.333333, expected=44.000000
predicted=45.666667, expected=45.000000
predicted=46.666667, expected=36.000000
predicted=41.666667, expected=57.000000
predicted=46.000000, expected=44.000000
predicted=45.666667, expected=42.000000
predicted=47.666667, expected=53.000000
predicted=46.333333, expected=42.000000
predicted=45.666667, expected=34.000000
predicted=43.000000, expected=40.000000
predicted=38.666667, expected=56.000000
predicted=43.333333, expected=44.000000
predicted=46.666667, expected=53.000000
predicted=51.000000, expected=55.000000
predicted=50.666667, expected=39.000000
predicted=49.000000, expected=59.000000
predicted=51.000000, expected=55.000000
predicted=51.000000, expected=73.000000
predicted=62.333333, expected=55.000000
predicted=61.000000, expected=44.000000
predicted=57.333333, expected=43.000000
predicted=47.333333, expected=40.000000
predicted=42.333333, expected=47.000000
predicted=43.333333, expected=51.000000
predicted=46.000000, expected=56.000000
predicted=51.333333, expected=49.000000
predicted=52.000000, expected=54.000000
predicted=53.000000, expected=56.000000
predicted=53.000000, expected=47.000000
predicted=52.333333, expected=44.000000
predicted=49.000000, expected=43.000000
predicted=44.666667, expected=42.000000
predicted=43.000000, expected=45.000000
predicted=43.333333, expected=50.000000
predicted=45.666667, expected=48.000000
predicted=47.666667, expected=43.000000
predicted=47.000000, expected=40.000000
predicted=43.666667, expected=59.000000
predicted=47.333333, expected=41.000000
predicted=46.666667, expected=42.000000
predicted=47.333333, expected=51.000000
predicted=44.666667, expected=49.000000
predicted=47.333333, expected=45.000000
predicted=48.333333, expected=43.000000
predicted=45.666667, expected=42.000000
predicted=43.333333, expected=38.000000
predicted=41.000000, expected=47.000000
predicted=42.333333, expected=38.000000
predicted=41.000000, expected=36.000000
predicted=40.333333, expected=42.000000
predicted=38.666667, expected=35.000000
predicted=37.666667, expected=28.000000
predicted=35.000000, expected=44.000000
predicted=35.666667, expected=36.000000
predicted=36.000000, expected=45.000000
predicted=41.666667, expected=46.000000
predicted=42.333333, expected=48.000000
predicted=46.333333, expected=49.000000
predicted=47.666667, expected=43.000000
predicted=46.666667, expected=42.000000
predicted=44.666667, expected=59.000000
predicted=48.000000, expected=45.000000
predicted=48.666667, expected=52.000000
predicted=52.000000, expected=46.000000
predicted=47.666667, expected=42.000000
predicted=46.666667, expected=40.000000
predicted=42.666667, expected=40.000000
predicted=40.666667, expected=45.000000
predicted=41.666667, expected=35.000000
predicted=40.000000, expected=35.000000
predicted=38.333333, expected=40.000000
predicted=36.666667, expected=39.000000
predicted=38.000000, expected=33.000000
predicted=37.333333, expected=42.000000
predicted=38.000000, expected=47.000000
predicted=40.666667, expected=51.000000
predicted=46.666667, expected=44.000000
predicted=47.333333, expected=40.000000
predicted=45.000000, expected=57.000000
predicted=47.000000, expected=49.000000
predicted=48.666667, expected=45.000000
predicted=50.333333, expected=49.000000
predicted=47.666667, expected=51.000000
predicted=48.333333, expected=46.000000
predicted=48.666667, expected=44.000000
predicted=47.000000, expected=52.000000
predicted=47.333333, expected=45.000000
predicted=47.000000, expected=32.000000
predicted=43.000000, expected=46.000000
predicted=41.000000, expected=41.000000
predicted=39.666667, expected=34.000000
predicted=40.333333, expected=33.000000
predicted=36.000000, expected=36.000000
predicted=34.333333, expected=49.000000
predicted=39.333333, expected=43.000000
predicted=42.666667, expected=43.000000
predicted=45.000000, expected=34.000000
predicted=40.000000, expected=39.000000
predicted=38.666667, expected=35.000000
predicted=36.000000, expected=52.000000
predicted=42.000000, expected=47.000000
predicted=44.666667, expected=52.000000
predicted=50.333333, expected=39.000000
predicted=46.000000, expected=40.000000
predicted=43.666667, expected=42.000000
predicted=40.333333, expected=42.000000
predicted=41.333333, expected=53.000000
predicted=45.666667, expected=39.000000
predicted=44.666667, expected=40.000000
predicted=44.000000, expected=38.000000
predicted=39.000000, expected=44.000000
predicted=40.666667, expected=34.000000
predicted=38.666667, expected=37.000000
predicted=38.333333, expected=52.000000
predicted=41.000000, expected=48.000000
predicted=45.666667, expected=55.000000
predicted=51.666667, expected=50.000000
Test RMSE: 7.834