概念地圖・DBSCAN 密度分群
分類:系統
這一頁不只是把一個概念解釋一遍——一張自己畫的結構圖,加上拿台灣情境從頭走一次的實例演練、這個框架什麼時候會騙你,以及它接回 P.A.I.N. 之後長什麼樣。一頁必須交付的三層 →
DBSCAN:先量密度,再判誰是雜訊
一家看板公司在地圖上釘了三百個點位,業務簡報寫「北中南三區」,可是有十一個點誰都碰不到。DBSCAN 就是替這十一個點留位置的分群法:它不先問要分幾群,只問兩件事——半徑多大算近、幾個鄰居算密。半徑內的鄰居湊滿門檻,就是核心點;自己不夠密、卻落在某個核心點的半徑內,就是邊界點;兩樣都沾不上的,判為雜訊點。群數由資料自己長出來,那一小撮孤點會被單獨標出來,不會被硬塞進最近的一群。
三種身分,各自的判準是什麼
三種身分有先後:先定出核心點,另外兩種才判得出來。
| 身分 | 判準(半徑 ε、最少鄰居數 minPts) | 在你的名單上長什麼樣 |
|---|---|---|
| 核心點 | 半徑 ε 內的鄰居數(含自己)達到 minPts | 這一群的骨幹,抽掉一個,群的形狀還在 |
| 邊界點 | 自己半徑內湊不滿 minPts,但落在某個核心點的半徑內 | 跟著群走,群的外緣由它畫出來 |
| 雜訊點 | 自己湊不滿 minPts,也不在任何核心點的半徑內 | 不屬於任何一群,在總表上被平均掉 |
表裡藏著一件實務上很吵的事:邊界點只是「沾到某個核心點」,它沒有力氣把鄰居拉進來。所以兩個核心區如果剛好共用同一個邊界點,那個點歸誰,取決於程式先掃到誰——同一份資料重跑,個別邊界點的群號可能換人,群的骨架卻不動。真正該盯的是第三列:雜訊講的只是「身邊沒人」,它跟品質好壞完全無關,混著看就會把獨棟的好資產一起丟掉。
半徑跟最少鄰居數怎麼訂,先過三關
一、半徑要換算成業務碰得到的距離。看板這一行為什麼落在 1.2 公里?因為那是一支業務半天巡得完、一組外拍團隊一趟車跑得掉的範圍——距離要從現場來,別從地圖上挑一個好看的數字。ε 訂得漂亮而排班照樣排不出來,那張群集圖就只是牆上的裝飾。自問:你這一行的「近」,有沒有一個量得出來的距離、天數或金額級距?
二、最少鄰居數要問成本,不要問統計。出一趟車、調一次吊臂、報一次備,看板公司算過五面起跳才攤得平,minPts 就訂 5(含自己)。這個數字一旦是憑感覺填的,後面所有群的大小都跟著飄。自問:要幾個聚在一起,你才願意為它多開一條動線?
三、把門檻鬆一格,先看群數會不會垮。ε 一放寬,雜訊會變少、群也會開始互相黏——這兩件事一定同時發生,不會只來一個。所以參數不能只跑一次:至少三個 ε 各跑一遍,看群數是穩定在三,還是輕輕一碰就掉到二。自問:門檻鬆一格,你的分群結果會不會整個併成一團?
三百個廣告看板點位,跑一次密度分群
底下這家台灣中部的廣告看板公司,是為了把這個結構講清楚而編出來的示意情境,沒有指涉任何真實公司。
- 先把 300 個點位攤成座標:自有加代管,全台 300 面。這一步只留經緯度,不帶單價、不帶去年營收。先量結構,錢的事下一輪再進來
- ε 訂 1.2 公里,minPts 訂 5:一趟外拍車半天跑得完的半徑,五面看板才攤得平出車成本——兩個參數都從現場長出來。參數解釋得出來,簡報就吵不起來
- 跑一次,身分先分出來:核心點 214 個、邊界點 75 個、雜訊 11 個,合計 300 個,一個不多一個不少。三種身分把名單切乾淨了
- 群數自己長出來:北 132、中 88、南 69,三群合計 289 個,剩下 11 個誰都不屬於。業務簡報寫的「北中南三區」,少算了那 11 個
- 半徑放寬到 2.0 公里再跑一次:雜訊只剩 2 個,畫面乾淨多了,可是北群與中群黏成一塊,群數從三掉到二。雜訊變少的代價,是兩區的報價表被合併
那 11 個點位多半是獨棟的路口柱、聯外道路上的單面看板——身邊沒有同伴,所以進不了任何一群,資料品質本身一點問題都沒有。麻煩的是它們後來的去處:在點位總表上,它們的空租天數混進南區平均,客訴次數混進全公司客訴率,於是永遠沒有人為它們單獨開一頁。放寬半徑那一次更值得記住:畫面上只看到雜訊從 11 個掉到 2 個,看不到北中兩區的報價權責在同一秒被合併——參數調的是圖,動到的是誰去收款。以上為說明結構用的示意情境,僅供理解框架之用。
哪幾種點位會被它讀錯
- 密度高不等於價值高。DBSCAN 讀的是位置的擁擠程度,不讀單價、不讀空租率。市區一條街擠了二十面看板,會被判成一群紮實的核心;郊區那面獨佔省道路口、租金是市區同尺寸兩倍的看板,反而被丟進雜訊。把「群」直接當成「重點區」去排資源,等於系統性地把獨佔型資產排到最後——而那類資產通常毛利最高。
- 一個半徑套全國,兩頭都會出錯。同樣的 1.2 公里,在台北會把兩個商圈黏成一塊,在台東會把整條海線判成雜訊。DBSCAN 沒有「各區用各區的半徑」這個開關,要那個得換 HDBSCAN 那一族的做法。所以看到某一區雜訊特別多,先問那一區是不是本來就疏,再回頭懷疑資料髒。
- 「雜訊」兩個字會被讀成「可以刪」。標籤一進報表,下一步往往就是篩掉。刪掉的是十一列資料,跟著消失的是那幾張獨佔合約、那幾通打進總機的抱怨。比較安全的做法是把雜訊另存一張名單、指定一個人負責,讓那十一列從殘渣變成待辦——這比再調一次參數重要得多。
痛點視角:誰都碰不到的那一小撮
雜訊這個詞,是演算法在替自己解釋。
把 300 個點位分成三群加 11 個孤點,靠的全是彼此的距離。距離量得出誰的鄰居多,量不出誰在難受。那 11 個點位每一張總表都待不下去:空租天數被平均進南區,客訴被平均進全公司,數字一被攤開就消失了——這張圖畫得出點位的疏密,畫不出租下那面看板的老闆昨天打了幾通電話。P.A.I.N. 的第一個字是「誰在痛」,而痛的人往往正是這種孤點客戶:他附近沒有第二面看板可換,議價空間小、依賴度高,一旦出事也叫不到人。密度分群把他歸到「其他」,經營現實裡他反而是最黏、也最容易被得罪的一群。今晚就能做的一件小事:把被判成雜訊的那幾個客戶挑出來,各撥一通電話,問他上一次覺得麻煩是什麼時候。名單短,一小時打得完。
常見問題
DBSCAN 跟 K-means 差在哪?
K-means 要你先給群數,而且每個點都會被分進某一群,孤點也會被硬塞。DBSCAN 要你給的是半徑與最少鄰居數,群數由資料自己長出來,還允許一部分點誰都不屬於。資料一團一團、形狀不規則、又混著孤點時,DBSCAN 比較合;資料本來就均勻,只是想切成 N 塊排班排線,K-means 反而省事。兩者可以先後跑:先用 DBSCAN 把孤點挑出來,剩下的再切。
半徑 ε 要怎麼訂才不是憑感覺?
常見做法是畫 k-距離圖:把每個點到第 k 個鄰居的距離由小排到大、連成一條曲線,找那個明顯往上翹的轉折,轉折附近就是候選值。但曲線只給你一個起點,最後仍然要用業務語言校一次:這個距離,你的人半天跑得完嗎?客戶會覺得這兩個點算同一區嗎?校不過就退回去改,別讓一張圖決定調度。
最少鄰居數要訂多少?
教科書的起手式是「維度數加一」,二維資料至少 4,資料雜、離群多就往上調。不過真正好用的判準是成本:湊滿幾個,你才願意為這一團多派一次資源、多開一條動線。訂完一定要拿兩三個值各跑一次,看群數穩不穩——一動就變的參數組合,代表你的資料還沒準備好被分群。
被判成雜訊的資料可以直接刪掉嗎?
做模型時可以先擱在一邊,經營上千萬別刪。雜訊的意思只有「附近沒有同伴」,它不預告品質,也不預告重要性——獨佔型的資產、剛開發的新區、談了三年的老客戶,全都可能長成孤點。實務上的做法是另存一張名單,每季拿出來看一次:有沒有哪個孤點附近開始長出鄰居?那通常是新商圈冒出來的第一個訊號。
在自己的客戶名單上圈出誰不屬於任何一群。那份名單通常很短,短到一個下午就能一個一個打過去。想比較另一種思路,可以接著看 K-means 的手肘法:那篇要你先決定分成幾群,這篇不問群數,只問夠不夠密。
喜歡這篇文章嗎?
每週幫你拆二本好書,把判斷力、好書金句、好問題,直送你的信箱。
不適合你可隨時退訂 · 每週兩封,陪你把書讀進生活。
送出即表示同意我們依隱私權政策使用你的 email。