Serie storica - ARIMA

Abbiamo già capito che per una serie temporale stazionaria una variabile al tempo "t" è una funzione lineare di osservazioni precedenti o errori residui. Quindi è tempo per noi di combinare i due e avere un modello di media mobile auto-regressiva (ARMA).

Tuttavia, a volte la serie temporale non è stazionaria, cioè le proprietà statistiche di una serie come la media, la varianza cambia nel tempo. E i modelli statistici che abbiamo studiato finora presumono che le serie temporali siano stazionarie, quindi, possiamo includere una fase di pre-elaborazione di differenziare le serie temporali per renderle stazionarie. Ora, è importante per noi scoprire se le serie temporali di cui abbiamo a che fare sono stazionarie o meno.

Vari metodi per trovare la stazionarietà di una serie temporale cercano la stagionalità o l'andamento nel grafico delle serie temporali, controllando la differenza di media e varianza per vari periodi di tempo, test Augmented Dickey-Fuller (ADF), test KPSS, esponente di Hurst ecc. .

Vediamo se la variabile "temperatura" del nostro set di dati è una serie temporale stazionaria o meno utilizzando il test ADF.

In [74]:

from statsmodels.tsa.stattools import adfuller

result = adfuller(train)
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))

Statistica ADF: -10.406056

valore p: 0,000000

Valori critici:

1%: -3,431

5%: -2,862

10%: -2,567

Ora che abbiamo eseguito il test ADF, interpretiamo il risultato. Per prima cosa confronteremo la statistica ADF con i valori critici, un valore critico inferiore ci dice che la serie è molto probabilmente non stazionaria. Successivamente, vediamo il valore p. Un valore p maggiore di 0,05 suggerisce anche che la serie temporale non è stazionaria.

In alternativa, il valore p inferiore o uguale a 0,05 o la statistica ADF inferiore ai valori critici suggeriscono che la serie temporale è stazionaria.

Quindi, la serie temporale di cui abbiamo a che fare è già stazionaria. In caso di serie temporali stazionarie, impostiamo il parametro "d" a 0.

Possiamo anche confermare la stazionarietà delle serie temporali usando l'esponente di Hurst.

In [75]:

import hurst

H, c,data = hurst.compute_Hc(train)
print("H = {:.4f}, c = {:.4f}".format(H,c))

H = 0,1660, c = 5,0740

Il valore di H <0,5 mostra un comportamento anti-persistente e H> 0,5 mostra un comportamento persistente o una serie di trend. H = 0,5 mostra la camminata casuale / il moto browniano. Il valore di H <0,5, a conferma che la nostra serie è stazionaria.

Per le serie temporali non stazionarie, impostiamo il parametro "d" come 1. Inoltre, il valore del parametro di tendenza auto-regressivo "p" e il parametro di tendenza della media mobile "q", viene calcolato sulle serie temporali stazionarie, cioè tracciando ACP e PACP dopo aver differenziato le serie temporali.

Il modello ARIMA, che è caratterizzato da 3 parametri, (p, d, q) ci sono ora chiari, quindi modelliamo le nostre serie temporali e prevediamo i valori futuri della temperatura.

In [156]:

from statsmodels.tsa.arima_model import ARIMA

model = ARIMA(train.values, order=(5, 0, 2))
model_fit = model.fit(disp=False)

In [157]:

predictions = model_fit.predict(len(test))
test_ = pandas.DataFrame(test)
test_['predictions'] = predictions[0:1871]

In [158]:

plt.plot(df['T'])
plt.plot(test_.predictions)
plt.show()

In [167]:

error = sqrt(metrics.mean_squared_error(test.values,predictions[0:1871]))
print ('Test RMSE for ARIMA: ', error)

Test RMSE per ARIMA: 43.21252940234892