定常性とトレンド除去(ADF/KPSS)

定常性とは、時系列の統計的特性、すなわち平均、分散、共分散が時間とともに変化しないことを意味します。多くの統計モデルは、効果的で正確な予測を行うために、時系列が定常であることを要求します。

時系列の定常性を確認するためには、2つの統計的検定が使用されます。1つは拡張ディッキー・フラー(“ADF”)検定、もう1つはクヴィアトコウスキー・フィリップス・シュミット・シン(“KPSS”)検定です。また、非定常な時系列を定常な時系列に変換する方法も使用されます。

この最初のセルは、標準的なパッケージをインポートし、プロットをインラインで表示する設定を行います。

[1]:
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import statsmodels.api as sm

サンスポットのデータセットが使用されています。これは、国立地球物理データセンターから提供された1700年から2008年までの年間サンスポットデータを含んでいます。

[2]:
sunspots = sm.datasets.sunspots.load_pandas().data

データにはいくつかの前処理が行われます。」YEAR」列はインデックス作成に使用されます。

[3]:
sunspots.index = pd.Index(sm.tsa.datetools.dates_from_range("1700", "2008"))
del sunspots["YEAR"]

データは現在プロットされています。

[4]:
sunspots.plot(figsize=(12, 8))
[4]:
<Axes: >
../../../_images/examples_notebooks_generated_stationarity_detrending_adf_kpss_8_1.png

ADF検定

ADF検定は、時系列に単位根が存在するかどうかを判断するために使用され、したがって、時系列が定常かどうかを理解するのに役立ちます。この検定の帰無仮説と対立仮説は次の通りです:

帰無仮説:時系列には単位根が存在する。

対立仮説:時系列には単位根が存在しない。

帰無仮説が棄却されない場合、この検定は時系列が非定常であることを示す証拠を提供する可能性があります。

時系列に対してADF検定を実行するための関数が作成されます。

[5]:
from statsmodels.tsa.stattools import adfuller


def adf_test(timeseries):
    print("Results of Dickey-Fuller Test:")
    dftest = adfuller(timeseries, autolag="AIC")
    dfoutput = pd.Series(
        dftest[0:4],
        index=[
            "Test Statistic",
            "p-value",
            "#Lags Used",
            "Number of Observations Used",
        ],
    )
    for key, value in dftest[4].items():
        dfoutput["Critical Value (%s)" % key] = value
    print(dfoutput)

KPSS検定

KPSS検定は、時系列データの定常性を確認するための別の検定方法です。KPSS検定の帰無仮説と対立仮説は、ADF検定のそれとは逆になります。

帰無仮説:プロセスはトレンド定常である。

対立仮説:時系列には単位根がある(時系列は定常でない)。

時系列データに対してKPSS検定を実行するための関数が作成されます。

[6]:
from statsmodels.tsa.stattools import kpss


def kpss_test(timeseries):
    print("Results of KPSS Test:")
    kpsstest = kpss(timeseries, regression="c", nlags="auto")
    kpss_output = pd.Series(
        kpsstest[0:3], index=["Test Statistic", "p-value", "Lags Used"]
    )
    for key, value in kpsstest[3].items():
        kpss_output["Critical Value (%s)" % key] = value
    print(kpss_output)

ADF検定は以下の結果を示します - 検定統計量、p値、および1%、5%、10%の信頼区間での臨界値。

現在、データにADF検定が適用されています。

[7]:
adf_test(sunspots["SUNACTIVITY"])
Results of Dickey-Fuller Test:
Test Statistic                  -2.837781
p-value                          0.053076
#Lags Used                       8.000000
Number of Observations Used    300.000000
Critical Value (1%)             -3.452337
Critical Value (5%)             -2.871223
Critical Value (10%)            -2.571929
dtype: float64

有意水準0.05およびADF検定のp値に基づき、帰無仮説は棄却できません。したがって、時系列は非定常です。

KPSS検定は以下の結果を示します - 検定統計量、p値、および1%、5%、10%の信頼区間での臨界値。

現在、KPSS検定がデータに適用されています。

[8]:
kpss_test(sunspots["SUNACTIVITY"])
Results of KPSS Test:
Test Statistic           0.669866
p-value                  0.016285
Lags Used                7.000000
Critical Value (10%)     0.347000
Critical Value (5%)      0.463000
Critical Value (2.5%)    0.574000
Critical Value (1%)      0.739000
dtype: float64

有意水準0.05およびKPSS検定のp値に基づき、帰無仮説を棄却し、対立仮説を支持する証拠があります。したがって、KPSS検定によると、この時系列は非定常です。

両方の検定を適用することが常に良い方法です。これにより、時系列が真に定常であるかどうかを確認できます。定常性の検定結果として考えられるケースは以下の通りです:

ケース1:両方の検定が時系列が定常でないと結論を出す - 時系列は非定常
ケース2:両方の検定が時系列が定常であると結論を出す - 時系列は定常
ケース3:KPSS検定が定常性を示し、ADF検定が非定常性を示す - 時系列はトレンド定常である。トレンドを除去して、時系列を厳密な定常にする必要がある。差分を取った後の時系列の定常性を確認する。
ケース4:KPSS検定が非定常性を示し、ADF検定が定常性を示す - 時系列は差分定常である。差分を取って時系列を定常にする必要がある。差分を取った後の時系列の定常性を確認する。

ここでは、ADF検定とKPSS検定の結果の違いに基づき、この時系列がトレンド定常であり、厳密な定常ではないと推測できます。時系列は差分を取るか、モデル適合によってトレンドを除去できます。

差分によるトレンド除去

これは時系列のトレンドを除去する最も簡単な方法の一つです。新しい系列は、現在の時点での値が元の観測値と前の時点での観測値との差として計算されることで構築されます。

データに差分を適用し、その結果をプロットします。

[9]:
sunspots["SUNACTIVITY_diff"] = sunspots["SUNACTIVITY"] - sunspots["SUNACTIVITY"].shift(
    1
)
sunspots["SUNACTIVITY_diff"].dropna().plot(figsize=(12, 8))
[9]:
<Axes: >
../../../_images/examples_notebooks_generated_stationarity_detrending_adf_kpss_20_1.png

ADF検定はこれらのトレンド除去後の値に適用され、定常性が確認されます。

[10]:
adf_test(sunspots["SUNACTIVITY_diff"].dropna())
Results of Dickey-Fuller Test:
Test Statistic                -1.486166e+01
p-value                        1.715552e-27
#Lags Used                     7.000000e+00
Number of Observations Used    3.000000e+02
Critical Value (1%)           -3.452337e+00
Critical Value (5%)           -2.871223e+00
Critical Value (10%)          -2.571929e+00
dtype: float64

ADF検定はこれらのトレンド除去後の値に適用され、定常性が確認されます。

KPSS検定がこれらのトレンド除去後の値に適用され、定常性が確認されます。

[11]:
kpss_test(sunspots["SUNACTIVITY_diff"].dropna())
Results of KPSS Test:
Test Statistic           0.021193
p-value                  0.100000
Lags Used                0.000000
Critical Value (10%)     0.347000
Critical Value (5%)      0.463000
Critical Value (2.5%)    0.574000
Critical Value (1%)      0.739000
dtype: float64
C:\Users\user\AppData\Local\Temp\ipykernel_24204\1512460390.py:6: InterpolationWarning: The test statistic is outside of the range of p-values available in the
look-up table. The actual p-value is greater than the p-value returned.

  kpsstest = kpss(timeseries, regression="c", nlags="auto")

KPSS検定のp値に基づいて、帰無仮説は棄却できません。したがって、時系列は定常です。

結論

時系列の定常性を確認するために、ADF検定とKPSS検定の2つの検定が使用されます。差分を使用してトレンド除去が行われます。トレンド定常な時系列は厳密な定常時系列に変換されます。これで、定常な時系列データに適切な予測モデルを適用することができます。


最終更新日: 2025年01月28日