王楚瑜+汪慶華+王楚楚+陳艷輝+華祎恒
摘 要: 針對高校食堂菜品存在的浪費、搭配不佳問題,根據連續(xù)85天的用餐人次數據,用時間序列分析研究了用餐人次符合的ARIMA(5,1,3)模型。對濟南市高校常見的菜品及年銷售數據,用R語言編程,先利用“過半數規(guī)則”計算和預測某一菜品銷量的好壞,并計算出不同的素菜-素菜、素菜-葷菜之間的銷量關聯性。最后使用Python編程,用Apriori算法進一步挖掘菜品間的銷售關聯。
關鍵詞: 時間序列分析; ARMA模型; R語言; 關聯規(guī)則學習
中圖分類號: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 引言
高校食堂是一個特殊的“經營實體”,高校食堂須考慮如何改善菜肴品質及服務質量。本文用時間序列分析、關聯規(guī)則挖掘等算法,研究了用餐人次的變化規(guī)律,并初步預測了每種菜品銷量的漲落。Apriori算法是關聯規(guī)則學習的一種算法,本文基于此研究了不同菜品之間最強的銷量關聯性。
1 基于時間序列分析的用餐人次預測
以山東大學為例,“山東大學一多食堂”的兩臺pos收款機記載了交易時間、交易額、現有余額、用卡次數等數據,我們選擇其中2016年10月、11月、12月的用餐數據進行研究,用向量m表示連續(xù)85天的用餐人次,在R中繪制m的時間序列圖,如圖1所示。
根據圖1還不能確定m的變化趨勢,因此我們繼續(xù)用時間序列分析方法提取相關信息。
1.1 平穩(wěn)性檢驗
運用游程檢驗法對序列m作平穩(wěn)性檢驗:m的均值為996.1412,大于均值的樣本個數為N1=41,小于均值的樣本個數為N2=44游程數為Nr=22,N=85,游程的均值和方差分別為,Var(Nr)=,且Nr近似服從正態(tài)分布,即統計量。游程判別法認為,在給定的顯著性水平α=0.05下,若,則認為序列是平穩(wěn)的,否則認為是非平穩(wěn)的[1]。根據已知數據計算,得,由游程判別法知,序列m是非平穩(wěn)序列。
1.2 平穩(wěn)性檢驗與白噪聲檢驗
理論上來說,任何一個非平穩(wěn)時間序列經過多階差分后都可變成平穩(wěn)序列。但差分的階數并非越多越好,過差分會帶來信息的嚴重損失。解決方法是對非平穩(wěn)序列進行一階差分,并判斷一階差分后的序列是否具有平穩(wěn)性。因此,對m進行一階差分并在R中繪制時間序列圖,如圖2所示。
tseries程序包含檢驗時間序列平穩(wěn)性的adf.test()函數。調用該函數后得到p值是0.01,小于顯著性水平(一般取0.1或0.05)。說明diff(m)已經是平穩(wěn)序列,不需要再對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中,標準殘差的序列圖呈現出“中間變幅大、兩頭變幅小”的特點,類似于正態(tài)分布的分布函數形態(tài);殘差的樣本ACF都處于2倍標準差范圍內,可近似于零;Ljung-Box檢驗統計量的p值均大于0.5,明顯大于顯著水平。上述三點證明了殘差服從正態(tài)分布,相關信息已被模型提取。
利用SPSS對這9個參數進行顯著性檢驗,取顯著水平α=0.05,t值與顯著性如表4。
2 菜品銷量漲落的預測
用餐人次一定程度上可反映食堂銷量的漲落,但涉及具體菜品的銷量漲落時,這種研究方法便失去了實際意義。針對具體菜品的銷售漲落,可以采用“過半數規(guī)則”粗略預測。將食堂菜品分為面條、主食、煲湯、點心、飲品、素菜、葷菜、蓋飯8類,并選擇每類中銷量較好的幾種菜品。以這些菜品為范圍,調查了近1000名在校學生的日常用餐搭配。
“過半數規(guī)則”根據最近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?,F實解釋是:欲預測下一個月“西紅柿炒雞蛋”的銷量好壞,只需觀測從這個月開始的前5個月銷量高漲是否超過3,如果是,則下個月銷售高漲,否則是銷售低谷。
此種算法只提供了粗略預測方法,預測出錯率仍然較高。要精確預測還需運用時間序列分析,此處略。
3 菜品銷量的關聯性
類似于“牛奶-啤酒”的經典案例,高校食堂不同菜品之間的銷售量也具有關聯規(guī)則[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算法的關聯規(guī)則學習
在搜集數據的同時,受訪人的“個人飲食記錄”也隨之產生。據此用Apriori算法,在Python語言進行關聯規(guī)則學習。Apriori是一種挖掘關聯規(guī)則的頻繁項集算法,核心思想是通過候選集生成和情節(jié)的向下封閉檢測兩個階段來挖掘頻繁項集。首先找出所有的頻集,項集的頻繁性至少和預定義的最小支持度一樣。然后由頻集產生強關聯規(guī)則,規(guī)則必須滿足最小支持度和最小可信度。接著使用找到的頻集產生期望的規(guī)則,產生只包含集合的項的所有規(guī)則。一旦這些規(guī)則被生成,只有大于用戶給定的最小可信度的規(guī)則才被留下來。
編程實現過程與運算結果如下,最后得到了銷售關聯最好的一種菜品組合[7]。
def createC1(dataSet): #構建所有候選項集的集合
return list(map(frozenset, C1)) #使用frozenset,被
“冰凍”的集合,為后續(xù)建立字典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(優(yōu)酸乳)的銷售關聯性最強。
4 結束語
本文用時間序列分析法對連續(xù)85天的用餐人次擬合出ARIMA(5,1,3)模型,接著對具體菜品進行粗略的銷量漲落預測,再通過簡單易行的編程方法,對素菜-素菜類、素菜-葷菜類的銷售相關性進行挖掘,得出最優(yōu)的搭配組合。最后用Apriori算法,發(fā)現豬排蓋飯與優(yōu)酸乳的銷售關聯性最強。用數學建模的方式定量分析不同菜品特征比傳統的直觀觀察更精確,能發(fā)現數據間蘊藏的價值,擁有較好的研究前景。關于不同菜品的口味、烹飪方式等屬性還有待進一步研究,考察更細致的菜品屬性能讓銷售關聯性的挖掘更有現實價值。
參考文獻(References):
[1] 周永道,王會琦.時間序列分析及應用(第1版)[M].高等教育
出版社,2015.
[2] 趙華.時間序列數據分析R軟件應用(第1版)[M].清華大學出
版社,2016.
[3] 趙玉新.基于R語言時間序列的轎車銷量分析及預測[J].電
腦知識與科技,2017.13:16-18
[4] 陳堰平,邱怡軒.R語言編程藝術(第1版)[M].機械工業(yè)出版
社,2016.
[5] 高濤,肖楠.R語言實戰(zhàn)(第1版)[M].機械工業(yè)出版社,2013.
[6] 陳玲玲,尹文俊.高校食堂菜品的綜合評價系統[J].科技創(chuàng)新,
2015.33:13-15
[7] CSDN.《使用Apriori算法進行關聯分析》[EB/OL].http://
blog.csdn.net/u010454729/article/details/49078505,
2015-10-12.