[IT鐵人賽] [Day1] 時間序列分析:時間序列資料屬性拆解 (附程式碼)

本系列是筆者在 iThome 2021 鐵人賽的主題:【時間序列分析與預測方法大全

兩邊是同一人發文,敬請放心

歡迎來到【時間序列分析與預測方法大全】第一篇!

本篇我們會介紹時間序列資料所包含的屬性
先對資料特性有基本認識後,進入到方法和模型時才不會對各種名詞產生問號哦~

時間序列的變量數目

時間序列資料可能會是單變量或多變量的,例如:

  • 單變量:每日氣溫變化
  • 多變量:每日股市開盤、收盤價

不同的變量個數,適合的分析/預測方法不同、模型架構也會隨之調整;如果有多個變量,我們就需要關注變量間是否存在相關性。

時間序列所包含的屬性

  • 有系統性的變量 (Systemic variable):因為擁有「一致性」或「循環」而可以被建模(能找出一個模式)
    1. Level:一段時間序列內的平均量
    2. Trend:時間序列變化的趨勢,例如比上個時間點增加/減少多少
    3. Seasonality:時間序列中的短期循環(季節性)
  • 非系統性變量 (Non-systemic variable):因為更多是「隨機性」產生,無法被很好的模式化
    1. Noise:現實世界中的時間序列不會像正弦波、餘弦波這樣完美,會存在隨機變動量

所有時間序列資料都有 Level 和 Noise 屬性, Trend 和 Seasonality 則不一定存在

時間序列資料的類型

根據上述 4 種屬性,可以組合出不同類型的時間序列:

  • 相加型 (Additive):屬性相加所形成的時間序列
    • Linear trend:線性增減
    • Linear seasonality:季節性循環和增幅/減幅固定
  • 相乘型 (Multiplicative):屬性相乘所形成的時間序列,可能為二次、高次或指數方程式
    • Non-linear trend:非線性增減
    • Non-linear seasonality:季節性循環和增幅/減幅不固定


[Coding] 使用 statsmodels 將時間序列做成份分解

  • 範例資料:Airline Passenger Dataset
    既然介紹了時間序列會有的屬性,接下來我們用超簡單的範例資料集進行 Python 實作分解,看看分解後的時間序列屬性會是怎樣的:
import pandas as pd
import matplotlib.pyplot as plt

data_uri = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/airline-passengers.csv'
data = pd.read_csv(data_uri, header=0, index_col=0)
data.plot()
plt.show();
airline_passenger_series_plot.png

根據範例中的時間序列資料,我們推測他更像是 Multiplicative 的時間序列類型

from statsmodels.tsa.seasonal import seasonal_decompose
decomposition = seasonal_decompose(data, model='multiplicative')
decomposition.plot()
plt.show();
decomposition_plot.png
decomposition plot

由 decomposition plot 可以看到我們的範例時序資料,呈現出了以下特性:

  • 每年近似線性增長的趨勢
  • 頻率和幅度都幾乎完全固定的季節性
  • 系統性變數之外的殘差則在 1953 年以前及 1958 年以後變異相對較大(不穩定、易有隨機波動)

本篇重點總結

  1. 時間序列屬性可拆解為 4 種,分別是 level, trend, seasonality & noise
  2. 依據不同的屬性組成,時間序列資料的類型可分為兩種,Additive & Multiplicative
  3. 使用 decompose 方法將時間序列中屬性各自分解出來,能幫助我們更具體的描述不同時間序列之間的差異

如果你喜歡本系列的整理,歡迎幫我分享到社群哦!謝謝你的閱讀和回饋!

Leave a Reply