Chapter 14에서는
* Time Series의 seasonality 정의 및 machine learning method을 통한 예측에 제공되는 방법
* difference method를 사용하여 season별로 조정된 일일 온도 데이터의 time series 만드는 방법
* seasonal component를 직접 modeling하고 관측치에서 빼는 방법
Seasonality in Time Series
* Time Series에는 seasonal variation이 포함될 수 있다.
* seasonal variation or seasonality는 시간이 지남에 따라 반복되는 주기이다.
Benefits to Machine Learning
* Time Series의 seasonal component를 이해하면 machine learning을 통한 modeling 성능 향상이 가능하다.
* 이는 두 가지 주요 방법으로 성능을 향상시킬 수 있다.
* 1. Clearer Signal : 계절 성분을 식별하고 제거하면 입력 변수와 출력 변수 간의 관계가 더 명확해질 수 있다.
* 2. More Information : 계절적 구성 요소에 대한 추가 정보는 모델 성능 개선을 위한 새로운 정보를 제공할 수 있다.
Types of Seasonality
* 1. Time of Day
* 2. Daily
* 3. Weekly
* 4. Monthly
* 5. Yearly 등등
* 따라서 Time Series에서 seasonality component가 있는지 확인하는 것은 주관적이다.
* 확인하는 가장 간단한 방법은 plotting하는 것이다.
Removing Seasonality
* Time Series에서 계절 성분을 제거된 것을 계절 고정이라고 한다. 명확한 계절 성분이 있는 Time Series는 non-stationary이라고 한다.
Minimum Daily Temperatures Dataset
* 10년간 일일 최저 기온에 대한 dataset이다.
* 단위는 섭씨이며, 3650개의 관측치가 있다.
from pandas import read_csv
from matplotlib import pyplot
series = read_csv('./dataset/daily-minimum-temperatures.csv', header=0, index_col=0,parse_dates=True, squeeze=True)
series.plot()
pyplot.show()
Seasonal Adjustment with Differencing
* Seasonality component를 수정하는 가장 간단한 방법은 차이를 이용하는 것이다.
* 온도 같은 경우는 1년의 주기를 가지므로 1년으로 묶어서 다음 년도 온도를 이전 년도 온도와의 차이로 계절성을 제거할 수 있다.
* 그렇기에 dataset의 첫 년도는 적용할 수 없으며 윤년같은 경우는 특별한 처리를 해줘야한다.
* 이 dataset같은 경우는 2개의 윤년이 있다.(1984.1988) 특별한 처리를 하지 않아서 1984년 3월이후는 하루, 1988년 3월이후는 이틀정도의 차이가 생긴다.
# deseasonalize a time series using differencing
from pandas import read_csv
from matplotlib import pyplot
series = read_csv('./dataset/daily-minimum-temperatures.csv', header=0, index_col=0,parse_dates=True, squeeze=True)
X = series.values
diff = list()
days_in_year = 365
for i in range(days_in_year, len(X)):
value = X[i] - X[i - days_in_year]
diff.append(value)
pyplot.plot(diff)
pyplot.show()
* 다른 방법으로는 하루 단위로 되어있는 dataset을 월단위로 resampling(down sampling)하는 방법이 있다.
# calculate and plot monthly average
from pandas import read_csv
from matplotlib import pyplot
series = read_csv('./dataset/daily-minimum-temperatures.csv', header=0, index_col=0,
parse_dates=True, squeeze=True)
resample = series.resample('M')
monthly_mean = resample.mean()
print(monthly_mean.head(13))
monthly_mean.plot()
pyplot.show()
Date
1981-01-31 17.712903
1981-02-28 17.678571
1981-03-31 13.500000
1981-04-30 12.356667
1981-05-31 9.490323
1981-06-30 7.306667
1981-07-31 7.577419
1981-08-31 7.238710
1981-09-30 10.143333
1981-10-31 10.087097
1981-11-30 11.890000
1981-12-31 13.680645
1982-01-31 16.567742
Freq: M, Name: Temp, dtype: float64
* 년간의 차이를 사용하기에 첫 년도의 data는 사용하지 못하는 것은 동일하다.
* 월별 데이터를 plotting하는 것이기에 이전보다 계절성이 제거된 것을 눈으로 확인하기 쉽다.
* 또한 윤년에 대한 고려를 하지 않아도 된다.
# deseasonalize monthly data by differencing
from pandas import read_csv
from matplotlib import pyplot
series = read_csv('./dataset/daily-minimum-temperatures.csv', header=0, index_col=0,
parse_dates=True, squeeze=True)
resample = series.resample('M')
monthly_mean = resample.mean()
X = series.values
diff = list()
months_in_year = 12
for i in range(months_in_year, len(monthly_mean)):
value = monthly_mean[i] - monthly_mean[i - months_in_year]
diff.append(value)
pyplot.plot(diff)
pyplot.show()
Seasonal Adjustment with Modeling
* 계절 성분을 직접 모델링하고 이를 관측치에서 뺄 수 있다.
* 주어진 time series의 계절 성분은 일반적으로 고정된 기간에 대한 사인파일 가능성이 높다.
* 이는 곡선 맞춤 방법을 사용하여 쉽게 근사화할 수 있다.
# model seasonality with a polynomial model
from pandas import read_csv
from matplotlib import pyplot
from numpy import polyfit
series = read_csv('./dataset/daily-minimum-temperatures.csv', header=0, index_col=0,
parse_dates=True, squeeze=True)
# fit polynomial: x^2*b1 + x*b2 + ... + bn
X = [i%365 for i in range(0, len(series))]
y = series.values
degree = 4
coef = polyfit(X, y, degree) #다항식을 fitting, degree는 차수, 최고 차수부터 첫번째 인덱스로
print('Coefficients: %s' % coef)
# create curve
curve = list()
for i in range(len(X)):
value = coef[-1]
for d in range(degree):
value += X[i]**(degree-d) * coef[d]
curve.append(value)
# plot curve over original data
pyplot.plot(series.values)
pyplot.plot(curve, color='red', linewidth=3)
pyplot.show()
Coefficients: [-1.17308000e-08 9.30253946e-06 -2.15977594e-03 1.19147966e-01
1.38980178e+01]
# deseasonalize by differencing with a polynomial model
from pandas import read_csv
from matplotlib import pyplot
from numpy import polyfit
series = read_csv('./dataset/daily-minimum-temperatures.csv', header=0, index_col=0,
parse_dates=True, squeeze=True)
# fit polynomial: x^2*b1 + x*b2 + ... + bn
X = [i%365 for i in range(0, len(series))]
y = series.values
degree = 4
coef = polyfit(X, y, degree)
# create curve
curve = list()
for i in range(len(X)):
value = coef[-1]
for d in range(degree):
value += X[i]**(degree-d) * coef[d]
curve.append(value)
# create seasonally adjusted
values = series.values
diff = list()
for i in range(len(values)):
value = values[i] - curve[i]
diff.append(value)
pyplot.plot(diff)
pyplot.show()
'Study > time series forecasting with python' 카테고리의 다른 글
Chapter 16. Backtest Forecast Model (0) | 2021.07.21 |
---|---|
Chapter 15. Stationarity in Time Series Data (0) | 2021.07.21 |
Chapter 13. Use and Remove Trends (0) | 2021.07.21 |
Chapter 12. Decompose Time Series Data (0) | 2021.07.12 |
Chapter 11. A Gentle Introduction to the Random Walk (0) | 2021.07.12 |