stacionarita znamená, že statistické vlastnosti časové řady tj. průměr, rozptyl a kovariance se v průběhu času nemění. Mnoho statistických modelů vyžaduje, aby série byla stacionární, aby bylo možné provádět efektivní a přesné předpovědi.
ke kontrole stacionarity časové řady by byly použity dva statistické testy-Test Augmented Dickey Fuller („ADF“) a test Kwiatkowski-Phillips-Schmidt-Shin („KPSS“). Použije se rovněž metoda přeměny nestacionární časové řady na stacionární řady.
tato první buňka importuje standardní balíčky a nastaví grafy, aby se zobrazily inline.
:
%matplotlib inlineimport numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport statsmodels.api as sm
používá se dataset slunečních skvrn. Obsahuje roční (1700-2008) údaje o slunečních skvrnách z Národního Geofyzikálního datového centra.
:
sunspots = sm.datasets.sunspots.load_pandas().data
některé předzpracování se provádí na datech. Sloupec “ rok “ se používá při vytváření indexu.
:
sunspots.index = pd.Index(sm.tsa.datetools.dates_from_range('1700', '2008'))del sunspots
data jsou nyní vynesena.
:
sunspots.plot(figsize=(12,8))
:
<AxesSubplot:>
ADF test¶
ADF test se používá k určení přítomnosti kořene jednotky v sérii, a proto pomáhá pochopit, zda je řada stacionární nebo ne. Nulová a alternativní hypotéza tohoto testu jsou:
nulová hypotéza: řada má kořen jednotky.
alternativní hypotéza: řada nemá kořen jednotky.
pokud nulová hypotéza v nebyla zamítnuta, může tento test poskytnout důkaz, že řada je nestacionární.
je vytvořena funkce pro provedení testu ADF na časové řadě.
:
from statsmodels.tsa.stattools import adfullerdef adf_test(timeseries): print ('Results of Dickey-Fuller Test:') dftest = adfuller(timeseries, autolag='AIC') dfoutput = pd.Series(dftest, index=) for key,value in dftest.items(): dfoutput = value print (dfoutput)
KPSS test¶
KPSS je další test pro kontrolu stacionarity časové řady. Nulová a alternativní hypotéza pro test KPSS je opačná než u testu ADF.
nulová hypotéza: proces je trendově stacionární.
alternativní hypotéza: řada má kořen jednotky (řada není stacionární).
je vytvořena funkce pro provedení testu KPSS na časové řadě.
:
from statsmodels.tsa.stattools import kpssdef kpss_test(timeseries): print ('Results of KPSS Test:') kpsstest = kpss(timeseries, regression='c', nlags="auto") kpss_output = pd.Series(kpsstest, index=) for key,value in kpsstest.items(): kpss_output = value print (kpss_output)
testy ADF poskytují následující výsledky-statistiku testu, hodnotu p a kritickou hodnotu v intervalech spolehlivosti 1%, 5% a 10%.
ADF test je nyní aplikován na data.
:
adf_test(sunspots)
Results of Dickey-Fuller Test:Test Statistic -2.837781p-value 0.053076#Lags Used 8.000000Number of Observations Used 300.000000Critical Value (1%) -3.452337Critical Value (5%) -2.871223Critical Value (10%) -2.571929dtype: float64
na základě úrovně významnosti 0,05 a hodnoty P testu ADF nelze nulovou hypotézu odmítnout. Proto je řada nestacionární.
testy KPSS poskytují následující výsledky – statistiku testu, hodnotu p a kritickou hodnotu v intervalech spolehlivosti 1%, 5% a 10%.
KPSS test je nyní aplikován na data.
:
kpss_test(sunspots)
Results of KPSS Test:Test Statistic 0.669866p-value 0.016285Lags Used 7.000000Critical Value (10%) 0.347000Critical Value (5%) 0.463000Critical Value (2.5%) 0.574000Critical Value (1%) 0.739000dtype: float64
na základě úrovně významnosti 0,05 a hodnoty P testu KPSS existují důkazy pro odmítnutí nulové hypotézy ve prospěch alternativy. Proto je řada nestacionární podle testu KPSS.
vždy je lepší použít oba testy, aby bylo zajištěno, že série je skutečně stacionární. Možné výsledky použití těchto stacionárních testů jsou následující:
zde, vzhledem k rozdílu ve výsledcích z testu ADF a testu KPSS, lze odvodit, že série je trend stacionární a není striktní stacionární. Řada může být oddělena odlišováním nebo montáží modelu.
Detrending Differencing
je to jedna z nejjednodušších metod pro detrending časové řady. Je vytvořena nová řada, kde se hodnota v aktuálním časovém kroku vypočítá jako rozdíl mezi původním pozorováním a pozorováním v předchozím časovém kroku.
na datech se aplikuje diferenciace a výsledek je vynesen.
:
sunspots = sunspots - sunspots.shift(1)sunspots.dropna().plot(figsize=(12,8))
:
<AxesSubplot:>
ADF test je nyní aplikován na tyto detrended hodnoty a stacionarita je kontrolována.
:
adf_test(sunspots.dropna())
Results of Dickey-Fuller Test:Test Statistic -1.486166e+01p-value 1.715552e-27#Lags Used 7.000000e+00Number of Observations Used 3.000000e+02Critical Value (1%) -3.452337e+00Critical Value (5%) -2.871223e+00Critical Value (10%) -2.571929e+00dtype: float64
na základě p-hodnoty testu ADF existují důkazy pro odmítnutí nulové hypotézy ve prospěch alternativy. Série je tedy nyní přísně stacionární.
KPSS test je nyní aplikován na tyto hodnoty detrended a je kontrolována stacionarita.
:
kpss_test(sunspots.dropna())
Results of KPSS Test:Test Statistic 0.021193p-value 0.100000Lags Used 0.000000Critical Value (10%) 0.347000Critical Value (5%) 0.463000Critical Value (2.5%) 0.574000Critical Value (1%) 0.739000dtype: float64
/home/travis/build/statsmodels/statsmodels/statsmodels/tsa/stattools.py:1911: InterpolationWarning: The test statistic is outside of the range of p-values available in thelook-up table. The actual p-value is greater than the p-value returned. warn_msg.format(direction="greater"), InterpolationWarning
na základě p-hodnoty KPSS testu nelze nulovou hypotézu odmítnout. Proto je série stacionární.
závěr¶
používají se dva testy pro kontrolu stacionarity časové řady, a to ADF test a kpss test. Detrending se provádí pomocí differencing. Trend stacionární časové řady je převeden na přísné stacionární časové řady. Požadovaný předpovědní model lze nyní aplikovat na stacionární data časových řad.