Indossa il tuo comodo lo-fi, prendi un maglione oversize, la tua bevanda calda preferita e pitoniamo.
È di nuovo quel momento nell’emisfero settentrionale: tempo di mele, zucche e varie configurazioni di cannella, noce moscata, zenzero, pimento e chiodi di garofano. E mentre le isole dei supermercati iniziano a prepararsi per Halloween, il Ringraziamento e le vacanze invernali, è un ottimo momento per rispolverare le mie capacità di modellazione statistica. Tieniti stretto il tuo latte stagionato e facciamo un po’ di modellistica stagionale orientata alla funzione. Il taccuino completo del codice può essere trovato qui.
Ipotesi:
La popolarità di Pumpkin Spice come termine cercato su Google negli Stati Uniti avrà una forte stagionalità poiché è associato alle vacanze autunnali americane e ai piatti stagionali.
Ipotesi nulla:
L’utilizzo dei dati della settimana scorsa o dell’anno scorso sarà più predittivo del livello di popolarità di questa settimana per il termine di ricerca “spezia di zucca”.
Dati:
Dati degli ultimi 5 anni di Google Trends, estratti il 7 ottobre 2023. (1)
- Crea un modello ingenuo in cui i dati della settimana scorsa/dell’anno scorso corrispondono alla previsione di questa settimana. Nello specifico, non è sufficiente che il mio modello finale sia accurato o impreciso nel vuoto. Il mio modello finale deve avere prestazioni migliori utilizzando i dati storici come previsione diretta.
- La suddivisione del test del treno mi fornirà due serie di dati, una da cui l’algoritmo potrà imparare. L’altro è per me testare il rendimento del mio algoritmo.
- La scomposizione stagionale mi darà un’idea approssimativa di quanto siano prevedibili i miei dati cercando di separare la tendenza generale annuale dagli schemi stagionali e dal rumore. Una scala di rumore più piccola implica che una maggiore quantità di dati può essere catturata in un algoritmo.
- Una serie di test statistici per determinare se i dati sono stazionari. Se i dati non sono stazionari, dovrò prendere una prima differenza (eseguire una funzione delta tempo in cui i dati di ciascun intervallo di tempo mostrano solo la differenza rispetto ai dati dell’intervallo di tempo precedente. Ciò costringerà i dati a diventare stazionari.)
- Realizza alcuni modelli SARIMA, utilizzando le inferenze dai grafici di autocorrelazione per il termine della media mobile e le inferenze dai grafici di autocorrelazione parziale per il termine autoregressivo. SARIMA è un punto di riferimento per la modellazione di serie temporali e proverò l’inferenza ACF e PACF prima di provare un approccio di forza bruta con Auto Arima.
- Prova a utilizzare Auto Arima, che eseguirà l’iterazione di molti termini e selezionerà la migliore combinazione di termini. Voglio sperimentare per sapere se i parametri che mi fornisce per un modello SARIMA producono un modello con prestazioni migliori.
- Prova i modelli ETS, deducendo dalla scomposizione stagionale se x è additivo o moltiplicativo nel tempo. I modelli ETS si concentrano maggiormente sulla stagionalità e sulla tendenza generale rispetto ai modelli della famiglia SARIMA e potrebbero darmi un vantaggio nel catturare la relazione che le spezie di zucca hanno con il tempo.
KPI di tracciamento delle prestazioni:
- Prova a utilizzare il punteggio MAPE perché è uno standard di settore in molti luoghi di lavoro e le persone potrebbero esserci abituate. È facile da capire.
- Prova a utilizzare il punteggio RMSE perché è più utile.
- Traccia le previsioni rispetto ai dati del test e controlla visivamente le prestazioni.
Come possiamo vedere dal grafico sopra, questi dati mostrano un forte potenziale per la modellazione stagionale. C’è un chiaro picco nella seconda metà di ogni anno, con una riduzione e un altro picco prima di scendere al nostro livello di base.
Tuttavia, il picco primario di ogni anno è maggiore ogni anno oltre al 2021, il che ha senso, data la pandemia, quando le persone potrebbero non avere in mente di celebrare la stagione.
Nota: queste importazioni appaiono in modo diverso nel notebook stesso rispetto al notebook su cui faccio affidamento seasonal_mod.py
che contiene molte delle mie importazioni.
Queste sono le librerie che ho usato per creare il taccuino del codice. Ho scelto statsmodels invece di scikit-learn per i loro pacchetti di serie temporali, mi piacciono di più statsmodels per la maggior parte dei problemi di regressione lineare.
Non so voi ma io non voglio scrivere diverse righe di codice ogni volta che creo un nuovo modello e poi altro codice da verificare. Quindi ho creato alcune funzioni per mantenere il mio codice DRY ed evitare di commettere errori.
Queste tre piccole funzioni lavorano insieme, quindi devo solo eseguire 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. Ciò mi farà risparmiare tempo e fatica.
Utilizzare i dati dell’anno scorso come punto di riferimento per il successo:
La mia esperienza nella gestione della vendita al dettaglio ha informato la mia decisione di provare i dati della settimana scorsa e quelli dell’anno scorso come previsione diretta per i dati di quest’anno. Spesso nella vendita al dettaglio, abbiamo utilizzato i dati della scorsa stagione (1 unità di tempo fa) come previsione diretta, ad esempio per garantire l’inventario durante il Black Friday. I dati della scorsa settimana non hanno avuto lo stesso rendimento di quelli dell’anno scorso.
I dati della settimana scorsa per prevedere i dati di questa settimana hanno mostrato un punteggio MAPE di poco superiore a 18, con un RMSE di circa 11. In confronto, i dati dello scorso anno come previsione diretta dei dati di quest’anno hanno mostrato un punteggio MAPE di appena circa 12 con un RMSE di circa 7.
Pertanto ho scelto di confrontare tutti i modelli statistici che ho costruito con un modello ingenuo utilizzando i dati dell’anno scorso. Questo modello ha individuato i tempi dei picchi e delle diminuzioni in modo più accurato rispetto al nostro ingenuo modello settimanale, tuttavia, pensavo comunque di poter fare di meglio. Il passo successivo nella modellazione è stato eseguire una scomposizione stagionale.
La seguente funzione mi ha aiutato a eseguire la scomposizione della stagione e la terrò come codice riutilizzabile per tutta la modellazione futura da qui in poi.
Di seguito viene mostrato come ho utilizzato la scomposizione stagionale.
Il modello additivo aveva uno schema annuale ricorrente nei residui, prova che un modello additivo non era in grado di scomporre completamente tutti gli schemi ricorrenti. È stata una buona ragione per provare un modello moltiplicativo per i picchi annuali.
Ora i residui della decomposizione moltiplicativa erano molto più promettenti. Erano molto più casuali e su scala molto più piccola, dimostrando che un modello moltiplicativo avrebbe catturato meglio i dati. Il fatto che i residui fossero così piccoli, su una scala compresa tra 1,5 e -1, significava che c’erano molte promesse nella modellizzazione.
Ma ora volevo una funzione per eseguire specificamente i modelli SARIMA, inserendo solo l’ordine. Volevo sperimentare la corsa c
,t
E ct
versioni del modello SARIMA anche con quegli ordini poiché la scomposizione stagionale ha favorito un modello di tipo moltiplicativo rispetto a un modello di tipo additivo. Usando il c
, t
E ct
nel trend =
parametro, ho potuto aggiungere moltiplicatori al mio modello SARIMA.
Tralascerò la descrizione della parte in cui ho esaminato i grafici AFC e PACF e la parte in cui ho anche provato PMD auto arima per trovare i termini migliori da utilizzare nei modelli SARIMA. Se sei interessato a questi dettagli, consulta il mio taccuino di codice completo.
Il mio miglior modello SARIMA:
Quindi il mio miglior modello SARIMA aveva un punteggio MAPE più alto rispetto al mio modello ingenuo, da quasi 29 a quasi 12, ma un RMSE inferiore di circa un’unità, da quasi 7 a quasi 6. Il mio problema più grande con l’utilizzo di questo modello è che ha davvero sottostimato il picco del 2023 , c’è una discreta quantità di area tra le linee rossa e blu da agosto a settembre del 2023. Ci sono motivi per apprezzarlo meglio del mio modello ingenuo annuale o peggio del mio modello ingenuo annuale, a seconda delle tue opinioni su RMSE vs MAPE. Tuttavia, non avevo ancora finito. Il mio modello finale era decisamente migliore del mio modello ingenuo annuale.
Ho utilizzato un modello ETS (smussamento esponenziale) per il mio modello finale, che mi ha permesso di utilizzare esplicitamente il file seasonal
parametro per far sì che utilizzi un approccio moltiplicativo.
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 uno scambio più che equo considerando che ora ho un RMSE di circa 4 e mezzo invece di 7. Sebbene questo modello abbia difficoltà un po’ di più nel dicembre del 2022 rispetto al mio miglior modello SARIMA, è inferiore di un’area importo per quel picco rispetto al picco più grande per l’autunno del 2023, a cui tengo di più. Puoi trovare quel modello qui.
Aspetterò fino al 7/10/2024 ed effettuerò un altro estrazione dei dati e vedrò come si è comportato il modello rispetto ai dati dell’anno scorso.
Per riassumere, sono stato in grado di confutare l’ipotesi nulla, il mio modello finale ha sovraperformato un ingenuo modello annuale. Ho dimostrato che la popolarità delle spezie di zucca su Google è molto stagionale e può essere prevista. Tra i modelli ingenui, SARMA e ETS, ETS è stato in grado di catturare meglio la relazione tra il tempo e la popolarità delle spezie di zucca. La relazione moltiplicativa tra la spezia di zucca e il tempo implica che la popolarità della spezia di zucca si basa su più di una variabile indipendente oltre al tempo nell’espressione time * unknown_independant_var = pumpkin_spice_popularity
.
Cosa ho imparato e lavoro futuro:
Il mio prossimo passo è utilizzare una versione di API del grafico di Meta per cercare la “spezia di zucca” utilizzata negli articoli commerciali. Mi chiedo quanto saranno correlati questi dati ai miei dati sulle tendenze di Google. Ho anche imparato che quando la scomposizione stagionale punta verso un modello moltiplicativo, raggiungerò un ETS molto prima nel mio processo.
Inoltre, sono interessato ad automatizzare gran parte di questo processo. Idealmente, mi piacerebbe creare un modulo Python in cui l’input è un CSV direttamente da Google Trends e l’output può essere un modello utilizzabile con una documentazione sufficientemente buona da consentire a un utente non tecnico di creare e testare i propri modelli predittivi. Nell’eventualità che un utente scelga dati difficili da prevedere (IE un modello ingenuo o di camminata casuale sarebbe più adatto), spero di creare il modulo per spiegarlo agli utenti. Potrei quindi raccogliere dati da un’app utilizzando quel modulo per mostrare i risultati della stagionalità su molti dati non testati.
Cerca l’app per la stagione delle spezie di zucca del prossimo anno!
(1) Google Trends, N/D (https://www.google.com/trends)
Fonte: towardsdatascience.com