干貨 :基于用戶畫像的聚類分析
聚類(Clustering),顧名思義就是“物以類聚,人以群分”,其主要思想是按照特定標(biāo)準(zhǔn)把數(shù)據(jù)集聚合成不同的簇,使同一簇內(nèi)的數(shù)據(jù)對象的相似性盡可能大,同時(shí),使不在同一簇內(nèi)的數(shù)據(jù)對象的差異性盡可能大。通俗地說,就是把相似的對象分到同一組。
聚類算法通常不使用訓(xùn)練數(shù)據(jù),只要計(jì)算對象間的相似度即可應(yīng)用算法。這在機(jī)器學(xué)習(xí)領(lǐng)域中被稱為無監(jiān)督學(xué)習(xí)。
某大型保險(xiǎn)企業(yè)擁有海量投??蛻魯?shù)據(jù),由于大數(shù)據(jù)技術(shù)與相關(guān)人才的緊缺,企業(yè)尚未建立統(tǒng)一的數(shù)據(jù)倉庫與運(yùn)營平臺,積累多年的數(shù)據(jù)無法發(fā)揮應(yīng)有的價(jià)值。企業(yè)期望搭建用戶畫像,對客戶進(jìn)行群體分析與個(gè)性化運(yùn)營,以此激活老客戶,挖掘百億續(xù)費(fèi)市場。眾安科技數(shù)據(jù)團(tuán)隊(duì)對該企業(yè)數(shù)據(jù)進(jìn)行建模,輸出用戶畫像并搭建智能營銷平臺。再基于用戶畫像數(shù)據(jù)進(jìn)行客戶分群研究,制訂個(gè)性化運(yùn)營策略。
本文重點(diǎn)介紹聚類算法的實(shí)踐。
Step 1 數(shù)據(jù)預(yù)處理
任何大數(shù)據(jù)項(xiàng)目中,前期數(shù)據(jù)準(zhǔn)備都是一項(xiàng)繁瑣無趣卻又十分重要的工作。
首先,對數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化處理,處理異常值,補(bǔ)全缺失值,為了順利應(yīng)用聚類算法,還需要使用戶畫像中的所有標(biāo)簽以數(shù)值形式體現(xiàn)。
其次要對數(shù)值指標(biāo)進(jìn)行量綱縮放,使各指標(biāo)具有相同的數(shù)量級,否則會使聚類結(jié)果產(chǎn)生偏差。
接下來要提取特征,即把最初的特征集降維,從中選擇有效特征放進(jìn)聚類算法里跑。眾安科技為該保險(xiǎn)公司定制的用戶畫像中,存在超過200個(gè)標(biāo)簽,為不同的運(yùn)營場景提供了豐富的多維度數(shù)據(jù)支持。但這么多標(biāo)簽存在相關(guān)特征,假如存在兩個(gè)高度相關(guān)的特征,相當(dāng)于將同一個(gè)特征的權(quán)重放大兩倍,會影響聚類結(jié)果。
我們可以通過關(guān)聯(lián)規(guī)則分析(Association Rules)發(fā)現(xiàn)并排除高度相關(guān)的特征,也可以通過主成分分析(Principal Components Analysis,簡稱PCA)進(jìn)行降維。這里不詳細(xì)展開,有興趣的讀者可以自行了解。
Step 2 確定聚類個(gè)數(shù)
層次聚類是十分常用的聚類算法,是根據(jù)每兩個(gè)對象之間的距離,將距離最近的對象兩兩合并,合并后產(chǎn)生的新對象再進(jìn)行兩兩合并,以此類推,直到所有對象合為一類。
Ward方法在實(shí)際應(yīng)用中分類效果較好,應(yīng)用較廣。它主要基于方差分析思想,理想情況下,同類對象之間的離差平方和盡可能小,不同類對象之間的離差平方和應(yīng)該盡可能大。該方法要求樣品間的距離必須是歐氏距離。
值得注意的是,在R中,調(diào)用ward方法的名稱已經(jīng)從“ward”更新為“ward.D”。
- library(proxy)
- Dist <- dist(data,method='euclidean') #歐式距離
- clusteModel <- hclust(Dist, method='ward.D')
- plot(clusteModel)

根據(jù)R繪制的層次聚類圖像,我們對該企業(yè)的客戶相似性有一個(gè)直觀了解,然而單憑肉眼,仍然難以判斷具體的聚類個(gè)數(shù)。這時(shí)我們通過輪廓系數(shù)法進(jìn)一步確定聚類個(gè)數(shù)。
輪廓系數(shù)旨在對某個(gè)對象與同類對象的相似度和與不同類對象的相似度做對比。輪廓系數(shù)取值在-1到1之間,輪廓系數(shù)越大時(shí),表示對應(yīng)簇的數(shù)量下,聚類效果越好。
- library(fpc)
- K <- 3:8
- round <- 30 # 避免局部***
- rst <- sapply(K,function(i){
- print(paste("K=",i))
- mean(sapply(1:round,function(r){
- print(paste("Round",r))
- result<- kmeans(data, i)
- stats<- cluster.stats(dist(data), result$cluster)
- stats$avg.silwidth
- }))
- })
- plot(K,rst,type='l',main='輪廓系數(shù)與K的關(guān)系',ylab='輪廓系數(shù)')

在輪廓系數(shù)的實(shí)際應(yīng)用中,不能單純?nèi)≥喞禂?shù)***的K值,還需要考慮聚類結(jié)果的分布情況(避免出現(xiàn)超大群體),以及從商業(yè)角度是否易于理解與執(zhí)行,據(jù)此綜合分析,探索合理的K值。
綜上,根據(jù)分析研究,確定K的取值為7。
Step 3 聚類
K-means是基于距離的聚類算法,十分經(jīng)典,簡單而高效。其主要思想是選擇K個(gè)點(diǎn)作為初始聚類中心, 將每個(gè)對象分配到最近的中心形成K個(gè)簇,重新計(jì)算每個(gè)簇的中心,重復(fù)以上迭代步驟,直到簇不再變化或達(dá)到指定迭代次數(shù)為止。K-means算法缺省使用歐氏距離來計(jì)算。
- library(proxy)
- library(cluster)
- clusteModel <- kmeans(data, centers = 7, nstart =10)
- clusteModel$size
- result_df <- data.frame(data,clusteModel$cluster)
- write.csv(result_df, file ="clusteModel.csv", row.names = T, quote = T)
Step 4 聚類結(jié)果分析
對聚類結(jié)果(clusteModel.csv)進(jìn)行數(shù)據(jù)分析,總結(jié)群體特征:
- cluster=1:當(dāng)前價(jià)值低,未來價(jià)值高。(5.6%)
- cluster=2:當(dāng)前價(jià)值中,未來價(jià)值高。(5.4%)
- cluster=3:當(dāng)前價(jià)值高,未來價(jià)值高。(18%)
- cluster=4:當(dāng)前價(jià)值高,未來價(jià)值中低。(13.6%)
- cluster=5:高價(jià)值,穩(wěn)定群。(14%)
- cluster=6:當(dāng)前價(jià)值低,未來價(jià)值未知(可能信息不全導(dǎo)致)。(2.1%)
- cluster=7:某一特征的客戶群體(該特征為業(yè)務(wù)重點(diǎn)發(fā)展方向)。(41.3%)
根據(jù)分析師與業(yè)務(wù)團(tuán)隊(duì)的討論結(jié)果,將cluster=1與cluster=6進(jìn)行合并,最終得到6個(gè)客戶群體,并針對客戶群體制訂運(yùn)營策略。
客戶分群與運(yùn)營策略
(業(yè)務(wù)敏感信息打碼)
