高校食堂的菜品销量分析

计算机时代 / 2018年02月23日 16:33

新闻

王楚瑜+汪庆华+王楚楚+陈艳辉+华祎恒

摘 要: 针对高校食堂菜品存在的浪费、搭配不佳问题,根据连续85天的用餐人次数据,用时间序列分析研究了用餐人次符合的ARIMA(5,1,3)模型。对济南市高校常见的菜品及年销售数据,用R语言编程,先利用“过半数规则”计算和预测某一菜品销量的好坏,并计算出不同的素菜-素菜、素菜-荤菜之间的销量关联性。最后使用Python编程,用Apriori算法进一步挖掘菜品间的销售关联。

关键词: 时间序列分析; ARMA模型; R语言; 关联规则学习

中图分类号:TP311 文献标志码:A 文章编号:1006-8228(2017)07-65-04

The analysis of dishes sales in university dining room

Wang Chuyu1, Wang Qinghua1, Wang Chuchu1, Chen Yanhui2, Hua Yiheng1

(Shandong University School of Mathematics, Jinan, Shandong 250100, China; 2. Shandong University School of Software)

Abstract: In view of the waste and poor collocation of dishes in university canteens, the model of ARIMA (5,1,6) suiting well the number of customers in the consecutive 85 days is studied. Based on the lists of the most common dishes in the universities in Jinan and the sales of the dishes, with the aid of R language, the 'more than the half' rule is applied to compute a 'k' which predicts the sale of the next month is good or not. Finally, programming in Python, Apriori algorithm is used to further tap the sales correlation between the dishes.

Key words: time series analysis; ARMA model; R language; learning of association rules

0 引言

高校食堂是一个特殊的“经营实体”,高校食堂须考虑如何改善菜肴品质及服务质量。本文用时间序列分析、关联规则挖掘等算法,研究了用餐人次的变化规律,并初步预测了每种菜品销量的涨落。Apriori算法是关联规则学习的一种算法,本文基于此研究了不同菜品之间最强的销量关联性。

1 基于时间序列分析的用餐人次预测

以山东大学为例,“山东大学一多食堂”的两台pos收款机记载了交易时间、交易额、现有余额、用卡次数等数据,我们选择其中2016年10月、11月、12月的用餐数据进行研究,用向量m表示连续85天的用餐人次,在R中绘制m的时间序列图,如图1所示。

根据图1还不能确定m的变化趋势,因此我们继续用时间序列分析方法提取相关信息。

1.1 平稳性检验

运用游程检验法对序列m作平稳性检验:m的均值为996.1412,大于均值的样本个数为N1=41,小于均值的样本个数为N2=44游程数为Nr=22,N=85,游程的均值和方差分别为,Var(Nr)=,且Nr近似服从正态分布,即统计量。游程判别法认为,在给定的显著性水平α=0.05下,若,则认为序列是平稳的,否则认为是非平稳的[1]。根据已知数据计算,得,由游程判别法知,序列m是非平稳序列。

1.2 平稳性检验与白噪声检验

理论上来说,任何一个非平稳时间序列经过多阶差分后都可变成平稳序列。但差分的阶数并非越多越好,过差分会带来信息的严重损失。解决方法是对非平稳序列进行一阶差分,并判断一阶差分后的序列是否具有平稳性。因此,对m进行一阶差分并在R中绘制时间序列图,如图2所示。

tseries程序包含检验时间序列平稳性的adf.test()函数。调用该函数后得到p值是0.01,小于显著性水平(一般取0.1或0.05)。说明diff(m)已经是平稳序列,不需要再对m进行二阶或其他差分处理。

进一步利用Q统计量和LB统计量分别对diff(m)进行白噪声检验,得到表1中的结果。

1.3 模型识别与参数估计

为识别符合diff(m)序列的时间序列模型,应作出自相关函数与偏自相关函数。由图3知,自相关函数与偏自相关函数均呈现拖尾性特点,初步推断diff(m)符合ARMA(p,q)模型。

接着调用arima()函数,使用CSS-ML估计法对该ARMA(5,3)模型进行参数估计,结果如表3所示。

因此diff(m)的拟合结果是:

1.4 模型检验与参数的显著性检验

建立模型后需要对整个模型的有效性进行检验,并进行参数的显著性检验。先调用tsdiag()函数对残差进行白噪声检验。

在图4中,标准残差的序列图呈现出“中间变幅大、两头变幅小”的特点,类似于正态分布的分布函数形态;残差的样本ACF都处于2倍标准差范围内,可近似于零;Ljung-Box检验统计量的p值均大于0.5,明显大于显著水平。上述三點证明了残差服从正态分布,相关信息已被模型提取。

利用SPSS对这9个参数进行显著性检验,取显著水平α=0.05,t值与显著性如表4。

2 菜品销量涨落的预测

用餐人次一定程度上可反映食堂销量的涨落,但涉及具体菜品的销量涨落时,这种研究方法便失去了实际意义。针对具体菜品的销售涨落,可以采用“过半数规则”粗略预测。将食堂菜品分为面条、主食、煲汤、点心、饮品、素菜、荤菜、盖饭8类,并选择每类中销量较好的几种菜品。以这些菜品为范围,调查了近1000名在校学生的日常用餐搭配。

“过半数规则”根据最近k期的销售涨落,来预测下一期的销售。高于平均值的月份用1表示(表示菜品在该月内“畅销”),低于平均值的月份用0表示(表示菜品在该月内“滞销”)。如果在最近k期里1的个数大于等于k/2,那么预测下一个值是1,否则为0。算法的核心在于合理确定k值,解决方案是根据已知的数据,变换不同的k值,比较各预测出错率的大小。

以菜品“西红柿炒鸡蛋”为例,计算出销量的年平均值(除寒暑假),则该菜品在一年内的销售涨落向量是x=[0,1,1,0,0,1,1,0,0]。可以设计出一种简便的编程算法,在R中的主要代码与运行结果如下[4-5]:

pred<-function(x,k) {

n<-length(x);k2<-k/2

pred<-vector(length=n-k) #定义一个长度为n-k的“预测向量”

csx<-c(0,cumsum(x)) #计算之前k期中值为1的个数并储存

for(i in 1:(n-k)) {

if(csx[i+k]-csx[i]>=k2) #如果最近k期里1的个数大于等于k/2

pred[i]<-1 #预测下一期的值是1

else #否则值是0

pred[i]<-0 }

return(mean(abs(pred-x[(k+1):n]))) } #计算预测值与

真实值误差绝对值的均值

不同结果对应了不同k值的预测出错率。本着预测出错率“越小越好”的原则,就“西红柿炒鸡蛋”而言,k取1或5时达到预测出错率的最小值。但是从实际看,易见k=1时参考价值较小,因此留下k=5,预测出错率达到最小0.5。现实解释是:欲预测下一个月“西红柿炒鸡蛋”的销量好坏,只需观测从这个月开始的前5个月销量高涨是否超过3,如果是,则下个月销售高涨,否则是销售低谷。

此种算法只提供了粗略预测方法,预测出错率仍然较高。要精确预测还需运用时间序列分析,此处略。

3 菜品销量的关联性

类似于“牛奶-啤酒”的经典案例,高校食堂不同菜品之间的销售量也具有关联规则[6]。这里先进行关联性的初估计,再结合Apriori算法作精确挖掘。

3.1 关联性的初估计

定义两组数据的关联性:关联性是它们同时上升或下降次数占总观测次数的比例。先将各菜品在9个月内的销量数据以向量的形式储存,并以c1~c8分别表示菜品的类别,以cxy表示各菜品的名称,例如c11表示素菜类中的西红柿炒鸡蛋。

首先研究七种素菜(即西红柿炒鸡蛋c11、清炒花菜c12、清炒土豆丝c13、干煸四季豆c14、菠菜炒蛋c15、家常豆腐c16、海带丝c17)之间49种搭配的销售关联性,以下是代码实现,并将结果以矩阵A11表示[6]:

findud<-function(v) { #定义一个“销售相关性”函数

vud<-diff(v) #定义向量的一阶差分

return(ifelse(vud>0,1,-1))} #如果vud大于0,则函数返回值是1,反之是1

udcorr<-function(x,y) {

ud<-lapply(list(x,y),findud) #针对x与y分别调用findud函数

return(mean(ud[[1]]==ud[[2]]))} #计算同时上升或下降的比例

矩阵元素代表素菜类中第i种菜品和第j中菜品之间的关联性,本着销量关联性“越大越好”的原则,可见c11与c13、c13与c14、c13与c16、c14与c15、c15与c16之间的关联性较高,达0.875。

素菜類与荤菜类(即糖醋里脊c21、水煮牛肉c22、土豆烧肉c23、毛血旺c24、翡翠虾仁c25、清蒸扁鱼c26、口水鸡c27)之间49种搭配的关联性A12可用相同算法计算:

可见,c11与c23、c12与c26、c15与c24和c25之间有较强的销售关联性,而c12与c27的销售关联性很弱。对于销售关联性较大的两种菜品,建议食堂进行捆绑搭配。

3.2 基于Apriori算法的关联规则学习

在搜集数据的同时,受访人的“个人饮食记录”也随之产生。据此用Apriori算法,在Python语言进行关联规则学习。Apriori是一种挖掘关联规则的频繁项集算法,核心思想是通过候选集生成和情节的向下封闭检测两个阶段来挖掘频繁项集。首先找出所有的频集,项集的频繁性至少和预定义的最小支持度一样。然后由频集产生强关联规则,规则必须满足最小支持度和最小可信度。接着使用找到的频集产生期望的规则,产生只包含集合的项的所有规则。一旦这些规则被生成,只有大于用户给定的最小可信度的规则才被留下来。

编程实现过程与运算结果如下,最后得到了销售关联最好的一种菜品组合[7]。

def createC1(dataSet): #构建所有候选项集的集合

return list(map(frozenset, C1)) #使用frozenset,被

“冰冻”的集合,为后续建立字典key-value使用。

def scanD(D,Ck,minSupport): #由候选项集生成符合最

小支持度的项集L。参数分别为数据集、候选项集列表,最小支持度

return retList, supportData

def apriori(dataSet, minSupport=0.5):

C1=createC1(dataSet)

D=list(map(set,dataSet))

L1, supportData=scanD(D, C1, minSupport)

L=[L1]

while (len(L[k-2])>0):

Ck=aprioriGen(L[k-2], k)

Lk, supK=scanD(D, Ck, minSupport)

supportData.update(supK)

L.append(Lk)

k+=1

return L, supportData

在此算法基础上导入“个人饮食记录”中的数据集,得到符合最小支持度的频繁1项集:{'31'}, {'74'}所有符合最小支持度的项集:{'31'},{'74'}, {'74', '31'},頻繁2项集:{'74', '31'}所有符合最小支持度为0.7的项集:{'31'},{'74'}, {'74', '31'}。

由于数据依然较稀疏,关联频集数目仍然较小,此时有c31(猪排盖饭)与c74(优酸乳)的销售关联性最强。

4 结束语

本文用时间序列分析法对连续85天的用餐人次拟合出ARIMA(5,1,3)模型,接着对具体菜品进行粗略的销量涨落预测,再通过简单易行的编程方法,对素菜-素菜类、素菜-荤菜类的销售相关性进行挖掘,得出最优的搭配组合。最后用Apriori算法,发现猪排盖饭与优酸乳的销售关联性最强。用数学建模的方式定量分析不同菜品特征比传统的直观观察更精确,能发现数据间蕴藏的价值,拥有较好的研究前景。关于不同菜品的口味、烹饪方式等属性还有待进一步研究,考察更细致的菜品属性能让销售关联性的挖掘更有现实价值。

参考文献(References):

[1] 周永道,王会琦.时间序列分析及应用(第1版)[M].高等教育

出版社,2015.

[2] 赵华.时间序列数据分析R软件应用(第1版)[M].清华大学出

版社,2016.

[3] 赵玉新.基于R语言时间序列的轿车销量分析及预测[J].电

脑知识与科技,2017.13:16-18

[4] 陈堰平,邱怡轩.R语言编程艺术(第1版)[M].机械工业出版

社,2016.

[5] 高涛,肖楠.R语言实战(第1版)[M].机械工业出版社,2013.

[6] 陈玲玲,尹文俊.高校食堂菜品的综合评价系统[J].科技创新,

2015.33:13-15

[7] CSDN.《使用Apriori算法进行关联分析》[EB/OL].http://

blog.csdn.net/u010454729/article/details/49078505,

2015-10-12.

1.环球科技网遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.环球科技网的原创文章,请转载时务必注明文章作者和"来源:环球科技网",不尊重原创的行为环球科技网或将追究责任;3.作者投稿可能会经环球科技网编辑修改或补充。