上一篇文章當中我們談到,透過對時間序列資料進行解構 (Time Series Decomposition)來取得當中的趨勢與週期特徵,以及使用季節與週期項來做進一步分析應用時該留意什麼,並且以零售、量販市場;以及餐飲服務、民生用品的供應鏈需求預測實務,來說明季節與週期項的可用性。而這篇文章,我們就要來談談上篇文章還未談完的時間序列解構要素:趨勢項與殘差項。
# 簡單的趨勢估計
時間序列資料當中的趨勢,說起來是個簡單且直觀的玩意,但若要進一步分析與應用,則又有不少學問在。先從簡單的彈起,就經典的時間序列解構方法 、以及 STL 方法而言,其都是使用移動平均法的概念,來替已拆離季節週期成份後的原始序列資料,進行移動平均。既然是移動平均,那麼所採用的平均期數,自然就會影響到拆解出來的趨勢項的結果。一般而言,平均的期數越長、拆解出來的曲線就越趨平穩、短期波動的影響性就會降低。選定一個合適的平均期數,是時間序列趨勢分析的基本功。
然而,只瞭解歷史資料當中的趨勢成份一定是不夠的。透過移動平均來瞭解歷史資料當中的趨勢之後,繼續用它來產生未來的預測值,也是很合理的。而提到移動平均,那當然要提一下它的一個特殊的特殊變形:指數平滑法,能夠依照使用者的需求,彈性調整短期波動對未來的影響幅度。除了移動平均,我們當然也可以用歷史資料直接抓一條簡單線性迴歸的直線來做參考,亦或是使用我曾經撰寫過專文介紹的 Theta 模型,其代表的都是過去歷史資料的整體趨勢。基本上,如果你的預測結果還比上面這幾項還差,那表示你的預測模型該砍掉重練了。
# 進階的趨勢估計
簡單估計或拆解過去趨勢的方法不勝枚舉,上面提到的都只是一些通俗的基礎方法。但畢竟這系列文章要討論的是對未來的需求預測,而只透過上述簡單方法求出來的預測值,可用性仍十分有限。因此近年,諸如 Prophet、Silverkite 等厲害的時間序列預測演算法,就提供了不同類型的趨勢線估計方式,除了最基本的線性加法趨勢之外、還有像是指數型態的非線性趨勢。為了反應歷史資料上,不同時間區段的趨勢變化,這兩種演算法也採用所謂的「Changepoints」的設定,使估計出來的趨勢線能更有效反應歷史資料的趨勢轉折。此外,也有像 Orbit 這種不採用 Changepoints,而是以平滑的方式輔以其他彈性調整方法來產生趨勢項。
當我們使用這些時間序列演算法套件的全自動預測功能時,會發現其產生出來的趨勢項以及最終預測值,通常不會太差,但這也是這些自動化的預測演算法的弱點:即當下的我們無法知道,這些「看起來很準」的數字,是否只是模型過適(Over-fitting)的結果?此外,這些趨勢的類型劃定,以及 Changepoints 的設定,是否能跟實際業務面結合,這是我們在使用這些自動化預測模型時,需要格外小心的地方,否則很可能,就會在每一次我們使用這些工具來預估需求的時候,都陷入了參數校準的陷阱。由於本文的重點並非介紹這些自動化的預測演算法,所以關於其各種趨勢類型的計算公式、以及 Changepoints 的數學理論,我們就不在此多談,有興趣的讀者可自行參考這些演算法套件的官方文件。
# 需求預測當中的趨勢線應用
撇開那些複雜設定的趨勢線產生方法不談,時間序列的趨勢線最主要的功能之一,就是作為一條對未來的基準參考線,而其背後簡單且直觀的假設便是:未來的需求,應該不會偏離這條基準線太多。在一些中長期的需求預測應用上,對於距今越遙遠的預測結果,重點通常也不在求準,而是作為當下規劃的參考依據。我們若將這條基準線搭配上歷史資料的標準差或者全距等等統計指標,那麼就能夠在產生出所謂的「判定異常值的上下邊界」。當實際需求超過或低於這些邊界值的時候,相關單位可能該做出一些應對行動。這種概念其實就類似於生產管理的「管制圖法」 (Statistical Process Control,SPC)。
惟需留意的是,在製造業現場的管制圖法,通常是用於設備儀表數值、或者生產良率的一些監控管制,其數值理當落在某個具有物理或者管理意涵的範圍內。因此,其管制圖的範圍通常不會隨著時間而改變。但若我們是用在需求預測的時間序列資料上,就必須特別小心。因為需求的時間序列資料,很可能隨著各種因素的影響,使得其「合理的範圍」跟著改變,而這些改變可能都是合理且事出有因的。因此,在採用這種平均數搭配標準差來計算離群值邊界的作法時,比較適合採用滾動期數的方式來計算。例如:針對過去任意一期的離群值邊界,都是該期往前推三個月(一季)的需求數字的平均數與標準差。如此一來,才能將「時間相依性」的這項特質,反應於異常需求的判定上。
# 3C 電子代工業的產銷需求預測
根據上一個段落的描述,趨勢線的應用,無論是在上、中、下游的供應鏈需求預測當中,其實都有其參考價值在,而在這篇文章當中,筆者想以 3C 電子代工業的產銷需求預測來舉例。為何以 3C 電子代工來舉例呢?因為,3C 電子代工業的季節週期因子的影響,通常不像供應鏈最末端的食品、民生用品的零售、量販業那樣明顯,甚至可能根本不存在季節與週期的特徵,等於說,我們在進行預測時的可用特徵資訊少了一項。
例如:某款筆記型電腦的實際需求(從品牌商提交給代工廠那一段的訂單),可能連續好幾期低於預估值,但是剛好在下一期,就把前面幾期少買的數量給一次補回來了。這種情形在 3C 電子代工業當中其實並不少見,甚至可能都有其對應的合理因素存在,這種需求資料的高低波動,往往更接近於一條隨機序列。而代工廠的現場單位,通常不可能隨著這種混亂邪惡的需求來備人備班備料(這裡指的混亂邪惡,是指站在代工廠的角度而言,會覺這種需求混亂邪惡。而對於品牌商,甚至是供應鏈末端的零售業,自然比較沒這困擾)。這種情況下,一條可靠的趨勢線,就顯得格外重要。
我們可以用下方圖表的範例來說明,我們以前 20 期的歷史資料作為input data,分別建立出三條不同的趨勢線(FCST_{1,2,3})。並比較從 21 到 23 期的預測值與實際值的預測誤差(Gap_{1,2,3},Gap = FCST - Actual)。再複習一次:時間序列的趨勢線最主要的功能之一,就是作為一條對未來的基準參考線。我們可以看到,三條趨勢線的未來三期預測值的樣本標準差差異並不大,但是從預測值的平均誤差就可以明顯看出來,一前一後比下來,FCST_2 的平均誤差最接近 0。
除了向後比較,我們也可以向前比較歷史模擬值的部份。一樣是比較三條趨勢線在過去的 1~20 期的歷史模擬值與實際值的差異量。三者的樣本標準差依舊沒有太顯著的差異,但是從平均誤差看,FCST_1 所代表的過去那段時間的趨勢,表現最穩健(robust)。綜合上述,FCST_1與FCST_2,兩者都可以考慮作為未來預測參考的基準線。而就以筆者的觀點而言,若這條趨勢線只是做為短期的需求預測的基準線,那麼可以優先採用 input data 區間的平均誤差以及標準差等資訊來作為選擇趨勢線的依據,因為過去歷史的趨勢總是最容易反映在頭幾期的預測值上。反之,如果我們要找一條 for 中長期需求預測的趨勢線的話,那麼相對就比較適合一開始提到的「向後比較」的作法。
# 如何評估趨勢線的好壞?
當然,讀者們可能會疑惑,既然要計算預測準確度,為什麼不直接算個 MAPE 就好了?刻意地把好幾期的資料視作一個大的區間來比較其平均誤差的作法,這種做法不是會使得某幾期的正負預測誤差,在合併的過程當中就相互抵消了嗎?沒錯,這就是我們的用意!這裡要留意的是,我們要評鑑的是這條趨勢線的穩健程度,要確認的是這條趨勢線是否能作為一個有效的基準線來使用。但這條 基準線並不一定是最終的預測結果,且我們的目的也不是直接比較其預測準確度。釐清這兩者的目的並不一樣,所以才說,同時要去一整個比較區間的平均誤差以及標準差等統計資訊。而平均誤差沒有取絕對值的用意則是在於,我們希望知道這條趨勢線的估計結果,比較可能偏向多估還是少估,這也是一項挑選基準線的重要因素。而上述特性,對於電子代工廠而言又尤其重要,包含工廠單位的產能規劃會更重視基準線的穩健程度,以及寧可多備料也不要少備料(所以就不能絕對值去看誤差)。
就以筆者目前就在 3C 電子代工業從事需求預測見模的經驗,我得說,需求預測的成效評比方式百百種,換了一種評估方式,結果當然可能就不一樣了,但是看待基準線的標準,基本上不會差到哪裡去。而到底要採用哪種評估方式,還是要以實際面對的問題、資料樣貌、以及業務需求而定。但如果僅止於討論趨勢線在需求預測的應用,上述的比較方式,有其意義。而關於趨勢線在於需求預測的應用,本文就探討到這裡為止。下一篇文章,我們將討論基本時間序列解構的最後一項:殘差項。以及如何處理需求資料當中的異常值。