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