跳到主要內容
Lab Grimoire
TW
請喝咖啡
動手實作

常見分析方法:分群、關聯規則、降維與時間序列

K-means、DBSCAN 與階層分群,支援度、信賴度、提升度的計算,PCA 與 SVD 的性質,以及時間序列的組成與驗證方式。

作者
CY
發表
AI 的資料基礎:從統計到生成式 AI · 第 10/19 篇

本系列第 10 篇|這篇回答:沒有標準答案的資料,要怎麼找出結構與規律? 讀完這篇,你應該能:

  • 依問題本身選擇分群、關聯規則、降維或時間序列,而不是先記住演算法名稱
  • 用手邊的交易次數算出支援度、信賴度與提升度,並解釋提升度大於、等於、小於 1 的差別
  • 說出 K-means、DBSCAN、PCA 的前提與限制,判斷一個場面為什麼適合或不適合

一、分析的四個層次

四層是問題的深度,不能互換,也不能跳過層次。

詳細說明

問法決定方法。描述性分析(descriptive analytics)回答發生了什麼,例如某電商上個月哪些商品常出現在同一筆訂單。診斷性分析(diagnostic analytics)追問為什麼發生,例如是不是某個檔期讓兩類商品同時變多。預測性分析(predictive analytics)問接下來會發生什麼,例如未來一段時間的日銷售。處方性分析(prescriptive analytics)才問該怎麼做,例如庫存與搭售要不要調整。四層是問題的深度,不是可以互換的演算法。

學習方式也要先分開。監督式學習(supervised learning)需要標籤,每一筆已經有答案,模型學的是特徵如何對到那個答案。本篇的分群、關聯規則與降維屬於非監督式學習(unsupervised learning):沒有「正確組別」或「正確規則」可對,目標是把資料裡的結構找出來。結構本身仍停在描述。把它當成進貨決策或下一週的銷售數字,是把層次跳過去了。

時間序列預測對準的是「會發生什麼」,而且觀測沿時間排列。異常偵測要標出不像多數點的觀察。這兩類跟分群、關聯規則、降維回答的不是同一種問題。

二、方法與適用場面

分群

K-means 要先給 k、假設球形群;形狀不規則就用 DBSCAN。

詳細說明

沒有人事先標好組別,只希望相似的點靠近、不相似的分開,用分群。

K-means 要先指定群數 k。它反覆做兩件事:把每個點分給目前最近的中心,再用該群的點更新中心,直到分組幾乎不再變。它假設各群大致呈球形,而且大小相近。特徵尺度差很多,或資料有離群值時,中心會被拉開,所以要先標準化。

k 不是越大越好。群數增加時,群內平方和(within-cluster sum of squares)通常還會下降,因為點離自己的中心更近;這個下降本身不是停止信號。手肘法(elbow method)看的是下降由陡變緩的轉折。輪廓係數(silhouette coefficient)的範圍是 −1 到 1,越高表示點越靠近自己的群、越遠離其他群。

階層式分群(hierarchical clustering)由下而上,每次合併最接近的兩群,過程畫成樹狀圖(dendrogram)。不必事先指定 k,切在樹的哪一層,就得到幾群。

DBSCAN 依密度分群。eps 是鄰域半徑,minPts 是一個點要成為核心點時,鄰域內至少要有的鄰居數。密度夠的區域連成一群,形狀不必是圓的;過於稀疏的點標成雜訊。它不需要指定 k。限制有兩項。各群密度差很多時,很難用同一組 eps 與 minPts 同時適合每一群。維度很高時,距離逐漸失去區辨力,也就是維度詛咒(curse of dimensionality),分群效果變差。

因此,GPS 軌跡若沿彎路排成帶狀,旁邊又有零星雜訊點,球形假設不成立,還要把稀疏點分開,應選 DBSCAN。群大致呈圓形、尺度已經標準化、也知道大約要幾群時,K-means 才對得上它的前提。

高斯混合模型(Gaussian mixture model, GMM)做軟分群:每個點不是只屬於一群,而是得到屬於各群的機率。落在邊界上的點可以對兩群都有部分歸屬。

關聯規則

提升度約 1.11 只是弱正相關,三個數的分母不能互換。

詳細說明

問題若是「交易裡出現 A 時,B 有多常跟著出現」,資料又是一筆筆交易,用關聯規則。這裡沒有連續的預測目標,不必先做 K-means。

三個數的分母不同,不能互換。

支援度(support)是規則覆蓋全部交易的比例:

support(A→B) = 同時含 A 與 B 的交易數 / 總交易數

信賴度(confidence)是在 A 已經出現的條件下 B 出現的比例,即 P(B|A):

confidence(A→B) = support(A,B) / support(A)

提升度(lift)再拿這個條件機率去和 B 自己的支援度比:

lift(A→B) = confidence(A→B) / support(B)

lift > 1 是正相關,lift = 1 是獨立(知道 A 並未改變 B 的出現比例),lift < 1 是負相關。只略大於 1 時,是弱的正相關。

某電商 10 筆交易,含尿布 6 筆、含啤酒 6 筆、同時含兩者 4 筆。規則「尿布→啤酒」:

support = 4/10 = 0.4

support(尿布) = 6/10 = 0.6,所以 confidence = 4/6 ≈ 0.667

support(啤酒) = 6/10 = 0.6,所以 lift = 0.667 / 0.6 ≈ 1.11

用分數再算一次:(4/6) / (6/10) = (4/6) × (10/6) = 40/36 = 10/9 ≈ 1.11。大於 1,所以是正相關;離 1 不遠,所以不強。若把信賴度 0.667 除以規則的支援度 0.4,會得到約 1.67,那是分母用錯,不是提升度。

Apriori 原理用來剪枝:頻繁項目集的所有子集也一定頻繁;某個項目集不頻繁,它的超集合也不頻繁。若 {尿布, 啤酒} 未達支援度門檻,就不必再數 {尿布, 啤酒, 餅乾}。

降維

降維只保住主要變異,不負責分群或預測,分析前要標準化。

詳細說明

欄位多,而你要的是用較少的新變數保住主要變異,用降維。降維不負責把點分成群,也不負責預測下一期。

主成分分析(principal component analysis, PCA)是線性轉換,找出變異最大的正交方向,這些方向就是主成分,彼此不相關。留幾個,看解釋變異比例(explained variance ratio)累加到你要保留的程度。分析前要標準化。否則「年收入(元)」的尺度遠大於「年齡(歲)」,第一主成分會被年收入主導,反映的是單位,不是兩欄的相對變異。

PCA 得到的是原變數的線性組合。若分析需求是留下可解釋的原始欄位,那是特徵選擇,不是 PCA。

奇異值分解(singular value decomposition, SVD)把任意矩陣寫成 A = U Σ Vᵀ。Σ 對角線上的奇異值非負,且由大到小排列。取前 k 個奇異值、其餘當 0,得到低秩近似。推薦系統用它找潛在因子,文字用它做潛在語意分析(latent semantic analysis, LSA)。PCA 可由標準化資料的 SVD 算出。奇異值不能是負數。

t-SNE 與 UMAP 是非線性降維,主要用於視覺化。圖上群與群的距離、群看起來的大小,不宜直接解讀成原始空間的距離或群的規模。它們也不提供「這幾個成分解釋了多少變異」。

時間序列

隨機切分會把未來混進訓練,必須用較早資料預測較晚資料。

詳細說明

觀測沿時間排列,而且要用過去推論未來,用時間序列。日期打亂之後,就不再是這個問題。

序列可以做時間序列分解(time series decomposition):趨勢(trend)是長期走向,季節性(seasonality)是固定週期的起伏,循環(cycle)是長度不固定的起伏,不規則雜訊(irregular noise)是其餘波動。移動平均(moving average)用來平滑短期抖動,方便看趨勢。

ARIMA 需要定態性(stationarity),即平均與變異不隨時間改變。序列若還帶著趨勢、平均一直移動,可先差分,再看差分後是否已接近定態。

驗證要依時間順序切分,用較早的資料訓練、用較晚的一段驗證,也就是以過去預測未來。隨機切成 80/20,或先打亂再做 K-fold,都會把未來混進訓練。scikit-learn 的 TimeSeriesSplit 就是沿時間展開的切法。只報整段期間的整體平均,等於沒有處理趨勢與季節性,也沒有檢驗對下一段時間的誤差。

異常偵測

越容易被孤立的點越異常,|z| 很大代表偏離較遠。

詳細說明

目標是找出少數不像其他點的觀察,而不是把每個點都分進某一群時,用異常偵測。

Isolation Forest 用隨機切分隔離每個點:越容易被孤立的點越異常;落在密集區的點要切很多次才分得出來。

z 分數(z-score)以標準差為單位,看一個點離平均多遠:

z = (x − x̄) / σ

|z| 很大,表示這個點偏離多數觀察較遠。

程式對照

這些是介面範例,不是每份資料都該照抄的參數。

詳細說明

下面是呼叫寫法。n_clusters=4 與 n_init=10 表示分成 4 群,並以不同的初始中心跑 10 次後留下較好的一次。min_samples=5 就是方法裡的 minPts。n_components=0.95 表示保留達到 95% 變異所需的主成分數。這些是介面範例,不是每份資料都該照抄的參數。

from sklearn.cluster import KMeans, DBSCAN
from sklearn.decomposition import PCA
from sklearn.model_selection import TimeSeriesSplit

# X_scaled 為已標準化的特徵矩陣
kmeans = KMeans(n_clusters=4, n_init=10).fit(X_scaled)
dbscan = DBSCAN(eps=0.5, min_samples=5)
pca = PCA(n_components=0.95).fit(X_scaled)
pca.explained_variance_ratio_
TimeSeriesSplit()

explained_variance_ratio_ 在 fit 之後給出每個主成分各自解釋的變異比例。TimeSeriesSplit 用來依時間順序切訓練與驗證。

三、容易混淆的地方

實務上常把「算得出一個數字」和「這個數字能回答的問題」混在一起,也容易把降維、分群、預測放在同一個情境裡。先對照分析目的。

容易混淆 差別在哪 實際遇到時的線索
K-means vs DBSCAN K-means 指定 k,假設群大致呈球形且大小相近,對尺度與離群值敏感。DBSCAN 用 eps 與 minPts 依密度找群,不指定 k,可得到任意形狀,並把稀疏點標為雜訊;各群密度差很大時同一組參數難通用,高維度還有維度詛咒。 資料分佈呈彎曲帶狀且有雜訊點時考慮 DBSCAN;資料已標準化、群呈球形且群數已給定時考慮 K-means。
支援度 vs 信賴度 vs 提升度 支援度是 A 與 B 同時出現的交易佔全部交易的比例。信賴度是 P(B|A),分母是 support(A)。提升度是信賴度除以 support(B);大於 1 正相關,等於 1 獨立,小於 1 負相關。 交易報表需要全部交易中 A 與 B 同時出現的比例時看支援度;要看有 A 時 B 的比例用信賴度;要判斷是否相關及強弱看提升度。
PCA vs t-SNE/UMAP PCA 是線性轉換,主成分彼此不相關,用解釋變異比例決定留幾個。t-SNE/UMAP 是非線性、主要為了畫圖,群間距離和群的大小不宜直接解讀。 分析需求要解釋變異並保留正交成分時用 PCA;只需視覺化且不解讀圖上距離時用 t-SNE 或 UMAP。
PCA vs 特徵選擇 PCA 是非監督降維,新變數是原欄位的線性組合。特徵選擇留下的仍是原來的欄位。 需求要以主成分解釋變異時用 PCA;若要保留哪些原始欄位,則用特徵選擇。
時間序列切分 vs 隨機切分 時間序列以過去預測未來,必須依時間順序切。隨機 80/20 或先打亂再 K-fold,會把未來混進訓練。 預測日銷售、未來幾天或趨勢與季節性時依時間切分;資料流程若打亂或隨機 80/20,不能用於時間序列驗證。

四、基礎練習

第 1 題

某電商有 10 筆交易。含尿布的 6 筆、含啤酒的 6 筆、同時含兩者的 4 筆。規則「尿布→啤酒」的提升度約是多少?它表示什麼關係?

  • (A) 0.4,表示兩者正相關而且很強
  • (B) 約 0.667,正相關但不強
  • (C) 約 1.11,正相關但不強
  • (D) 約 1.67,正相關而且很強
看答案與解析

答案:C

support = 4/10 = 0.4。confidence = 4/6 ≈ 0.667。support(啤酒) = 6/10 = 0.6。lift = 0.667 / 0.6 ≈ 1.11。分數形式是 (4/6) / (6/10) = 10/9 ≈ 1.11。大於 1,所以正相關;只略大於 1,所以不強。

  • (A) 0.4 是支援度 4/10,不是提升度。
  • (B) 0.667 是信賴度 4/6,不是提升度;「正相關但不強」是對 lift ≈ 1.11 的解讀。
  • (D) 0.667 / 0.4 ≈ 1.67 是把信賴度除以規則本身的支援度,分母應為 support(啤酒) = 0.6。

第 2 題

某工廠的搬運車 GPS 點在平面上沿彎曲道路排成帶狀,旁邊還有零星雜訊點。若要找出軌跡群,並把這些稀疏點標成雜訊,較合適的是哪一個?

  • (A) K-means,因為可以事先指定群數
  • (B) DBSCAN,因為它依密度找任意形狀的群,並把稀疏點標為雜訊
  • (C) PCA,因為能把軌跡壓到變異最大的方向
  • (D) 線性迴歸,因為帶狀分佈看起來像一條線
看答案與解析

答案:B

點呈彎曲帶狀,不符合球形;題目又要求把稀疏點標成雜訊,而且不必先指定 k。這正是 DBSCAN 用 eps 與 minPts 在做的事。

  • (A) K-means 假設群大致呈球形且大小相近;零星點會被吸進某一群並拉動中心,而不是標成雜訊。
  • (C) PCA 是線性降維,產生的是主成分,不負責分出軌跡群與雜訊。
  • (D) 線性迴歸是在配一條直線關係,不是依密度分群,也不會把零星點標成雜訊;彎曲帶狀本來就不是一條直線。

第 3 題

分析師準備把「年收入(元)」和「年齡(歲)」放進 PCA。轉換之前應該先做哪一步?

  • (A) 先標準化,否則年收入的大尺度會主導第一主成分
  • (B) 不必處理,PCA 會自行平衡各欄位的尺度
  • (C) 先做 One-Hot,把兩個欄位改成類別代碼
  • (D) 先刪除年齡,只保留年收入
看答案與解析

答案:A

PCA 沿變異最大的方向找主成分。年收入以元計、年齡以歲計,不做標準化時,數值尺度大的年收入會主導第一主成分,方向反映的是單位。

  • (B) PCA 不會自動消除尺度差,所以分析前要標準化。
  • (C) 年收入與年齡已經是數值;One-Hot 解決不了「元」和「歲」的尺度差。
  • (D) 刪除年齡是丟掉一個欄位,不是標準化,也不是 PCA 的前置步驟。

第 4 題

顧客資料要用 K-means 分群,k 還沒決定。哪一種做法符合它選 k 的方式?

  • (A) k 越大越好,因為群內距離會越來越小
  • (B) 固定用 k = 2,分成兩群最清楚
  • (C) 用 R²,選配適最高的那個 k
  • (D) 用手肘法看群內平方和下降的轉折,或用輪廓係數(−1 到 1,越高越好)
看答案與解析

答案:D

K-means 的 k 用手肘法或輪廓係數來選。手肘法看群內平方和下降由陡變緩的位置;輪廓係數越高越好,範圍是 −1 到 1。

  • (A) 群內距離隨 k 變大而變小是預期現象,不是選擇標準;要看的是下降的轉折,或輪廓係數。
  • (B) 方法沒有規定 k 一定是 2,群數要由資料上的轉折或輪廓係數決定。
  • (C) R² 不是 K-means 選 k 的準則;這裡用的是群內平方和的轉折或輪廓係數。

第 5 題

某電商有 3 年的日銷售資料,想預測未來 14 天。哪一種驗證方式符合時間序列的要求?

  • (A) 把 3 年的日資料隨機切成 80/20,當訓練集與驗證集
  • (B) 先打亂日期順序,再做 K-fold
  • (C) 依時間順序切分,用較早的資料訓練、用最後一段期間驗證,並處理趨勢與季節性
  • (D) 只算 3 年的整體平均,用這個平均代表未來 14 天
看答案與解析

答案:C

日銷售要依時間順序切分,以過去預測未來,例如把最後一段期間留作驗證。序列裡的趨勢與季節性也要一併處理,否則模型對上的是被打亂的表格,不是下一段時間。

  • (A) 隨機 80/20 會把較晚的日期混進訓練,違反以過去預測未來。
  • (B) 先打亂再 K-fold 同樣破壞時間順序,未來的銷售會出現在訓練折裡。
  • (D) 整體平均沒有處理趨勢與季節性,也沒有用一段較晚的期間檢驗誤差。

第 6 題

關於 SVD,下列哪一項敘述不正確?

  • (A) 奇異值非負,而且由大到小排列
  • (B) 奇異值可以是負數
  • (C) 取前 k 個奇異值,可以得到低秩近似
  • (D) 這種低秩近似可用於推薦系統的潛在因子
看答案與解析

答案:B

A = U Σ Vᵀ 中,Σ 對角線上的奇異值非負,且由大到小排列。因此「奇異值可以是負數」不正確,本題要選的就是這一句。

  • (A) 這句是對的:奇異值非負且由大到小,所以它不是那個不正確的敘述。
  • (C) 這句是對的:取前 k 個奇異值可以做低秩近似。
  • (D) 這句是對的:低秩近似可用於推薦系統的潛在因子。

五、重點回顧

  • 描述結構用分群、關聯規則或降維;要預測下一期且觀測沿時間排列,才用時間序列,並依時間順序驗證。
  • 支援度是同時出現的交易佔全部交易的比例,信賴度是 P(B|A),提升度是信賴度除以 support(B)。大於 1 正相關,等於 1 獨立,小於 1 負相關。
  • K-means 要指定 k,假設群大致呈球形且大小相近,對尺度與離群值敏感;k 看手肘法或輪廓係數,不是越大越好。
  • DBSCAN 不指定 k,能找任意形狀並把稀疏點標成雜訊;各群密度差很多,或高維度使距離失去區辨力時,同一組 eps 與 minPts 不可靠。
  • PCA 前要標準化,否則大尺度變數主導主成分;它產生的是線性組合,不是留下原欄位。SVD 的奇異值非負且由大到小,取前 k 個可做低秩近似。
  • Isolation Forest 把越容易被隨機切分孤立的點視為越異常;z 分數 z = (x − x̄) / σ 用標準差量測一個點離平均多遠。

覺得有幫助? RSS · X · 請我喝杯咖啡

三團示意散點沒有事先標好的組別,先看每一團內部,再看團與團之間的空隙。

分群讓相近的點聚在一起
1 / 3
先出現群 A 的散點
K-means 依距離反覆分配資料並更新中心;點位為示意。
  1. 沒有人事先標好組別,這一團只表示彼此相似的點被放在一起。
  2. 不相似的點要分開,K-means 會把每個點分給目前最近的中心。
  3. K-means 要先指定群數 k,並假設各群大致呈球形且大小相近。

尿布與啤酒的 10 筆交易裡,並排的是支援度、信賴度與提升度。

提升度高於 1 才是正相關
1 / 3
先看支援度 0.4
10 筆交易中支援度 0.4、信賴度約 0.667、提升度約 1.11;提升度略高於 1,關聯偏弱。
  1. 支援度是同時含尿布與啤酒的交易占全部交易的比例,4 除以 10 得到 0.4。
  2. 信賴度是尿布已出現時啤酒出現的比例,分母改為 6,所以 4/6 約 0.667。
  3. 分母是啤酒的支援度 0.6,結果離 1 不遠,只算弱的正相關。改除以規則支援度 0.4 會得到約 1.67,那不是提升度。

示意點雲先鋪開,PC1 再從起點一段段加長,直到整段方向都出現。

PC1 指向變異最大的方向
1 / 3
先出現示意資料的點雲
PCA 先標準化,再找出變異最大的正交方向;點雲與方向為示意。
  1. 分析前要先標準化,否則尺度大的欄位會主導方向,反映的是單位而不是相對變異。
  2. PCA 是線性轉換,第一個主成分取的是資料變異最大的方向。
  3. 用一個新變數就保住主要變異。若要留下可解釋的原始欄位,那是特徵選擇,不是 PCA。

曲線帶著長期走向與固定週期的起伏,垂直線標在訓練與驗證的分界。

依時間切分,才能用過去預測未來
1 / 2
先畫出沿時間起伏的曲線
趨勢與季節起伏是兩種不同訊號;垂直線標出訓練與驗證分界。曲線為示意。
  1. 趨勢是長期走向,季節性是固定週期的起伏。日期打亂後,就不再是時間序列。
  2. 訓練側用較早的資料,驗證側用較晚的一段。隨機切分會把未來混進訓練。

多數點擠成密集觀測,少數離群點落在外圍,隔離兩者所需的切分不一樣。

孤立點比密集區更像異常
1 / 2
密集觀測先聚成一團
Isolation Forest 會較快隔離遠離密集區的點;座標為示意。
  1. 落在密集區的點要切很多次才分得出來,所以不像異常。
  2. Isolation Forest 以隨機切分隔離每個點,越容易被孤立的點越異常。

動手試試範例是鳶尾花的四個量測值;開關「標準化」,看每個主成分的解釋變異量怎麼變。

PCA 主成分分析