다운로드
작성자: admin 작성일시: 2017-07-28 15:54:58 조회수: 1487 다운로드: 207
카테고리: 시계열 분석 태그목록:

Seasonal ARIMA 모형 추정의 예

대기중 이산화탄소 농도 예측

다음은 대기중 이산화탄소 농도에 대한 시계열 자료이다. 이 시계열은 뚜렷한 계절성을 보이고 있다.

In:
data = sm.datasets.get_rdataset("co2")
df = data.data

def yearfraction2datetime(yearfraction, startyear=0):
    import datetime, dateutil
    year = int(yearfraction) + startyear
    month = int(round(12 * (yearfraction - year)))
    delta = dateutil.relativedelta.relativedelta(months=month)
    date = datetime.datetime(year, 1, 1) + delta
    return date

df["datetime"] = df.time.map(yearfraction2datetime)
df["month"] = df.datetime.dt.month
df.tail()
Out:
time co2 datetime month
463 1997.583333 362.57 1997-08-01 8
464 1997.666667 360.24 1997-09-01 9
465 1997.750000 360.83 1997-10-01 10
466 1997.833333 362.49 1997-11-01 11
467 1997.916667 364.34 1997-12-01 12
In:
df.plot(x="datetime", y="co2")
plt.show()

SARIMAX 클래스 이용하면 Multiplicated SARIMA(p,d,q)x(P,D,Q,s) 모형에 대한 추정 및 예측이 가능하다.

클래스 인스턴스를 생성하기 위해서는 order 인수에 (p,d,q) 튜플을, seasonal_order 인수에 (P,D,Q,s) 튜플을 넣는다.

SARIMAXfit 메서드는 모수를 추정하여 그 결과를 SARIMAXResult 클래스 인스턴스로 반환한다.

우선 Multiplicated가 아닌 단순 Seasonal ARIMA 모형을 사용해보자.

In:
m1 = sm.tsa.SARIMAX(df.co2.values, order=(0,0,0), seasonal_order=(1,1,2,12))
r1 = m1.fit()
print(r1.summary())
                            Statespace Model Results                            
================================================================================
Dep. Variable:                        y   No. Observations:                  468
Model:             SARIMAX(1, 1, 2, 12)   Log Likelihood                -443.176
Date:                  Fri, 28 Jul 2017   AIC                            894.353
Time:                          15:23:38   BIC                            910.947
Sample:                               0   HQIC                           900.883
                                  - 468                                         
Covariance Type:                    opg                                         
==============================================================================
                 coef    std err          z      P>|z|      [0.025      0.975]
------------------------------------------------------------------------------
ar.S.L12       0.9970      0.003    315.331      0.000       0.991       1.003
ma.S.L12      -0.9227      0.052    -17.596      0.000      -1.025      -0.820
ma.S.L24       0.0771      0.052      1.475      0.140      -0.025       0.180
sigma2         0.3806      0.025     15.110      0.000       0.331       0.430
===================================================================================
Ljung-Box (Q):                     1355.26   Jarque-Bera (JB):                 3.63
Prob(Q):                              0.00   Prob(JB):                         0.16
Heteroskedasticity (H):               1.57   Skew:                             0.22
Prob(H) (two-sided):                  0.01   Kurtosis:                         3.03
===================================================================================

Warnings:
[1] Covariance matrix calculated using the outer product of gradients (complex-step).

이번에는 단순 차분한 결과를 12시간단위 주기로 계절-차분을 하여 자기상관함수를 살펴본다.

In:
r1.plot_diagnostics()
plt.tight_layout()
plt.show()
In:
plt.plot(r1.simulate(100, initial_state=r1.filtered_state[:,-1]))
plt.show()

이번에는 Multiplicated Seasonal ARIMA 모형을 위해 단순 차분을 한 결과의 ACF와 PACF를 살펴보자.

In:
df["y2"] = df["co2"].diff()
df3 = df.iloc[13:, :]
df3.y2.plot()
plt.show()
In:
sm.tsa.graphics.plot_acf(df3.y2, lags=60)
plt.show()
In:
m2 = sm.tsa.SARIMAX(df.co2.values, order=(1,1,1), seasonal_order=(1,1,1,12))
r2 = m2.fit()
print(r2.summary())
                                 Statespace Model Results                                 
==========================================================================================
Dep. Variable:                                  y   No. Observations:                  468
Model:             SARIMAX(1, 1, 1)x(1, 1, 1, 12)   Log Likelihood                 -84.882
Date:                            Fri, 28 Jul 2017   AIC                            179.763
Time:                                    15:23:43   BIC                            200.506
Sample:                                         0   HQIC                           187.925
                                            - 468                                         
Covariance Type:                              opg                                         
==============================================================================
                 coef    std err          z      P>|z|      [0.025      0.975]
------------------------------------------------------------------------------
ar.L1          0.2454      0.119      2.064      0.039       0.012       0.478
ma.L1         -0.5746      0.103     -5.594      0.000      -0.776      -0.373
ar.S.L12       0.0299      0.056      0.532      0.595      -0.080       0.140
ma.S.L12      -0.8582      0.033    -25.974      0.000      -0.923      -0.793
sigma2         0.0822      0.006     13.919      0.000       0.071       0.094
===================================================================================
Ljung-Box (Q):                       37.10   Jarque-Bera (JB):                 1.71
Prob(Q):                              0.60   Prob(JB):                         0.43
Heteroskedasticity (H):               0.93   Skew:                            -0.05
Prob(H) (two-sided):                  0.68   Kurtosis:                         2.72
===================================================================================

Warnings:
[1] Covariance matrix calculated using the outer product of gradients (complex-step).

두 모형의 잔차를 비교하면 다음과 같다.

In:
plt.plot(r1.resid[13:], color='b')
plt.plot(r2.resid[13:], color='g')
plt.show()