基於 Python 的顧客細分
在這篇文章中,我要談的東西是相對簡單,但卻是對任何業務都很重要的:客戶細分。客戶細分的核心是能夠識別不同型別的客戶,然後知道如何找到更多這樣的人,這樣你就可以…你猜對了,獲得更多的客戶!在這篇文章中,我將詳細介紹您如何可以使用K-均值聚類來完成一些客戶細分方面的探索。
我們的資料
我們使用的資料來自 John Foreman 的《智慧資料》。該資料集包含了營銷快訊/電郵推廣(電子郵件傳送報價)和來自客戶的交易層面資料(提供的資料來自客戶期望和最終購買)這兩個資訊。
1 2 3 4 |
import pandas as pd df_offers = pd.read_excel("./WineKMC.xlsx", sheetname=0) df_offers.columns = ["offer_id", "campaign", "varietal", "min_qty", "discount", "origin", "past_peak"] df_offers.head() |
交易層面的資料…
1 2 3 4 |
df_transactions = pd.read_excel("./WineKMC.xlsx", sheetname=1) df_transactions.columns = ["customer_name", "offer_id"] df_transactions['n'] = 1 df_transactions.head() |
K-均值快速入門
為了細分客戶,我們需要一種方法來對它們進行比較。要做到這一點,我們將使用K-均值聚類。K-均值是一種獲取一個資料集,並從中發現具有類似性質點的組合(或簇)的方法。K-均值的工作原理是,最小化各個點與各簇中點之間的距離,並以此來進行分組。
想一個最簡單的例子。如果我告訴你為下面這些點建立 3 個組,並在每個組的中間繪製一個星星,你會怎麼做?
可能(或希望)是這樣的…
在K-均值中,“ x ”的被稱為“重心”,並指出(你猜對了),給定簇的中心。我不打算詳細講述K-均值實際上是怎什麼樣運作的,但希望這說明會給你一個不錯的想法。
將客戶分類
好吧,那麼,如何我們的客戶該怎麼分類呢?因為我們試圖更多地瞭解我們客戶的行為,我們可以用他們的行為(根據他們是否在收到報價後進行了採購),以此將有類似想法的客戶分類在一起。然後,我們可以研究這些群體,來尋找模式和趨勢,來幫助我們制定未來的報價。
我們最需要的就是一種比較客戶的方法。要做到這一點,我們要建立一個矩陣,包含每個客戶和他們是否迴應了報價的一個 0/1 指標。在 Python 中,這是很容易做到的:
1 2 3 4 5 6 7 8 |
# join the offers and transactions table df = pd.merge(df_offers, df_transactions) # create a "pivot table" which will give us the number of times each customer responded to a given offer matrix = df.pivot_table(index=['customer_name'], columns=['offer_id'], values='n') # a little tidying up. fill NA values with 0 and make the index into a column matrix = matrix.fillna(0).reset_index() # save a list of the 0/1 columns. we'll use these a bit later x_cols = matrix.columns[1:] |
現在建立簇,我們將使用 scikit-learn 庫中 KMeans 的功能。我任意選擇了 5 個簇。我一般的經驗法則是,我進行分類的記錄數至少是類別數的 7 倍。
1 2 3 4 5 6 7 8 9 10 11 |
from sklearn.cluster import KMeans cluster = KMeans(n_clusters=5) # slice matrix so we only include the 0/1 indicator columns in the clustering matrix['cluster'] = cluster.fit_predict(matrix[matrix.columns[2:]]) matrix.cluster.value_counts() 2 32 1 22 4 20 0 15 3 11 dtype: int64 |
簇視覺化
一個很酷的技巧,這可能是學校沒有教你的,主成分分析。它有很多用途,但今天我們將用它來將我們的多維資料集轉化到一個二維資料集。 你問為什麼要這樣做?一旦它在二維中(或簡單地說,它有 2 列),它就會變得更容易繪製!
再一次, scikit-learn 發揮作用了!
1 2 3 4 5 6 7 8 9 |
from sklearn.decomposition import PCA pca = PCA(n_components=2) matrix['x'] = pca.fit_transform(matrix[x_cols])[:,0] matrix['y'] = pca.fit_transform(matrix[x_cols])[:,1] matrix = matrix.reset_index() customer_clusters = matrix[['customer_name', 'cluster', 'x', 'y']] customer_clusters.head() |
我們所做的就是我們把 x_cols 列設定為 0/1 指標變數,我們已經把他們變成了一個二維的資料集。我們任取一列,稱之為 x,然後把其餘剩下的叫 y。現在我們可以把每一個點都對應到一個散點圖中。我們將基於它的簇編碼每個點的顏色,可以讓它們更清晰。
1 2 3 4 5 6 7 8 |
df = pd.merge(df_transactions, customer_clusters) df = pd.merge(df_offers, df) from ggplot import * ggplot(df, aes(x='x', y='y', color='cluster')) + geom_point(size=75) + ggtitle("Customers Grouped by Cluster") |
如果你要搞點花樣,你也可以畫出各簇的中心。這些都儲存在 KMeans 例項中的 cluster_centers_ 變數。確保你也可以將簇心轉換為二維投影。
1 2 3 4 5 6 7 8 |
cluster_centers = pca.transform(cluster.cluster_centers_) cluster_centers = pd.DataFrame(cluster_centers, columns=['x', 'y']) cluster_centers['cluster'] = range(0, len(cluster_centers)) ggplot(df, aes(x='x', y='y', color='cluster')) + geom_point(size=75) + geom_point(cluster_centers, size=500) + ggtitle("Customers Grouped by Cluster") |
對簇更深的挖掘
讓我們在簇中更深入得挖掘吧。以第 4 簇為例。如果我們挑出簇4,並將其與餘下的客戶比較,我們就可以開始尋找可供我們利用的、有趣的方方面面。
作為一個基準,看看簇4與其它簇的葡萄品種對比。事實證明,幾乎所有的Cabernet Sauvignon(赤霞珠)都是由簇4的成員購買的。另外,簇4中沒有一個人買了Espumante(義大利蘇打白葡萄酒)。
1 2 |
df['is_4'] = df.cluster==4 df.groupby("is_4").varietal.value_counts() |
你還可以細分出數值功能。例如,看看為何4號簇與其它簇在min_qty的平均值上表現迥異。似乎簇4的成員都喜歡大批量購買!
1 |
df.groupby("is_4")[['min_qty', 'discount']].mean() |
結語
雖然它不會神奇地告訴你所有的答案,但分群是一個很好的探索性嘗試,可以幫助你更多地瞭解你的客戶。有關K-均值和客戶細分的更多資訊,請檢視以下資源:
INSEAD Analytics Cluster Analysis and Segmentation Post
Customer Segmentation at Bain & Company
Customer Segmentation Wikipedia
這篇所用程式碼請查閱 這裡。