
CDA數(shù)據(jù)分析師 出品
作者:CDALevel Ⅰ持證人
崗位:數(shù)據(jù)分析師
行業(yè):大數(shù)據(jù)
背景
在前文(Python實現(xiàn)基于客觀事實的RFM模型)中闡述了如何運用分箱的技巧講客服進行分群,有興趣的讀者可以去回顧 一下。利用流行的編程語言---Python及分箱技巧進行RFM模型構(gòu)建,結(jié)果發(fā)現(xiàn),此方法有效了降低人工分群帶來的主觀性影響,然而,會出現(xiàn)類似偏態(tài)的現(xiàn)象。其原因是在于分箱的操作對R值、F值、M值都進行了一遍。因此,為解決這種類似偏態(tài)的問題,本文將利用機器學(xué)習(xí)中的K-Means聚類對客戶進行分群。
如今新基建大數(shù)據(jù)、人工智能行業(yè)在迅速的發(fā)展,而機器學(xué)習(xí)是其中不可或缺的一環(huán),機器學(xué)習(xí)強調(diào)的是利用人腦一般從歷史的數(shù)據(jù)中學(xué)習(xí)到經(jīng)驗并運用與未來的判斷中。而K-Means模型則是機器學(xué)習(xí)中聚類算法中的一塊,本文結(jié)合Python實現(xiàn)K-Means聚類算法的編寫,同時應(yīng)用于客戶分群中。
本文采用Anaconda進行Python編譯,主要涉及的Python模塊:
本章分為三部分講解:
"人以類聚,物以群分",這句話就是K-Means模型的思想點。其中,K代表類別數(shù)量(Tips:在機器學(xué)習(xí)中,自變量又叫預(yù)測變量,因變量又叫目標(biāo)變量)。而Means代表每個類別中樣本的均值,因此這個Means也即均值的意思(Tips:這里的樣本通俗理解就是一個記錄行)。
K-Means聚類是以距離作為樣本間相似度的度量標(biāo)準(zhǔn),將距離相近的樣本分配至同一個類別。樣本間的度量方式可以是歐氏距離,馬氏距離,余弦相似度等,K-Means聚類通常采用歐氏距離來度量各樣本間的距離。
歐式距離又稱歐幾里得度量,為常見的兩點之間或多點之間的距離表示法,如類別$x=(x{1},x{1},...,x{n})$與類別$y=(y{1},y{2},...,y{n})$間的距離如下式:
馬氏距離同樣也是一種距離的度量,是由馬哈拉諾比斯(P. C. Mahalanobis)提出的,表示樣本間的協(xié)方差距離。它是一種有效的計算兩個未知樣本集的相似度的方法。這可以看作是歐式距離的修正,修正了歐式距離中各個維度尺度不一致且相關(guān)的問題。
對于一個均值為$mu=(mu{1},mu{2},...,mu_{p})^{T}$,協(xié)方差矩陣的S的多變量$x=(x^{1},x^{2},...,x^{p})^{T}$,其馬氏距離為下式
輸入:樣本集D,設(shè)定類別數(shù)目K
輸出:類劃分(K個類)
以流程圖展現(xiàn)算法步驟,
在上述原理和算法步驟可能有讀者不是很清楚,那么接下來將以例子的形式更加具體的展現(xiàn)K-Means是如何進行聚類的。首先利用scikit-learn庫中的datasets接口生成隨機樣本點作為我們的聚類輸入值,以可視化形式展現(xiàn),如下圖:
從上圖可以看出輸入的樣本點肉眼可見可以分成3類,那么怎么用K-Means將此樣本集識別出3類呢。這里用到scikit-learn庫中的KMeans接口,該接口的訓(xùn)練算法與上述算法是大同小異的。其中稍有差別的是,初始的類中心點的選擇并不是隨機的,而是選擇k-means++的初始化方案,將類中心化為彼此原理的點。具體而言將在代碼體現(xiàn)。其次不同的是,結(jié)束條件,上述算法步驟的結(jié)束條件時判斷各類別中的樣本是否發(fā)生改變,而KMeans接口中的結(jié)束條件是類似于利用損失函數(shù):$||Means{old}-Means{new}||$,該式子的意思是計算舊類中心點于新類中心點的距離,如果該距離小于給定的值$epsilon$,則結(jié)束,輸出類別。
上述樣本點的構(gòu)建及可視化的代碼如下
import numpy as np import matplotlib.pyplot as plt import seaborn as sns from sklearn.datasets import make_blobs
sns.set_style('darkgrid') # 中文顯示問題解決 plt.rcParams['font.sans-serif'] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False # 生成例子數(shù)據(jù) np.random.seed(123)
centers = [[2, 1], [6, 5], [10, 3]]
n_clusters = len(centers)
X, labels_true = make_blobs(n_samples=300, centers=centers, cluster_std=0.7)
plt.scatter(X[:,0],X[:,1],c='red',marker='o',
label='樣本')
plt.legend()
plt.savefig('example.jpg',dpi=200)
plt.show()
代碼解讀:
首先設(shè)置可視化的主題為seaborn下的黑格子狀態(tài),其次選擇圍繞(2,1),(6,5),(10,3)這三個點(類中心點)構(gòu)造樣本集。運用make_blobs()函數(shù)即可構(gòu)建樣本集,該函數(shù)中可以設(shè)定樣本集的數(shù)量n_samples和方差cluster_std。最后以散點圖形式展現(xiàn)。
最后調(diào)用KMeans接口,將該樣本集進行聚類,用可視化的方式對聚類后結(jié)果進行展現(xiàn),結(jié)果如下圖
可以明確看到,聚類結(jié)果為3類,和我們預(yù)期的是一致的,接下來看類別中心點于原設(shè)計的中心點對比,如下表。
從上表可以看出,聚類中心點是存在微小差異的,這也說明KMeans接口時利用損失函數(shù)進行迭代的。相關(guān)代碼如下
# K-Means聚類 from sklearn.cluster import KMeans
sns.set_style('darkgrid') # 中文顯示問題解決 plt.rcParams['font.sans-serif'] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False # 模型擬合 k_means = KMeans(init="k-means++", n_clusters=3)
k_means.fit(X) # 可視化結(jié)果 fig = plt.figure(figsize=(15,8))
colors = ["#4EACC5", "#FF9C34", "#4E9A06"]
k_means_cluster_centers = k_means.cluster_centers_
k_means_labels = k_means.labels_
ax = fig.add_subplot()
for k, col in zip(range(n_clusters), colors):
my_members = k_means_labels == k
cluster_center = k_means_cluster_centers[k]
ax.plot(X[my_members, 0], X[my_members, 1], "w", markerfacecolor=col, marker="*")
ax.plot(
cluster_center[0],
cluster_center[1], "o",
markerfacecolor=col,
markeredgecolor="k",
markersize=6,
)
ax.set_title("KMeans聚類結(jié)果") #ax.set_xticks() #ax.set_yticks() plt.savefig('例子結(jié)果.jpg',dpi=200)
代碼解讀:
KMeans(init="k-means++", n_clusters=3)這段代碼即將估計器擬合上述的樣本集。其中,init參數(shù)即為上述所講KMeans++的初始化選擇方式。而后的參數(shù)為設(shè)定分成多少類。
擬合后的KMeans估計器是可以進行調(diào)用的,這里我們調(diào)用類中心點(k_means.cluster_centers_)和樣本所屬類別(k_means.labels_)。
最后一段代碼是結(jié)合類中心點和樣本所屬類別進行可視化展示,可以非常明確的看到聚類后的結(jié)果。(TIps:最后保存圖片的dpi是調(diào)整像素的,在Python編譯器里面默認(rèn)保存的圖像像素普遍都不高,讀者可以適當(dāng)?shù)脑O(shè)置。)
K-Means模型構(gòu)建(代碼)
有了數(shù)據(jù)和scikit-learn庫中的KMmeans接口的了解,那么接下來先上完整代碼和解釋,模型構(gòu)建的代碼如下
# RMF實戰(zhàn) import pandas as pd import seaborn as sns
sns.set_style('darkgrid')
# 中文顯示問題解決
plt.rcParams['font.sans-serif'] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
## 數(shù)據(jù)讀取 data = pd.read_excel('rfm.xlsx')
X = data.drop(columns = 'user_id')
## KMeans模型構(gòu)建
k_means = KMeans(init="k-means++", n_clusters=8,random_state=123)
k_means.fit(X)
## 類別查看 data['categories'] = k_means.labels_
## 相關(guān)屬性查看
k_means.cluster_centers_
k_means.verbose
## 機器幫助判斷(等深分箱)
result = k_means.cluster_centers_
reuslt = pd.DataFrame(result)
reuslt['R_label'] = pd.qcut(reuslt[2],2,labels = range(1,3)).astype('int')
reuslt['F_label'] = pd.qcut(reuslt[0],2,labels = range(1,3)).astype('int')
reuslt['M_label'] = pd.qcut(reuslt[1],2,labels = range(1,3)).astype('int')
## 客戶分類打標(biāo)簽 for i,j in data.iterrows(): if j['categories'] == 0 or j['categories'] == 2: data.loc[i,'客戶類別'] = '一般發(fā)展用戶' if j['categories'] == 1 or j['categories'] == 5: data.loc[i,'客戶類別'] = '重要價值用戶' if j['categories'] == 3 or j['categories'] == 7: data.loc[i,'客戶類別'] = '重要保持客戶' if j['categories'] == 4 or j['categories'] == 6: data.loc[i,'客戶類別'] = '一般挽留客戶' # 可視化
cate_sta = data['客戶類別'].value_counts()
cate_sta = pd.DataFrame(cate_sta)
sns.barplot(y='客戶類別', x=cate_sta.index, data=cate_sta)
plt.title('用戶類別統(tǒng)計')
plt.show()
從上圖可以看到,利用KMeans的估計器,我們已經(jīng)得到了每個id所屬的類別,那么現(xiàn)在的問題是,該怎么判斷用戶是哪種客戶類別呢(Tips:用戶類別分為8種,不清楚的讀者可以回顧前文),這時候就需要用到類中心點,通過判斷類中心點來給每種分類一個判斷,下表為每個類別對應(yīng)的類中心點。
有了每個類別的類中心點,我們就需要對每個類賦予RFM模型中的客戶類別,本文在這方面選擇分箱的技巧進行分類。
對類中心點實現(xiàn)等深分箱,與前文運用等距分箱不同,這里采取的是指定每個類別種的個數(shù)是一致的,這也符合RFM模型中的每個值都有4個高,4個低。在Python中利用pd.qcut()函數(shù)進行分箱,其參數(shù)與等距分箱大同小異,有興趣的讀者可以研究。最后以"2"代表高,"1"代表低。并按照RFM的規(guī)則將每種類別賦予一個客戶類別,結(jié)果如下表:
最后,以柱狀圖的形式展示該份數(shù)據(jù)集中的客戶類別總數(shù)
具體數(shù)值如下表:
與前文(Python實現(xiàn)基于客觀事實的RFM模型)對比,本文將該份數(shù)據(jù)集中的用戶分為4類(一般發(fā)展用戶、重要保持客戶、一般挽留客戶、重要價值用戶),而前文將用戶分為5類(一般發(fā)展用戶、一般挽留用戶、重要挽留客戶、一般保持用戶、重要發(fā)展用戶)??梢钥闯觯瑑烧叨甲R別出了一般發(fā)展用戶的信息,且其所占比例也是最多的。不同之處在于,基于KMeans聚類模型的RFM模型可以挖掘出重要保持客戶、重要價值用戶的信息,而基于客觀事實的RFM模型對一般挽留用戶較為敏感。
因此,對于決策者而言,每個模型得到的RFM模型是不一致的,而決策者應(yīng)該從模型結(jié)果的相同點入手,如該份數(shù)據(jù),兩個模型都發(fā)現(xiàn)了一般發(fā)展用戶所占比例是最大的,代表其解釋性強。而對于模型間的不同點,則需要更深入的探討如何取舍的問題。
數(shù)據(jù)分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
LSTM 模型輸入長度選擇技巧:提升序列建模效能的關(guān)鍵? 在循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)家族中,長短期記憶網(wǎng)絡(luò)(LSTM)憑借其解決長序列 ...
2025-07-11CDA 數(shù)據(jù)分析師報考條件詳解與準(zhǔn)備指南? ? 在數(shù)據(jù)驅(qū)動決策的時代浪潮下,CDA 數(shù)據(jù)分析師認(rèn)證愈發(fā)受到矚目,成為眾多有志投身數(shù) ...
2025-07-11數(shù)據(jù)透視表中兩列相乘合計的實用指南? 在數(shù)據(jù)分析的日常工作中,數(shù)據(jù)透視表憑借其強大的數(shù)據(jù)匯總和分析功能,成為了 Excel 用戶 ...
2025-07-11尊敬的考生: 您好! 我們誠摯通知您,CDA Level I和 Level II考試大綱將于 2025年7月25日 實施重大更新。 此次更新旨在確保認(rèn) ...
2025-07-10BI 大數(shù)據(jù)分析師:連接數(shù)據(jù)與業(yè)務(wù)的價值轉(zhuǎn)化者? ? 在大數(shù)據(jù)與商業(yè)智能(Business Intelligence,簡稱 BI)深度融合的時代,BI ...
2025-07-10SQL 在預(yù)測分析中的應(yīng)用:從數(shù)據(jù)查詢到趨勢預(yù)判? ? 在數(shù)據(jù)驅(qū)動決策的時代,預(yù)測分析作為挖掘數(shù)據(jù)潛在價值的核心手段,正被廣泛 ...
2025-07-10數(shù)據(jù)查詢結(jié)束后:分析師的收尾工作與價值深化? ? 在數(shù)據(jù)分析的全流程中,“query end”(查詢結(jié)束)并非工作的終點,而是將數(shù) ...
2025-07-10CDA 數(shù)據(jù)分析師考試:從報考到取證的全攻略? 在數(shù)字經(jīng)濟蓬勃發(fā)展的今天,數(shù)據(jù)分析師已成為各行業(yè)爭搶的核心人才,而 CDA(Certi ...
2025-07-09【CDA干貨】單樣本趨勢性檢驗:捕捉數(shù)據(jù)背后的時間軌跡? 在數(shù)據(jù)分析的版圖中,單樣本趨勢性檢驗如同一位耐心的偵探,專注于從單 ...
2025-07-09year_month數(shù)據(jù)類型:時間維度的精準(zhǔn)切片? ? 在數(shù)據(jù)的世界里,時間是最不可或缺的維度之一,而year_month數(shù)據(jù)類型就像一把精準(zhǔn) ...
2025-07-09CDA 備考干貨:Python 在數(shù)據(jù)分析中的核心應(yīng)用與實戰(zhàn)技巧? ? 在 CDA 數(shù)據(jù)分析師認(rèn)證考試中,Python 作為數(shù)據(jù)處理與分析的核心 ...
2025-07-08SPSS 中的 Mann-Kendall 檢驗:數(shù)據(jù)趨勢與突變分析的有力工具? ? ? 在數(shù)據(jù)分析的廣袤領(lǐng)域中,準(zhǔn)確捕捉數(shù)據(jù)的趨勢變化以及識別 ...
2025-07-08備戰(zhàn) CDA 數(shù)據(jù)分析師考試:需要多久?如何規(guī)劃? CDA(Certified Data Analyst)數(shù)據(jù)分析師認(rèn)證作為國內(nèi)權(quán)威的數(shù)據(jù)分析能力認(rèn)證 ...
2025-07-08LSTM 輸出不確定的成因、影響與應(yīng)對策略? 長短期記憶網(wǎng)絡(luò)(LSTM)作為循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)的一種變體,憑借獨特的門控機制,在 ...
2025-07-07統(tǒng)計學(xué)方法在市場調(diào)研數(shù)據(jù)中的深度應(yīng)用? 市場調(diào)研是企業(yè)洞察市場動態(tài)、了解消費者需求的重要途徑,而統(tǒng)計學(xué)方法則是市場調(diào)研數(shù) ...
2025-07-07CDA數(shù)據(jù)分析師證書考試全攻略? 在數(shù)字化浪潮席卷全球的當(dāng)下,數(shù)據(jù)已成為企業(yè)決策、行業(yè)發(fā)展的核心驅(qū)動力,數(shù)據(jù)分析師也因此成為 ...
2025-07-07剖析 CDA 數(shù)據(jù)分析師考試題型:解鎖高效備考與答題策略? CDA(Certified Data Analyst)數(shù)據(jù)分析師考試作為衡量數(shù)據(jù)專業(yè)能力的 ...
2025-07-04SQL Server 字符串截取轉(zhuǎn)日期:解鎖數(shù)據(jù)處理的關(guān)鍵技能? 在數(shù)據(jù)處理與分析工作中,數(shù)據(jù)格式的規(guī)范性是保證后續(xù)分析準(zhǔn)確性的基礎(chǔ) ...
2025-07-04CDA 數(shù)據(jù)分析師視角:從數(shù)據(jù)迷霧中探尋商業(yè)真相? 在數(shù)字化浪潮席卷全球的今天,數(shù)據(jù)已成為企業(yè)決策的核心驅(qū)動力,CDA(Certifie ...
2025-07-04CDA 數(shù)據(jù)分析師:開啟數(shù)據(jù)職業(yè)發(fā)展新征程? ? 在數(shù)據(jù)成為核心生產(chǎn)要素的今天,數(shù)據(jù)分析師的職業(yè)價值愈發(fā)凸顯。CDA(Certified D ...
2025-07-03