다운로드
작성자: admin 작성일시: 2016-04-27 16:15:38 조회수: 8841 다운로드: 267
카테고리: 시계열 분석 태그목록:

비정상 확률 과정을 정상 확률 과정으로 변환하기

비정상 확률 과정(nonstationary process)은 기댓값이나 분산이 시간에 따라 변화하는 확률 과정이다. 주로 기댓값 분산의 크기가 시간이 지남에 따라 커지는 경우가 많다. 이와 반대로 시간이 지나도 기댓값이 분산이 변하지 않는 확률 과정을 정상 확률 과정(stationary process)라고 한다. 정상 확률 과정과 비정상 확률 과정에 대해서는 다음 노트북을 참조한다.

정상 확률 과정은 그 특성에 따라 AR 모형, MA 모형, ARMA 모형 등의 확률 과정 모형으로 모형화(modeling) 할 수 있다.

비정상 확률 과정의 경우에는 정상 과정으로 변환(transform)하여 모형화하는 것이 효율적이므로 다음과 같은 방법을 사용하여 정상 과정 변환을 하게 된다.

요약: 비정상 확률 과정을 정상 확률 과정으로 변환하는 방법
  • 차분 (differencing)

  • 백분율(percentage change) 혹은 로그(logarithm) 변환

  • Box-Cox 변환

차분

다음 시계열 자료는 1986년부터 2006년까지의 월간 원유 가격 자료이다. Cryer & Chan (2008)의 자료를 참고하였다. 2001년 이후로 보이는 급격한 가격 상승을 고려할 때 이 시계열은 정상 확률 과정으로 보기 힘들다. 그렇지만 ARIMA 모형과 같은 확률적 추세(stochastic trend)를 가지는 비정상 모형은 이 시계열 자료의 특성을 비교적 잘 표현할 수 있다.

In:
df = pd.read_csv("data/tsa/oil.price.dat")
df.index = pd.date_range("01/1986", "01/2006", freq="MS") 
df.plot();

아래의 플롯은 위의 시계열 자료를 차분한 결과이다. 원자료에 비해 정상 과정으로 모형화하기 더 적합한 자료가 되었다.

In:
df.diff().plot();

로그 변환

비정상 확률 과정으로 모형화 할 수 있는 시계열 자료 중에서 표준편차가 자료의 크기에 비례하여 증가하는 경향을 보이거나 지수함수적으로 증가하는 경향을 보이는 경우에는 차분보다 로그 변환(logarithm transform)이 더 적당하다.

우선 표준 편차가 자료의 크기에 비례하는 경우를 살펴보자. 추세 함수 즉 기댓값이 시간에 따른 함수이고 표준 편차는 여기에 비례한다고 하자.

$$ \text{E}[Y_t] = \mu_t = f(t) $$$$ \sqrt{\text{Var}[Y_t]} = \mu_t \sigma $$

로그 변환을 하면 다음과 같다.

$$ \log Y_t \approx \log \mu_t + \dfrac{Y_t - \mu_t}{\mu_t} $$$$ \text{E}[\log Y_t] = \log \mu_t $$$$ \text{Var}[\log Y_t] \approx \sigma^2 $$

즉 로그 변환한 결과로 나온 확률 과정의 분산은 일정하게 된다. 따라서 추세 제거를 통해 기댓값을 0으로 만들기만 하면 정상 과정으로 모형화 가능하다

경제 관련 분석에서 흔히 볼 수 있는 수익률 혹은 백분율 자료도 로그 변환과 관련이 있다.

확률 과정 $Y_t$에 대한 백분율 자료 $X_t$는 다음과 같이 정의된다.

$$ X_t = \dfrac{Y_{t}}{Y_{t-1}} - 1 $$

여기에서

$$ \log{Y_t} - \log{Y_{t-1}} = \log{X_t + 1} \approx X_t \;\; \text{ if } \left| X_t \right| < 0.2 $$

이므로 백분률 이나 수익률 자료는 원 자료에 대해 로그 변환을 하고 이를 다시 차분한 것이라 볼 수 있다.

다음 시계열 자료는 1973년부터 2005년까지의 월간 전기 가격 자료이다. Cryer & Chan (2008)의 자료를 참고하였다.

In:
df = pd.read_csv("data/tsa/electricity.dat")
df.index = pd.date_range("01/1973", "12/2005", freq="MS")
df.plot();

전기 가격이 상승하며 분산도 증가하고 있음을 볼 수 있다. 이 자료를 로그 변환하면 다음과 같다.

In:
np.log(df).plot();

여전히 선형 추세는 가지고 있지만 ($\text{E}[Y_t] = \mu = \text{const.}$), 분산의 크기가 비교적 일정하게 변환되었다. 선형 추세를 없애기 위해 이 시계열을 차분한다.

In:
np.log(df).diff().plot();

이 자료는 기댓값이 $0$이고 분산이 일정한 정상 과정 모형으로 모형화 가능하다.

Box-Cox 변환

Box-Cox 변환은 정규분포가 아닌 자료를 정규분포로 변환하기 위해 사용된다. 모수(parameter) $\lambda$를 가진다.

$$ y^{(\boldsymbol{\lambda})} = \begin{cases} \dfrac{y^{\lambda} - 1}{\lambda} & \text{if } \lambda \neq 0, \\ \ln{y} & \text{if } \lambda = 0, \end{cases} $$

보통 여러가지 $\lambda$ 값을 시도하여 가장 정규성을 높여주는 값을 찾아서 사용한다.

위의 전기 가격 자료에 대해 최적의 $\lambda$값을 찾기 위해서는 scipy 패키지의 boxcox_normplot 명령을 사용한다. 결과로 구해진 값은 약 0.028이다.

In:
x, y = sp.stats.boxcox_normplot(df.electricity, -2, 2)
plt.plot(x, y);
y2, l = sp.stats.boxcox(df.electricity)
plt.axvline(x=l, color='r', ls="--");
print("optimal lambda:", l)
optimal lambda: 0.0283726895138

정규성을 비교하기 위해 원자료와 Box-Cox 변환후 차분한 값의 QQ-Plot을 그리면 아래과 같다.

In:
ax1 = plt.subplot(121);
sm.qqplot(df, fit=True, line='45', ax=ax1);
ax1.axis("square"); ax1.set_xlim(-4, 4); ax1.set_ylim(-4, 4); 
ax2 = plt.subplot(122);
sm.qqplot(np.diff(y2), fit=True, line='45', ax=ax2);
ax2.axis("square"); ax2.set_xlim(-4, 4); ax2.set_ylim(-4, 4); 

질문/덧글

아직 질문이나 덧글이 없습니다. 첫번째 글을 남겨주세요!