1 客戶分群分析
“PDFMV架構是問題-資料-特征-模型-價值五個英文字母的首字母組合而成,它是以問題為導向,資料為驅動,利用特征和模型從資料中學習到知識,以創造價值的系統化過程。”

當我們面對一批客戶時,如何讀懂你的客戶(KYC)?
我們可以做全量分析,整體洞察這些客戶;我們可以做分群分析,物以類聚,人以群分;我們可以做個性分析,每個人都有其特性,實作千人千面。
本文介紹客戶的分群分析,以UCI提供的線上零售資料集為研究對象,采用RFM分析方法,以實作客戶的分群研究和了解。
資料集擷取連結:
http://archive.ics.uci.edu/ml/machine-learning-databases/00352/
1 客戶分群概述
客戶分群是一種根據客戶共同特征将客戶分組或者分群的方法。
客戶分群的價值,幫助你讀懂你的客戶,進而給客戶提供更好地服務和體驗,讓客戶的全生命周期價值(CLV)最大化。
2 RFM分析方法
RFM(Recency,Frequency,Monetary)分析是一種基于客戶行為資料做分群的方法。RFM的含義,說明如下。
- Recency(R):誰最近購買了?與最近一次購買的間隔天數。
- Frequency(F):誰頻繁購買?表示最近一段時間購買的數量(例如:高頻或者低頻)。
- Monetary(M):誰購買金額高?表示最近一段時間購買的所花費的金錢數。
如果RFM的三個變量,每個變量分成兩組,總共會有8種分群。如下圖所示。
圖1 8種客戶分群情況
3 客戶分群(Python語言)
客戶分群,Python語言參考代碼,建議使用jupyter notebook測試。
# 導入 Python庫
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import datetime as dt
import warnings
warnings.filterwarnings('ignore')
# 加載資料集
data = pd.read_excel('./datasets/Online_Retail.xlsx')
# 資料準備工作
data = data[pd.notnull(data['CustomerID'])]
filtered_data = data[['Country','CustomerID']].drop_duplicates() # 删除重複記錄
# 對英國的客戶做分群分析
uk_data = data[data.Country=='United Kingdom']
# 描述性統計分析
print(uk_data.describe().T)
# 資料清洗
uk_data = uk_data[(uk_data['Quantity']>0)]
# 選擇需要的列
uk_data=uk_data[['CustomerID','InvoiceDate','InvoiceNo','Quantity','UnitPrice']]
# 變量類型轉換
uk_data['InvoiceDate'] = pd.to_datetime(uk_data['InvoiceDate'])
# 設定觀測時間點
PRESENT = dt.datetime(2011,12,10)
# RFM分析
rfm = uk_data.groupby('CustomerID').agg({'InvoiceDate': lambda date: (PRESENT - date.max()).days,
'InvoiceNo': lambda num: len(num),
'TotalPrice': lambda price: price.sum()})
# 列重命名
rfm.columns = ['monetary','frequency','recency']
# 變量類型轉換
rfm['recency'] = rfm['recency'].astype(int)
# 變量分組
rfm['r_quartile'] = pd.qcut(rfm['recency'], 2, ['1','2'])
rfm['f_quartile'] = pd.qcut(rfm['frequency'], 2, ['2','1'])
rfm['m_quartile'] = pd.qcut(rfm['monetary'], 2, ['2','1'])
# RFM評分
rfm['RFM_Score'] = rfm.r_quartile.astype(str)+ rfm.f_quartile.astype(str) + rfm.m_quartile.astype(str)
print(rfm.head())
# 客戶分群的分布情況
rfm.reset_index(inplace=True)
rfm['RFM_Score'].value_counts()
# 客戶分群的可視化分析
rfm['RFM_Score'].value_counts().plot(kind='bar')
複制
RFM分析的結果
RFM_Score的分布情況和可視化
RFM_Score取值"111?imageView2/2/w/1620",表示重要價值客戶。其它的取值,你可以參照圖1了解。