Comment faire des prévisions basées sur des données agrégées sur des intervalles irréguliers?

10

J'essaie de prévoir les ventes de produits dans un distributeur automatique. Le problème est que la machine est remplie à intervalles irréguliers et à chaque remplissage, nous ne pouvons enregistrer que les ventes agrégées depuis le dernier remplissage de la machine (c'est-à-dire que nous n'avons pas de données de vente quotidiennes). Donc, fondamentalement, nous avons des données sur les ventes agrégées à intervalles irréguliers. Les intervalles sont généralement compris entre 2 jours et 3 semaines. Voici des exemples de données pour un distributeur automatique et un produit:

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

Notre algorithme naïf actuel consiste à calculer les ventes moyennes par jour en divisant par 90 la quantité totale vendue au cours des 90 derniers jours.

Avez-vous une idée de comment améliorer la prévision des ventes par jour? J'ai besoin de prévoir ce qui sera vendu lors de la prochaine visite de la machine. Est-il possible d'utiliser une sorte d'algorithme de lissage exponentiel étant donné la nature de nos données?

Merci d'avance!

MISE À JOUR: Merci beaucoup pour toutes les réponses et commentaires. Permettez-moi d'essayer de donner un peu plus de contexte (l'analyse de rentabilisation derrière la question - très simplifiée bien sûr). Nous avons des centaines de distributeurs automatiques. Chaque jour, nous devons décider quels 20 d'entre eux visiter pour recharge. Pour ce faire, nous essayons de prédire quel est l'état actuel des machines et de sélectionner les 20 machines les plus "vides". Pour chaque machine et produit, nous calculons les ventes moyennes par jour (SPD) en utilisant l'algorithme naïf décrit ci-dessus. Ensuite, nous multiplions le SPD par le nombre de jours écoulés depuis le dernier remplissage de la machine et le résultat est la quantité prévue vendue.

Ivan Dimitrov
la source
Je pense que c'est une question intéressante. Ma réponse à votre question exacte et à votre ensemble de données est: est-ce important? et: obtenir plus de données. De plus, je pense qu'il est utile de savoir quelle est la capacité du distributeur automatique.
Adam
@Adam La capacité de ce produit est de 50 bouteilles. Peut-être que ma description du problème n'est pas assez claire. Je vais essayer de le modifier un peu pour donner plus de contexte. Fondamentalement, je cherche des idées pour résoudre le problème général et je suis très reconnaissant pour tous les commentaires jusqu'à présent. L'ensemble de données spécifique est donné à titre d'exemple à quoi ressemblent les données. Pour d'autres distributeurs automatiques, je peux fournir des données pour une période beaucoup plus longue.
Ivan Dimitrov
@IvanDimitrov: Quelle est exactement la colonne deux dans vos données?
Kyle Brandt
@KyleBrandt La deuxième colonne est le nombre de bouteilles vendues depuis la dernière visite au distributeur automatique. Ainsi, le numéro 48 sur la rangée du haut signifie que 48 bouteilles ont été vendues entre le 17/02 et le 27/02
Ivan Dimitrov

Réponses:

11

Concentrons-nous sur le problème commercial, développons une stratégie pour y remédier et commençons à mettre en œuvre cette stratégie de manière simple. Plus tard, il peut être amélioré si l'effort le justifie.

Le problème commercial est bien sûr de maximiser les profits. Cela se fait ici en équilibrant les coûts de remplissage des machines contre les coûts des ventes perdues. Dans sa formulation actuelle, les coûts de remplissage des machines sont fixes: 20 peuvent être rechargés chaque jour. Le coût des ventes perdues dépend donc de la fréquence à laquelle les machines sont vides.

Un modèle statistique conceptuel pour ce problème peut être obtenu en concevant un moyen d'estimer les coûts pour chacune des machines, sur la base des données précédentes. L' attendule coût de la non-maintenance d'une machine aujourd'hui équivaut approximativement au risque qu'elle soit épuisée multipliée par la vitesse à laquelle elle est utilisée. Par exemple, si une machine a 25% de chances d'être vide aujourd'hui et vend en moyenne 4 bouteilles par jour, son coût attendu est égal à 25% * 4 = 1 bouteille en ventes perdues. (Traduisez cela en dollars comme vous le ferez, sans oublier qu'une vente perdue engendre des coûts intangibles: les gens voient une machine vide, ils apprennent à ne pas y compter, etc. Vous pouvez même ajuster ce coût en fonction de l'emplacement de la machine; avoir certains obscurs les machines qui fonctionnent à vide pendant un certain temps peuvent entraîner quelques coûts intangibles.) Il est juste de supposer que le rechargement d'une machine remettra immédiatement à zéro la perte attendue - il devrait être rare qu'une machine soit vidée chaque jour (vous ne le souhaitez pas. ..). Au fil du temps,

Un modèle statistique simple dans ce sens propose que les fluctuations de l'utilisation d'une machine semblent aléatoires. Cela suggère un modèle de Poisson . Plus précisément, nous pouvons supposer qu'une machine a un taux de vente journalier sous-jacent de bouteilles et que le nombre vendu pendant une période de jours a une distribution de Poisson avec le paramètre . (D'autres modèles peuvent être formulés pour gérer la possibilité de regroupements de ventes; celui-ci suppose que les ventes sont individuelles, intermittentes et indépendantes les unes des autres.)x θ xθxθX

Dans le présent exemple, les durées observées sont et les ventes correspondantes étaient . Maximiser la probabilité donne : cette machine vend environ deux bouteilles par jour. L'historique des données n'est pas assez long pour suggérer qu'un modèle plus compliqué est nécessaire; il s'agit d'une description adéquate de ce qui a été observé jusqu'à présent.y = ( 4 , 14 , 4 , 16 , 16 , 12 , 7 , 16 , 24 , 48 ) θ = 1,8506X=(7,7,7,13,11,9,8,7,8,dix)y=(4,14,4,16,16,12,7,16,24,48)θ^=1,8506

Réel vs ajustement

Les points rouges indiquent la séquence des ventes; les points bleus sont des estimations basées sur l'estimation de la probabilité maximale du taux de vente typique.

Armé d'un taux de vente estimé, nous pouvons ensuite calculer le risque qu'une machine soit vide après jours: elle est donnée par la fonction de distribution cumulative complémentaire (CCDF) de la distribution de Poisson, évaluée à la capacité de la machine (présumée être 50 dans la figure suivante et les exemples ci-dessous). La multiplication par le taux de vente estimé donne un graphique de la perte quotidienne prévue des ventes en fonction du temps depuis la dernière recharge:t

Perte au fil du temps

Naturellement, cette courbe augmente le plus rapidement vers le moment à jours où la machine est le plus susceptible de s'épuiser. Ce que cela ajoute à notre compréhension, c'est de montrer qu'une augmentation sensible commence en fait une semaine plus tôt que cela. D'autres machines avec d'autres taux auront des montées plus raides ou moins profondes: ce seront des informations utiles.50/1,85=27

Étant donné un tableau comme celui-ci pour chaque machine (dont il semble qu'il y en ait quelques centaines), vous pouvez facilement identifier les 20 machines qui subissent actuellement la plus grande perte attendue: leur entretien est la décision commerciale optimale. (Notez que chaque machine aura son propre taux estimé et sera à son propre point le long de sa courbe, en fonction du dernier entretien.) Personne n'a réellement à regarder ces tableaux: identifier les machines à entretenir sur cette base est facilement automatisé avec un programme simple ou même avec une feuille de calcul.

Ce n'est que le début. Au fil du temps, des données supplémentaires peuvent suggérer des modifications à ce modèle simple: vous pouvez tenir compte des week-ends et des jours fériés ou d'autres influences anticipées sur les ventes; il peut y avoir un cycle hebdomadaire ou d'autres cycles saisonniers; il peut y avoir des tendances à long terme à inclure dans les prévisions. Vous voudrez peut-être suivre les valeurs aberrantes représentant des exécutions ponctuelles inattendues sur les machines et incorporer cette possibilité dans les estimations de pertes, etc. de tout mécanisme pour provoquer une telle chose.

Oh, oui: comment obtient-on l'estimation ML? J'ai utilisé un optimiseur numérique, mais en général, vous vous rapprocherez simplement en divisant les ventes totales sur une période récente par la longueur de la période. Pour ces données, c'est 163 bouteilles vendues du 09/12/2011 au 27/02/2012, soit une période de 87 jours: bouteilles par jour. Assez proche de et extrêmement simple à implémenter, donc tout le monde peut commencer ces calculs tout de suite. (R et Excel, entre autres, calculeront facilement le CCDF de Poisson: modélisez les calculs après 1,8506θ^=1,871,8506

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

pour Excel ( A2est une cellule contenant le temps écoulé depuis la dernière recharge et Thetaest le taux de vente quotidien estimé) et

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

pour R.)

Les modèles plus sophistiqués (qui intègrent les tendances, les cycles, etc.) devront utiliser la régression de Poisson pour leurs estimations.

NB Pour les aficionados: J'évite volontairement toute discussion sur les incertitudes dans les pertes estimées. Leur manipulation peut compliquer considérablement les calculs. Je soupçonne que l'utilisation directe de ces incertitudes n'apporterait pas une valeur appréciable à la décision. Cependant, être conscient des incertitudes et de leurs tailles pourrait être utile; cela pourrait être représenté au moyen de bandes d'erreur dans la deuxième figure. En terminant, je veux juste souligner à nouveau la nature de ce chiffre: il trace des chiffres qui ont une signification commerciale directe et claire; à savoir, les pertes attendues; il ne trace pas des choses plus abstraites telles que les intervalles de confiance autour de , qui peuvent intéresser le statisticien mais qui feront tellement de bruit pour le décideur.θ

whuber
la source
1
Pour moi, l'hypothèse selon laquelle les ventes / événements sont indépendants les uns des autres semblerait illogique car il s'agit de mesures prises au fil du temps sur la même nachine. Comment votre approche traiterait-elle les données de vente auto-corrélées qui auraient pu avoir un changement de niveau? Juste curieux ?
IrishStat
1
Je crois avoir tracé une voie pour évaluer et traiter les formes probables d '"autocorrélation". Ils ne se manifesteraient pas comme tels dans une analyse de séries chronologiques traditionnelle, même si des données régulièrement espacées étaient disponibles. La corrélation temporelle résulterait de la corrélation de facteurs externes, tels que les cycles hebdomadaires ou saisonniers. Une forme intéressante se produirait du regroupement temporel des achats (par exemple, juste après le déjeuner ou le week-end). Les «changements nets de niveau» peuvent être traités par l'ajustement des tendances, si nécessaire, mais le simple fait d'utiliser un moyen courant traiterait cela automatiquement.
whuber
4

Je pense que vous aurez généralement la première étape de la conversion en série chronologique régulière. Vous avez dit que vous prenez en moyenne 90 jours. Étant donné que vous avez des données plus fréquentes que cela, je pense qu'il est plus logique d'utiliser au maximum ce que vous avez en prenant les jours entre chaque observation et en les divisant par le nombre d'articles vendus pour cette période (en supposant que c'est ce que votre deuxième colonne est).

Comme avertissement, je suis un amateur total, donc vous voulez suivre les conseils d'un expert comme IrishStat sur le code suivant (par exemple, il a dit que ETS est un mauvais modèle, alors ne le traitez que comme un exemple de jouet), mais dans l'espoir que cela vous fait gagner du temps, voici un code R avec lequel vous pouvez jouer:

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

Le tracé résultant est:

entrez la description de l'image ici

Kyle Brandt
la source
Avez-vous lu ma réponse "Nous avons résolu ce problème en convertissant la demande en un taux en divisant la demande réelle par le nombre de jours dans l'intervalle entre les services". Plutôt que de supposer un modèle tel que vous êtes, j'ai identifié un modèle utile. Vos prévisions sont explosives car elles croient aux «taux anormaux» récents plutôt que de les ajuster.
IrishStat
2
@IrishStat: Oui, j'ai même un commentaire dans mon code soulignant le fait que vous avez dit que c'était un mauvais modèle, je pensais juste qu'un code R pourrait aider les gens en donnant une base pour expérimenter.
Kyle Brandt
1

Ce que vous avez, c'est un «problème de demande intermittente». Nous avons résolu ce problème en convertissant la demande en un taux en divisant la demande réelle par le nombre de jours dans l'intervalle entre les services. Ce taux peut ensuite être modélisé comme une fonction de transfert afin de prédire un taux compte tenu de la prédiction de l'intervalle. Ce taux prévu peut ensuite être converti en demande. Des précautions doivent être prises pour détecter les changements structurels du taux via la détection d'intervention. Essayez de googler "Approche de modélisation de la demande intermittente en utilisant une méthodologie de fonction de transfert". Écartez très clairement les modèles d'approches présomptives de Croston ou de lissage exponentiel car ils sont assez déficients.

ANALYSE SUPPLÉMENTAIRE:

Lorsque j'ai modélisé le débit en fonction de l'intervalle, j'ai obtenu ce qui suit. En utilisant une prédiction d'INTERVAL en utilisant son passé, cette équation peut alors prédire le taux, qui peut être utilisé pour prédire la demande. Ce type de modèle permet d'incorporer une structure autorégressive dans le taux ainsi que des impulsions, des changements de niveau et / ou des tendances temporelles locales dans le taux.

      MODEL COMPONENT       LAG    COEFF     STANDARD      P       T        

# (BOP) VALEUR D'ERREUR VALEUR

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

INTERVALLE D'ENTRÉE DE LA SÉRIE X1

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

INPUT SERIES X2 I ~ P00002 12/03/11 PULSE

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

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

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

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

 Differencing                  1                                            
5Omega (input) -Factor #  4    0   1.37       .260       .0062     5.27
IrishStat
la source
1
Je pense que cela méconnaît légèrement la question: il n'a pas de demande intermittente, il a observé la demande par intermittence , et il est apparemment heureux de supposer une demande sous-jacente constante par jour. En effet, l'approche de la fonction de transfert semble être globalement celle qu'il essaie ici, bien qu'avec une hypothèse de linéarité, une fenêtre de 90 jours et aucune covariable. La demande de régression FWIW par rapport aux jours (exogènes) depuis la dernière lecture donne environ 2,2 articles demandés par jour, mais une forte incertitude autour de cette estimation.
conjugateprior
@ConjugatePrior Il ne peut pas observer la demande réelle par jour et les échantillons à intervalles peu fréquents sont donc de facto équivalents à un problème de demande intermittent.Son "taux" peut être caractérisé comme une marche aléatoire avec 3 exceptions (impulsions) à 12/16; 2 / 02; 2/27. Notre idée ici est de modéliser le taux en fonction de l'intervalle, puis de prédire l'intervalle et ensuite de prédire la demande. Vous semblez avoir modélisé la demande en fonction de l'intervalle en obtenant le taux moyen simple qui dans ce cas est sévèrement / négativement effectuée par les 3 points de données anomoleux et ne reflète pas la structure autorégressive.
IrishStat
2
Cela ne peut certainement pas être une marche aléatoire, car les ventes ne peuvent qu'augmenter ou rester les mêmes (de manière équivalente, les stocks ne peuvent que baisser ou rester au même niveau) - quelque chose de plus comme un processus de renouvellement. De plus, je ne sais pas comment vous avez compris qu'exactement 3 points sont des valeurs aberrantes. (BTW, `` l'analyse '' que j'ai suggérée n'est qu'une version généralisée de la sienne, avec une hypothèse de linéarité insoutenable, donc je ne m'en contenterais pas personnellement.)
conjugateprior
@ConjugatePrior Le taux en fonction de l'intervalle a montré que le taux était fortement dépendant des taux précédents et également impacté par trois "taux inhabituels". Aucun changement de niveau n'a été identifié. Ce que j'aurais dû dire, c'est que le taux était une marche aléatoire sans constante donc il n'y a pas de tendance discernable.
IrishStat
1
@IrishStat Merci beaucoup pour la réponse. Je vais lire sur la demande intermittente en utilisant une fonction de transfert. Une petite correction: nous n'avons pas à prédire l'INTERVALLE. Nous devons décider quand visiter la machine en fonction de la prédiction du taux. Par exemple, une règle commerciale pourrait être «visitez la machine lorsqu'elle est vide à 60%»
Ivan Dimitrov