STL 在做什麼?一個比喻

想像你手上有一首歌的音頻。STL 就像是把這首歌分成三個音軌:低音(趨勢)、節奏(季節性)、背景雜音(殘差)。分開後你才能分析每個部分。
原始資料 = 趨勢 + 季節性 + 殘差
趨勢(長期方向) 季節性(重複規律) 殘差(剩餘雜訊)

三個成分的意義

趨勢(Trend)
資料的長期走向,去掉所有短期波動後剩下的方向。

醫院門診:整體緩慢上升
血壓追蹤:治療後緩慢下降
季節性(Seasonal)
每隔固定週期重複的規律,形狀幾乎每次都一樣。

門診:每年夏天高峰
血壓:每週一最高
殘差(Residual)
去掉趨勢和季節性後剩下的部分,包含隨機噪音和異常事件。

COVID衝擊、
忘記吃藥的血壓飆升
STL 的特色
STL = Seasonal and Trend decomposition using Loess。比傳統方法更穩健,不會被少數異常值干擾整體分解結果。

趨勢是怎麼計算出來的?

STL 用一種叫做 Loess(局部加權迴歸)的方法,像一個「滑動視窗」沿著時間軸移動,在每個時間點只看附近的資料,擬合一條局部平滑曲線。
1
選一個時間點(例如第12個月)
不是看全部資料,只看「附近」的幾個月(視窗大小可調整)
2
對附近資料加權
離這個時間點越近的資料,權重越高;越遠的,權重越低。
異常值因為離正常值遠,自動被降低權重 → 這就是「穩健」的原因
3
在這個點擬合一條直線
用加權最小平方法算出這個點的趨勢值,然後移到下一個點重複
窄(更靈活) 寬(更平滑)
視窗太窄:趨勢線追著每個波動跑,分不清趨勢和季節性
視窗太寬:趨勢線過於平滑,可能錯過真實的趨勢變化
STL 的預設值通常已經很合適,不需要手動調整

季節性是怎麼提取的?

STL 先把資料按「同一個週期位置」分組,再對每組做平滑。例如月資料:把所有的「一月」放在一起,所有的「二月」放在一起,分別估算每個月的季節效應。
1
去掉趨勢後,剩下季節性 + 殘差
原始資料 - 趨勢 = 季節性 + 殘差(兩者加在一起)
2
按週期位置分組
月資料(週期=12):把 2018年1月、2019年1月、2020年1月... 全部放在一起
3
對每組做 Loess 平滑
得到每個月份的「代表季節效應」,讓季節性可以隨時間緩慢演變(不是每年完全一樣)
季節性強度怎麼解讀?
0.6+
強季節性
建議用SARIMA/
Prophet
0.3-0.6
中等季節性
ARIMA也可以
0-0.3
弱季節性
ARIMA就夠

殘差:去掉一切規律後剩下的

殘差 = 原始資料 - 趨勢 - 季節性
殘差理想上應該像「白噪音」:在零附近隨機跳動,沒有任何規律。如果殘差還有規律,代表趨勢或季節性沒有被完全抓到。

殘差告訴你什麼?

大部分時候在 ±小範圍內隨機跳動
代表分解成功,趨勢和季節性被完整抓出來了
!
某幾個時間點殘差特別大
這就是「異常點」!COVID衝擊、儀器錯誤、政策介入,都會在殘差圖中以大峰值或大谷值出現。

這是異常偵測的基礎原理。
?
殘差還有明顯的規律
例如每幾個月固定出現一個高峰 → 可能季節週期設定錯誤,或有另一個尚未被識別的週期

STL vs 傳統分解法(classical)有什麼差?

傳統 classical
❌ 季節性每年完全固定
❌ 對異常值非常敏感
❌ 序列兩端有空白(無法估計)
✅ 計算簡單、速度快
✅ 概念直觀
STL(推薦)
✅ 季節性可以隨時間演變
✅ 對異常值穩健(不被污染)
✅ 序列兩端也有估計值
✅ 適合任何週期
✅ 論文和實務都廣泛使用

為什麼 STL「穩健」?

圖中橘點是異常值(2020 COVID低谷)。
藍線(STL):趨勢幾乎不受影響,因為異常值被自動降低權重。
灰線(classical):趨勢被拉偏,在異常點附近出現不自然的凹陷。

什麼情況用乘法(multiplicative)模型?

加法 additive(一般情況)
季節波動的絕對值固定
例:每年夏天固定多200人,不管總量多少

適合:大多數醫學和社科資料
乘法 multiplicative(特殊情況)
季節波動的比例固定
例:每年夏天多10%,總量越大波動越大

適合:股價、GDP等指數型成長的資料
⚠️ 資料必須全為正值

把所有步驟串在一起:門診資料分解

以您的 ts_hospital_monthly.csv 為例,說明 STL 在每一步實際做了什麼。
原始 趨勢 季節性 殘差

讀圖要點:對照你工具箱的輸出

1
趨勢層(藍線)
應該非常平滑。2020年那裡有沒有出現平緩的下彎?2022年之後有沒有跳高?這是院區開幕和COVID的痕跡。
2
季節性層(粉紅線)
每年的形狀應幾乎一樣(可能緩慢演變)。如果形狀每年都差很多,可能週期設定錯誤。波幅代表季節效應有多強。
3
殘差層(灰線)
大部分在 ±100 以內?那幾個特別大的值就是異常點,對應 COVID(負值)和 2021-08 的資料異常(大正值)。