跳到主要內容

發表文章

關聯規則|除了 Apriori 之外還有什麼?

圖源:Seq2Pat: Sequence-to-pattern generation to bridge patternmining with machine learning. |  AI Magazine Volume 44, Issue 1, Mar 2023, Pages1-130.  # 前言 筆者在 前一篇文章 當中提到了關聯規則分析在製造業當中的相關應用場景,而在本篇文章當中,筆者提到一些關聯規則的變體。正如標題的提問:「關聯規則分析,除了 Apriori   之外還有什麼?」,不外乎正是因為 Apriori 演算法的地位就相當於迴歸分析當中的 簡單線性迴歸 。因為它實在太經典,理論簡單清晰且樸實無華,談到關聯規則分析的演算法不外乎一定會想到 Apriori。但也因為如此,其實用性必定然不如後續各種改良版的演算法。本篇文章依舊不討論理論細節,只聊聊若考量了更多分析要素的情況下,關聯規則演算法可以怎麼玩? # 階層與類別 Multidimensional and Multilevel Association Rules。這是資料分析實務上幾乎會存在的議題,以超市商品銷售分析為例,商品的用途分類、品牌、價位、供應商、是否有打折?是否為當季商品?這些類別屬性本身就是重要的統計資訊來源,而有了類別屬性就能夠依此來賦予階層的資料劃分。經典的購物籃分析當中只到啤酒跟尿布,但若我們將上述屬性給納入分析當中,那麼可能資料本身就要經過更嚴謹的標記處理,甚至是調整演算法本身,才能使分析結果更具詮釋性。 相關參考文獻: Comparison of New Multilevel Association Rule Algorithm with MAFIA. | International Journal of Intelligent Systems Technologies and Applications 6(11):75-81, October 2014, 6(11):75-81. Mining Multi-Dimensional and Multi-Level Sequential Patterns. |  ACM Transactions on Knowledge Discovery from Data (TKDD), 2010, 4 (1), pp.1-37.  #

關聯規則|除了購物籃分析還有什麼?

# 前言 關聯規則分析( Association Rule Analysis ) 大概可以列入所有入門資料科學、數據分析的朋友們,都聽過的一門分析方法,最常見的應用不外乎就是購物籃分析( Basket Analysis ) 與推薦系統,尤其是那個經典的美國超市的「 啤酒與尿布 」 的案例。 這幾乎是筆者現在每次聽到的時候都會直接腦袋放空的案例,直到筆者在某一次的相關技術分享當中聽到有人提到「月餅與烤肉架、柚子與木炭」這項範例,筆者才發自內心一笑 XD 而誠如標題,這篇文章要討論的關聯規則在購物籃分析之外的應用。 白話來說,關聯規則分析,就是計算在資料集當中不同「項目」(item)共同出現的頻率,藉以找出「具有一定統計顯著關聯」的「規則」。而這個「項目」的定義,自然就根據應用的領域而有所不同。例如各位可能也在教科書或者各大教學網站當中看過,關聯規則分析在醫療生技、投資組合、網路資安控管等等的應用。筆者本身所處的產業是電子製造業,理所當然地要來跟各位簡單聊聊關聯規則在電子製造業的相關應用。 # 異常事件偵測 這類的應用與資安控管、金融詐騙等應用相似,都是將關聯規則分析作為「異常檢測」( Anomaly detection )的方法。而製造業常見的異常檢測議題有什麼呢?機台設備的保養檢查、產品品質檢驗、客戶的需求預測。都是常見的應用。 製造業本是高度實體資本集中的產業,任何可能影響產線正常運作與出貨的事件,都很可能造成公司損失。因此,確保產線能正常運作、產品品質無慮,是製造業無時無刻都在關注的事情。而客戶的需求預測,則就不限於電子製造業,日常營運當中包含實體進出貨作業、並且有庫存成本考量的產業,皆是如此。而「精準地預測客戶需求」本身就是一項艱難的任務,即便是大數據與人工智慧技術蓬勃發展的 2024 年也還是一樣 否則每一位資料分析師就都拿資料套個模型炒股發大財去了 。而關聯規則分析則有機會找到異常波動的一些蛛絲馬跡,提前做好防範措施。 相關 理論 應用範例: Interpretable failure risk assessment for continuous production processes based on association rule mining.|Advances in Industrial and Manufacturing Engineeri

時間序列|淺談供應鏈需求預測 其六:階層預測與群組預測

本系列的前五篇文章談到的,幾乎都是單一變數的時間序列資料。也就是假設每一樣產品的需求為獨立,彼此互不影響,每一項產品的預期需求完全分開來預測。但在業界實務當中,我們手頭上的時間序列資料,可能有群組與階層的隸屬關聯,而本系列的最後一篇文章,就是要聊聊具有這種結構關係的需求預測難題。 # 簡單的群組與階層拆分與整併預測 以筆記型電腦為例,假設某品牌商旗下有兩個不同系列的筆記型電腦(姑且就稱為 A 款與 B 款),假設這兩款都可以依照螢幕尺寸再分成 14 吋與 15 吋好了,該品牌的 A 與 B 兩款筆電都銷售全球(就粗略分成亞太、北美洲、歐洲、與新興市場四大地區好了)。有了上述的類別標籤,我們就能依照這些標籤,將過往的銷售數據進行群組與階層的拆分或整併。而在進行需求預測時,無論我們是「由下而上」(Button-up)先將切到最細層級的個別序列資料(例如 A 款的 14 吋筆電在亞太地區的未來預期需求)分別預測之後,再逐層往上堆疊;抑或是「由上而下」(Top-down)先使用彙總到最頂層的序列資料進行預測之後,再依照特定比例拆分到底下各層,這種兩分預測流程,從技術面而言都說得通,相關細節可以參考 該電子書的章節頁面 ,裡頭有十分詳盡的觀念談。 # 同時預測多條時間序列 若我們採行的是「由下而上」的預測方式,且假設我們明確知道同階層或同群組的序列資料當中,彼此具有一定程度的關聯性存在。這種時候就可以使用 向量自迴歸模型 (Vector Autoregression),針對同一階層或者同一群組的時間序列資料來進行預測。然而,就跟其他基於統計學的時間序列預測模型一樣,該方法的使用上要留意一些的限制與假設前提,否則用起來的預測成效也不會好到哪裡去,甚至根本用不起來。 例如最簡單的:當你一次把太多條時間序列綁成一個龐大的矩陣來求解……那麼求解的複雜度指數上升,甚至模型會因為無法收斂而直接跳 Error 給你看。又或者是,你綁在一起預測的這些時間序列壓根沒有統計上的關聯性,那麼為了圖方便性而向量自迴歸模型來做預測的結果,就跟你拿一串隨機序列的資料說要用 ARIMA 模型來準確預測下一步,是一樣的概念。 # 群組與階層的陷阱 延續上個段落所提到的,既然都特地寫了這篇文章,當然不是請讀者們把上面那本電子書的章節看過而已。雖然在業界當中的許多產品需求資料,都能夠依照上述方式來進行群組與階層

時間序列|淺談供應鏈需求預測 其五:中長期預測的挑戰

  筆者在本系列的 上一篇文章 提到,產品生命週期曲線的重要功能之一,是作為中長期需求走勢觀測的基準線。對於許多公司的營運管理、決策規劃單位而言,藉由未來半年甚至一整年的需求預測結果,來制定相對應的中長期營運計畫,是十分常見的事情,但這與中長期預測的難易是兩碼子事。固然我們能參考產品生命週期,來抓出個大概,但實務上,仍需搭配其他輔助方法與資訊,才能讓中長期的預測結果具有參考價值。而這篇文章就是要來分享筆者實際在 3C 電子代工廠建構中長期需求預測模型的相關作法。 1. 為歷史趨勢加掛衰退係數 方法 1. 就是先從歷史資料當中抓出一條筆直的趨勢線,然後針對未來各期的趨勢值,乘上一組衰退係數。例如:我們要產出的是未來半年的預測值,最小的時間顆粒度是 by week(也就是總共要產出未來 26 週的預測值),並且我們假設採用最簡單的線性衰退函數,那麼我們就在這條趨勢線上的未來第一週的趨勢值乘上 26/26;第二週的趨勢值乘上 25/26,依此類推,到了第二十六週的趨勢值則乘上 1/26。藉由該調整方法,讓「根據歷史資料而產生出來的趨勢線」的影響比例,隨著距今時間拉長而降低。 該作法便是假設「根據歷史資料而產生出來的趨勢線」,對時間上距今越近的預測值越管用。若時間上距今越遙遠,那麼參考性理當會越來越低 。 至於這個衰退係數一定要線性的嗎?我能不能用指數衰退?對數衰退?或者其他非線性的衰退方式?我一定要對全部的預測值都乘上衰退係數嗎?能不能在未來的第 N 期的預測值才開始乘上這組衰退係數?筆者的看法是,採用全段未來趨堅的線性衰退,當然是最簡單的作法。但若您有足夠的時間進行相關比較實驗,仔細瞭解手頭上的資料樣貌、以及自己所面臨的預測情境後,再來決定要採用哪種比例衰退方式,一定不會錯。 而讀者們一定還會再問,照上述說法,距今最遙遠那一期的調整後趨勢值,不就一定會很小嗎?沒錯,如果你的最終預測結果,就真的只有這一條「根據歷史資料產生出來的趨勢線」,沒有再加上其他東西或者其他調整程序了,那麼採用這種比例衰退方法,自然會讓越遙遠的未來預測值看起來小得不合理。所以這時候,就要跟筆者在上述提到的方法 2. 來相互搭配。 2. 採用不只一種的趨勢線進行比例調和 方法 2. 的概念也十分容易理解,就是我透過混合不只一條的趨勢線,來產生未來的趨勢參考線。而需要特別留意的是, 每一條趨勢線的資料來

程式 DIY|for 時間序列預測的小工具

IT 工程師的圈子內有個俚語,大意是:「如果已經有人把輪子造出來了,那何必再自己造一次輪子?」,輪子指的即是工具。先撇開程式運作效率以及彈性不談,如果過去已經有人把我們要的功能給寫出來了,且這段程式碼我們也能夠正常取得的化,那我們何必在自己寫一次?這對當今廣義的程式開發工作者而言,是很理所當然的事情。但是反過來說,如果今天我們想要的功能,還沒有人寫出來(當然也有可能是我們不夠神通廣大,沒在公開環境當中找到符合我們需求的玩意兒),那麼自己寫一套,也是很正常的,而這個系列的宗旨即是如此。 在這篇文章之前,筆者已經放了四篇不太好消化的領域知識探討文章。所以這一篇我們就換換口味,談談好久沒提到的程式設計。說是這麼說,但本文所要分享的東西,其實都與過去幾篇「時間序列」主題的文章相關,而些程式碼都放在筆者自己建立的 GitHub repository 當中,裏頭包含了三個 .py 檔,每一個 .py 檔主都是一個簡單的自定義函數。以下分別介紹: # series_rescaler 如函數名稱,「序列的正規化」,其功能是將餵進函數的 Python 數值資料list,依照指定的長短期數(int),進行等比例的長度縮放以及將原始 list 的各期數值給正規化,其正規化的 list 各期數值加總為 1。這項功能要應用於【淺談供應鏈需求預測】的第四篇文章「 產品生命週期 」的相關應用當中。在比較不同長度以及總和數量不同的序列資料,勢必比較基準也得一致才行,而這道函數的功能便是執行了這項前處理功能。 讀著們會好奇,正規化?那麼我能將原本較長的序列資料縮短、也能將原本較短的序列資料拉長嗎?當然,這道函數的功能變是如此,它的原理就是將原本各期的數值資料進行「加總為 1 的正規化處理」後,再依照新的指定期數長短進行等比例的劃分,再依序塞到對應的新位置(即正規化後的新的 list 的 item 順序)當中。而由於前面的步驟已經先經過了「加總為 1 的正規化處理」,所以縮放之後的序列資料,也保有原本的數量比例分佈。惟須留意的是,由於縮放後的各期數字是以迴圈逐項計算的,由於浮點數計算的因素,有可能使縮放後的序列資料加總不完全等於 1,可能有個正負 0.001 之類的浮點數運算差異。如果是非常在乎精準度的使用者,請務必將縮放後的序列資料再檢查一次加總是否剛好為 1。 # sim_calculator

時間序列|淺談供應鏈需求預測 其四:產品生命週期

前一篇文章 當中,我們從殘差分析(Residual Analysis)來瞭解離群值(Outlier)、異常值(Anomaly)、以及事件(Event)之間的關聯與差異,並談如何透過迴歸分析以及 Judgmental forecasting 的方法,來處理需求預測當中的事件影響因素。而既然提到了Judgmental forecasting,我們就在這篇文章談談它的一個特殊支線:「 產品生命週期 」 (Product Life Cycle,PLC)。 # Why Product Life Cycle? 為什麼要特別提到產品生命週期?我們都知道,現在的3C電子產品,大概 1~2 年會改版一次,假設某3C電子產品零售門市對於某款熱銷商品大量進貨,但眼看下一代的產品就要上市了,而門市還有一堆貨既有款式的庫存,這些商品就很容易在日後變成死庫存,資金無法變現。要不就是必須要降價拋售,使門市的獲益減少。而若門市的營運主管,在採購這批商品之際,便考量到的其每一代的產品生命週期(包含:相同品牌相同系列產品的次世代產品、以及相同價格代但是不同品牌的替代商品),那麼就有機會大大降低上述的營運風險。 上述案例是以供應鏈最末端的零售門市來看。假若是站在供應鏈中游的代工廠來看,因為不同世代產品的零件用料很可能不同, BOM 也會跟著不同,這就攸關到工廠的產能規劃、物料管控、採購管理等等問題。若是再往供應鏈中上游的電子零組件供應商、或者上游的原物料供應商,其考量到的就可能是不同世代的製程技術問題,例如一樣是  PCB ,新舊製程的生產時間、機台設備、相關原料成本、對應的目標客群可能都不同。若對於中下游客戶端的產品生命週期毫無概念,一樣會影響到工廠的生產排程以及成本相關問題。 若我們再往上游追溯,從產品設計階段來看,新一代產品該採用哪種新零件?中下游的原料供應以及代工廠產能是否跟得上?是否有必要再為同系列產品推出次世代款式?還是要開發新的系列?這些都是供應鏈需求預測與產品生命週期息息相關的議題。 # PLC在產銷規劃的應用 當然,讀者們可能會說,現在的3C電子產品門市,除非是真的非常熱銷且甫上市的款式,例如:新一代的 iPhone,門市才有可能做庫存,否則現在哪來的門市還呆呆的作做庫存的?當然,這是非常合理的質疑。但品牌商的通路管理、供應鏈上下游節點的採購與庫存管理等等,實質上都是可以再延伸探討

時間序列|淺談供應鏈需求預測 其三:殘差、事件、離群值

前兩篇文章當中,筆者分別提到了時間序列資料的季節週期因子以及趨勢因子,在不同產業以及不同供應鏈環節的需求預測應用實務。而這篇文章,我們就要來談談對基礎時間序列資料解構 ( Time Series Decomposition )的最後一項要素:殘差(Residual),以及在概念上很容易跟其搞混的玩意:包含離群值(Outlier)、異常值(Anomaly)、以及事件(Event)。 # 殘差? 離群值? 異常值? 事件? 造成殘差的原因很多,有些可能事出有因、有些可能剛好只是隨機偏誤。而不同類型的時間序列資料,其隱含的資訊自然也不同。這裡就先簡要說明剛剛提到的幾個觀念詞彙的意涵: 殘差:就是對時間序列資料進行解構,拆離了季節週期以及趨勢項後剩下來的玩意。 離群值:也被稱為極端值,就是與大多數樣本差異甚大的樣本,本身是尚未被拆解的原始資料。 異常值:顧名思義就是異常的樣本。本身也是尚未被拆解的原始資料。 事件:泛指可能導致時間序列資料當中出現離群值、異常值、與殘差的不特定原因。 綜合上述釋義。離群值、異常值、與殘差都是顯示在時間序列資料上的「結果」;而事件則是造成這些結果的原因。而殘差則是離群值與異常值當中 神聖不可分割 的一部份。進一步來談談前三者的關聯,先講講離群值,如果某筆資料被歸納為離群值,那想必是因為該筆資料達成了某些特定條件,使得該資料與其他樣本有很大的差異。 就統計學上經常使用的界定方式為四分位距的 盒狀圖判定方法 、或者是平均數或中位數正負 N 個標準差之類的作法來的取判定門檻,超出這個門檻的就是離群值。 在許多情況下,離群值經常也代表是異常值,但這樣的等價關係並非絕對 。例如:以機器設備的儀表資料而言(例如氣壓計、溫度計、溼度計、震度感測器、聲聞接收器),通常都會有符合其物理意義含的離群值判定範圍,要是出這個範圍,那就真的是異常了。但是在需求預測的時間序列資料上,就不一定了,因為某些波動較大的需求趨勢變動,可能都是事出有因的,而使得某幾筆資料雖落入離群值的範圍當中,但是不代表這些資料就不正常。 這裡指的情況是指從資料面上看起來異常,但是對應到業務面其實是正常的情況。有了上述概念之後,接著才能來談殘差。因為離群值跟異常值,通常與大多數的樣本有著很大的差異。因此,假若某條時間序列資料當中包含了異常值,而我們對整段原始序列資料進行解構之後,通常那一筆異常值資