Introduzione al Modello ARIMA per l’Analisi delle Serie Temporali

Cerca:

Generic selectors
Exact matches only
Search in title
Search in content
Post Type Selectors

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.

Forse potrebbe interessarti anche:  Dashboard: Come Trasformarla da Cruscotto di Dati a Mappa Strategica per le Decisioni

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.

Forse potrebbe interessarti anche:  Python: la libreria Pandas. Un'introduzione alle serie storiche

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.

Forse potrebbe interessarti anche:  L'Accuracy (Precisione) nei Modelli di Classificazione: Guida Completa alla Metrica Fondamentale (e ai Suoi Limiti)

Esempio pratico in Python

Implementiamo un esempio semplice in Python per chiarire l’applicazione dei modelli ARIMA, con particolare attenzione alla visualizzazione dei test e dei risultati. Useremo dati simulati per semplicità.
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()
Modello ARIMA per l'Analisi delle Serie Temporali serie origine
# 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()
Modello ARIMA per l'Analisi delle Serie Temporali serie temporale differenziata
# 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()
Modello ARIMA per l'Analisi delle Serie Temporali ACF e PACF della serie differenziata
# 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}")
Modello ARIMA Addestramento e confronto dei modelli
# 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}")
Modello ARIMA Diagnostica dei residui
Modello ARIMA Diagnostica dei residui ACF e PACF
# 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()

Modello ARIMA Previsioni

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.

Pubblicità