一、引言
就餐饮企业而言,经常会碰到如下问题:
由于餐饮行业是生产和销售同时进行,因此销售预测对于餐饮企业十分必要。如何基于菜品历史销售数据,做好餐饮销售预测,以便减少菜品脱销现象和避免因备料不足而造成的生产延误,从而减少菜品生产等待时间,提供给客户更优质的服务,同时可以减少安全库存量,做到生产准时制,降低物流成本。
餐饮销售预测可以看作是基于时间序列的短期数据预测,预测对象为具体菜品销售量。
常用按时间顺序排列的一组随机变量来表示一个随机事件的时间序列,简记为;用表示该随机序列的n个有序观察值,称之为序列长度为n的观察值序列。
时间序列分析的的目的就是给定一个已被观测了的时间序列,预测该序列的未来值。
常用时间序列模型:
模型名称 | 描述 |
平滑法 | 平滑法常用于趋势分析和预测,利用修匀技术,削弱短期随机波动对序列的影响,使序列平滑化。根据所用平滑技术的不同,可具体分为移动平均法和指数平滑法。 |
趋势拟合法 | 趋势拟合法把时间作为自变量,相应的序列观察值作为因变量,建立回归模型。根据序列的特征,可具体分为线性拟合和曲线拟合 |
组合模型 | 时间序列的变化主要受到长期趋势(T)、季节变动(S)、周期变动(C)和不规则变动这四个因素的影响。根据序列的特点,可以构建加法模型和乘法模型。 加法模型: 乘法模型: |
AR模型 | |
MA模型 | |
ARMA模型 | |
ARIMA模型 | 许多非平稳序列差分后会显示出平稳序列的性质,称这个非平稳序列为差分平稳序列。对差分平稳序列可以使用ARIMA模型进行拟合 |
ARCH模型 | ARCH模型能准确的模拟时间序列变量的波动性的变化,适用于序列具有异方差性并且异方差函数短期自相关 |
GARCH模型及其衍生模型 | GARCH模型称为广义ARCH模型,是ARCH模型的扩展。相比于ARCH模型,GARCH模型及其衍生模型更能反映实际序列中的长期记忆性、信息的非对称性等性质。 |
二、时间序列的预处理
拿到一个观察值序列后,首先要对它的纯随机性和平稳性进行检验,这两个重要的检验称为对序列的预处理。根据检验结果可以将序列分为不同的类型,对不同的类型的序列会采取不同的分析方法。
对于纯随机序列(白噪声序列),序列的各项之间没有任何相关关系,序列在进行完全无序的随机波动,可以终止对该序列的分析。白噪声序列是没有信息可提取的平稳序列。
对于平稳非白噪声序列,它的均值和方差是常数,现在已有一套非常成熟的平稳序列的建模方法。通常是建立一个线性模型来拟合该序列的发展,借此提取该序列的有用信息。ARMA模型是最常用的平稳序列拟合模型。
对于非平稳序列,由于它的均值和方差不稳定,处理方法一般是将其转化为平稳序列,这样就可以应用有关平稳时间序列的分析方法,如建立ARMA模型来进行相应的研究。如果一个时间序列经差分运算后具有平稳性,则该序列为差分平稳序列,可以使用ARIMA模型进行分析。
1.平稳性检验
(1)平稳时间序列的定义
(2)平稳性的检验
对序列的平稳性的检验有两种检验方法,一种是根据时序图和自相关图的特征做出做出判断的图检验,该方法操作简单、应用广泛,缺点是带有主观性;另一种是构造检验统计量进行检验的方法,目前最常用的方法是单位根检验。
1)时序图检验:根据平稳序列的均值和方差都为常数的性质,平稳序列的时序图显示该序列值始终在一个常数附近随机波动,而且波动的范围有界;如果有明显的趋势性或者周期性,那它通常不是平稳序列。
2)自相关图检验:平稳序列具有短期相关性,这个性质表明对平稳序列而言,通常只有近期的序列值对现在值的影响比较明显,间隔越远的过去值对现时值得影响越小。随着延迟期数k的增加,平稳序列的自相关系数(延迟k期)会比较快的衰减趋向于零,并在零附近随机波动,而非平稳序列的自相关系数衰减的速度比较慢,这就是利用自相关图进行平稳性检验的标准。
3)单位根检验:单位根检验是指检验序列中是否存在单位根,如果存在单位根就是非平稳时间序列了。
2.纯随机性检验
如果一个序列是纯随机序列,那么它的序列值之间应该没有任何关系,即满足 y(k)=0,k!=0 这是一种理论上才会出现的理想状态,实际上纯随机序列的样本自相关系数不会绝对为零,但是很接近零,并在零附近随机波动。
随机性检验也称为白噪声检验,一般是构造检验统计量来检验序列的纯随机性,常用的检验统计量有Q统计量、LB统计量,由样本各延迟期数的自相关系数可以计算得到检验统计量,然后计算出对应的p值,如果p值显著大于显著性水平,则表示该序列不能拒绝纯随机的原假设,可以停止对该序列的分析。
三、平稳时间序列分析
ARMA模型的全称是自回归移动平均模型,它是目前最常用的拟合平稳序列的模型。它又可以细分为AR模型、MA模型和ARMA模型三大类。都可以看作是多元线性回归模型。
1.AR模型
2.MA模型
3.ARMA模型
4.平稳时间序列建模
某个时间序列经过预处理,被判定为平稳非白噪声序列,就可以利用ARMA模型进行建模。计算出平稳非白噪声序列的自相关系数和偏自相关系数,再由AR(p)模型、MA(q)模型和ARMA(p,q)的自相关系数和偏相关系数的性质,选择合适的模型。平稳时间序列建模步骤如下:
1)计算AFC和PACF。先计算非平稳白噪声序列的自相关系数(AFC)和偏自相关系数(PAFC)。
2)ARMA模型识别。也称为模型定阶,由AR(p)模型、MA(q)和ARMA(p,q)模型的自相关系数和偏自相关系数的性质,选择合适的模型。识别的原则如下表:
ARMA模型识别原则
模型 | 自相关系数(AFC) | 偏自相关系数(PACF) |
AR(p) | 拖尾 | p阶截尾 |
MA(q) | q阶截尾 | 拖尾 |
ARMA(p,q) | p阶拖尾 | q阶拖尾 |
3)估计模型中未知参数的值并进行参数检验。
4)模型检验。
5)模型优化
6)模型应用:进行短期预测。
四、非平稳时间序列分析
事实上,自然界中绝大部分序列都是非平稳的。因而对非平稳序列的分析更普遍、更重要,创造出来的分析方法也更多。
对非平稳序列的分析方法可以分为确定性因素分解的时序分析和随机时序分析两大类:
(1)确定性因素分解:
确定性因素分解方法把所有序列的变化都归结为4个因素(长期趋势、季节变动、循环变动和随机波动)的综合影响,其中长期趋势和季节变动的规律性信息通常比较容易提取,而由随机因素导致的波动则非常难确定和分析,对随机信息浪费严重,会导致模型拟合精度不够理想。
(2)随机时序分析:
随机时序分析方法的发展就是为了弥补确定性因素分解方法的不足。根据时间序列的不同特点,随机时序分析可以建立的模型有ARIMA模型、残差自回归模型、季节模型、异方差模型等。
1.差分运算
(1)p阶差分
相距一期的两个序列值之间的减法运算称为1阶差分运算。
(2)k步差分
相距k期的两个序列值之间的减法运算称为k步差分运算。
2.ARIMA模型
差分运算具有强大的确定性信息提取能力,许多非平稳序列差分后会显示出平稳序列的性质,这是称这个非平稳序列为差分平稳序列。对差分平稳序列可以使用ARMA模型进行拟合。ARIMA模型的实质就是差分运算与ARMA模型的组合,掌握了ARMA模型的建模方法和步骤后,对序列建立ARIMA模型是比较简单的。
差分平稳序列建模步骤:
实例:对某餐厅的销售数据进行建模
#-*- coding: utf-8 -*-
#arima时序模型
import pandas as pd
#参数初始化
discfile = '../data/arima_data.xls'
forecastnum = 5
#读取数据,指定日期列为指标,Pandas自动将“日期”列识别为Datetime格式
data = pd.read_excel(discfile, index_col = u'日期')
#时序图
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号
data.plot()
plt.show()
#自相关图
from statsmodels.graphics.tsaplots import plot_acf
plot_acf(data).show()
#平稳性检测
from statsmodels.tsa.stattools import adfuller as ADF
print(u'原始序列的ADF检验结果为:', ADF(data[u'销量']))
#返回值依次为adf、pvalue、usedlag、nobs、critical values、icbest、regresults、resstore
#差分后的结果
D_data = data.diff().dropna()
D_data.columns = [u'销量差分']
D_data.plot() #时序图
plt.show()
plot_acf(D_data).show() #自相关图
from statsmodels.graphics.tsaplots import plot_pacf
plot_pacf(D_data).show() #偏自相关图
print(u'差分序列的ADF检验结果为:', ADF(D_data[u'销量差分'])) #平稳性检测
#白噪声检验
from statsmodels.stats.diagnostic import acorr_ljungbox
print(u'差分序列的白噪声检验结果为:', acorr_ljungbox(D_data, lags=1)) #返回统计量和p值
from statsmodels.tsa.arima_model import ARIMA
data[u'销量'] = data[u'销量'].astype(float)
#定阶
pmax = int(len(D_data)/10) #一般阶数不超过length/10
qmax = int(len(D_data)/10) #一般阶数不超过length/10
bic_matrix = [] #bic矩阵
for p in range(pmax+1):
tmp = []
for q in range(qmax+1):
try: #存在部分报错,所以用try来跳过报错。
tmp.append(ARIMA(data, (p,1,q)).fit().bic)
except:
tmp.append(None)
bic_matrix.append(tmp)
bic_matrix = pd.DataFrame(bic_matrix) #从中可以找出最小值
p,q = bic_matrix.stack().idxmin() #先用stack展平,然后用idxmin找出最小值位置。
print(u'BIC最小的p值和q值为:%s、%s' %(p,q))
model = ARIMA(data, (p,1,q)).fit() #建立ARIMA(0, 1, 1)模型
model.summary2() #给出一份模型报告
model.forecast(5) #作为期5天的预测,返回预测结果、标准误差、置信区间。
(1)检验序列的平稳性
原始序列的时序图:显示了该序列具有明显的单调递增趋势,可以判断为是非平稳序列
原始序列的自相关图:显示自相关系数长期大于0,说明序列间具有很强的长期相关性。
原始序列的ADF检验结果为: (1.8137710150945274, 0.9983759421514264, 10, 26, {'1%': -3.7112123008648155, '5%': -2.981246804733728, '10%': -2.6300945562130176}, 299.46989866024177)
上表的单位根统计量对应的p值显著大于0.05,最终将该序列判断为非平稳序列(非平稳序列一定不是白噪声序列)。
(2)对原始序列进行一阶差分,并进行平稳性和白噪声检验
1)对一阶差分后的序列再次做平稳性判断
一阶差分之后序列的时序图:在均值附近比较平稳的波动
一阶差分之后序列的自相关图:表现出很强的短期相关性
差分序列的ADF检验结果为: (-3.1560562366723532, 0.02267343544004886, 0, 35, {'1%': -3.6327426647230316, '5%': -2.9485102040816327, '10%': -2.6130173469387756}, 287.5909090780334)
一阶差分后的单位根检验p值小于0.05,所以一阶差分之后的序列是平稳序列。
2)对一阶差分后的序列做白噪声检验
差分序列的白噪声检验结果为: (array([11.30402222]), array([0.00077339]))
输出的p值远小于0.05,所以一阶差分之后的序列是平稳非白噪声序列。
( 3)对一阶差分之后的非平稳白噪声序列拟合ARMA模型
首先进行模型定阶。即确定p和q。
方法一:人为识别:根据ARMA模型识别原则进行识别
一阶差分后自相关图显示出1阶截尾,偏自相关图显示出拖尾性,所以可以考虑用MA(1)模型拟合1阶差分后的序列,即对原始序列建立ARIMA(0,1,1)模型。
方法二:相对最优模型识别
计算ARMA(p,q)。当p和q均小于等于3的所有组合的BIC信息量,取其中BIC信息量达到最小的模型阶数。
计算完成BIC矩阵如下:
p值为0,q值为1时最小的BIC值为430.1374。p,q定阶完成。
用AR(1)模型拟合一阶差分后的序列,即对原始序列建立ARIMA(0,1,1)模型。虽然两种方法建立的模型是一样的,但是模型是非唯一的,可以检验ARIMA(1,1,0)和ARIMA(1,1,1),这两个模型也能通过检验。
接下来对一阶差分后的序列拟合AR(1)模型进行分析
1)模型检验。残差为白噪声序列,p值为:0.627016
2)参数检验和参数估计如下表
(4)ARIMA模型预测
五、Python主要时序算法
python实现时序模式的主要库是StatsModels,算法主要是ARIMA模型,在使用该模型进行建模时,需要进行一系列判别操作,主要包含平稳性检验、白噪声检验、是否差分、AIC和BIC指标值、模型定阶,最后再做预测。