Chapter 13에서는
* Time Series에 존재할 수 있는 trend의 중요성과 유형 및 식별 방법
* simple differencing method를 사용하여 trend를 제거하는 방법
* 선형 trend를 modeling하고 판매 Time Series dataset에서 제거하는 방법
Trends in Time Series
* trend는 일반적으로 주기적이지 않은 시계열의 체계적인 변화를 말한다.
* trend를 파악하고 이해하면 모델 성능 향상에 도움이 된다.
* 1. Faster Modeling : 모델 선택 및 평가를 보다 효율적으로 만들 수 있다.
* 2. Simpler Problem : 모델링을 단순화하고 모델 성능을 향상시키기 위해 trend를 수정하거나 제거할 수 있다.
* 3. More Data : 모델에 추가 정보를 제공하고 모델 성능을 향상시키기 위해 trend 정보를 직접 또는 요약으로 사용할 수 있다.
Types of Trends
* Two general classes
* 1. Deterministic Trends(결정론적 추세) : 지속적으로 증가or감소하는 trend
* 2. Stochastic Trends(확률적 추세) : 일관성없이 증가or감소하는 trend
* 일반적으로 결정적 추세는 식별하고 제거하기 쉽지만, 아래에서 배울 방법에는 확률적 추세가 더 유용할 것이다.
* scope of observations(관찰 범위측면)
* 1. Global Trends : 전체 time series에 적용되는 trend
* 2. Local Trends : Time Series의 일부 또는 subsequences에 적용되는 trend
* 일반적으로 Global trends는 식별 및 해결하기 더 쉽다.
Identifying a Trend
* Time Series data를 plotting해서 trend를 파악할 수 있다.
* 하지만 이는 실제로 trend를 식별하는 것이 주관적인 프로세스가 될 수 있다.
* 따라서 Time Series에서 추출하거나 제거하는 것도 주관적일 수 있다.
Removing a Trend
* trend가 있는 time series를 non-stationary라고 부른다.
* 식별된 trend는 modeling이 가능하며 modeling 후에 time series dataset에서 제거할 수 있다.
* dataset에 trend가 없거나 제거된 경우 이 dataset을 trend stationary라고 한다.
Using Time Series Trends in Machine Learning
* machine learning 관점에서 trend는 2가지 기회를 나타낸다.
* 1. Remove Information : 입력 변수와 출력 변수 간의 관계를 왜곡하는 체계적인 정보를 제거
* 2. Add Information : 입력 변수와 출력 변수 간의 관계를 개선하기 위해 체계적인 정보를 추가
Shampoo Sales Dataset
* 3년간 월간 샴푸 판매 수에 대한 정보가 담긴 time series dataset
from pandas import read_csv
from pandas import datetime
from matplotlib import pyplot
def parser(x):
return datetime.strptime('190'+x, '%Y-%m')
series = read_csv('./dataset/shampoo.csv', header=0, parse_dates=[0], index_col=0, squeeze=True, date_parser=parser)
series.plot()
result1 = seasonal_decompose(series, model='multiplicative') #additive
result1.plot()
pyplot.show()
Detrend by Differencing
* time series tend를 제거하는 가장 간단한 방법은 차이를 이용하는 것이다.
* 현재 시간 단계의 값이 원래 관측치와 이전 시간 단계의 관측치 간의 차이로 계산되는 새 series를 구성된다.
* value(t) = observation(t) - observation(t-1)
* 이전 시간을 이용하여 새로운 series를 만들기 때문에 첫번째 관측치는 계산할 수 없어 원시 dataset보다 하나의 data가 적다.
# detrend a time series using differencing
from pandas import read_csv
from pandas import datetime
from matplotlib import pyplot
def parser(x):
return datetime.strptime('190'+x, '%Y-%m')
series = read_csv('./dataset/shampoo.csv', header=0, index_col=0, parse_dates=True,
squeeze=True, date_parser=parser)
X = series.values
diff = list()
for i in range(1, len(X)):
value = X[i] - X[i - 1]
diff.append(value)
pyplot.plot(diff)
pyplot.show()
Detrend by Model Fitting
* trend는 선으로 쉽게 시각화되는 경우가 많다.
* linear한 trend는 linear model로 요약할 수 있고 비선형 trend는 다항식 등으로 요약할 수 있다.
* 아래의 예제는 trend를 통해 trend를 제거하는 방법이다.
* LinearRegression()함수를 사용하여 linear한 trend를 생성하고, 원시 data에서 뺌으로서 trend를 제거한다.
# use a linear model to detrend a time series
from pandas import read_csv
from pandas import datetime
from sklearn.linear_model import LinearRegression
from matplotlib import pyplot
import numpy
def parser(x):
return datetime.strptime('190'+x, '%Y-%m')
series = read_csv('./dataset/shampoo.csv', header=0, index_col=0, parse_dates=True,
squeeze=True, date_parser=parser)
# fit linear model
X = [i for i in range(0, len(series))]
X = numpy.reshape(X, (len(X), 1))
y = series.values
model = LinearRegression()
model.fit(X, y) #비지도 학습에서의 fit()은 입력 데이터의 형태에 맞춰 데이터를 변환하기 위한 사전 구조를 맞추는 작업
# calculate trend
trend = model.predict(X) #fit 이후 입력 데이터의 차원 변환, 클러스터랑, 피처 추출 등의 실제 작업을 수행합니다.
# plot trend
pyplot.plot(y)
pyplot.plot(trend)
pyplot.show()
# detrend
detrended = [y[i]-trend[i] for i in range(0, len(series))]
# plot detrended
pyplot.plot(detrended)
pyplot.show()
'Study > time series forecasting with python' 카테고리의 다른 글
Chapter 15. Stationarity in Time Series Data (0) | 2021.07.21 |
---|---|
Chapter 14. Use and Remove Seasonality (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 |
Chapter 10. A Gentle Introduction to White Noise (0) | 2021.07.12 |