APP下载

基于单品卷烟销量的预测方法研究

2021-11-13刘际鑫仇道霞

新一代信息技术 2021年13期
关键词:季节性卷烟销量

宋 楠,刘际鑫,李 林,仇道霞

(山东省烟草专卖局(公司),山东 济南 250101)

0 引言

1 Holt-Winters模型

通过分析多个地市的卷烟销量数量发现,卷烟的销量存在季节性的变化规律,卷烟销量和卷烟销量增长率在时间序列上存在着一段周期的与下一个周期的关联。

Holt和Winters将Holt方法进行拓展用来捕获季节因素。Holt-Winters季节性方法包括预测方程和三个平滑方程:一个用于水平lt,一个用于趋势bt,另一个用于季节性分量st,相应的平滑参数分别为2α β和γ。我们用m来表示季节频率,即一年中包含的季节数。例如,季度数据的m=4,月度数据的m=12这种方法有两种不同的季节性组成部分。当季节变化在该时间序列中大致保持不变时,通常选择加法模型;而当季节变化与时间序列的水平成比例变化时,通常选择乘法模型。

在加法模型中,季节性分量在观测序列的尺度上以绝对值表示,在水平方程中,时间序列通过减去季节分量进行季节性调整,并且每年的季节性分量加起来大约为零。在乘法模型中,季节性分量用相对数(百分比)表示,时间序列通过除以季节性分量来进行季节性调整,并且每年的季节性分量加起来约为m。

1.1 Holt-Winters加法模型

加法模型的分量形式为:

水平方程表示在 t时刻,季节性调整的观察值 (yt - st-m)与非季节性预测值 ( lt-1+ bt-1)之间的加权平均值。趋势方程与Holt线性方法相同。季节性方程表示当前季节性指数, ( yt- lt-1- bt-1),和去年同一季节(即m个时间段前)的季节性指数之间的加权平均值。季节性分量的方程通常表示为:

如果用平滑方程中的lt代替上述分量形式中的水平,可以得到:

2.1 两组女性血清中AsAb抗体水平检测结果比较 在AsAb-T检测水平方面,不孕不育组总阳性率(65.8%)与健康对照组总阳性率(5.4%)相比明显提高(P<0.05);其中不孕不育组女性血清IgG-AsAb、IgM- AsAb、IgA- AsAb的总阳性率均明显高于健康对照组(均P<0.05)。见表1。

与规定的季节性分量的平滑方程相同,其中γ = γ*( 1 - α )。通常的参数限制是 0 ≤ γ*≤ 1,将其转换为0 ≤ γ ≤ 1 -α。

1.2 Holt-Winters乘法模型

乘法模型的分量形式为:

以一个卷烟单品为例,从日销量图可以看出,单品的每日销量有周期性的规律,日销量数据也可以保持一段时间的趋势性。holt-winters算法主要考虑的是趋势性和周期性,因此可以使用holt-winters算法对单品的销量数据进行推断。但是我们从日销量图中也可以看出,销量数据也会出现较大的波动,这些波动很难捕捉到,而且会对基于holt-winters的销量推断产生影响,由于这些销量数据是真实的,不是由于数据填充错误导致的,因此后面我们引入prophet算法。

图1 卷烟销量波动图Fig.1 Fluctuation chart of cigarette sales

2 prophet模型

prophet算法模型不仅可以处理时间序列存在一些异常值的情况,也可以处理部分缺失值的情形,还能够几乎全自动地预测时间序列未来的走势。prophet算法模型是基于时间序列分解和机器学习的拟合来做的,其中在拟合模型的时候使用了pyStan这个开源工具,因此能够在较快的时间内得到需要预测的结果。使用prophet模型可以构建趋势项模型、构建季节性趋势、对节假日效应进行预估。

2.1 趋势项模型

在Prophet算法里面,趋势项有两个重要的函数,一个是基于逻辑回归函数(logistic function)的,另一个是基于分段线性函数(piecewise linear function)的。

如果回顾逻辑回归函数的话,一般都会想起这样的形式:

式(6)中C称为曲线的最大渐近值,k表示曲线的增长率,m表示曲线的中点。当C=1,k=1,m=0时,恰好是常见的 sigmoid函数的形式。从sigmoid的函数表达式来看,它满足的微分方程为:

那么,使用分离变量法来求解微分方程y′=y(1-y),可以得到:

在Prophet里面,是需要设置变点的位置的,而每一段的趋势和走势也是会根据变点的情况而改变的。在程序里面有两种方法,一种是通过人工指定的方式指定变点的位置;另外一种是通过算法来自动选择。在默认的函数里面,Prophet 会选择n_changepoints = 25个变点,然后设置变点的范围是前80%(changepoint_range),也就是在时间序列的前 80%的区间内会设置变点。通过forecaster.py里面的set_changepoints函数可以知道,首先要看一些边界条件是否合理,例如时间序列的点数是否少于n_changepoints 等内容;其次如果边界条件符合,那变点的位置就是均匀分布的,这一点可以通过np.linspace这个函数看出来。

假设已经放置了S个变点了,并且变点的位置是在时间戳 sj,1≤j≤s上,那么在这些时间戳上,需要给出增长率的变化,也就是在时间戳sj上发生的 change in rate。可以假设有这样一个向量: δ ∈Rs,其中δj表示在时间戳sj上的增长率的变化量。如果一开始的增长率使用k来代替,则在时间戳t上的增长率是:

以实际的烟草销量数据为例,通过销量数据可以得出,销量数据是存在分段线性销量趋势的,因此可以通过设置趋势来捕获销量的走势。

图2 卷烟销量趋势项模型分析图Fig.2 Analysis diagram of cigarette sales trend item model

2.2 季节性趋势

几乎所有的时间序列预测模型都会考虑这个因素,因为时间序列通常会随着天,周,月,年等季节性的变化而呈现季节性的变化,也称为周期性的变化。卷烟的销售同样会受季节的影响。对于周期函数而言,大家能够马上联想到的就是正弦余弦函数。而在数学分析中,区间内的周期性函数是可以通过正弦和余弦的函数来表示的:假设f(x)是以2π为周期的函数,那么它的傅立叶级数为:

使用傅立叶级数来模拟时间序列的周期性。假设 P表示时间序列的周期,p=365.25,表示以年为周期,p=7,表示以周为周期。它的傅立叶级数的形式为:

对于以年为周期的序列(P=365.25)而言,N=10;对于以周为周期的序列(p=7)而言,N=3。参数可以形成列向量:

我们以一个单品为例,拆分prophet模型的趋势项与周期项得到如下图所示,改单品整体的销量为下降趋势,有周期性的销量波动。

图3 卷烟销量季节性趋势分析图Fig.3 Seasonal trend analysis of cigarette sales

2.3 节假日效应

通过对时间序列的深度分析,我们发现卷烟的销量除了季节性的变化趋势外,还会受节假日的影响,如春节、中秋等节假日会使卷烟的销量发生比较大的波动,所以我们又结合节假日的特征对模型进行了进一步训练。

在 Prophet算法模型里面,通过对节假日的特征分析,训练得到节假日对卷烟销售的影响和关系。由于每个节假日对时间序列的影响程度不同,例如春节、国庆节是七天的假期,劳动节等假期则较短。因此,不同的节假日可以看成相互独立的模型,并且可以为不同的节假日设置不同的前后窗口值,表示该节假日会影响前后一段时间的时间序列。用数学语言来说,对于第 i个节假日来说,Di表示该节假日的前后一段时间。为了表示节假日效应,需要一个相应的指示函数(indicator function),同时需要一个参数ki来表示节假日的影响范围。假设有L个节假日,那么:

2.4 模型拟合

按照以上的解释,时间序列已经可以通过增长项、季节项、节假日项来构建:

下一步则需要拟合函数,以下以30天卷烟销量预测为例。

根据卷烟日销量数据汇聚成 30天的销量数据,当前的销量为30天的历史销量的总和,使用prophet算法的预测共得到三条销量的曲线,最上面一条为销量预测的上界即最大的销量,中间一条曲线为预测的销量,最下面一条曲线为销量预测的下界,散点为实际的销量,通过图4可以看出,虽然30天总的销量相比于日销量来说数据的分布更稳定,但是依然会数据波动非常大,而且只用销量的数据,算法在预测结果的稳定性方面没有考虑更多的因素,因此引入机器学习与时间序列模型融合的方法,在机器学习特征设计的时候使用了时间序列预测的特征,同时加入了非时间序列的特征。

图4 卷烟销量模型拟合分析图Fig.4 Fitting analysis diagram of cigarette sales model

3 xgboost模型

XGBoost是 boosting算法的其中一种。Boosting算法的思想是将许多弱分类器集成在一起形成一个强分类器。因为XGBoost是一种提升树模型,所以它是将许多树模型集成在一起,形成一个很强的分类器,而所用到的树模型则是CART回归树模型。该算法思想就是不断地添加树,不断地进行特征分裂来生长一棵树,每次添加一个树,其实是学习一个新函数,去拟合上次预测的残差。当训练完成得到k棵树,则需预测一个样本的分数,根据样本的特征,在每棵树中会落到对应的一个叶子节点,每个叶子节点就对应一个分数,最后只需要将每棵树对应的分数加起来就是该样本的预测值:

式(21)中,wq(x)为叶子节点的分数,f(x)为其中一棵回归树。

4 销量预测具体流程

由于时间序列预测销量只能使用历史的销量数据,不能使用其它数据,因此我们采用时间序列模型与机器学习模型融合的方法,模型的设计既使用来时间序列销量特征,又考虑了用户特征等非时间序列销量特征。prophet和 holt-winters时间序列方法作为 xgboost预测的高级特征,目标预测不是直接预测未来的销量,而是预测未来的增长率,这样目标变量的波动范围会小,而且更稳定。通过增长率与当前30天历史的销量就可以计算出未来的 30天销量,7天销量的方法是一致的,只是特征构建不同。

图5 卷烟销量预测流程图Fig.5 Flow chart of cigarette sales forecast

4.1 30天销量预测的特征

表1 30天销量预测的特征表Tab.1 Feature table for 30-day sales forecast

4.2 7天销量的预测特征

表2 7天销量的预测特征表Tab.2 7-day sales forecast feature table

4.3 模型验证

使用2017年1月1日到2020年7月1日,某省三个地市的六种规格的卷烟销量数据,根据MAPE进行验证销量预测的准确率,结果如表3。

表3 卷烟销量预测表Tab.3 Cigarette sales forecast table

6901028315012规格编号的卷烟在使用 2020年5月29号之前的历史数据预测2020年5月30号到6月28号周期30天的销量数据时,从销量数据来看,5月30号到6月28号的销量数据忽然下降很多,导致预测结果有一定的偏差, 与销售部门确认其原因是货源不足等因素干扰。

图6 卷烟销量异常波动图Fig.6 Abnormal fluctuations in cigarette sales

5 结论

为科学的制定市级烟草商业企业的卷烟投放策略,采用基于prophet、Holt-Winters和xgboost模型构成的混合模型,对基于地市乡镇为单位的销量前十的单品卷烟销量进行预测,提高了单品卷烟预测的精确度,在卷烟单品销量预测中取得了较好的结果,但文中的混合模型仅以历史销售数据为输入,相关结论在数据存在政策因素影响时并不适用。

猜你喜欢

季节性卷烟销量
同比增长130%!剑指3万吨销量,丰华黄颡料迎来大爆发
粕类季节性规律:豆粕篇
季节性需求放缓 钾肥价格下行
盘点2018年车企销量
蔬菜价格呈季节性回落
远离季节性过敏
2016年度车企销量排名
上汽通用172万销量下的阴影
卷烟包装痕迹分析
我国卷烟需求预测研究述评