Come eseguire la previsione in base a dati aggregati su intervalli irregolari?


10

Sto cercando di prevedere le vendite dei prodotti nel distributore automatico. Il problema è che la macchina viene riempita a intervalli irregolari e ad ogni riempimento possiamo solo registrare le vendite aggregate dall'ultimo riempimento della macchina (cioè non abbiamo dati di vendita giornalieri). Quindi sostanzialmente abbiamo dati per le vendite aggregate a intervalli irregolari. Gli intervalli di solito sono tra 2 giorni e 3 settimane. Ecco alcuni dati di esempio per un distributore automatico e un prodotto:

27/02/2012 48
17/02/2012 24
09/02/2012 16
02/02/2012 7
25/01/2012 12
16/01/2012 16
05/01/2012 16
23/12/2011 4
16/12/2011 14
09/12/2011 4
02/12/2011 2

Il nostro attuale algoritmo ingenuo è calcolare le vendite medie giornaliere dividendo la quantità totale venduta negli ultimi 90 giorni per 90.

Hai idea di come migliorare la previsione delle vendite al giorno? Devo prevedere cosa verrà venduto alla prossima visita della macchina. È possibile utilizzare una sorta di algoritmo di livellamento esponenziale data la natura dei nostri dati?

Grazie in anticipo!

AGGIORNAMENTO: Grazie mille per tutte le risposte e i commenti. Vorrei provare a dare un po 'più di contesto (il business case dietro la domanda - ovviamente molto semplificato). Abbiamo centinaia di distributori automatici. Ogni giorno dobbiamo decidere quali 20 di loro visitare per la ricarica. Per fare ciò, stiamo cercando di prevedere quale sia lo stato attuale delle macchine e di selezionare le 20 macchine "più vuote". Per ogni macchina e prodotto stiamo calcolando le vendite medie giornaliere (SPD) utilizzando l'algoritmo ingenuo sopra descritto. Quindi moltiplichiamo l'SPD per il numero di giorni dall'ultimo riempimento della macchina e il risultato è la quantità prevista venduta.


Penso che sia una domanda interessante. La mia risposta alla tua esatta domanda e set di dati è: importa? e: ottenere più dati. Inoltre, penso che sia utile sapere qual è la capacità del distributore automatico.
Adam

@Adam La capacità di questo prodotto è di 50 bottiglie. Forse la mia descrizione del problema non è abbastanza chiara. Proverò a modificarlo un po 'per dare più contesto. Fondamentalmente sto cercando idee su come risolvere il problema generale e sono molto grato per tutti i commenti finora. Il set di dati specifico viene fornito proprio come esempio dell'aspetto dei dati. Per altri distributori automatici posso fornire dati per un periodo molto più lungo.
Ivan Dimitrov

@IvanDimitrov: che cos'è esattamente la colonna due nei tuoi dati?
Kyle Brandt

@KyleBrandt La colonna due è il numero di bottiglie vendute dall'ultima visita al distributore automatico. Quindi il numero 48 nella riga superiore indica che sono state vendute 48 bottiglie tra il 17/02 e il 27/02
Ivan Dimitrov

Risposte:


11

Concentriamoci sul problema aziendale, sviluppiamo una strategia per affrontarlo e iniziamo a implementare tale strategia in modo semplice. Più tardi, può essere migliorato se lo sforzo lo giustifica.

Il problema aziendale è ovviamente quello di massimizzare i profitti. Ciò viene fatto qui bilanciando i costi di ricarica delle macchine con i costi delle vendite perse. Nella sua attuale formulazione, i costi di ricarica delle macchine sono fissi: 20 possono essere ricaricati ogni giorno. Il costo delle vendite perse dipende quindi dalla frequenza con cui le macchine sono vuote.

Un modello statistico concettuale per questo problema può essere ottenuto inventando un modo per stimare i costi per ciascuna delle macchine, sulla base di dati precedenti. L' attesoil costo della mancata manutenzione di una macchina oggi equivale approssimativamente alla probabilità che si sia esaurita moltiplicata per la velocità con cui viene utilizzata. Ad esempio, se una macchina ha una probabilità del 25% di essere vuota oggi e in media vende 4 bottiglie al giorno, il suo costo previsto è pari al 25% * 4 = 1 bottiglia nelle vendite perse. (Traducilo in dollari come vuoi, senza dimenticare che una vendita persa comporta costi immateriali: le persone vedono una macchina vuota, imparano a non fare affidamento su di essa, ecc. Puoi persino regolare questo costo in base alla posizione di una macchina; avendo qualche oscuro le macchine si svuotano per un po 'potrebbero comportare pochi costi immateriali.) È giusto supporre che il riempimento di una macchina ripristinerà immediatamente la perdita prevista a zero - dovrebbe essere raro che una macchina venga svuotata ogni giorno (non lo desideri. ..). Col passare del tempo,

Un semplice modello statistico lungo queste linee propone che le fluttuazioni nell'uso di una macchina appaiano casuali. Questo suggerisce un modello di Poisson . In particolare, possiamo affermare che una macchina ha un tasso di vendita giornaliero sottostante di bottiglie e che il numero venduto durante un periodo di durata giorni ha una distribuzione Poisson con parametro . (Altri modelli possono essere formulati per gestire la possibilità di cluster di vendite; questo suppone che le vendite siano individuali, intermittenti e indipendenti l'una dall'altra.)x θ xθxθx

Nel presente esempio, le durate osservate sono e le vendite corrispondenti erano . Massimizzare la probabilità dà : questa macchina ha venduto circa due bottiglie al giorno. La cronologia dei dati non è abbastanza lunga da suggerire la necessità di un modello più complicato; questa è una descrizione adeguata di ciò che è stato osservato finora.y = ( 4 , 14 , 4 , 16 , 16 , 12 , 7 , 16 , 24 , 48 ) θ = 1,8506x=(7,7,7,13,11,9,8,7,8,10)y=(4,14,4,16,16,12,7,16,24,48)θ^=1.8506

Misura effettiva vs

I punti rossi mostrano la sequenza delle vendite; i punti blu sono stime basate sulla stima della massima probabilità del tasso di vendita tipico.

Armati di un tasso di vendita stimato, possiamo continuare a calcolare la possibilità che una macchina possa essere vuota dopo giorni: è data dalla funzione di distribuzione cumulativa complementare (CCDF) della distribuzione di Poisson, valutata alla capacità della macchina (presunto essere 50 nella figura successiva e negli esempi seguenti). Moltiplicando per il tasso di vendita stimato si ottiene un diagramma della perdita giornaliera prevista delle vendite rispetto al tempo trascorso dall'ultima ricarica:t

Perdita nel tempo

Naturalmente questa curva sta salendo più velocemente vicino al momento a giorni in cui è più probabile che la macchina si esaurisca. Ciò che aggiunge alla nostra comprensione è mostrare che un aumento apprezzabile inizia effettivamente una settimana prima. Altre macchine con altri tassi avranno aumenti più ripidi o meno profondi: saranno utili informazioni.50/1.85=27

Dato un grafico come questo per ogni macchina (di cui sembra che ce ne siano duecento), è possibile identificare facilmente le 20 macchine che attualmente stanno subendo la perdita maggiore prevista: la loro manutenzione è la decisione aziendale ottimale. (Si noti che ogni macchina avrà la propria velocità stimata e si troverà nel suo punto lungo la sua curva, a seconda dell'ultima manutenzione.) Nessuno deve effettivamente guardare questi grafici: identificare le macchine da riparare su questa base è facile automatizzato con un semplice programma o anche con un foglio di calcolo.

Questo è solo l'inizio. Nel tempo, ulteriori dati potrebbero suggerire modifiche a questo semplice modello: potresti tenere conto di fine settimana e festività o di altre influenze anticipate sulle vendite; potrebbe esserci un ciclo settimanale o altri cicli stagionali; potrebbero esserci tendenze a lungo termine da includere nelle previsioni. Potresti voler tenere traccia dei valori periferici che rappresentano esecuzioni una tantum impreviste sulle macchine e incorporare questa possibilità nelle stime delle perdite, ecc. Dubito, tuttavia, che sarà necessario preoccuparsi molto della correlazione seriale delle vendite: è difficile pensare di qualsiasi meccanismo per causare una cosa del genere.

Oh, sì: come si ottiene la stima ML? Ho usato un ottimizzatore numerico, ma in generale ti avvicinerai molto semplicemente dividendo le vendite totali in un periodo recente per la durata del periodo. Per questi dati che sono 163 bottiglie vendute dal 09/12/2011 al 27/02/2012, un periodo di 87 giorni: bottiglie al giorno. Abbastanza vicino a ed estremamente semplice da implementare, in modo che chiunque possa iniziare subito questi calcoli. (R ed Excel, tra gli altri, calcoleranno prontamente il CCDF di Poisson: modellano i calcoli dopo 1,8506θ^=1.871.8506

1-POISSON(50, Theta * A2, TRUE)

per Excel ( A2è una cella contenente il tempo trascorso dall'ultima ricarica ed Thetaè il tasso di vendita giornaliero stimato) e

1 - ppois(50, lambda = (x * theta))

per R.)

I modelli più elaborati (che incorporano tendenze, cicli, ecc.) Dovranno utilizzare la regressione di Poisson per le loro stime.

NB Per gli appassionati: sto volutamente evitando qualsiasi discussione sulle incertezze nelle perdite stimate. La gestione di questi può complicare significativamente i calcoli. Sospetto che l'uso diretto di queste incertezze non aggiungerebbe un valore apprezzabile alla decisione. Tuttavia, essere consapevoli delle incertezze e delle loro dimensioni potrebbe essere utile; che potrebbe essere rappresentato per mezzo di bande di errore nella seconda figura. In conclusione, voglio solo enfatizzare la natura di quella figura: traccia numeri che hanno un significato commerciale diretto e chiaro; vale a dire, perdite attese; non traccia cose più astratte come gli intervalli di confidenza intorno a , che potrebbero essere di interesse per lo statistico, ma saranno solo un gran rumore per il decisore.θ


1
Per me il presupposto che vendite / eventi siano indipendenti l'uno dall'altro sembrerebbe illogico in quanto si tratta di misurazioni effettuate nel tempo sulla stessa nachina. In che modo il tuo approccio gestirà i dati di vendita auto-correlati che potrebbero aver avuto un cambiamento di livello? Solo curioso ?
IrishStat

1
Credo di aver delineato un percorso per valutare e gestire probabili forme di "autocorrelazione". Non si manifesterebbero come tali in una tradizionale analisi delle serie storiche, anche se fossero disponibili dati spaziati regolarmente. La correlazione temporale risulterebbe dalla correlazione in fattori esterni, come i cicli settimanali o stagionali. Una forma interessante potrebbe verificarsi dal raggruppamento temporale degli acquisti (ad esempio, subito dopo pranzo o nei fine settimana). Le "variazioni nette di livello" possono essere gestite dall'adattamento delle tendenze, se necessario, ma il semplice utilizzo di una media corrente lo affronterebbe automaticamente.
whuber

4

Penso che di solito avrai il primo passo per passare a una serie storica regolare. Hai detto di prendere la media di 90 giorni. Dato che disponi di dati più frequenti di quello, penso che abbia più senso usare il meglio di ciò che hai prendendo i giorni tra ogni osservazione e dividendoli per il numero di oggetti venduti per quel periodo (supponendo che sia quello che la seconda colonna è).

Come disclaimer sono un dilettante totale, quindi vuoi seguire il consiglio di un esperto come IrishStat sul seguente codice (ad esempio, ha detto che ETS è un cattivo modello, quindi considera questo solo come un esempio di giocattolo), ma nella speranza che questo ti fa risparmiare un po 'di tempo, ecco un codice R con cui puoi giocare:

library("xts")
library("forecast")

x = read.table(text="27/02/2012 48
17/02/2012 24
09/02/2012 16
02/02/2012 7
25/01/2012 12
16/01/2012 16
05/01/2012 16
23/12/2011 4
16/12/2011 14
09/12/2011 4
02/12/2011 2")

#Convert the data into an XTS object which works with irregular time series 
x.xts = xts(x[,2], as.POSIXct(x[,1], format="%d/%m/%Y"))

#Conver to a daily rate by taking the observed data and dividing it by 
#the number of days between observations
daily_rate <- lag(x.xts) / diff(index(x.xts))

#Generate a daily time series for the dates
dummy_dates <- seq(from=index(x.xts)[1], to=tail(index(x.xts), 1), by="day")

#Combine daily series with observered daily rate
m.xts <- merge(daily_rate, dummy_dates)

#Interpolate the daily sales -- kind of evil because we "invent" data
m.xts.interpolate <- na.approx(m.xts)

#Convert to regular time series
m.ts <- ts(m.xts.interpolate, freq=365, start=c(2011, 336))
#Clean up dimnames in case of stl forecast (just an R thing when converting from dataframes)
dim(m.ts) <- NULL

#Fit TS to an ETS model (Rudely ignoring IrishStat's advice that it is a bad model, but this is just an example)
fit <- ets(m.ts)

#Forecast and Plot
plot(forecast(fit, h=30))

La trama risultante è:

inserisci qui la descrizione dell'immagine


Hai letto la mia risposta "Abbiamo risolto questo problema convertendo la domanda in un tasso dividendo la domanda effettiva per il numero di giorni nell'intervallo tra la manutenzione". Invece di assumere un modello come te, ho identificato un modello utile. Le tue previsioni sono esplosive in quanto credono ai recenti "tassi anomali" piuttosto che adattarsi per loro.
IrishStat

2
@IrishStat: Sì, ho anche un commento nel mio codice che indica il fatto che hai detto che era un cattivo modello, pensavo solo che un po 'di codice R potesse aiutare le persone dando una base per sperimentare.
Kyle Brandt

1

Quello che hai è un "problema di domanda intermittente". Abbiamo risolto questo problema convertendo la domanda in un tasso dividendo la domanda effettiva per il numero di giorni nell'intervallo tra la manutenzione. Questa velocità può quindi essere modellata come una funzione di trasferimento al fine di prevedere una velocità data la previsione dell'intervallo. Questo tasso previsto può quindi essere convertito in una domanda. Prestare attenzione a rilevare i cambiamenti strutturali nella frequenza tramite il rilevamento degli interventi. Prova a cercare "Approccio di modellazione della domanda intermittente usando una metodologia di funzione di trasferimento". Indovina molto chiaramente gli approcci presuntivi del modello di Croston o Exponential Smoothing in quanto sono piuttosto carenti.

ANALISI AGGIUNTIVA:

Quando ho modellato la velocità in funzione dell'intervallo, ho ottenuto quanto segue. Utilizzando una previsione di INTERVAL usando il passato, questa equazione può quindi prevedere il tasso, che può essere utilizzato per prevedere la domanda. Questo tipo di modello consente di incorporare la struttura autoregressiva nella frequenza e di consentire la frequenza di impulsi, spostamenti di livello e / o tendenze dell'ora locale.

      MODEL COMPONENT       LAG    COEFF     STANDARD      P       T        

# (BOP) VALORE DI ERRORE

 Differencing                  1                                            
1CONSTANT                          .295       .840E-01   .0246     3.51

INTERVALLO SERIE INGRESSO X1

 Differencing                  1                                            
2Omega (input) -Factor #  1    0   .685E-01   .346E-01   .1193     1.98

SERIE INGRESSO X2 I ~ P00002 12/03/11 PULSE

 Differencing                  1                                            
3Omega (input) -Factor #  2    0   1.43       .168       .0010     8.52

SERIE INPUT X3 I ~ P00007 12/08/11 PULSE

 Differencing                  1                                            
4Omega (input) -Factor #  3    0  -.935       .168       .0051    -5.57

SERIE INPUT X4 I ~ P00010 12/11/11 PULSE

 Differencing                  1                                            
5Omega (input) -Factor #  4    0   1.37       .260       .0062     5.27

1
Penso che questo fraintenda leggermente la domanda: non ha una domanda intermittente, ha osservato la domanda in modo intermittente ed è apparentemente felice di assumere una domanda sottostante costante al giorno. In effetti, l'approccio della funzione di trasferimento sembra in generale essere quello che sta provando qui, sebbene con un presupposto di linearità, una finestra di 90 giorni e nessuna covariata. La regressione della domanda FWI contro i giorni (esogeni) dall'ultima lettura fornisce circa 2,2 articoli richiesti al giorno, ma un'elevata incertezza su tale stima.
conjugateprior

@ConjugatePrior Non può osservare la domanda effettiva al giorno e i campioni a intervalli rari quindi è di fatto equivalente a un problema di domanda intermittente. Il suo "rate" può essere caratterizzato come una camminata casuale con 3 eccezioni (impulsi) a 12/16; 2 / 02; 2/27. La nostra idea qui è quella di modellare il tasso in funzione dell'intervallo, quindi prevedere l'intervallo e quindi prevedere la domanda. Sembra che tu abbia modellato il fabbisogno in funzione dell'intervallo ottenendo il tasso medio semplice che in questo caso è gravemente / negativamente effettuato dai 3 punti di dati anomali e non riflette la struttura autoregressiva.
IrishStat

2
Sicuramente non può essere una passeggiata casuale perché le vendite possono solo salire o rimanere invariate (equivalentemente le scorte possono solo diminuire o rimanere allo stesso livello) - qualcosa di più simile a un processo di rinnovo. Inoltre non sono sicuro di come hai capito che esattamente 3 punti sono anomali. (A proposito, l '"analisi" che ho suggerito è solo una sua versione generalizzata, con un'ipotesi di linearità insostenibile, quindi personalmente non mi accontenterei.)
Coniugateprior

@ConjugatePrior Il tasso in funzione dell'intervallo ha mostrato che il tasso era fortemente dipendente dai tassi precedenti e influenzato anche da tre "tassi insoliti". Non sono stati identificati cambiamenti di livello. Quello che avrei dovuto dire era che il tasso era una camminata casuale senza una costante, quindi non c'è una tendenza evidente.
IrishStat

1
@IrishStat Grazie mille per la risposta. Leggerò della domanda intermittente usando una funzione di trasferimento. Una piccola correzione: non è necessario prevedere INTERVAL. Dobbiamo decidere quando visitare la macchina in base alla previsione della tariffa. Ad esempio, una regola aziendale potrebbe essere "visitare la macchina quando è vuota al 60%"
Ivan Dimitrov,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.