時間序列分解:將時間序列分解成基本的構建塊
大多數(shù)時間序列可以分解為不同的組件,在本文中,我將討論這些不同的組件是什么,如何獲取它們以及如何使用 Python 進行時間序列分解。
時間序列組成
時間序列是(主要)三個組成部分的組合:趨勢、季節(jié)性和殘差/剩余部分。讓我們簡單的解釋這三個組成部分
趨勢:這是該序列的整體運動。它可能會持續(xù)增加、也可能持續(xù)減少,或者是波動的。
季節(jié)性:系列中的任何常規(guī)季節(jié)性模式。比如,夏季冰淇淋的銷量通常高于冬季。
殘差:這是我們考慮到趨勢和季節(jié)性后剩下的部分。它也可以被認為只是統(tǒng)計噪聲,或者是臨時性事件的影響,這個殘差量也有一個單獨的周期分量,但它通常被歸入趨勢分量。
加法模型與乘法模型
這些組件的組合方式取決于時間序列的性質(zhì)。對于加法模型:
對于乘法模型:
其中 Y 是序列,T 是趨勢,S 是季節(jié)性,R 是殘差分量。
當序列變化的大小尺度一致的時候,加法模型是最合適的。而當序列的波動處于相對和比例范圍內(nèi)時乘法模型是比較合適的。
例如,如果夏季冰淇淋的銷量每年高出 1,000 個,則該模型是加法的。如果每年夏天銷售額持續(xù)增長 20%,但絕對銷售額在變化,則該模型是乘法的。稍后我們將討論一個示例,該示例可以使該理論更加具體。
為了計算和可視化的漸變,可以通過對數(shù)變換或Box-Cox變換將乘法模型轉換為加法模型:
分解是如何工作的
有多種算法和方法可以將時間序列分解為三個分量。以下的經(jīng)典方法,經(jīng)常會使用并且非常直觀。
- 使用移動/滾動平均值計算趨勢分量 T。
- 對序列進行去趨勢處理,Y-T 用于加法模型,Y/T 用于乘法模型。
- 通過取每個季節(jié)的去趨勢序列的平均值來計算季節(jié)分量 S。
- 殘差分量 R 的計算公式為:對于加法模型R = Y-T-R,對于乘法模型R = Y/(TR)。
還有其他幾種可用于分解的方法,例如 STL、X11 和 SEATS。這些是先進的方法,是對經(jīng)典方法的基本方法的補充,并改進了它的缺點。如果有想了解這些最新方法的可以留言,我們單開一篇文章介紹。
Python中進行時間序列分解
這里讓我們使用1948年至1961年的美國航空客運量數(shù)據(jù)集:
從圖中我們觀察到趨勢是增加的,每年也有季節(jié)性。波動的大小隨著時間的推移而增加,因此我們可以說這是一個乘法模型。
statmodels中包含了seasonal_decomposition函數(shù)可以幫我們來分解時間序列,并在我們要在調(diào)用函數(shù)時指定這是一個“乘法”模型:
從上圖中可以看到,該函數(shù)確實成功地捕獲了這三個組成部分。
通過應用Scipy的函數(shù)boxcox ,可以使用Box-Cox變換穩(wěn)定方差,這樣可以將序列轉換為一個加法模型:
這個函數(shù)也很好地捕獲了這三個組件。但是我們看到殘差在早期和后期具有更高的波動性。所以在為這個時間序列構建預測模型時,需要考慮到這一點。
總結
在這篇文章中,我們展示了如何將時間序列分解為三個基本組成部分:趨勢、季節(jié)性和殘差。這三個組成部分的組合產(chǎn)生了實際的時間序列,它們的組合可以是加性的也可以是乘性的。有幾種更新技術可以執(zhí)行分解,如STL, SEAL和X11,但是經(jīng)典的方法簡單并且直觀。最后通過分解時間序列有助于建立對數(shù)據(jù)的理解,從而更容易做出未來的預測。