Como prever com base em dados agregados em intervalos irregulares?


10

Estou tentando prever as vendas de produtos na máquina de venda automática. O problema é que a máquina é preenchida em intervalos irregulares e, a cada preenchimento, só podemos registrar as vendas agregadas desde o último preenchimento da máquina (ou seja, não temos dados diários de vendas). Então, basicamente, temos dados para vendas agregadas em intervalos irregulares. Os intervalos geralmente são entre 2 dias e 3 semanas. Aqui estão dados de exemplo para uma máquina de venda automática e um produto:

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

Nosso atual algoritmo ingênuo é calcular as vendas médias por dia, dividindo a quantidade total vendida nos últimos 90 dias por 90.

Você tem alguma ideia de como melhorar a previsão das vendas por dia? Preciso prever o que será vendido na próxima visita da máquina. É possível usar algum tipo de algoritmo de suavização exponencial, dada a natureza de nossos dados?

Desde já, obrigado!

ATUALIZAÇÃO: Muito obrigado por todas as respostas e comentários. Deixe-me tentar dar um pouco mais de contexto (o caso de negócios por trás da pergunta - muito simplificado, é claro). Temos centenas de máquinas de venda automática. Todos os dias temos que decidir quais 20 deles devem ser reabastecidos. Para isso, estamos tentando prever qual é o status atual das máquinas e selecionar as 20 máquinas mais "vazias". Para cada máquina e produto, calculamos a média de vendas por dia (SPD) usando o ingênuo algoritmo descrito acima. Em seguida, multiplicamos o SPD pelo número de dias desde o último preenchimento da máquina e o resultado é a quantidade prevista vendida.


Eu acho que é uma pergunta interessante. Minha resposta para sua pergunta exata e o conjunto de dados é: isso importa? e: obtenha mais dados. Além disso, acho útil saber qual é a capacidade da máquina de venda automática.
Adam

@ Adam A capacidade deste produto é de 50 garrafas. Talvez minha descrição do problema não seja clara o suficiente. Vou tentar editá-lo um pouco para dar mais contexto. Basicamente, estou procurando idéias sobre como resolver o problema geral e sou muito grato por todos os comentários até agora. O conjunto de dados específico é fornecido apenas como exemplo com a aparência dos dados. Para outras máquinas de venda automática, posso fornecer dados por um período muito maior.
Ivan Dimitrov

@IvanDimitrov: O que exatamente é a coluna dois em seus dados?
Kyle Brandt

@KyleBrandt A coluna dois é o número de garrafas vendidas desde a última visita à máquina de venda automática. Portanto, o número 48 na linha superior significa que 48 garrafas foram vendidas entre 17/02 e 27/02
Ivan Dimitrov

Respostas:


11

Vamos nos concentrar no problema comercial, desenvolver uma estratégia para resolvê-lo e começar a implementá-la de uma maneira simples. Mais tarde, pode ser melhorado se o esforço o justificar.

O problema dos negócios é maximizar os lucros, é claro. Isso é feito aqui, equilibrando os custos das máquinas de recarga com os custos de vendas perdidas. Na sua formulação atual, os custos de reabastecimento das máquinas são fixos: 20 podem ser reabastecidos a cada dia. O custo das vendas perdidas, portanto, depende da frequência com que as máquinas estão vazias.

Um modelo estatístico conceitual para esse problema pode ser obtido através da criação de uma maneira de estimar os custos para cada uma das máquinas, com base em dados anteriores. O esperadoO custo de não reparar uma máquina hoje em dia é aproximadamente igual à chance de esgotar o tempo em que é usada. Por exemplo, se uma máquina tem 25% de chance de ficar vazia hoje e, em média, vende 4 garrafas por dia, seu custo esperado é igual a 25% * 4 = 1 garrafa em vendas perdidas. (Transforme isso em dólares, sem esquecer que uma venda perdida incorre em custos intangíveis: as pessoas veem uma máquina vazia, aprendem a não confiar nela, etc. Você pode até ajustar esse custo de acordo com a localização de uma máquina; as máquinas ficam vazias por um tempo podem resultar em alguns custos intangíveis.) É justo supor que o reabastecimento de uma máquina redefinirá imediatamente a perda esperada para zero - deve ser raro que uma máquina seja esvaziada todos os dias (você não deseja. ..) Conforme o tempo passa,

θxθx

x=(7,7,7,13,11,9,8,7,8,10)y=(4,14,4,16,16,12,7,16,24,48)θ^=1.8506

Ajuste real vs

Os pontos vermelhos mostram a sequência de vendas; os pontos azuis são estimativas com base na estimativa de probabilidade máxima da taxa de vendas típica.

t

Perda ao longo do tempo

50/1.85=27

Dado um gráfico como esse para cada máquina (das quais parece haver algumas centenas), é possível identificar facilmente as 20 máquinas que atualmente estão enfrentando a maior perda esperada: a manutenção é a melhor decisão comercial. (Observe que cada máquina terá sua própria taxa estimada e estará em seu próprio ponto ao longo de sua curva, dependendo da última vez em que foi reparada.) automatizado com um programa simples ou mesmo com uma planilha.

Isto é apenas o começo. Com o tempo, dados adicionais podem sugerir modificações nesse modelo simples: você pode considerar fins de semana e feriados ou outras influências previstas nas vendas; pode haver um ciclo semanal ou outros ciclos sazonais; pode haver tendências de longo prazo a serem incluídas nas previsões. Você pode rastrear valores externos que representam execuções únicas inesperadas nas máquinas e incorporar essa possibilidade nas estimativas de perda, etc. Duvido, porém, que seja necessário se preocupar muito com a correlação serial de vendas: é difícil pensar de qualquer mecanismo para causar uma coisa dessas.

θ^=1.871.8506

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

para Excel ( A2é uma célula que contém o tempo desde a última recarga e Thetaé a taxa diária estimada de vendas) e

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

para R.)

Os modelos mais sofisticados (que incorporam tendências, ciclos, etc.) precisarão usar a regressão de Poisson para suas estimativas.

θ


11
Para mim, a suposição de que vendas / eventos são independentes um do outro pareceria ilógica, pois são medidas feitas ao longo do tempo no mesmo nachine. Como sua abordagem lidaria com dados de vendas correlacionados automaticamente, que poderiam ter tido uma mudança de nível? Apenas curioso?
IrishStat

11
Acredito ter traçado uma rota para avaliar e lidar com formas prováveis ​​de "autocorrelação". Eles não se manifestariam como tal em uma análise tradicional de séries temporais, mesmo que dados regularmente espaçados estivessem disponíveis. A correlação temporal resultaria da correlação em fatores externos, como ciclos semanais ou sazonais. Uma forma interessante ocorreria a partir do agrupamento temporal de compras (por exemplo, logo após o almoço ou nos finais de semana). "Alterações líquidas de nível" podem ser tratadas pelo ajuste de tendência, se necessário, mas o simples uso de uma média corrente lidaria com isso automaticamente.
whuber

4

Eu acho que você normalmente terá o primeiro passo para converter em uma série temporal regular. Você disse que leva em média 90 dias. Como você tem dados mais frequentes do que isso, acho que faz mais sentido usar ao máximo o que você tem, aproveitando os dias entre cada observação e dividindo-os pelo número de itens vendidos para esse período (assumindo que é esse o seu segunda coluna é).

Como isenção de responsabilidade, sou totalmente amador, então você quer seguir o conselho de um especialista como o IrishStat sobre o código a seguir (por exemplo, ele disse que o ETS é um modelo ruim, portanto, trate-o apenas como um exemplo de brinquedo), mas na esperança Para economizar tempo, aqui está um código R com o qual você pode jogar:

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))

O gráfico resultante é:

insira a descrição da imagem aqui


Você leu minha resposta "Resolvemos isso convertendo a demanda em uma taxa, dividindo a demanda real pelo número de dias no intervalo entre a manutenção". Em vez de assumir um modelo como você, identifiquei um modelo útil. Suas previsões são explosivas, pois acreditam nas recentes "taxas anômalas", em vez de se ajustarem a elas.
precisa saber é o seguinte

2
@IrishStat: Sim, eu até tenho um comentário no meu código apontando para o fato de que você disse que era um modelo ruim, eu apenas pensei que algum código R poderia ajudar as pessoas, dando uma base para experimentar.
Kyle Brandt

1

O que você tem é um "problema de demanda intermitente". Resolvemos isso convertendo a demanda em uma taxa, dividindo a demanda real pelo número de dias no intervalo entre a manutenção. Essa taxa pode ser modelada como uma função de transferência para prever uma taxa, dada a previsão do intervalo. Essa taxa prevista pode ser convertida em demanda. Deve-se tomar cuidado para detectar mudanças estruturais na taxa via Detecção de Intervenção. Tente pesquisar "Abordagem de modelagem de demanda intermitente usando uma metodologia de função de transferência". Mantenha-se muito claro das abordagens presumidas do modelo de Croston ou da suavização exponencial, pois são bastante deficientes.

ANÁLISE ADICIONAL:

Quando modelei Rate como uma função do Intervalo, obtive o seguinte. Usando uma previsão de INTERVAL usando o passado, essa equação pode prever a taxa, que pode ser usada para prever a demanda. Esse tipo de modelo permite que a estrutura autoregressiva na taxa seja incorporada, além de permitir pulsos, mudanças de nível e / ou tendências da hora local na taxa.

      MODEL COMPONENT       LAG    COEFF     STANDARD      P       T        

VALOR DE VALOR DE ERRO # (BOP)

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

INTERVALO DE ENTRADA SÉRIE X1

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

SÉRIE DE ENTRADA X2 I ~ P00002 12/03/11 PULSO

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

SÉRIE DE ENTRADA X3 I ~ P00007 12/08/11 PULSO

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

SÉRIE DE ENTRADA X4 I ~ P00010 12/11/11 PULSO

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

11
Eu acho que isso entendeu um pouco a pergunta: ele não tem demanda intermitente, ele observou intermitentemente a demanda, e ele parece feliz em assumir a demanda subjacente constante por dia. De fato, a abordagem da função de transferência parece ser a que ele está tentando aqui, embora com uma suposição de linearidade, uma janela de 90 dias e nenhuma covariável. A demanda regressiva do FWIW em relação aos dias (exógenos) desde a última leitura fornece cerca de 2,2 itens demandados por dia, mas alta incerteza em torno dessa estimativa.
conjugateprior

@ConjugatePrior Ele não pode observar a demanda real diária e as amostras em intervalos pouco frequentes, portanto, é de fato equivalente a um problema de demanda intermitente. Sua "taxa" pode ser caracterizada como uma caminhada aleatória com três exceções (pulsos) em 12/16; 2 / 02; 2/27. Nossa idéia aqui é modelar a taxa em função do intervalo, prever o intervalo e prever a demanda. Parece que você modelou a demanda em função do intervalo, obtendo a taxa média simples que, neste caso, é severa / adversa efetuada pelos 3 pontos de dados anômalos e não reflete a estrutura auto-regressiva.
precisa saber é o seguinte

2
Certamente não pode ser uma caminhada aleatória, porque as vendas só podem subir ou permanecer iguais (os estoques equivalentes podem apenas diminuir ou permanecer no mesmo nível) - algo mais como um processo de renovação. Também não tenho certeza de como você descobriu que exatamente 3 pontos são discrepantes. (BTW a 'análise' Eu sugeri é apenas uma versão generalizada de sua autoria, com uma suposição de linearidade insustentável, então eu pessoalmente não iria se contentar com isso.)
conjugateprior

@ConjugatePrior A taxa em função do intervalo mostrou que a taxa era fortemente dependente das taxas anteriores e também impactada por três "taxas incomuns". Não foram identificadas mudanças de nível. O que eu deveria ter dito era que a taxa era uma caminhada aleatória sem uma constante, portanto, não há tendência discernível.
precisa saber é o seguinte

11
@IrishStat Muito obrigado pela resposta. Vou ler sobre a demanda intermitente usando uma função de transferência. Uma pequena correção: não precisamos prever o INTERVALO. Temos que decidir quando visitar a máquina com base na previsão da taxa. Por exemplo, uma regra de negócios pode ser "visite a máquina quando estiver 60% vazia"
Ivan Dimitrov
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.