前兩篇文章當中,筆者分別提到了時間序列資料的季節週期因子以及趨勢因子,在不同產業以及不同供應鏈環節的需求預測應用實務。而這篇文章,我們就要來談談對基礎時間序列資料解構 (Time Series Decomposition)的最後一項要素:殘差(Residual),以及在概念上很容易跟其搞混的玩意:包含離群值(Outlier)、異常值(Anomaly)、以及事件(Event)。
# 殘差? 離群值? 異常值? 事件?
造成殘差的原因很多,有些可能事出有因、有些可能剛好只是隨機偏誤。而不同類型的時間序列資料,其隱含的資訊自然也不同。這裡就先簡要說明剛剛提到的幾個觀念詞彙的意涵:
- 殘差:就是對時間序列資料進行解構,拆離了季節週期以及趨勢項後剩下來的玩意。
- 離群值:也被稱為極端值,就是與大多數樣本差異甚大的樣本,本身是尚未被拆解的原始資料。
- 異常值:顧名思義就是異常的樣本。本身也是尚未被拆解的原始資料。
- 事件:泛指可能導致時間序列資料當中出現離群值、異常值、與殘差的不特定原因。
綜合上述釋義。離群值、異常值、與殘差都是顯示在時間序列資料上的「結果」;而事件則是造成這些結果的原因。而殘差則是離群值與異常值當中神聖不可分割的一部份。進一步來談談前三者的關聯,先講講離群值,如果某筆資料被歸納為離群值,那想必是因為該筆資料達成了某些特定條件,使得該資料與其他樣本有很大的差異。就統計學上經常使用的界定方式為四分位距的盒狀圖判定方法 、或者是平均數或中位數正負 N 個標準差之類的作法來的取判定門檻,超出這個門檻的就是離群值。
在許多情況下,離群值經常也代表是異常值,但這樣的等價關係並非絕對。例如:以機器設備的儀表資料而言(例如氣壓計、溫度計、溼度計、震度感測器、聲聞接收器),通常都會有符合其物理意義含的離群值判定範圍,要是出這個範圍,那就真的是異常了。但是在需求預測的時間序列資料上,就不一定了,因為某些波動較大的需求趨勢變動,可能都是事出有因的,而使得某幾筆資料雖落入離群值的範圍當中,但是不代表這些資料就不正常。
這裡指的情況是指從資料面上看起來異常,但是對應到業務面其實是正常的情況。有了上述概念之後,接著才能來談殘差。因為離群值跟異常值,通常與大多數的樣本有著很大的差異。因此,假若某條時間序列資料當中包含了異常值,而我們對整段原始序列資料進行解構之後,通常那一筆異常值資料,也會有著較大的殘差。因此,殘差分析,本身就也是判定離群值與異常值的做法。
# 事件影響因子
理解了箇中關聯與差異之後,就該來瞭解是什麼樣的原因造成離群值或異常值了。一般而言,時間序列的資料當中出現離群值或異常值,那麼經常也可能代表出事了。而這裡也分成兩部份來討論,一個是針對既有資料的離群值肇因分析,以進一步瞭解在建構預測模型的時候,如何處理 input data 當中的離群值。另一個則是針對如何在「已知未來會發生哪些特殊影響事件」的情況下,將這些事件的影響放入預測結果當中。
先談談前者,離群值肇因分析,這十分考驗數據專家與領域專家的相互合作,才能有效且合理的判斷出,離群值資料產生的原因,是否真的跟某些事件有關。即便判斷出有關聯,那麼事件對於真實結果的影響程度、影響範圍、以及影響的方式?這些也都是後續的考驗。若沒有經過這樣的肇因分析流程,建模人員很難知道如何將事件的影響成份,放入預測結果的產出流程當中。
將事件因子轉化成模型參數變數的方法很多,從實務應用角度言,筆者認為,只要該方法能具體解釋業務面的事件影響,那問題都不大。時下一些熱門的自動化時間序列預測演算法如 Facebook 的 Prophet、LinkedIn的 Silverkite ,也都有內建事件影響因子的成份函數在。其原本的功能是節日(Festival)的影響成份,透過模型配適後加掛於最終的預測結果當中,但其也能夠根據使用者自定義的事件因子,自動從資料當中找出指定事件對原始資料的影響。
# 迴歸模型的應用
而以 Prophet 與 Silverkite 而言,其事件項函數的實作原理,就是先將趨勢與季節項從原始序列資料當中拆離之後,再根據使用者自定義的事件時間點,建立一個線性迴歸模型去捕捉對應事件時間點的殘差項,藉以反應未來的事件影響。事實上,本系列的前兩篇文章在用時間序列分析的觀念談需求預測時,都還只談到單一變數的時間序列預測(Univariate Time-Series Forecasting),如果我們能夠知道,我們面對的業務情境當中可能發生的事件,能夠在資料當中以某個固定欄位的形式呈現,且我們也明確知道,這個事件欄位的變數,跟我們的預測值、或者某些過程函數的結果有特定關聯性時,就能考慮使用多元迴歸(Multiple Regression)的方法來建構我們的模型。而迴歸模型的作法其實非常五花八門,本文的重點並非介紹迴歸模型,筆者就僅提到可以使用迴歸模型的作法,來將特殊事件的影響反應到預測結果上。有興趣的讀者可以自行再根據關鍵字,搜尋相關參考資源。。
# Judgmental forecasting
像事件影響因子這類特定情境條件來產生或者調整預測結果的作法,也稱為 Judgmental forecasting ,中文可以直譯成「判定式預測」。Judgmental forecasting 本身也是一個大坑,前述的段落當中我們只提到,若當我們手頭上的原始序列資料存在離群值,在進行後續的殘差分析以及事件因子的調整,可以怎麼看?怎麼做?但是 Judgmental forecasting 探討的是更廣泛的預測情境。例如:新產品導入、市場環境的突發性或者結構性的改變、相關法規政令的更動。這些都是會使需求產生變動的重要因素,而既然都知道了實際需求很可能改變,我們做出的預測值當然也需要有相對應的調整。
Judgmental forecasting 並非只用在需求預測上。事實上,只要是廣義的預測任務,包含自然科學、社會科學,都有其發揮功用的時候。但既然本系列文章探討的是供應鏈的需求預測,那我們還是分享一些典型的事件影響類型。下方的四張圖表,是擷取自這篇期刊論文:
Francois Marmier; Maria Gonzales-Blanch; Naoufel Cheikhrouhou. (2010). "Structuring and integrating human knowledge in demand forecasting: A judgemental adjustment approach". Production Planning & Control, The Management of Operations, Volume 21, 2010 - Issue 4
從學術的角度而言,雖然該論文的被引用數並不算高,但是其點出了幾項在進行需求預測時,會影響到整體趨勢的經典事件修正類型。
可以看到上方表格截圖,其調整於預測結果上面的各期數值,是以獨立欄位的形式,最後再通通加總於未調整前的預測結果上,這其實就是 Generalized linear model 的做法。而如果我們把這些獨立欄位視為迴歸模型的 Y 欄,並搭配其他的衍生資料欄位作為 X 欄,也有機會透過迴歸模型的方式,來估計相對應的事件影響成分的值,也就是 Generalized addictive model 的作法了(當然,要先確認欄位的意義是否能這樣用)。
然而,這也不是說 Judgmental forecasting 就一定好棒棒,無論是單純的事件影響因子調整也好,或者是其他上述提到的案例情境也好。雖然我們知道這些事件會影響到實際需求,但是如何將這些「影響」給明確與精準量化,本身是一項困難的任務,且存在高度的不確定性。就上面那篇論文提到的作法為例,在真實的需求預測場景當中,即便團隊當中有領域專家在,專家們也不見得知道那些對應的調整欄位當中,該填入多少數字才算恰當。
因此,在使用 Judgmental forecasting 這類的手法時,需要格外謹慎並留意許多限制,甚至,只在必要的時候才使用這類的預測或者調整方式。Judgmental forecasting 並非萬靈丹,尤其當我們只是將這些事件因素,用於預測結果的調整,而非完全依照不同事件情境來產生預測值的時候,更該留意這一點(前者是在既有的預測值上再做調整,後者是從無到有產生一個新的預測值,兩者不一樣)。因為,你永遠無法預知,參考了某項事件影響因子來調整預測值之後,調整後的預測值是不是真的會變得更好?這些都只能事後來驗證。
文章開頭圖片來源:
5.4 Residual diagnostics | Forecasting: Principles and Practice (3rd ed)