針對Time Series Data 通常會觀察原始資料的趨勢(Trend), 季節性/週期性(Seasonality)的狀態或資料中的雜訊.
但這些數據是怎麼取得的呢?
- 趨勢線: 用原始資料的移動平均值(MA)作為長期走勢的觀察. (移動窗口可以自己設定)
- 季節性(Seaonality): 原始資料減去趨勢線
- 雜訊(Residual) : 原始資料減去趨勢線再減去週期性線, 剩下的值認定是噪訊(隨機波動)或短期的變化。
可以自己用Python 完成或者利用 statsmodels 工具來完成。 statsmodels 本身提供許多不同統計模型和統計資料探索的函數。
另外, 也可以計算ACF ( Autocorrelation) , 自相關係數為原始資料 Xt 和 X的lagged Xt+k計算相關係數,ACF 大小可以幫助我們了解數據中週期性的狀態。當lagged 越大 (即K愈大),ACF 通常會逐漸減少,特別是對於沒有長期相關性的數據而言。
$$\rho_k = \frac{\sum_{t=k+1}^{n} (X_t - \bar{X})(X_{t-k} - \bar{X})}{\sum_{t=1}^{n} (X_t - \bar{X})^2}$$
Note:$ \rho_0=1 $
繪製出ACF圖, 若每隔 $i$ 之後都能看到這個峰值, 則可能存週期 $i$。序列資料可能有存在一個以上的週期,如每週會有一個週期, 而每季也有一個週期。
ACF圖( X軸為不同的lag k, Y軸為ACF值)
底下ACF圖說明序列資料沒有存在週期性.
--------------
具有週期性的資料
seasonal_pattern = 10 * np.sin(2 * np.pi * time / 12)
trend = 0.1 * time
noise = np.random.normal(0, 1, size=100)
data = seasonal_pattern + trend + noise
ACF圖( X軸為不同的lag k, Y軸為ACF值)
底下ACF圖說明序列資料存在一個週期性, 在Lag n*K 處都有差不多的峰值, 表示其週期性為 k
沒有留言 :
張貼留言