一、引言
就餐飲企業而言,經常會碰到如下問題:
由於餐飲行業是生產和銷售同時進行,因此銷售預測對於餐飲企業十分必要。如何基於菜品歷史銷售數據,做好餐飲銷售預測,以便減少菜品脫銷現象和避免因備料不足而造成的生產延誤,從而減少菜品生產等待時間,提供給客戶更優質的服務,同時可以減少安全庫存量,做到生產準時制,降低物流成本。
餐飲銷售預測可以看作是基於時間序列的短期數據預測,預測對象爲具體菜品銷售量。
常用按時間順序排列的一組隨機變量來表示一個隨機事件的時間序列,簡記爲;用表示該隨機序列的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指標值、模型定階,最後再做預測。