本系列第 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̄) / σ用標準差量測一個點離平均多遠。