時間序列預測:ARIMA 與 Prophet - 每月工傷件數趨勢

時間序列預測:ARIMA 與 Prophet - 每月工傷件數趨勢

工傷件數有淡旺季嗎?安全改善計畫真的有效嗎?本篇用十年月度工傷資料實測兩大時序模型:統計學派的 SARIMA 與 Meta 開源的 Prophet。實驗跑出一個殘酷的劇情:預設參數的 Prophet 輸給「直接抄去年同月」的天真基準——以及如何用元件圖診斷、調參逆轉的完整過程。


核心貢獻者

George Box (喬治·博克斯)Gwilym Jenkins 於 1970 年出版的《Time Series Analysis》確立了 Box-Jenkins 方法論 (ARIMA),統治統計預測領域半世紀。Box 也是那句名言的作者:「所有模型都是錯的,但有些是有用的」Sean J. Taylor 與 Benjamin Letham (Facebook 核心資料科學團隊) 則於 2017 年開源 Prophet,論文標題《Forecasting at Scale》道盡其設計哲學:讓不懂 ARIMA 的分析師也能做出可靠預測,並把「人的領域知識」變成可調的參數。


為什麼工安需要時間序列?

前兩篇 (Day 40、41) 處理的是「這一筆是不是異常」,這一篇把視角拉高到「整體趨勢往哪走」:

  1. 驗證改善措施:安全改善計畫上線兩年,工傷件數的下降是計畫的功勞,還是本來就在降?
  2. 資源提前部署:如果 7、8 月是工傷旺季 (高溫、疲勞),職安人力與宣導應該 6 月就佈署。
  3. 設定合理目標:明年的工傷目標訂多少?拍腦袋不如讓模型先給一個基準預測。

1. 資料集來源

資料集:合成十年月度工傷件數

備註:延續本系列做法,合成資料才能「埋入已知答案」。真實結構參考常見的製造業型態。

資料集特色與欄位介紹:

2016-01 至 2025-12 共 120 個月,每月工傷件數由三個成分疊加後以 Poisson 分布抽樣 (件數是計數資料,天生就是 Poisson):

  1. 趨勢:2016~2019 穩定在每月約 14 件;2020 年初導入安全改善計畫後,四年間緩降至約 7 件——注意,趨勢裡藏了一個轉折點 (changepoint),這是後面劇情的伏筆。
  2. 季節性:7、8 月高溫疲勞高峰 (+3.5 件)、12 月年底趕工小高峰 (+1.5 件)、2 月春節停工低谷 (-4 件)。
  3. 雜訊:Poisson 隨機性——平均 10 件的月份,實際可能出 6 件也可能出 15 件。

資料切分

  • 訓練集:2016-01 ~ 2024-12 (108 個月)。
  • 測試集:2025-01 ~ 2025-12 (12 個月)——時間序列絕不能隨機切分,只能「用過去預測未來」。

2. 原理

2.0 先學會拆解:趨勢 + 季節 + 殘差

一切時序分析的起手式是 STL 分解,把序列拆成三層:

STL 分解
  • Trend:改善計畫的成效肉眼可見——這條線就是給管理層看的那條線。
  • Seasonal:每年重複的規律 (夏季高峰、春節低谷)。
  • Residual:拆完剩下的隨機波動。如果殘差還有規律,代表模型還有東西沒學到。

2.1 ARIMA:統計學派的正統武功

ARIMA(p, d, q) 由三個零件組成,全部作用在序列自己身上:

零件名稱直覺
AR(p)自回歸這個月的件數,和前 p 個月的件數有關 (慣性)
I(d)差分先做 d 次「這月減上月」,把趨勢消掉,讓序列平穩
MA(q)移動平均這個月的意外波動,會殘留前 q 期預測誤差的影子
  • 平穩性 (Stationarity) 是 ARIMA 的核心信仰:均值與變異數不隨時間改變。趨勢與季節都是「不平穩」,所以要先用差分消掉——這就是 I 的工作。
  • SARIMA 再加一組季節零件 (P, D, Q, s):對「去年同月」做同樣的三件事。本篇用經典設定 SARIMA(1,1,1)×(1,1,1,12)——月資料的萬用起手式。

2.2 Prophet:把預測變成「可調參的曲線擬合」

Prophet 走完全不同的路線——不管自相關,直接把序列建成可分解的加法模型:

y(t)=g(t)+s(t)+h(t)+ϵty(t) = g(t) + s(t) + h(t) + \epsilon_t

  • g(t)g(t) 趨勢:分段線性函數,自動偵測轉折點 (changepoints)——正好對應「某年導入改善計畫」這種結構變化。
  • s(t)s(t) 季節性:用傅立葉級數擬合年週期 (平滑的正弦波疊加)。
  • h(t)h(t) 假日效應:直接把「春節」「颱風假」等日曆事件餵給模型——這是它對亞洲資料特別友善的原因。
  • 設計哲學:每個成分都對應一個人類看得懂的參數,預測錯了可以「看圖診斷」——這一點在後面的實驗會變成主角。

2.3 兩派對照

面向SARIMAProphet
建模對象序列的自相關結構趨勢/季節/假日的顯式函數
前置要求平穩性、定階 (p,d,q)幾乎零門檻,daily/monthly 皆可
轉折點靠差分硬吃原生支援,可調彈性
缺失值/離群值敏感天生耐受
可解釋性ACF/PACF,統計人語言元件圖,管理層語言

3. 實戰

Python 程式碼實作

from statsmodels.tsa.statespace.sarimax import SARIMAX
from prophet import Prophet

# ---- SARIMA:月資料經典設定 (1,1,1)x(1,1,1,12) ----
sarima = SARIMAX(train['y'].values, order=(1, 1, 1),
                 seasonal_order=(1, 1, 1, 12)).fit(disp=False)
pred_arima = sarima.get_forecast(steps=12).predicted_mean

# ---- Prophet:資料表只要兩欄,ds (日期) 與 y (數值) ----
m = Prophet(yearly_seasonality=True, weekly_seasonality=False,
            daily_seasonality=False)
m.fit(train)                                   # train 含 ds, y 兩欄
future = m.make_future_dataframe(periods=12, freq='MS')
pred_prophet = m.predict(future)['yhat'].values[108:]

程式碼重點:

  • Prophet 的 API 是「pandas 進、pandas 出」,對月資料記得 freq='MS' (Month Start)。
  • 評估時多加一個季節性天真基準 (Seasonal Naive):預測值直接抄「去年同月」。任何時序模型都必須先打贏它,否則就是白忙。

4. 模型評估

12 個月留出測試的成績單

模型MAERMSE
Seasonal Naive (直接抄去年同月)2.2502.784
SARIMA (1,1,1)×(1,1,1,12)2.0202.356
Prophet (預設參數)2.3992.824
Prophet (changepoint_prior_scale=0.5)1.4861.652
預測對比圖

劇情分三幕:

第一幕:預設 Prophet 輸給了「抄去年」。MAE 2.399 對 2.250——大名鼎鼎的開源套件,敗給一行 Excel 就能做的天真基準。這不是 Prophet 爛,是預設參數不認識你的資料

第二幕:看圖診斷。Prophet 最大的優勢是可以把模型剖開來看:

Prophet 元件圖
  • 上圖 (趨勢):抓包了!真實趨勢是「2016~2019 平穩、2020 起下降」的折線,但 Prophet 畫成一條從頭降到尾的直線——它把 2020 年的轉折點抹平了。原因:預設 changepoint_prior_scale=0.05 對趨勢轉折非常保守。
  • 下圖 (年季節性):2 月低谷和 7 月高峰有抓到,但多出一堆真實結構裡不存在的小波浪——傅立葉級數把 Poisson 雜訊當成了季節規律。

第三幕:一個參數逆轉。把 changepoint_prior_scale 放寬到 0.5,允許趨勢在轉折點處大膽轉彎——MAE 從 2.399 降到 1.486,反超 SARIMA 奪冠

工安視角的解讀

  • 先立基準再談模型:職安月報本來就會「跟去年同期比」,Seasonal Naive 就是這件事的數學版。模型打不贏它,就繼續用去年同期比,誠實又省錢。
  • 轉折點是有管理意義的:changepoint_prior_scale 調大後模型抓到的那個轉折,正是安全改善計畫的上線時間——模型幫你用數據證明了計畫有效,這比預測本身更有價值。
  • 件數少的廠注意:月工傷件數是小計數 (常常是 0、1、2),Poisson 雜訊相對巨大,任何模型的區間都會很寬。此時重點不是點預測,而是「這個月落在區間外」的警訊功能。

5. 總結

我們學習了時間序列預測的兩大門派:

  • SARIMA:Box-Jenkins 正統,用自回歸+差分+移動平均對付自相關,月資料起手式 (1,1,1)×(1,1,1,12)。
  • Prophet:趨勢+季節+假日的可分解模型,轉折點原生支援,元件圖能「看圖診斷」——本篇它從輸給天真基準到反超奪冠,靠的就是這個可診斷性。
  • 鐵律:永遠先立 Seasonal Naive 基準;時序資料只能按時間切分;預設參數不認識你的資料。
  • 工安啟示:時序模型最大的價值不一定是預測,而是用轉折點與趨勢線證明「改善措施有沒有效」

下一篇是一般教材極少覆蓋、但工安與設備管理天生需要的主題:存活分析 (Survival Analysis)——設備多久會壞?這批員工多久內會出事?時間本身,就是答案。