* Chapter 11에서는
* Random Walk가 무엇이며 Python에서 만드는 방법
* Random Walk의 속성을 분석하고 time series가 random walk인지 아닌 지 아는 방법
* Random Walk를 예측하는 방법
Random Series
* python에서 기본적으로 randrange()함수를 제공한다.
* randrange(n) 함수는 기본적으로 0에서 n사이의 임의의 정수를 생성하는 함수이다.
* plot을 통해 보면 이는 time series와 거리가 멀게 느껴지며 random walk는 아니고 단순한 난수들이다.
# create and plot a random series
from random import seed
from random import randrange
from matplotlib import pyplot
seed(1)
series = [randrange(10) for i in range(1000)]
pyplot.plot(series)
pyplot.show()
Random Walk
* Random Walk는 다음 값이 이전 값을 수정한다.
* Random Walk의 간단한 model은 다음과 같다.
* 1. -1or1의 임의의 숫자로 시작한다.
* 2. -1or1을 무작위로 선택하고 이전 시간 단계의 관측치에 추가한다.
* 3. 원하는 만큼 2번의 단계를 반복한다.
* 위를 토대로 Random Walk는 y(t)=B0+B1*X(t-1)+e(t)라는 식으로 작성할 수 있다.
* 여기서 B0는 초기값, b1은 이전 시간 단계에 가중치를 부여하는 계수이며 보통 1로 설정
* x(t-1)은 이전 시간 단계의 관측치, e(t)는 그 당시의 White noise 또는 랜덤값이다.
# create and plot a random walk
from random import seed
from random import random
from matplotlib import pyplot
seed(1)
random_walk = list()
random_walk.append(-1 if random() < 0.5 else 1) #random함수는 0~1의 수를 무작위 추출
for i in range(1, 1000):
movement = -1 if random() < 0.5 else 1
value = random_walk[i-1] + movement
random_walk.append(value)
pyplot.plot(random_walk)
pyplot.show()
Random Walk and Autocorrelation
* Random Walk 구성 방식을 감안하면 이전 관측치와 다음 관측치는 강력한 자기 상관 관계가 있다.
# plot the autocorrelation of a random walk
from random import seed
from random import random
from matplotlib import pyplot
from pandas.plotting import autocorrelation_plot
import matplotlib.pyplot as plt
seed(1)
random_walk = list()
random_walk.append(-1 if random() < 0.5 else 1)
for i in range(1, 1000):
movement = -1 if random() < 0.5 else 1
value = random_walk[i-1] + movement
random_walk.append(value)
autocorrelation_plot(random_walk)
pyplot.show()
# 산점도는 두 변수 사이에 관계를 알아보기 위해 점으로 도표를 나타낸 것
# 산점도의 관계를 하나의 수치로 나타낸 것이 상관계수
Random Walk and Stationarity
* time series data는 보통 stationary(고정된)이 아니다.
* stationary한 time series는 관측치가 시간에 의존하지 않는 경우이다.
* stationary하지 않다는 것은 time series의 결과값들이 통계적 우연이 될 가능성이 낮다는 것이다.
* random walk의 관측치가 시간에 의존한다는 것을 알 수 있다.(위의 예시들을 통해)
* 따라서 위 예제들의 random walk또한 stationary하지 않다는 것을 알 수 있다.
* 이를 Augmented Dickey-Fuller test를 통해 확인할 수 있다.
* ADF검정은 time series data가 stationary인지 테스트 하는 방법이다.
* 검증값이 critical value보다 작은 경우 stationary하다고 할 수 있다.
* 또는 P-value가 0.05보다 작으면 stationary하다고 할 수 있다.
* 위의 식이 ADF검증 방법이고, 추세를 파악하고 stationary한 지 확인하는 것이다.
* p-value는 귀무가설이 맞다고 가정할 때 얻은 결과가 실제로 관측될 확률이다.
from random import seed
from random import random
from statsmodels.tsa.stattools import adfuller
# generate random walk
seed(1)
random_walk = list()
random_walk.append(-1 if random() < 0.5 else 1)
for i in range(1, 1000):
movement = -1 if random() < 0.5 else 1
value = random_walk[i-1] + movement
random_walk.append(value)
# statistical test
result = adfuller(random_walk) #반환 값중 2,3번 index는 사용된 시차의 수, 분석 자료수이다.
print('ADF Statistic: %f' % result[0])
print('p-value: %f' % result[1])
print('Critical Values:')
for key, value in result[4].items():
print('\t%s: %.3f' % (key, value))
ADF Statistic: 0.341605
p-value: 0.979175
Critical Values:
1%: -3.437
5%: -2.864
10%: -2.568
* 차이를 고려해서 random walk를 고정시킬 수 있다.
* 시간과 관계없이 -1or1로 고정시키는 예제이다.
* 하지만 일련의 -1과 1의 무작위 이외에는 작업할 정보다 없다.
# calculate and plot a differenced random walk
from random import seed
from random import random
from matplotlib import pyplot
# create random walk
seed(1)
random_walk = list()
random_walk.append(-1 if random() < 0.5 else 1)
for i in range(1, 1000):
movement = -1 if random() < 0.5 else 1
value = random_walk[i-1] + movement
random_walk.append(value)
# take difference
diff = list()
for i in range(1, len(random_walk)):
value = random_walk[i] - random_walk[i - 1]
diff.append(value)
# line plot
pyplot.plot(diff)
pyplot.show()
* 하지만 stationary하므로 차이에 대한 series는 상관도 다시 계산하면 상관도가 낮게 나올 것이다.
# plot the autocorrelation of a differenced random walk
from random import seed
from random import random
from matplotlib import pyplot
from pandas.plotting import autocorrelation_plot
# create random walk
seed(1)
random_walk = list()
random_walk.append(-1 if random() < 0.5 else 1)
for i in range(1, 1000):
movement = -1 if random() < 0.5 else 1
value = random_walk[i-1] + movement
random_walk.append(value)
# take difference
diff = list()
for i in range(1, len(random_walk)):
value = random_walk[i] - random_walk[i - 1]
diff.append(value)
# line plot
autocorrelation_plot(diff)
pyplot.show()
Predicting a Random Walk
* Random Walk는 합리적으로 예측할 수 없다.
* Random Walk의 구성방식을 고려할 때, 우리가 할 수 있는 최선의 예측은 다음 시간 단계에서 일어날 일과 같이 이전 시간 단계의 관찰을 사용하는 것이다.
* 이를 종종 naive forecast, persistence model 이라고 부른다.
* 전 시간을 통한 다음 시간 예측이 1의 오차가 있다는 것은 양or음의 방향으로 1이 되므로 예상 오차의 제곱이 1이라는 것을 예측할 수 있다.
# persistence forecasts for a random walk
from random import seed
from random import random
from sklearn.metrics import mean_squared_error
from math import sqrt
# generate the random walk
seed(1)
random_walk = list()
random_walk.append(-1 if random() < 0.5 else 1)
for i in range(1, 1000):
movement = -1 if random() < 0.5 else 1
value = random_walk[i-1] + movement
random_walk.append(value)
# prepare dataset
train_size = int(len(random_walk) * 0.66)
train, test = random_walk[0:train_size], random_walk[train_size:]
# persistence
predictions = list()
history = train[-1]
for i in range(len(test)):
yhat = history
predictions.append(yhat)
history = test[i]
rmse = sqrt(mean_squared_error(test, predictions))
print('Persistence RMSE: %.3f' % rmse)
Persistence RMSE: 1.000
'Study > time series forecasting with python' 카테고리의 다른 글
Chapter 13. Use and Remove Trends (0) | 2021.07.21 |
---|---|
Chapter 12. Decompose Time Series Data (0) | 2021.07.12 |
Chapter 10. A Gentle Introduction to White Noise (0) | 2021.07.12 |
Chapter 9. Moving Average Smoothing (0) | 2021.07.12 |
Chapter 8. Power Transforms (0) | 2021.07.12 |