🗺️ AI 學習與考證地圖
大數據處理 · 時間序列

時間序列:趨勢、季節、預測

每月營收、每小時用電、每秒股價——只要資料是「照時間排好的一串數字」,就是時間序列。它跟一般表格最大的不同:順序本身就是資訊,昨天會影響今天,所以不能隨便打亂、也不能隨便切分。

趨勢/季節/循環/殘差平穩性與差分移動平均/指數平滑ACFARIMA(p,d,q)lag 特徵Walk-forward

💡一句話定義

時間序列(time series)=依時間順序、等間隔記錄的一串觀測值。分析它的目標有兩個:看懂(把序列拆成趨勢、季節、殘差)與預測(用過去推未來)。核心假設是「過去的樣式會延續到未來」——所以方法都在找樣式、也都怕樣式突然改變。

為什麼要獨立成一個主題?因為一般機器學習假設每筆資料獨立(今天這筆和昨天那筆沒關係),時間序列正好相反:相鄰的值高度相關(自相關)。把它當普通表格處理——隨機打亂、隨機切訓練測試——會讓模型偷看未來,分數漂亮、上線就崩。

🧬時序資料的三個特性與四個成分

三個特性:有順序、有自相關、不能隨機打亂

⏱️有順序(ordered)
第 t 筆一定在第 t−1 筆之後。索引是時間(DatetimeIndex),不是任意編號。
🔗有自相關(autocorrelated)
yt 和 yt−1、yt−12 相關。這是「可預測」的來源,也是「不獨立」的原因。
🚫不能隨機打亂(no shuffle)
打亂就等於讓模型用「未來」學「過去」。切分、交叉驗證都要按時間先後。

四個成分:趨勢、季節、循環、殘差

成分長什麼樣生活例子怎麼抓
趨勢 Trend(T)長期往上或往下的方向公司營收逐年成長、人口老化移動平均、線性回歸對時間
季節 Seasonal(S)固定週期重複的起伏(週期已知)每年 12 月零售暴增、每天晚上 8 點用電高峰、每週一客服量多按週期位置取平均(每月/每小時)
循環 Cyclical(C)長期、週期不固定的起伏景氣循環(3–10 年不等)難,常與趨勢合併處理
殘差 Residual/Noise(R)拿掉以上三者後剩下的隨機波動突發新聞、天氣、量測誤差分解後剩下的部分;理想上應像白噪音
加法模型:yt = Tt + St + Rt  乘法模型:yt = Tt × St × Rt 季節起伏「大小固定」用加法;季節起伏「跟著水準放大」(營收越大、旺季差越多)用乘法——乘法取 log 就變加法。

分解(decomposition)就是把 y 拆回這幾條線,例如 statsmodels.tsa.seasonal.seasonal_decompose(y, model="additive", period=12)。看懂分解圖是中級科目二的常見判讀題:趨勢線往上、季節線週期 12、殘差應該沒有明顯樣式。

🎮互動一:時序合成與分解實驗

自己「造」一條 48 個月的序列:拉滑桿控制趨勢斜率、季節振幅、雜訊大小,右邊即時畫出合成後的序列並拆成三條子圖。再看下面兩個面板:一階差分怎麼把趨勢拿掉、ACF 怎麼透露季節週期。

📈 合成序列 y = 100 + 趨勢 + 季節 + 雜訊

↗ 趨勢 T

🌊 季節 S(週期 12)

🎲 殘差 R

Δ 一階差分 yt − yt−1

🔗 自相關函數 ACF(lag 1–24)lag 12、24 有尖峰=季節週期 12

玩法建議:① 斜率拉到 0、振幅拉到 0,只剩雜訊——ACF 全部趴在 0 附近,這就是「白噪音」,無法預測。② 斜率拉大——原序列的 ACF 全部偏高且慢慢衰減(非平穩的典型樣子),差分後趨勢消失、平均回到一條水平線。③ 振幅拉大——ACF 在 lag 12、24 冒出尖峰,這就是季節週期的指紋。

📉平穩性、差分、ACF 與 ARIMA 三個字母

平穩性(stationarity):統計性質不隨時間變

平穩序列的平均數、變異數不隨時間改變,自相關只跟 lag 有關、不跟「現在是哪一年」有關。傳統模型(AR、MA、ARMA)都假設序列平穩,因為「過去的樣式延續到未來」只有在性質不變時才說得通。有趨勢的序列平均數一直在跑,就是非平穩。檢定用 ADF 檢定(Augmented Dickey–Fuller):p 值小 → 拒絕「有單位根」→ 平穩。

差分(differencing):把趨勢減掉

一階差分 Δyt = yt − yt−1:「這個月比上個月多多少」。線性趨勢差分一次就變成常數,所以差分是讓序列平穩最常用的招。季節差分 yt − yt−12:「跟去年同月比」,拿掉季節。差分太多次會把訊號也差掉、變異數反而變大,通常 d ≤ 2。

ACF:序列跟「自己的過去」有多像

自相關函數(ACF, autocorrelation function)在 lag k 的值=yt 與 yt−k 的相關係數。讀圖直覺:

ARIMA(p, d, q):三個字母各管一件事

字母全名意思白話
AR(p)AutoRegressive 自我回歸用過去 p 期的值做回歸預測現在「今天 ≈ a×昨天 + b×前天」。p 看 PACF 在哪截斷
I(d)Integrated 整合(差分)先差分 d 次讓序列平穩,預測完再加回去d=0 本來就平穩、d=1 一階差分(最常見)、d=2 很少
MA(q)Moving Average 移動平均用過去 q 期的預測誤差修正現在「昨天估太高,今天往下修一點」。q 看 ACF 在哪截斷
兩個「移動平均」不是同一件事:ARIMA 裡的 MA(q) 是「過去誤差的加權」,是一個模型;下一節的移動平均(rolling mean)是「過去 w 個值的平均」,是一個平滑技巧。考題會故意放在一起考。另外,SARIMA 在 ARIMA 外再加一組季節性的 (P, D, Q, m),m=季節週期。

🎮互動二:移動平均視窗與指數平滑

用上面合成的同一條序列,拉視窗 w 看移動平均怎麼把雜訊磨平——w 越大越平滑、但也越落後(lag);w=12 剛好吃掉一整個季節週期。再調指數平滑的 α:α 大=相信最新值、反應快;α 小=平滑但遲鈍。

📈 原序列 vs 平滑後

原序列移動平均 rolling(w).mean()指數平滑 ewm(alpha).mean()
# Pandas 寫法(trailing:只用「過去與現在」,不偷看未來)
df["ma3"]  = df["y"].rolling(window=3).mean()        # 前 2 筆是 NaN
df["ma12"] = df["y"].rolling(window=12).mean()       # 吃掉季節,看趨勢
df["ema"]  = df["y"].ewm(alpha=0.3).mean()           # 指數加權:越近權重越大

# 簡單指數平滑的遞迴式:
# s_t = α·y_t + (1−α)·s_{t−1}
# Holt 加趨勢項、Holt-Winters 再加季節項(三參數)
移動平均的兩種用法:① 平滑看趨勢(w 等於季節週期時最乾淨);② 當預測(下一期 ≈ 最近 w 期平均,最陽春的基準線)。指數平滑(exponential smoothing)把「全部過去」都用上但權重指數遞減:α 像「記性」的反面——α=0.9 幾乎只記昨天。

🤖機器學習與深度學習做時序

用 ML 做時序=把「時間」變成特徵

樹模型、線性模型不懂順序,所以要手動把過去塞進欄位:

洩漏(leakage)的典型寫法:shift(-1) 是「明天的值」、rolling(7, center=True) 用到未來 3 天、對整段資料先做 fit_transform 再切分——都讓訓練時偷看到測試期。原則:任何特徵在時間 t 只能用 t 以前(含 t)的資訊。逐行解剖:rolling 移動平均與 shift 落後特徵——shift 正看過去、負偷未來;通論看 資料洩漏互動動畫。

驗證要用 Walk-forward(滾動前進)

不能用普通 K-fold(會隨機打亂)。Walk-forward/TimeSeriesSplit:訓練集永遠在前、驗證集永遠在後,一折一折往前推——第 1 折用 1–12 月訓練、13–15 月驗證;第 2 折用 1–15 月訓練、16–18 月驗證……模擬真實上線「用過去預測未來」。細看 時間序列切分 與 TimeSeriesSplit 讓驗證永遠晚於訓練。

深度學習:RNN/LSTM 天生吃序列

RNN(循環神經網路)一步一步讀序列、把「記憶」傳到下一步;LSTM 用閘門解決長序列的梯度消失,能記住更久以前的樣式。輸入形狀是 (樣本數, 時間步, 特徵數)——例如 (32, 24, 5)=32 段、每段 24 個時間點、每點 5 個特徵。概念看 RNN/LSTM 序列模型、RNN vs LSTM 記憶機制圖解;形狀怎麼讀看 LSTM 的輸入 shape。近年 Transformer 類模型(Temporal Fusion Transformer、PatchTST)也用於長序列預測。

🤔方法怎麼選:五種做法比較

方法核心想法適合弱點
移動平均/指數平滑用最近值的(加權)平均當預測基準線、短期、資料少、要可解釋抓不到複雜樣式;移動平均會落後
Holt-Winters指數平滑 + 趨勢 + 季節三項有明顯季節的單變量序列只用自己的歷史,無法吃外部變數
ARIMA/SARIMA差分平穩後用過去值與過去誤差回歸單變量、平穩或可差分、要統計推論要人工定 p d q、對非線性無力
ML(XGBoost 等)+ lag 特徵把時間攤成特徵欄,當一般回歸多變量、有外部特徵(促銷、天氣)、多條序列特徵工程重、容易洩漏、外推趨勢弱
RNN/LSTM/Transformer模型自己從序列學樣式長序列、大量資料、非線性資料需求大、訓練慢、不易解釋
評估指標:MAE、RMSE(怕大誤差用它)、MAPE(百分比、跨序列可比,但真值接近 0 會爆)。一定要跟天真預測(naive:明天=今天)比——打不贏 naive 的模型沒有價值。

⚠️常見誤區

🔀用 train_test_split 隨機切
測試集裡混著訓練集前後的時間點,模型靠「插值」拿高分。要 shuffle=False 或 TimeSeriesSplit。
🔮rolling 用 center=True 或 shift 負數
特徵用到未來的值,上線時根本拿不到。
📏對整段序列做標準化再切分
scaler 看到測試期的平均與標準差。scaler 只能 fit 訓練期。
🔁把 ARIMA 的 MA 當成移動平均
MA(q) 是過去誤差的加權模型;rolling mean 是平滑技巧。
📉沒檢查平穩就套 ARIMA
有趨勢的序列直接 AR 會得到假相關;先差分或檢定。
🧪沒跟 naive 比
RMSE 看起來小,但「明天=今天」可能更小。基準線永遠先算。

✅自我檢測

Q1. 零售業每年 12 月營收固定飆高、1 月回落,這屬於時間序列的哪個成分?

Q2. ARIMA(2, 1, 0) 中間的「1」代表什麼?

Q3. 下列哪個特徵會造成資料洩漏?

Q4. 月資料的 ACF 圖在 lag 12 與 24 有明顯尖峰,最可能表示?

Q5. 要評估一個月營收預測模型,最合適的驗證方式是?

🎯重點整理

📝 iPAS 考點提醒

時間序列是 iPAS 中級科目二「大數據處理分析與應用」的分析方法考點,也會以程式題出現。常見題型:① 成分辨析——「每年 12 月固定飆高」是季節、「景氣每幾年一波但週期不定」是循環、「逐年成長」是趨勢;② ARIMA 三個字母——AR(p) 用過去值、I(d) 差分次數、MA(q) 用過去誤差;問「ARIMA(1,1,1) 的 1 代表什麼」要分清位置;③ 平穩性——傳統模型要平穩,有趨勢就差分,ADF 檢定 p 值小代表平穩;④ ACF 判讀——慢衰減=非平穩、lag 12 尖峰=月資料的年季節;⑤ 程式題——shift(1) 合法、shift(-1) 洩漏、rolling(center=True) 洩漏、TimeSeriesSplit 不打亂、train_test_split(shuffle=False)。易混點:ARIMA 的 MA(誤差模型)vs 移動平均(平滑技巧);季節(週期固定)vs 循環(不固定)。情境題長相:「某電商要用過去 3 年的日銷量預測下個月,資料有明顯週末效應與雙 11 高峰,應如何切分驗證、哪種模型合適?」答:按時間順序 walk-forward 切分,SARIMA/Holt-Winters 或加 lag 與日曆特徵的 ML 模型,並與 naive 基準比較。

想練情境題與詳解 → AI 學習與考證地圖

❓ 常見問題

季節性和循環性差在哪?

季節性的週期固定且已知(每年、每週、每天),循環性的週期不固定、通常較長(景氣循環 3–10 年)。考題看到「固定每年某月」就是季節,「幾年一波但不規律」就是循環。

為什麼時間序列不能隨機切分?

相鄰時間點高度相關,隨機切分會讓測試集夾在訓練集的時間點之間,模型靠插值拿高分,等於偷看未來。要按時間先後切,驗證集永遠晚於訓練集(TimeSeriesSplit/walk-forward)。

什麼是平穩性?為什麼要差分?

平穩指平均數、變異數不隨時間變,自相關只跟 lag 有關。AR/MA/ARMA 假設序列平穩;有趨勢的序列平均數一直變,所以先做一階差分(y_t − y_{t−1})把趨勢拿掉,這就是 ARIMA 的 I(d)。

ARIMA 的 MA 和移動平均一樣嗎?

不一樣。ARIMA 的 MA(q) 是「用過去 q 期的預測誤差修正現在」的模型;移動平均(rolling mean)是「過去 w 期值的平均」的平滑技巧,常用來看趨勢或當陽春預測。

lag 特徵怎麼做才不會洩漏?

任何特徵在時間 t 只能用 t 以前(含 t)的資訊:shift 用正數、rolling 不加 center=True、通常先 shift(1) 再 rolling;標準化的 scaler 只 fit 訓練期。shift(-1) 或對整段資料 fit_transform 都是洩漏。

什麼時候用 LSTM 而不是 ARIMA?

資料量大、序列長、樣式非線性、有多個變數時 LSTM/Transformer 較有優勢;單變量、資料少、要可解釋或統計推論時 ARIMA/指數平滑更合適。無論用哪個都要先跟 naive(明天=今天)基準比。

🧭 相關主題

← 返回 AI 學習與考證地圖