Analisi delle serie temporali di Pumpkin Spice Time

Analisi delle serie temporali del periodo di Pumpkin Spice

Indossa il tuo lo-fi più comodo, prendi un maglione oversize, la tua bevanda calda preferita e pythoniamo.

Foto di Nathan Dumlao su Unsplash

È di nuovo quel momento nell’emisfero settentrionale, un momento per mele, zucche e varie configurazioni di cannella, noce moscata, zenzero, macis e chiodi di garofano. Mentre gli scaffali dei negozi si preparano per Halloween, Ringraziamento e le vacanze invernali, è un ottimo momento per spolverare le mie competenze di modellazione statistica. Tieni stretto il tuo cappuccino stagionale e facciamo un po’ di modellazione stagionale incentrata sulle funzioni. Il quaderno completo del codice può essere trovato qui.

Ipotesi:

La popolarità di Pumpkin Spice come termine di ricerca su Google negli Stati Uniti avrà una forte stagionalità poiché è associata alle festività autunnali americane e ai piatti stagionali.

Ipotesi nulla:

Utilizzare i dati della scorsa settimana o dell’anno scorso sarà più predittivo del livello di popolarità di questa settimana per il termine di ricerca “pumpkin spice”.

Dati:

Ultimi 5 anni di dati da Google Trends, prelevati il 7 ottobre 2023. [1]

Metodo di modellazione iterativa:

  • Crea un modello semplice in cui i dati della scorsa settimana o dell’anno scorso sono la previsione di questa settimana. In particolare, non è sufficiente che il mio modello finale sia accurato o inaccurato nel vuoto. Il mio modello finale deve essere migliore usando i dati storici come previsione diretta.
  • La divisione dei dati di addestramento e di test mi fornirà due set di dati, uno per l’algoritmo da apprendere. L’altro è per testare quanto bene l’algoritmo ha funzionato.
  • La decomposizione stagionale mi darà un’idea approssimativa di quanto prevedibile siano i miei dati cercando di separare la tendenza generale annuale dai modelli stagionali e dal rumore. Una scala minore di rumore implicherà che più dati possano essere catturati in un algoritmo.
  • Una serie di test statistici per determinare se i dati siano stazionari. Se i dati non sono stazionari, dovrò prendere una differenza iniziale (eseguire una funzione delta temporale in cui ogni intervallo di tempo mostra solo la differenza dai dati dell’intervallo di tempo precedente. Ciò costringerà i dati a diventare stazionari.)
  • Crea alcuni modelli SARIMA, utilizzando deduzioni dai grafici di autocorrelazione per il termine di media mobile e deduzioni dai grafici di autocorrelazione parziale per il termine di auto regressione. SARIMA è un’opzione per la modellazione delle serie storiche e proverò l’inferenza da ACF e PACF prima di provare un approccio forzato con Auto Arima.
  • Prova ad usare Auto Arima, che itererà attraverso molti termini e selezionerà la migliore combinazione di termini. Voglio sperimentare per capire se i parametri che mi fornisce per un modello SARIMA producono un modello più performante.
  • Prova i modelli ETS, utilizzando inferenze dalla decomposizione stagionale per stabilire se x è additivo o moltiplicativo nel tempo. I modelli ETS si concentrano più pesantemente sulla stagionalità e sulla tendenza generale rispetto ai modelli della famiglia SARIMA, e potrebbero darmi un vantaggio nella cattura della relazione che pumpkin spice ha con il tempo.

Indicatori di prestazione grafica:

  • Prova ad utilizzare il punteggio MAPE perché è uno standard del settore in molti ambienti di lavoro e le persone possono essere abituate ad esso. È facile da capire.
  • Prova ad utilizzare il punteggio RMSE perché è più utile.
  • Traccia le previsioni contro i dati di test e verifica visivamente le prestazioni.

Visualizzazione dei dati:

Immagine dell'autore.

Come possiamo vedere dal grafico precedente, questi dati mostrano un forte potenziale per la modellizzazione stagionale. C’è un chiaro picco nella seconda metà di ogni anno, con un’attenuazione e un altro picco prima di un calo al nostro valore base.

Tuttavia, il picco principale di ogni anno è più grande ogni anno, tranne il 2021, il che ha senso, dato il periodo pandemico, quando le persone potrebbero non aver avuto in mente di festeggiare la stagione.

Importazioni:

Nota: queste importazioni appaiono in modo diverso nel notebook stesso, poiché nel notebook mi affido a seasonal_mod.py che ha molte delle mie importazioni integrate.

Immagine dell’autore.

Queste sono le librerie che ho usato per creare il notebook di codice. Ho scelto statsmodels invece di scikit-learn per i loro pacchetti di serie temporali, preferisco statsmodels per la maggior parte dei problemi di regressione lineare.

Approccio basato su funzioni per il codice:

Non so voi, ma non voglio scrivere diverse righe di codice ogni volta che creo un nuovo modello e poi ulteriori righe di codice per verificarlo. Quindi invece ho creato alcune funzioni per mantenere il mio codice DRY e impedirmi di commettere errori.

Immagine dell’autore.

Queste tre piccole funzioni lavorano insieme in modo che io abbia bisogno di eseguire solo metrics_graph() con y_true e y_preds come input e mi fornirà una linea blu di dati reali e una linea rossa di dati predittivi, insieme a MAPE e RMSE. Questo mi risparmi tempo e problemi.

Utilizzare i dati dell’anno scorso come riferimento per il successo:

La mia esperienza nella gestione del commercio al dettaglio mi ha suggerito di provare i dati della settimana scorsa e i dati dell’anno scorso come predizione diretta dei dati di quest’anno. Spesso nel commercio al dettaglio, usavamo i dati della scorsa stagione (1 unità di tempo fa) come previsione diretta per garantire le scorte durante il Black Friday, ad esempio. I dati della settimana scorsa non hanno funzionato così bene come i dati dell’anno scorso.

Immagine dell'autore.

I dati della settimana scorsa per prevedere i dati di questa settimana hanno mostrato un punteggio MAPE di poco più del 18, con un RMSE di circa 11. In confronto, i dati dell’anno scorso come previsione diretta per i dati di quest’anno hanno mostrato un punteggio MAPE di circa 12 con un RMSE di circa 7.

Immagine dell'autore.

Pertanto ho scelto di confrontare tutti i modelli statistici che ho costruito con un modello ingenuo che utilizza i dati dell’anno scorso. Questo modello ha ottenuto una previsione più accurata dei picchi e dei cali rispetto al nostro modello settimanale ingenuo, tuttavia ho pensato di poter fare di meglio. Il passo successivo nella modellizzazione è stato fare una decomposizione stagionale.

La seguente funzione mi ha aiutato ad eseguire la mia decomposizione stagionale e la manterò come codice riutilizzabile per tutte le future modellizzazioni in avanti.

Immagine dell’autore.

Di seguito viene mostrato come ho utilizzato quella decomposizione stagionale.

Immagine dell'autore.

Il modello additivo presentava un modello annuale ricorrente nei residui, evidenza che un modello additivo non era in grado di decomporre completamente tutti i modelli ricorrenti. È stata una buona ragione per provare un modello moltiplicativo per i picchi annuali.

Immagine dell'autore.

Ora i residui nella decomposizione moltiplicativa erano molto più promettenti. Erano molto più casuali e su una scala molto più piccola, dimostrando che un modello moltiplicativo avrebbe catturato meglio i dati. I residui così piccoli – su una scala tra 1,5 e -1 – significava che c’era molta promessa nella modellazione.

Ma ora volevo una funzione per eseguire modelli SARIMA specificamente, immettendo solo l’ordine. Volevo sperimentare l’esecuzione delle versioni c, t e ct del modello SARIMA con quegli ordini, poiché la decomposizione stagionale favoriva un tipo di modello moltiplicativo rispetto a un tipo di modello additivo. Utilizzando c, t e ct nel parametro trend =, sono stato in grado di aggiungere moltiplicatori al mio modello SARIMA.

Immagine dell’autore.

Salterò la descrizione della parte in cui ho osservato i grafici AFC e PACF e la parte in cui ho anche provato PMD auto arima per trovare i migliori termini da utilizzare nei modelli SARIMA. Se sei interessato a questi dettagli, consulta il mio blocco note di codice completo.

Il mio miglior modello SARIMA:

Immagine dell'autore.

Quindi il mio miglior modello SARIMA aveva un punteggio MAPE più alto rispetto al mio modello ingenuo, quasi 29 a quasi 12, ma un RMSE più basso di circa un’unità, quasi 7 a quasi 6. Il mio problema principale nell’utilizzare questo modello è che prevedeva molto meno il picco del 2023, c’è una quantità considerevole di area tra le linee rosse e blu da agosto a settembre del 2023. Ci sono ragioni per preferirlo rispetto al mio modello ingenuo annuale o peggio rispetto al mio modello ingenuo annuale, a seconda delle tue opinioni su RMSE vs MAPE. Tuttavia, non ero ancora finito. Il mio modello finale era decisamente migliore del mio modello ingenuo annuale.

Modello finale:

Ho utilizzato un modello ETS (smoothing esponenziale) per il mio modello finale, che mi ha permesso di utilizzare esplicitamente il parametro seasonal per adottare un approccio moltiplicativo.

Immagine dell'autore.

Ora potresti pensare “ma questo modello ha un punteggio MAPE più alto rispetto al modello ingenuo annuale”. E avresti ragione, di circa lo 0,3%. Tuttavia, penso che sia un compromesso più che equo considerando che ora ho un RMSE di circa 4 e mezzo anziché 7. Sebbene questo modello incontri qualche difficoltà in dicembre 2022 rispetto al mio miglior modello SARIMA, si discosta di meno per quel picco rispetto al picco più grande dell’autunno del 2023, che mi interessa di più. Puoi trovare quel modello qui.

Ulteriori validazioni:

Aspetterò fino al 7/10/2024 e farò un’altra estrazione dei dati per vedere come il modello si è comportato rispetto ai dati dell’anno scorso.

Conclusione:

Per riassumere, sono riuscito a confutare l’ipotesi nulla, il mio modello finale ha superato un modello ingenuo annuale. Ho dimostrato che la popolarità della zucca speziata su Google è molto stagionale e può essere prevista. Tra modelli ingenui, modelli SARMA e modelli ETS, ETS è stato in grado di catturare meglio la relazione tra il tempo e la popolarità della zucca speziata. La relazione moltiplicativa della zucca speziata con il tempo implica che la popolarità della zucca speziata si basa su più di una variabile indipendente oltre al tempo nell’espressione time * unknown_independant_var = pumpkin_spice_popularity.

Cosa ho imparato e futuro lavoro:

Il mio prossimo passo è utilizzare una qualche versione del graph API di Meta per cercare “pumpkin spice” utilizzato in articoli aziendali. Mi chiedo quanto correlati saranno quei dati ai miei dati di tendenza di Google. Ho anche imparato che quando la decomposizione stagionale punta verso un modello moltiplicativo, userò un ETS molto prima nel mio processo.

Inoltre, sono interessato ad automatizzare gran parte di questo processo. Idealmente, vorrei creare un modulo Python in cui l’input sia un CSV direttamente da Google Trends e l’output possa essere un modello utilizzabile con una documentazione sufficientemente buona perché un utente non tecnico possa creare e testare i propri modelli di previsione. Nel caso in cui un utente scegliesse dati difficili da prevedere (ad esempio un modello ingenuo o random walk sarebbe più adatto), spero di costruire il modulo per spiegare ciò agli utenti. Potrei quindi raccogliere dati da un’app che utilizza quel modulo per mostrare risultati di stagionalità su molti dati non testati.

Il look per quella app sarà disponibile nella stagione delle zucche aromatiche dell’anno prossimo!

[1] Google Trends, N/D (https://www.google.com/trends)