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
'Study > time series forecasting with python' 카테고리의 다른 글
Chapter 11. A Gentle Introduction to the Random Walk (0) | 2021.07.12 |
---|---|
Chapter 10. A Gentle Introduction to White Noise (0) | 2021.07.12 |
Chapter 8. Power Transforms (0) | 2021.07.12 |
Chapter 7. 추가 내용 (0) | 2021.06.14 |
Chapter 7. Resampling and Interpolation (0) | 2021.06.14 |