Analisi esplorativa completa delle serie temporali

Esplorazione completa e approfondita delle serie temporali

Un’immersione approfondita nei dati sulla qualità dell’aria

Foto di Jason Blackeye su Unsplash

Eccoti con un dataset indicizzato da timestamp. I tuoi dati potrebbero riguardare la domanda e l’offerta di stoccaggio, e ti viene richiesto di prevedere gli intervalli ideali di rifornimento per un prodotto strategico. Oppure potresti aver bisogno di tradurre le informazioni storiche sulle vendite in insight chiave per il tuo team. Forse i tuoi dati sono finanziari, con informazioni sugli interessi storici e una selezione di prezzi delle azioni. Forse ti viene chiesto di modellare la volatilità di mercato e hai bisogno di quantificare il rischio monetario nel periodo di investimento. Dalle scienze sociali alla distribuzione dell’energia o dagli studi ambientali alla sanità. Gli esempi sono numerosi. Ma cosa hanno in comune questi scenari? Uno, hai un compito di serie storiche tra le mani. E due, sicuramente beneficerai di iniziare con un’analisi esplorativa sintetica ma completa.

Indice

L’obiettivo di questo articolo

Ma cosa significa effettuare un’analisi esplorativa delle serie temporali? Diversamente da altri problemi di data science, ottenere insight dai dati delle serie temporali può essere complicato e tutto fuorché semplice. I tuoi dati potrebbero avere tendenze e stagioni sottostanti importanti o essere adatti per previsioni nidificate all’interno dei loro intricati modelli ciclici. Distinguere gli outlier anomali causati da un errore nel processo di generazione dei dati da anomalie effettive che contengono informazioni chiave può essere sfidante. E gestire i valori mancanti potrebbe non essere così semplice come ti aspetti.

In questo articolo verrà delineato un processo che ha funzionato per me nello studio di dataset delle serie temporali. Mi seguirai mentre esploro le misurazioni di particolato fine, noto anche come PM 2.5, uno dei principali contribuenti all’inquinamento dell’aria e agli indici di qualità dell’aria. Mi concentrerò nel fornire alcune best practice con particolare attenzione ai dettagli per generare visualizzazioni e riepiloghi statistici nitidi e altamente informativi.

Descrizione del dataset

I dati studiati qui provengono da quattro stazioni di monitoraggio nella città di Vancouver, Columbia Britannica, Canada. Contengono misurazioni medie orarie di particolato fine PM 2.5 (particelle con diametro inferiore a 2,5 micron) in µg/m3 (microgrammi per metro cubo) con valori dal 1° gennaio 2016 al 3 luglio 2022.

PM 2.5 principalmente proviene dalla combustione di combustibili fossili, e nelle città generalmente origina dal traffico automobilistico e dai cantieri edili. Un’altra importante fonte di questa sostanza inquinante sono gli incendi boschivi e quelli delle praterie, che vengono facilmente trasportati dal vento [1].

L’immagine sottostante mostra la posizione approssimativa delle stazioni che esploreremo.

Figura 1. Mappa di Vancouver con stazioni di monitoraggio dell'aria. Autore: mappa personalizzata creata su Google Maps.

Il dataset proviene dal Catalogo dei dati della Columbia Britannica, e come dichiarato dal pubblicatore, non è stato sottoposto a controllo di qualità [5]. Per la versione che vedrete qui, ho effettuato una preprocessamento per risolvere alcuni problemi minori, come l’assegnazione di misurazioni negative (solo 6 su 57k osservazioni) come valori mancanti e la generazione di un DataFrame principale con le stazioni da noi scelte.

Librerie e Dipendenze

Utilizzeremo Python 3.9 e le librerie di disegno Matplotlib e Seaborn per le nostre visualizzazioni. Per i test statistici e l’esplorazione dei dati, lavoreremo con il modulo Python statsmodels e la libreria SciPy. Tutte le nostre manipolazioni dei dati e le attività ausiliarie saranno gestite con Pandas e Numpy.

Questi pacchetti sono nativamente disponibili in popolari distribuzioni di Python e notebook ospitati, come Anaconda e Miniconda, Google Collab o Kaggle Notebooks. Quindi ogni esempio di codice qui dovrebbe essere facilmente riproducibile nel tuo ambiente di scelta.

Iniziare

Iniziando con l’importazione delle nostre librerie, chiameremo matplotlib.dates.mdates e il modulo datetime per aiutarci a lavorare con il nostro indice DateTime. Per generare visualizzazioni coerenti, mi piace anche iniziare definendo i nostri stili di trama e la palette di colori. Quindi iniziamo con.

Figura 2. Palette di colori Seaborn “mako”. Immagine dell'autore.

Dopo aver letto il file .csv, definiremo il timestamp DATE_PS come un oggetto NumPy datetime64 e lo imposteremo come indice del nostro DataFrame. Questo passaggio comune abiliterà alcune funzionalità delle serie temporali di Pandas, come quella utilizzata di seguito per creare le caratteristiche delle parti di data nel nostro dataset.

Figura 3. Segmento del DataFrame principale con caratteristiche delle parti di data. Immagine dell'autore.

Il Quadro Generale

Ecco una visione completa di dove andremo a tuffarci, ovvero dove dedicheremo un po’ di tempo per avere una prima idea dei nostri dati.

Per questa visualizzazione, useremo grafici relazionali di Seaborn che leggeranno da una versione lunga aggregata del nostro DataFrame. A tal fine, utilizzeremo i metodi melt e resample di Pandas con una media aggregata in intervalli di 24 ore. Ciò ridurrà la granularità dei nostri dati dalle misurazioni orarie medie giornaliere e verrà fatto per ridurre il tempo necessario per generare il grafico.

Figura 4. Grafico della serie temporale PM 2.5 delle stazioni di monitoraggio. Immagine dell'autore.

Con una visione chiara di tutte e quattro le stazioni lungo l’intero periodo della nostra serie temporale, è già possibile iniziare a prendere alcune note:

  • Ci sono delle anomalie significative, e sembrano essere prevalenti durante l’estate e l’inizio dell’autunno.
  • Queste anomalie sembrano essere il risultato di eventi su larga scala, in quanto interessano approssimativamente tutte e quattro le stazioni nello stesso periodo.
  • Se osservi attentamente, ho incluso un grafico a dispersione grigio sbiadito di tutte le stazioni all’interno di ogni grafico. Con questo dettaglio sottile, è possibile vedere che l’anomalia presente nel 2017, ad esempio, ha avuto un effetto maggiore su entrambe le stazioni di North Vancouver (hanno raggiunto valori più alti di PM 2.5), mentre il contrario è vero per l’evento del 2018. Questa tecnica garantisce anche che tutti e quattro i grafici a linea siano all’interno dello stesso intervallo dell’asse Y.

Alcune buone pratiche che puoi trarre da questo primo grafico:

  • Matplotlib permette di personalizzare molto i locator e i formatter degli assi. In questo esempio, ho utilizzato un MonthLocator dal modulo mdates per creare locator minori mensili sull’asse X, che aiutano la leggibilità complessiva.
  • La data esatta prevista dal nostro grafico viene inserita nel titolo o nel sottotitolo del grafico. “Prevista” perché la nostra visualizzazione potrebbe essere troncata a causa di valori mancanti su entrambi i lati del periodo plottato, e questa pratica può aiutare ad identificare tali problemi. È anche una buona pratica di documentazione per riportare le tue scoperte.

Ottimo inizio, ma restringiamo un po’ la nostra visione. Nella prossima sezione, daremo un’occhiata a periodi di tempo più brevi, ma mantenendo la nostra granularità originale oraria.

Una Visione Dettagliata

D’ora in poi, inizieremo a definire alcune funzioni che possiamo chiamare rapidamente per generare visualizzazioni personalizzate. Puoi pensarlo come un modo per creare un set di strumenti analitici che saranno estremamente utili in avanti.

Questa prima funzione ci aiuterà a osservare singole serie temporali all’interno di un periodo specifico. Inizieremo osservando l’anno 2017 per la stazione di North Vancouver Mahon Park.

Figura 5. Grafico PM 2.5 di North Vancouver Mahon Park per il 2017. Immagine dell'autore.

Possiamo vedere qui che ci sono picchi più piccoli localizzati oltre alle principali anomalie. Ci sono stati anche periodi di maggiore volatilità (dove la varianza aumenta durante un breve periodo) all’inizio dell’anno e nel dicembre 2017.

Approfondiamo un po’ e guardiamo al di fuori dell’intervallo delle anomalie in modo da poter analizzare i nostri valori in un intervallo più stretto nell’asse Y.

Figura 6. Grafico PM 2.5 di North Vancouver Mahon Park per il 15 aprile al 1º luglio 2017. Immagine dell'autore.

Possiamo notare qui alcune valori mancanti. Il parametro fill=True della nostra funzione aiuta ad identificarli ed è un buon modo per dare enfasi visiva alle mancanze nei nostri dati. Quei piccoli intervalli che all’inizio sono difficili da notare ora sono chiaramente visibili.

Un altro dettaglio che potresti aver notato è il formato data personalizzato dell’asse X. Per il grafico sopra, ho arricchito la nostra funzione plot_sequence() con locator e formatter personalizzati per locator principali e minori. Questa nuova funzionalità adatta il nostro grafico all’intervallo temporale della visualizzazione e formatta l’asse X di conseguenza. Qui di seguito è riportato il frammento di codice che è stato incluso nella funzione.

Ora sappiamo che il nostro dataset ha delle interruzioni, quindi diamo un’occhiata più dettagliata a questo problema.

Valori Mancanti

Per i problemi di dati tabulari, in questa sezione saremmo probabilmente concentrati nel definire MAR (Missing At Random) da MNAR (Missing Not At Random). Tuttavia, conoscendo la natura dei nostri dati (misure temporali sensoriali), sappiamo che le interruzioni nel flusso dei dati probabilmente non sono intenzionali. Pertanto, in questi casi è più importante distinguere i valori mancanti isolati da quelli mancanti in modo continuo e i valori mancanti dai campioni completamente mancanti. Le possibilità qui sono vaste, quindi dedicherò un articolo solo a questo aspetto in futuro.

Per ora, cominciamo guardando una heatmap dei valori mancanti. Creeremo nuovamente una funzione per questo.

Figura 7. Heatmap dei valori mancanti. Immagine dell'autore.

Le heatmaps sono ottime perché ci consentono di quantificare la mancanza di dati e localizzarla nell’asse temporale. Da qui, possiamo osservare:

  • Non abbiamo campioni completamente mancanti (in cui i valori mancanti si verificano contemporaneamente per un periodo di tempo). Questo è prevedibile poiché i dati in streaming dalle stazioni di monitoraggio si verificano in modo indipendente.
  • Ci sono lunghe sequenze di valori mancanti all’inizio della nostra linea temporale e la disponibilità dei dati sembra migliorare con il passare del tempo.

Alcune analisi statistiche nelle sezioni successive potrebbero essere problematiche con i valori mancanti. Pertanto, useremo tecniche semplici per trattarli come meglio riteniamo, ad esempio:

  • I metodi Pandas ffill() e bfill(). Vengono utilizzati per riempire in avanti o all’indietro, rispettivamente, il valore più vicino disponibile.
  • L’interpolazione lineare o spline con il metodo Pandas interpolate(). Utilizza le osservazioni vicine per tracciare una curva per riempire un intervallo mancante.

Intermittenza

Dalla natura dei nostri dati, non dovremmo aspettarci valori negativi. Come accennato all’inizio, li ho trattati come mancanti durante la fase di pre-elaborazione dei dati. Chiamiamo le nostre statistiche di riepilogo per confermare ciò.

Figura 8. Statistiche di riepilogo. Immagine dell'autore.

Vediamo che le misurazioni minime sono zero per ogni stazione, il che ci porta alla domanda successiva. Il nostro serie temporale è intermittente?

L’intermittenza è caratterizzata quando i tuoi dati presentano un gran numero di valori esattamente zero. Questo comportamento presenta sfide specifiche e deve essere preso in considerazione durante la selezione del modello. Quindi, con quale frequenza vediamo valori zero nei nostri dati?

Figura 9. Conteggio dei valori zero. Immagine dell'autore.

Possiamo vedere che la quantità di zeri è trascurabile, quindi non abbiamo una serie intermittente. Questo è un controllo semplice ma cruciale, specialmente se il tuo obiettivo è fare previsioni. Potrebbe essere difficile per alcuni modelli prevedere un valore zero assoluto e questo potrebbe essere un problema se vuoi prevedere la domanda, ad esempio. Non vorresti pianificare la consegna di, diciamo, tre prodotti al tuo cliente se, in realtà, lui non si aspetta niente.

Stagionalità

Comprendere i cicli nel tuo serie temporale è fondamentale per pianificare la fase di modellazione. Potresti perdere informazioni chiave di cicli più piccoli se decidi di aggregare troppo i tuoi dati, oppure può aiutarti a determinare la fattibilità della previsione su una granularità più piccola.

Utilizzeremo alcuni box plots per iniziare a esplorare questo aspetto. Ma prima, rimuoveremo temporaneamente il 5% superiore in modo da poter osservare i dati su una scala migliore.

In questa prossima funzione, utilizzeremo una serie di boxplot per indagare i cicli all’interno dei nostri dati. Mappiamo anche la nostra palette di colori ai valori mediani per renderla un altro suggerimento visivo interessante.

Figura 10. Valori orari di PM 2.5. Immagine dell'autore.

Questo primo grafico restituisce le misurazioni orarie. Qui possiamo vedere:

  • Valori consistentemente più alti per PM 2.5 dalle 9:00 alle 14:00.
  • Le stazioni al di fuori di North Vancouver mostrano anche un picco dalle 20:00 alle 22:00.
  • Le prime ore del mattino hanno i valori più bassi per PM 2.5 dalle 2:00 alle 5:00.

Ora guardando la stagionalità settimanale e la differenza nei valori nel corso della settimana.

Figura 11. Valori giornalieri di PM 2.5. Immagine dell'autore.

Da qui vediamo:

  • Valori più bassi di PM 2.5 durante i fine settimana.
  • Una tendenza leggermente più alta per i livelli di inquinamento nei martedì.

E infine, guardando la tendenza mese per mese.

Figura 12. Valori mensili di PM 2.5. Immagine dell'autore.

Dove possiamo osservare:

  • Valori costantemente più alti di PM 2.5 ad agosto per tutti gli anni.
  • Le stazioni meridionali hanno valori più bassi di PM 2.5 a giugno e luglio, mentre quelle di North Vancouver mostrano misurazioni più basse a gennaio.

Infine, altri buoni metodi da questi grafici:

  • Non utilizzare ingenuamente la tua palette di colori, potrebbero confondere le interpretazioni. Se avessimo semplicemente passato pallette="mako" ai nostri boxplot, sarebbe stato mappato sul nostro asse X e non sulla nostra variabile di interesse.
  • I grafici a griglia sono potenti contenitori di informazioni per dati a bassa dimensionalità, e possono essere rapidamente impostati con Seaborn relplot() o Matplotlib subplots().
  • Puoi utilizzare il parametro order del Seaborn boxplot() per riordinare il tuo asse X di conseguenza. L’ho usato per riorganizzare le etichette X dei giorni della settimana in un ordine significativo.

Una visione più approfondita delle stagionalità può essere ottenuta da una decomposizione tendenza-stagione dalla nostra serie storica. Questo, tuttavia, sarà lasciato per un futuro articolo in cui possiamo approfondire la somiglianza delle serie storiche e la selezione del modello. Se questo è un argomento che ti interessa, assicurati di seguirmi qui su VoAGI per ricevere le mie future pubblicazioni.

Per il momento, proviamo una rapida occhiata ad uno dei nostri noti coefficienti statistici per indagare la relazione lineare tra le nostre quattro stazioni.

Correlazione di Pearson

I programmatori di R potrebbero essere familiari con il seguente grafico. Un correlogramma è una visualizzazione concisa ed estremamente informativa che viene implementata in diverse librerie R, come ad esempio ggpairs() nel pacchetto GGally. La diagonale superiore di un correlogramma ci mostra le correlazioni bivariate o i coefficienti di correlazione di Pearson tra variabili numeriche nei nostri dati. Nella diagonale inferiore, vediamo dei grafici a dispersione con curve di regressione adattate ai nostri dati. Infine, nella diagonale principale, abbiamo istogrammi e una curva di densità di ogni variabile.

Il codice seguente è un’implementazione adattata che utilizza il grafico PairGrid() Seaborn e un’altra funzione per il nostro set di strumenti analitici.

Figura 13. Correlogram di PM 2.5 su tutte e quattro le stazioni. Immagine dell'autore.

Come previsto, le nostre stazioni sono altamente correlate, specialmente quelle più vicine tra loro, come entrambe a North Vancouver.

È importante notare che, per ridurre i tempi di calcolo, i nostri dati sono stati aggregati in periodi di 6 ore. Se sperimenti questo grafico con periodi di aggregazione più ampi, vedrai un aumento dei coefficienti di correlazione, poiché le aggregazioni medie tendono ad appiattire gli outlier presenti nei dati.

Se hai già familiarità con l’analisi delle serie temporali, potresti ora pensare ad altri tipi di correlazione che vale la pena controllare. Ma prima, dobbiamo testare le nostre serie temporali per la stazionarietà.

Stazionarietà

Una serie temporale stazionaria è una serie le cui proprietà statistiche non cambiano nel tempo. In altre parole, ha una media, una varianza e un’autocorrelazione costante indipendenti dal tempo [4].

Diversi modelli di previsione si basano sulla stazionarietà delle serie temporali, quindi l’importanza di testarla in questa fase esplorativa. La nostra prossima funzione farà uso dell’implementazione di statsmodels di due test comunemente utilizzati per la stazionarietà, il test Augmented Dickey-Fuller (“ADF”) e il test Kwiatkowski-Phillips-Schmidt-Shin (“KPSS”).

Lascio di seguito le ipotesi di entrambi i test. Nota che hanno ipotesi nulle opposte, quindi creeremo una colonna “Decisione” per un’interpretazione facile dei risultati. Puoi leggere ulteriori informazioni su entrambi i test nella documentazione di statsmodels.

Test Augmented Dickey-Fuller (ADF) ipotesi:

H0: Una radice unitaria è presente nel campione della serie temporale (Non stazionaria)

Ha: Non è presente una radice unitaria nel campione della serie temporale (Stazionaria)

Test Kwiatkowski-Phillips-Schmidt-Shin (KPSS) ipotesi:

H0: I dati sono stazionari attorno a una costante (Stazionaria)

Ha: Una radice unitaria è presente nel campione della serie temporale (Non stazionaria)

Ora una domanda opportuna da fare è su quale scala dovremmo controllare la stazionarietà. La risposta dipenderà molto da come modellerai i tuoi dati, e uno dei obiettivi di un’analisi esplorativa completa è proprio aiutarti con quella decisione.

A scopo illustrativo, nell’esempio seguente, daremo un’occhiata ai mesi di gennaio 2016 e gennaio 2022 per la stazione dell’Aeroporto Internazionale di Vancouver e vedremo se c’è stato un cambiamento di comportamento dal 2016 al 2022 nei dati.

Potresti ricordare dalla nostra sezione sui valori mancanti che possiamo utilizzare i metodi Pandas ffill(), bfill() e interpolate() per imputare rapidamente interruzioni nella serie. Puoi vedere che ho definito un argomento dedicato fillna alla nostra funzione per selezionare uno di questi metodi per lavorare rapidamente sui valori mancanti, poiché entrambi i test accettano solo campioni completi.

Ora tornando ai nostri risultati.

Figura 14. Risultati del test di stazionarietà ADF e KPSS per gennaio 2016. Immagine dell'autore.
Figura 15. Risultati dei test di stazionarietà ADF e KPSS per gennaio 2022. Immagine dell'autore.

Possiamo vedere che nel 2016 entrambi i test hanno indicato la non stazionarietà, ma per il 2022 i risultati sono divergenti. La documentazione di statsmodels elenca chiaramente le interpretazioni dei risultati quando i test ADF e KPSS vengono eseguiti insieme [6]:

Caso 1: Entrambi i test concludono che la serie non è stazionaria — La serie non è stazionaria

• Caso 2: Entrambi i test concludono che la serie è stazionaria — La serie è stazionaria

• Caso 3: KPSS indica stazionarietà e ADF indica non stazionarietà — La serie è stazionaria di tendenza. La tendenza deve essere rimossa per rendere la serie strettamente stazionaria. La serie senza tendenza viene controllata per la stazionarietà.

• Caso 4: KPSS indica non stazionarietà e ADF indica stazionarietà — La serie è stazionaria differenziata. La differenziazione deve essere utilizzata per rendere la serie stazionaria. La serie differenziata viene controllata per la stazionarietà.

Se si ripete questa operazione per tutte e quattro le stazioni in diversi mesi, si può vedere che il caso 4 è predominante nei dati. Ciò ci porta alla nostra prossima sezione sull’ordinamento differenziale di primo ordine per rendere i nostri dati stazionari.

Ordinamento Differenziale di Primo Ordine

Come una delle tecniche di trasformazione più comuni, l’applicazione di ordinamento differenziale di primo o secondo ordine a una serie temporale è ampiamente utilizzata per rendere i dati adatti a modelli statistici che possono essere utilizzati solo su serie storiche stazionarie. Qui daremo uno sguardo alla tecnica applicata a uno degli esempi precedenti nel mese di gennaio 2016. Ma prima, diamo un’occhiata ai dati originali prima della trasformazione con la nostra funzione plot_sequence().

Figura 16. Grafico PM 2.5 dell'Aeroporto Internazionale di Vancouver per gennaio 2016. Immagine dell'autore.

Possiamo vedere che la varianza nel periodo cambia significativamente dall’inizio alla fine del mese. La media di PM 2.5 sembra anche passare da un valore più alto a uno più basso e stabile. Queste sono alcune delle caratteristiche che confermano la non stazionarietà della serie.

Anche in questo caso, Pandas ha un metodo piuttosto conveniente per differenziare i nostri dati. Chiameremo .diff() il nostro DataFrame e lo istanzieremo come una versione differenziata di primo ordine dei nostri dati. Quindi facciamo di nuovo il grafico dello stesso periodo.

Figura 17. Grafico PM 2.5 differenziato dell'Aeroporto Internazionale di Vancouver per gennaio 2016. Immagine dell'autore.

Oltre alla varianza ancora oscillante, i dati sono ora chiaramente più stabili intorno a un valore medio. Possiamo ancora una volta chiamare la nostra funzione stationarity_test() per verificare la stazionarietà dei dati differenziati.

Figura 18. Risultati dei test di stazionarietà ADF e KPSS per i dati differenziati. Immagine dell'autore.

Eccolo qui. Possiamo mettere un altro segno sulla nostra completa analisi esplorativa delle serie temporali, poiché abbiamo ora confermato che:

  • Stiamo affrontando serie temporali non stazionarie.
  • La differenza di ordine uno è una tecnica di trasformazione appropriata per renderla stazionaria.

E questo ci porta infine alla nostra ultima sezione.

Autocorrelazione

Una volta che i nostri dati sono stazionari, possiamo indagare su altre importanti caratteristiche delle serie temporali: autocorrelazione parziale e autocorrelazione. In termini formali:

La funzione di autocorrelazione (ACF) misura la relazione lineare tra i valori ritardati di una serie temporale. In altre parole, misura la correlazione della serie temporale con se stessa. [2]

La funzione di autocorrelazione parziale (PACF) misura la correlazione tra i valori ritardati in una serie temporale quando rimuoviamo l’influenza dei valori ritardati correlati tra loro. Questi sono noti come variabili di confondimento. [3]

Entrambe le metriche possono essere visualizzate con grafici statistici noti come correlogrammi. Ma prima è importante sviluppare una migliore comprensione di esse.

Dato che questo articolo si concentra sull’analisi esplorativa e questi concetti sono fondamentali per i modelli di previsione statistica, terrò l’esplicazione breve, ma tieni presente che sono idee molto importanti per costruire una solida intuizione quando si lavora con serie temporali. Per una lettura completa, consiglio il fantastico kernel “Serie temporali: interpretazione di ACF e PACF” del Kaggle Notebooks Grandmaster Leonie Monigatti.

Come detto sopra, l’autocorrelazione misura come la serie temporale è correlata con sé stessa su ritardi precedenti q. Puoi pensarlo come una misura della relazione lineare di un sottoinsieme dei tuoi dati con una copia di se stesso spostata indietro di q periodi. L’autocorrelazione, o ACF, è una metrica importante per determinare l’ordine q dei modelli di media mobile (MA).

D’altra parte, l’autocorrelazione parziale è la correlazione della serie temporale con la sua versione ritardata p, ma ora riguarda esclusivamente i suoi effetti diretti. Ad esempio, se voglio verificare l’autocorrelazione parziale del periodo di tempo t-3 a t-1 con il mio valore corrente t0, non mi interesserà come t-3 influenza t-2 e t-1 o come t-2 influenza t-1. Sarò concentrato esclusivamente sugli effetti diretti di t-3, t-2 e t-1 sul mio timestamp corrente, t0. L’autocorrelazione parziale, o PACF, è una metrica importante per determinare l’ordine p dei modelli autoregressivi (AR).

Una volta chiariti questi concetti, possiamo tornare ai nostri dati. Poiché le due metriche vengono spesso analizzate insieme, la nostra ultima funzione combinerà i grafici PACF e ACF in un’unica griglia che restituirà correlogrammi per più variabili. Utilizzerà le funzioni plot_pacf() e plot_acf() di statsmodels e le mapperaà a una griglia Matplotlib subplots().

Nota come entrambe le funzioni di statsmodels utilizzano gli stessi argomenti, ad eccezione del parametro method che è esclusivo del grafico plot_pacf().

Ora puoi sperimentare con diverse aggregazioni dei tuoi dati, ma ricorda che quando campioniamo nuovamente la serie temporale, ogni ritardo rappresenta un diverso salto indietro nel tempo. A scopo illustrativo, analizziamo il PACF e l’ACF per tutte e quattro le stazioni nel mese di gennaio 2016, con un dataset aggregato ogni 6 ore.

Figure 19. PACF and ACF Correlograms for Jan 2016. Image by the author.

I correlogrammi restituiscono i coefficienti di correlazione che vanno da -1,0 a 1,0 e un’area ombreggiata che indica la soglia di significatività. Qualsiasi valore che si estenda oltre quella soglia dovrebbe essere considerato statisticamente significativo.

Dai risultati sopra, possiamo finalmente concludere che su un’aggregazione di 6 ore:

  • I ritardi 1, 2, 3 (t-6h, t-12h e t-18h) e talvolta 4 (t-24h) hanno un PACF significativo.
  • I ritardi 1 e 4 (t-6h e t-24h) mostrano un ACF significativo per la maggior parte dei casi.

E prendi nota di alcune buone pratiche finali:

  • Evitare di tracciare correlogrammi per lunghi periodi di serie temporali con una grande granularità (ad esempio, tracciare un correlogramma di un intero anno per un set di dati con misurazioni orarie), poiché la soglia di significatività si riduce a zero con campioni sempre più grandi.
  • Ho definito un parametro x_label alla nostra funzione per facilitare l’annotazione dell’asse X con il periodo di tempo rappresentato da ogni ritardo. È comune vedere correlogrammi senza queste informazioni, ma avere un facile accesso ad esse può evitare interpretazioni erronee dei risultati.
  • I valori predefiniti di plot_acf() e plot_pacf() di Statsmodels sono impostati per includere il coefficiente di correlazione a 0-lag nel grafico. Poiché la correlazione di un numero con se stesso è sempre uno, ho impostato i nostri grafici per iniziare dal primo ritardo con il parametro zero=False. Migliora anche la scala dell’asse Y, rendendo più leggibili i ritardi che effettivamente dobbiamo analizzare.

In questo modo, abbiamo esplorato approfonditamente la nostra serie temporale. Con un set di strumenti di visualizzazione e funzioni analitiche, abbiamo potuto trarre una comprensione completa dei nostri dati. Hai anche imparato alcune delle migliori pratiche per esplorare set di dati di serie temporali e come presentarli in modo conciso e raffinato con grafici di alta qualità.

Ti è piaciuta questa storia?

Puoi seguirmi qui su VoAGI per ulteriori articoli sulla scienza dei dati, l’apprendimento automatico, la visualizzazione e l’analisi dei dati.

Puoi trovarmi anche su LinkedIn, dove condivido versioni più brevi di questi contenuti.

Riferimenti

[1] “Department of Health — Fine Particles (PM 2.5) Questions and Answers.” Consultato il 14 ottobre 2022. https://www.health.ny.gov/environmental/indoors/air/pmq_a.htm.

[2] Peixeiro, Marco. “3. Going on a Random Walk.” Saggio. In Time Series Forecasting in Python, 30–58. O’Reilly Media, 2022.

[3] Peixeiro, Marco. “5. Modeling an Autoregressive Process.” Saggio. In Time Series Forecasting in Python, 81–100. O’Reilly Media, 2022.

[4] Peixeiro, Marco. “8. Accounting for Seasonality.” Saggio. In Time Series Forecasting in Python, 156–79. O’Reilly Media, 2022.

[5] Services, Ministry of Citizens’. “The BC Data Catalogue.” Province of British Columbia. Province of British Columbia, 2 febbraio 2022. https://www2.gov.bc.ca/gov/content/data/bc-data-catalogue.

[6] “Stationarity and Detrending (ADF/KPSS).” statsmodels. Consultato il 17 ottobre 2022. https://www.statsmodels.org/dev/examples/notebooks/generated/stationarity_detrending_adf_kpss.html.