Questo articolo introduce i concetti fondamentali dell’analisi delle serie temporali, con particolare attenzione al modello Autoregressivo Integrato a Media Mobile (ARIMA). L’obiettivo è fornire una comprensione approfondita di questo potente strumento statistico e delle sue applicazioni.
Definizione di Serie Temporale
Una serie temporale è definita come una sequenza di osservazioni ordinate cronologicamente. Queste osservazioni rappresentano misurazioni di una variabile in istanti di tempo discreti o continui. Esempi comuni includono:
- Dati Finanziari: Prezzi di asset, tassi di cambio, volumi di scambio.
- Dati Economici: Prodotto Interno Lordo (PIL), tassi di inflazione, indici di disoccupazione.
- Dati Ambientali: Temperature, precipitazioni, concentrazioni di inquinanti.
- Dati di Vendita: Volumi di vendita, numero di transazioni, ricavi.
L’analisi delle serie temporali mira a identificare pattern, tendenze, stagionalità e altre dinamiche presenti nei dati, al fine di comprendere il comportamento passato e, soprattutto, di effettuare previsioni sul futuro.
Il Modello ARIMA: Struttura e Componenti
Il modello ARIMA è una metodologia statistica ampiamente utilizzata per l’analisi e la previsione di serie temporali. La sua denominazione, ARIMA, è un acronimo che descrive le sue tre componenti fondamentali:
-
AR (Autoregressivo): Questa componente modella la dipendenza lineare del valore corrente della serie dai suoi valori passati. Un modello AR(p) assume che il valore al tempo t, indicato con X(t), sia una combinazione lineare dei suoi p valori precedenti, X(t-1), X(t-2), …, X(t-p), più un termine di errore casuale ε(t):
X(t) = c + φ₁X(t-1) + φ₂X(t-2) + … + φₚX(t-p) + ε(t)
dove c è una costante e i φᵢ rappresentano i coefficienti autoregressivi.
-
I (Integrato): Questa componente gestisce la non-stazionarietà della serie attraverso l’operazione di differenziazione. La differenziazione consiste nel calcolare le differenze tra osservazioni consecutive: ΔX(t) = X(t) – X(t-1). La differenziazione di ordine d implica l’applicazione ripetuta di questa operazione d volte. Questa trasformazione è cruciale per rendere la serie stazionaria, un requisito fondamentale per l’applicazione del modello ARIMA.
-
MA (Media Mobile): Questa componente modella la dipendenza del valore corrente dagli errori di previsione dei periodi precedenti. Un modello MA(q) esprime X(t) come una combinazione lineare degli errori di previsione passati, ε(t-1), ε(t-2), …, ε(t-q):
X(t) = μ + ε(t) + θ₁ε(t-1) + θ₂ε(t-2) + … + θqε(t-q)
dove μ è la media della serie e i θᵢ sono i coefficienti della media mobile.
Un modello ARIMA è quindi denotato come ARIMA(p, d, q), dove p, d e q rappresentano rispettivamente l’ordine delle componenti AR, I e MA.
Stazionarietà: Un Assunto Fondamentale
La stazionarietà è una proprietà statistica cruciale per i modelli ARIMA. Una serie temporale è considerata stazionaria se le sue proprietà statistiche, come la media e la varianza, rimangono costanti nel tempo. Questa assunzione è fondamentale per le seguenti ragioni:
- Semplicità del Modello: La stazionarietà semplifica la struttura del modello, consentendo una stima più efficiente dei parametri.
- Affidabilità delle Previsioni: I modelli addestrati su dati non stazionari possono produrre previsioni inaffidabili, poiché le relazioni statistiche nei dati cambiano nel tempo.
- Evitare Regressioni Spurie: La non-stazionarietà può indurre correlazioni spurie tra variabili, portando a conclusioni errate.
Differenziazione e Integrazione: Trasformazioni Essenziali
La differenziazione, come precedentemente descritto, è utilizzata per rendere stazionaria una serie non stazionaria. Tuttavia, questa trasformazione modifica l’interpretazione diretta dei dati, poiché la serie differenziata rappresenta le variazioni tra le osservazioni, non i valori originali.
Dopo aver applicato il modello ARIMA alla serie differenziata e ottenuto le previsioni, è necessario effettuare l’operazione inversa, l’integrazione, per riportare le previsioni alla scala originale. L’integrazione consiste nella somma cumulativa delle previsioni differenziate, tenendo conto del valore iniziale della serie originale.
Esempio Applicativo: Analisi di Dati di Vendita
Consideriamo un esempio di dati di vendita mensili. Supponiamo che l’analisi preliminare riveli un trend crescente e una correlazione tra le vendite di mesi consecutivi. In questo scenario, un modello ARIMA(1, 1, 0) potrebbe essere appropriato:
- AR(1): Le vendite del mese corrente sono influenzate dalle vendite del mese precedente.
- I(1): È necessaria una differenziazione per rimuovere il trend.
- MA(0): Non si considerano gli errori di previsione passati.
Dopo aver stimato i parametri del modello e ottenuto le previsioni sulla serie differenziata, l’integrazione permetterà di ottenere le previsioni delle vendite nella scala originale.
Scelta dei Parametri (p, d, q)
1. Trovare il “Livello Giusto”: Determinare d
Il primo passo è capire se la tua serie temporale è “ferma” o “in movimento”. Una serie “ferma” (stazionaria) è come una persona che cammina su un tapis roulant a velocità costante: la sua posizione media non cambia nel tempo. Una serie “in movimento” (non stazionaria) è come una persona che cammina per strada: la sua posizione cambia continuamente.
-
Esame Visivo: Guarda il grafico della tua serie temporale. Se vedi un trend chiaro (la linea sale o scende in modo costante) o una stagionalità (pattern che si ripetono, come le vendite che aumentano ogni Natale), allora la serie è “in movimento” e hai bisogno di “aggiustarla”.
-
Test ADF (il Test del Tapis Roulant): Questo test ti dice in modo più preciso se la serie è “sul tapis roulant” (stazionaria) o “per strada” (non stazionaria). Il risultato principale è un numero chiamato p-value.
- Se il p-value è minore di 0.05, significa che la serie è stazionaria (è sul tapis roulant). Non hai bisogno di fare nulla! (d = 0).
- Se il p-value è maggiore di 0.05, significa che la serie non è stazionaria (è per strada). Devi “fermarla” usando la differenziazione.
-
Differenziazione (Mettere la Serie sul Tapis Roulant): Differenziare significa calcolare la differenza tra ogni valore e il valore precedente. È come calcolare di quanto si è spostata la persona da un passo all’altro, invece di guardare la sua posizione assoluta.
- Se differenzi una volta e il test ADF ora dice che la serie è stazionaria, allora d = 1.
- Se devi differenziare due volte per renderla stazionaria, allora d = 2. E così via.
Esempio: Immagina di misurare l’altezza di una pianta ogni giorno. Se la pianta cresce costantemente, vedrai un trend crescente. Differenziando i dati (calcolando di quanto è cresciuta la pianta ogni giorno), otterrai una serie più “ferma”, che rappresenta il tasso di crescita giornaliero.
2. Capire il “Passato”: Determinare p
Ora che hai una serie “ferma”, devi capire quanto il passato influenza il presente. Questo è il ruolo del parametro p.
-
PACF (Autocorrelazione Parziale): Questo grafico ti mostra quanto un valore della serie è direttamente correlato con i valori passati, senza considerare l’influenza dei valori intermedi. Immagina di voler sapere se il tuo umore di oggi è influenzato da come ti sentivi due giorni fa, senza considerare come ti sentivi ieri.
-
Cerca il primo “picco” significativo nel grafico PACF (cioè, il primo punto che supera le linee orizzontali). La posizione di questo picco sull’asse orizzontale (il “ritardo” o “lag”) ti dà il valore di p.
-
Se il primo picco significativo è al ritardo 1, allora p = 1. Se è al ritardo 2, allora p = 2, e così via. Se dopo un certo ritardo il grafico “cade” bruscamente verso lo zero, quello è il tuo p.
-
3. Considerare gli “Errori del Passato”: Determinare q
A volte, il presente non è influenzato solo dai valori passati, ma anche dagli errori di previsione che hai fatto in passato. Questo è il ruolo del parametro q.
-
ACF (Autocorrelazione): Questo grafico ti mostra quanto un valore della serie è correlato con tutti i valori passati, senza escludere l’influenza dei valori intermedi. Immagina di voler sapere se il tuo umore di oggi è influenzato da come ti sentivi due giorni fa, considerando anche come ti sentivi ieri.
-
Come per il PACF, cerca il primo “picco” significativo nel grafico ACF. La posizione di questo picco ti dà il valore di q.
-
Se il primo picco significativo è al ritardo 1, allora q = 1. Se è al ritardo 2, allora q = 2, e così via. Anche qui, un brusco “taglio” verso lo zero dopo un certo ritardo indica il valore di q.
-
Esempio Combinato:
Hai differenziato la serie una volta (d = 1). Guardando il PACF, vedi un picco significativo solo al ritardo 1. Quindi p = 1. Guardando l’ACF, vedi un decadimento graduale, ma non un taglio netto. Questo suggerisce una componente MA, ma non un ordine preciso. Potresti provare con q = 0 o q = 1 e vedere quale modello funziona meglio.
4. Scegliere il “Miglior Identikit”: AIC e BIC
Ora hai diverse opzioni per il tuo modello ARIMA (diverse combinazioni di p, d e q). Devi scegliere quella migliore.
- AIC e BIC: Questi sono due “punteggi” che ti aiutano a confrontare i diversi modelli. Più basso è il punteggio, migliore è il modello. Il BIC tende a preferire modelli più semplici rispetto all’AIC.
5. Controllare se l'”Identikit” è Valido: Diagnostica dei Residui
Dopo aver scelto un modello, devi controllare se funziona bene.
-
Residui: I residui sono gli errori che il tuo modello commette. Idealmente, questi errori dovrebbero essere casuali, come il rumore bianco.
- Se i grafici ACF e PACF dei residui mostrano ancora dei pattern, significa che il tuo modello non cattura completamente la struttura dei dati e devi rivedere i parametri (p, d, q).
In breve: Determinare (p, d, q) è come un’indagine. Usi il test ADF per capire se la serie è “ferma”, i grafici PACF e ACF per capire quanto il passato influenza il presente e gli errori passati, e i criteri AIC e BIC per scegliere il modello migliore. Infine, controlli i residui per assicurarti che il modello funzioni bene. È un processo che richiede un po’ di pratica e sperimentazione, ma con il tempo diventerà più chiaro.
Esempio pratico in Python
import pandas as pd import numpy as np import matplotlib.pyplot as plt from statsmodels.tsa.arima.model import ARIMA from statsmodels.graphics.tsaplots import plot_acf, plot_pacf from statsmodels.tsa.stattools import adfuller from statsmodels.stats.diagnostic import acorr_ljungbox # 1. Creazione di dati simulati (con un trend) np.random.seed(42) n_data = 100 time = np.arange(n_data) trend = 0.5 * time noise = np.random.normal(0, 5, n_data) data = pd.Series(trend + noise, index=pd.date_range('2024-01-01', periods=n_data, freq='D')) # 2. Visualizzazione della serie originale plt.figure(figsize=(10, 4)) plt.plot(data) plt.title('Serie Temporale Originale (con trend)') plt.show()# 3. Test di stazionarietà (ADF) sulla serie originale def test_stazionarieta(timeseries): print('Risultati del Test di Dickey-Fuller Aumentato:') 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) test_stazionarieta(data) # 4. Differenziazione per rendere la serie stazionaria data_diff = data.diff().dropna() # 5. Visualizzazione della serie differenziata plt.figure(figsize=(10, 4)) plt.plot(data_diff) plt.title('Serie Temporale Differenziata') plt.show()
# 6. Test di stazionarietà (ADF) sulla serie differenziata test_stazionarieta(data_diff) # 7. Grafici ACF e PACF sulla serie differenziata fig, axes = plt.subplots(1, 2, figsize=(12, 4)) plot_acf(data_diff, lags=20, ax=axes[0]) axes[0].set_title('ACF della Serie Differenziata') plot_pacf(data_diff, lags=20, ax=axes[1]) axes[1].set_title('PACF della Serie Differenziata') plt.tight_layout() # Per evitare sovrapposizioni nei titoli plt.show()
# 8. Scelta dei parametri (p, d, q) # Dall'ACF e PACF, proviamo p=1, d=1 (abbiamo differenziato una volta), q=0 o q=1. # 9. Addestramento e confronto dei modelli try: model1 = ARIMA(data, order=(1, 1, 0)) # AR(1) results1 = model1.fit() print("ARIMA(1,1,0)") print(results1.summary()) except Exception as e: print(f"errore modello 1:{e}") try: model2 = ARIMA(data, order=(1, 1, 1)) # ARIMA(1,1,1) results2 = model2.fit() print("\nARIMA(1,1,1)") print(results2.summary()) except Exception as e: print(f"errore modello 2:{e}")
# 10. Diagnostica dei residui (per il modello ARIMA(1,1,0) - puoi fare lo stesso per l'altro) residuals1 = results1.resid plt.figure(figsize=(10,4)) plt.plot(residuals1) plt.title("Residui ARIMA(1,1,0)") plt.show() fig, axes = plt.subplots(1, 2, figsize=(12, 4)) plot_acf(residuals1, lags=20, ax=axes[0]) axes[0].set_title('ACF dei Residui') plot_pacf(residuals1, lags=20, ax=axes[1]) axes[1].set_title('PACF dei Residui') plt.tight_layout() plt.show() lbvalue, pvalue = acorr_ljungbox(residuals1, lags=[10], return_df=False) print(f"Ljung-Box p-value: {pvalue}")
![]()
# 11. Previsioni (per il modello ARIMA(1,1,0)) forecast_steps = 20 forecast = results1.forecast(steps=forecast_steps) forecast_index = pd.date_range(start=data.index[-1] + pd.Timedelta(days=1), periods=forecast_steps, freq='D') forecast_series = pd.Series(forecast, index=forecast_index) plt.figure(figsize=(10, 4)) plt.plot(data, label='Dati Reali') plt.plot(forecast_series, label='Previsioni ARIMA(1,1,0)', color='red') plt.title('Previsioni') plt.legend() plt.show()

Conclusioni
Il modello ARIMA rappresenta uno strumento potente per l’analisi e la previsione di serie temporali. La comprensione dei suoi componenti, l’importanza della stazionarietà e le trasformazioni di differenziazione e integrazione sono essenziali per un’applicazione efficace. L’analisi dei residui del modello è altrettanto importante per la valutazione della bontà di adattamento del modello ai dati. Un’adeguata selezione dei parametri (p, d, q), basata sull’analisi dei dati e sui grafici ACF e PACF, è fondamentale per ottenere previsioni accurate e affidabili.





