如何根据不定期的汇总数据进行预测?


10

我正在尝试预测自动售货机中产品的销售情况。问题在于,机器的灌装间隔不规则,每次灌装我们只能记录自机器最后一次灌装以来的累计销售额(即我们没有每日销售数据)。因此,基本上我们有不定期的汇总销售数据。间隔通常在2天到3周之间。这是一台自动售货机和一种产品的示例数据:

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

我们当前的幼稚算法是通过将过去90天内的销售总量除以90来计算每天的平均销售额。

您是否知道如何改善每天的销售预测?我需要预测在下次访问机器时将出售什么。给定数据的性质,是否可以使用某种指数平滑算法?

提前致谢!

更新:非常感谢所有的答案和评论。让我尝试提供更多背景信息(问题背后的业务案例-当然非常简化)。我们有数百台自动售货机。每天我们都必须决定要访问其中的20个以进行补充。为此,我们试图预测计算机的当前状态,并选择“最空”的20台计算机。对于每台机器和产品,我们正在使用上述朴素算法计算每日平均销售量(SPD)。然后,将SPD乘以自上次填充机器以来的天数,结果就是预计的销售量。


我认为这是一个有趣的问题。我对您的确切问题和数据集的回答是:这有关系吗?和:获取更多数据。另外,我认为了解自动售货机的容量很有用。
2012年

@Adam该产品的容量为50瓶。也许我对问题的描述还不够清楚。我将尝试对其进行一些编辑以提供更多上下文。基本上,我正在寻找解决一般问题的想法,对于到目前为止的所有评论我都非常感谢。给出的特定数据集仅作为示例,数据看起来像什么。对于其他自动售货机,我可以提供更长的数据时间。
Ivan Dimitrov'3

@IvanDimitrov:数据中的第二列到底是什么?
凯尔·勃兰特

@KyleBrandt第二列是自上次访问自动售货机以来售出的瓶子数量。因此,最上面一行的数字48表示48瓶在17/02到27/02之间售出
Ivan Dimitrov

Answers:


11

让我们专注于业务问题,制定解决方案,然后以简单的方式开始实施该策略。后来,如果需要的话,可以改进它。

当然,业务问题是最大化利润。这是通过在重新填充机器的成本与销售损失的成本之间取得平衡来实现的。按照目前的公式,机器的加注成本是固定的:每天可以加注20台。因此,销售损失的成本取决于机器清空的频率。

通过基于以前的数据设计某种方式来估算每台机器的成本,可以获得针对此问题的概念统计模型。该预期今天不维修机器的成本大约等于机器用完的机会乘以使用率。例如,如果一台机器今天有25%的机会被清空,并且平均每天售出4瓶,则其预期成本等于25%* 4 = 1瓶销售损失。(您可以将其转换为美元,不要忘记一次销售损失会带来无形的成本:人们看到一台空机器,他们学会了不依赖它,等等。您甚至可以根据机器的位置调整此成本;有些晦涩难懂可以假设一台机器空了一段时间可能不会产生多少无形成本。)可以公平地假设为一台机器加气会立即将预期损失重置为零-很少会每天清空一台机器(您不希望这样做。) ..)。随着时光流逝,

θ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

实际与适合

红点表示销售顺序;蓝点是基于典型销售率的最大似然估计的估计。

t

随着时间的流逝

50/1.85=27

给定每台机器的这样一张图表(看起来有几百张),您可以轻松地确定当前遭受最大预期损失的20台机器:为它们提供服务是最佳的业务决策。 (请注意,每台机器将有其自己的估计速率,并且将根据其最后一次维修的时间位于其曲线上的相应点。)实际上,没有人需要查看这些图表:在此基础上确定要维修的机器很容易使用简单的程序甚至使用电子表格即可实现自动化。

这仅仅是个开始。随着时间的流逝,更多的数据可能会建议对该简单模型进行修改:您可能需要考虑周末和节假日或对销售的其他预期影响;可能有一个每周周期或其他季节性周期;预测中可能包含长期趋势。您可能希望跟踪代表机器上意外运行一次的异常值,并将这种可能性纳入损失估计等。但是,我怀疑是否有必要担心销售的序列相关性:这很难思考导致这种事情的任何机制。

θ^=1.871.8506

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

对于Excel(A2是一个包含自上次填充后的时间的单元格,Theta是估计的每日销售率),并且

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

对于R。)

较高级的模型(包含趋势,周期等)将需要使用Poisson回归进行估算。

θ


1
对我而言,销售/事件彼此独立的假设似乎是不合逻辑的,因为这些是对同一台机器随时间进行的测量。您的方法将如何处理可能已更改级别的自动关联的销售数据?只是好奇 ?
IrishStat 2012年

1
我相信我已经勾勒出了一种评估和处理可能形式的“自相关”方法。即使有规律间隔的数据,它们也不会在传统的时间序列分析中表现出来。时间相关性将由外部因素的相关性产生,例如每周或季节性周期。一个有趣的形式可能是由于购买的时间性聚类(例如,午餐后或周末)。如有必要,可以通过趋势拟合来处理“水平的净变化”,但是仅使用移动平均值即可自动进行处理。
Whuber

4

我认为您通常将具有转换为常规时间序列的第一步。您说平均需要90天。由于您拥有的数据比这更频繁,因此我认为最好利用大部分数据,方法是将每次观察之间的间隔天数除以该时间段内售出的商品数(假设这是您的实际数据)第二列是)。

作为免责声明,我是一个业余爱好者,因此您希望就下面的代码接受类似于IrishStat的专家的建议(例如,他说ETS是一个不好的模型,因此请仅将其视为玩具示例),但是希望这样可以节省您一些时间,这是您可以使用的一些R代码:

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

结果图为:

在此处输入图片说明


您是否读过我的回答:“我们已通过将实际需求除以两次服务之间的间隔天数来将需求转换为费率来解决此问题”。我没有假设一个模型,而是确定了一个有用的模型。您的预测是爆炸性的,因为他们相信最近的“异常利率”,而不是对其进行调整。
IrishStat'3

2
@IrishStat:是的,我什至在我的代码中有一条注释,指出你说这是一个不好的模型,我只是认为一些R代码可能会通过提供实验基础来帮助人们。
凯尔·勃兰特

1

您所遇到的是“间歇性需求问题”。我们已通过将需求转换为费率来解决此问题,方法是将实际需求除以两次服务间隔之间的天数。然后可以将该速率建模为传递函数,以便在给出间隔预测的情况下预测速率。然后,可以将这个预测的速率转换为需求。应注意通过干预检测来检测发生率的结构性变化。尝试谷歌搜索“使用传递函数方法的间歇性需求建模方法”。克雷斯顿(Croston)或指数平滑法的模型推定方法非常有缺陷,因此他们非常清楚。

其他分析:

当我将速率作为时间间隔的函数建模时,我获得了以下内容。使用INTERVAL的预测来结束此方程,然后可以预测rate,可以将其用于预测需求。这种模型允许合并速率的自回归结构,以及允许脉冲,电平转换和/或速率的本地时间趋势。

      MODEL COMPONENT       LAG    COEFF     STANDARD      P       T        

#(BOP)错误值VALUE

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

输入系列X1间隔

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

输入系列X2 I〜P00002 12/03/11脉冲

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

输入系列X3 I〜P00007 11/12/11脉冲

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

输入系列X4 I〜P00010 11/12/11脉冲

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

1
我认为这有点误解了这个问题:他没有间歇性需求,他间歇性地观察了需求,而且他很高兴每天都承担恒定的基础需求。实际上,传递函数方法似乎是他在这里尝试的方法,尽管它具有线性假设,90天的窗口期且没有协变量。自上次阅读以来,FWIW对(外生)日的需求进行回归计算得出每天约有2.2项需求,但该估计值存在高度不确定性。
共轭木

@ConjugatePrior他无法每天观察实际需求,并且不经常采样,因此实际上等同于间歇性需求问题。他的“速率”可以被描述为在12/16; 2时有3个异常(脉冲)的随机游动。 / 02; 2/27。我们在这里的想法是将速率建模为间隔的函数,然后预测间隔,然后预测需求。您似乎已经将需求建模为间隔的函数,获得了简单的平均速率,在这种情况下严重/不利受3个异常数据点影响且未反映自回归结构。
IrishStat'3

2
当然,这不可能是一个随机的过程,因为销售额只能上升或保持不变(相当于库存只能下降或保持不变),更像是续签过程。另外,我不确定您如何确定3点是异常值。(顺便说一句,我建议的“分析”只是他自己的一般化版本,具有不可持续的线性假设,因此我个人不会对此表示满意。)
共轭木

@ConjugatePrior比率作为时间间隔的函数表明,该比率在很大程度上取决于先前的比率,并且还受到三个“异常比率”的影响。没有发现水平转移。我应该说的是,该速度是随机行走,没有常数,因此没有明显的趋势。
IrishStat'3

1
@IrishStat非常感谢您的回答。我将使用传递函数来阅读有关间歇性需求的信息。一个小小的更正:我们不必预测间隔。我们必须根据速率的预测来决定何时访问机器。例如,一项业务规则可能是“在机器空缺60%时访问机器”
Ivan Dimitrov 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.