参考书目:Python数据分析与挖掘实战. 张良均. 北京:机械工业出版社,2019年


案例背景

废话不多说了,本次案例就是用航空公司的数据对客户群进行聚类,然后对不同客户制定不同的营销策略。三点目的:

1)借助航空公司客户数据,对客户进行分类。

2)对不同的客户类别进行特征分析,比较不同类别的客户的价值。

3)针对不同价值的客户类别制定相应的营销策略,为其提供个性化服务。


模型选择

K均值聚类

既然是聚类嘛,那肯定就用最经典也比较简单的K均值聚类方法。

K-Means算法是一种无监督的学习,事先不知道类别,自动将相似的对象归到同一个簇中。

也是一种聚类分析(cluster analysis)的算法,其主要是来计算数据聚集的算法,主要通过不断地取离聚类中心点最近均值的算法。

原理就不多说了,反正也都是用sklearn的包实现。

FRM模型

本文的目标是客户价值分析,即通过航空公司客户数据识别不同价值的客户。识别客户价值应用最广泛的模型是RFM模型。

R (Recency)指的是最近一次消费时间与截止时间的间隔。

F ( Frequency)指客户在某段时间内所消费的次数。

M ( Monetary)指客户在某段时间内所消费的金额。

RFM模型结果解读

RFM模型包括3个特征,无法用平面坐标系来展示,所以这里使用三维坐标系进行展示,如下图所示,x轴表示R特征(Recency),y轴表示F特征 ( Frequency),z轴表示M指标(Monetary)。

根据每个特征的取值区间不一样就可以把客户分为不同的类型。

航空公司客户价值分析的LRFMC模型

在RFM模型中,消费金额表示在一段时间内客户购买该企业产品的金额的总和。由于航空票价受到运输距离、舱位等级等多种因素的影响,同样消费金额的不同旅客对航空公司的价值是不同的,

本案例将客户关系长度L、消费时间间隔R、消费频率F、飞行里程M和折扣系数的平均值C这5个特征作为航空公司识别客户价值的特征(如下表所示),记为LRFMC模型。

特征

L

R

F

M

C

航空公司的LRFMC模型

会员入会时间距观测窗口结束的月数

客户最近一次乘坐公司飞机距观测窗口结束的月数。

客户在观测窗口内乘坐公司飞机的次数。

客户在观测窗口内累计的飞行里程。

客户在观测窗口内乘坐舱位所对应的折扣系数的平均值。


数据分析

终于开始上代码了,导包,然后我们将清洗好的五个特征的数据读取。

import numpy as npimport pandas as pdimport matplotlib.pyplot as plt import seaborn as snsplt.rcParams ['font.sans-serif'] ='SimHei' #显示中文plt.rcParams ['axes.unicode_minus']=False #显示负号sns.set_style("darkgrid",{"font.sans-serif":['KaiTi', 'Arial']})
# 读取数据清洗后的数据airline = pd.read_csv( 'data_cleaned.csv', encoding = 'utf-8')# 选取需求属性airline_selection = airline[['FFP_DATE','LOAD_TIME','LAST_TO_END','FLIGHT_COUNT','SEG_KM_SUM','avg_discount']]L = pd.to_datetime(airline_selection['LOAD_TIME'])- pd.to_datetime(airline_selection['FFP_DATE'])L = L.astype('str').str.split().str[0]L = L.astype('int')/30# 合并属性airline_features = pd.concat([L,airline_selection.iloc[:,2:]],axis = 1)airline_features.columns = ['L','R','F','M','C']airline_features.head()

数据只有5列特征,总共样本个数为:

len(airline_features)

6w多条,数据量还是很大的,博主也试过用分层聚类等方法,根本算不动……对于这种数据量大的就使用k均值聚类。

描述性统计

airline_features.describe() 

画出每个特征的箱线图

column = airline_features.columns.tolist() # 列表头fig = plt.figure(figsize=(22, 12), dpi=75)# 指定绘图对象宽度和高度for i in range(5):plt.subplot(2,3, i + 1)# 2行3列子图sns.boxplot(data=airline_features[column[i]], orient="v",width=0.5)# 箱式图plt.ylabel(column[i], fontsize=36)plt.show()

可以看到F和M特征的异常值很多,说明这两个特征较为分散,可以区分客户。

画出核密度图

column = airline_features.columns.tolist() # 列表头fig = plt.figure(figsize=(22, 12), dpi=75)# 指定绘图对象宽度和高度for i in range(5):plt.subplot(2,3, i + 1)# 2行3列子图ax = sns.kdeplot(data=airline_features[column[i]],color='blue',shade= True)plt.ylabel(column[i], fontsize=36)plt.show()

和前面结论一致,F和M 的特征很偏态,有较多异常值。

画皮尔逊相关系数热力图

corr = plt.subplots(figsize = (8,6))corr= sns.heatmap(airline_features[column].corr(),annot=True,square=True)

F和M 的相关性高,这也是必然的,因为消费越频繁的客户消费金额肯定也会更多。

数据标准化

from sklearn.preprocessing import StandardScalerscaler = StandardScaler()scaler.fit(airline_features)data = scaler.transform(airline_features)data[:5]

可以看到数据已经标准化完成了。

再查看一下数据形状:

airline_scale = dataairline_scale.shape

K-means聚类

from sklearn.cluster import KMeans 

K均值聚类,我们首先得确定聚为几类,一种很好的方法时看损失平方和随着K下降的程度。写个循环,k从1到10 ,分别计算SSE。

# 构建模型,确定k的值sse = []for k in range(1,10):model = KMeans(n_clusters=k, random_state=123, n_init=20)model.fit(airline_scale)sse.append(model.inertia_)print(sse)

画图看

plt.plot(range(1, 10), sse, 'o-')plt.axhline(sse[4], color='k', linestyle='--', linewidth=1)plt.xlabel('K')plt.ylabel('SSE')plt.title('K-means Clustering')

感觉K为5的时候SSE就不算很大了,下面选择K为5进行建模,即将客户聚为5类。

kmeans_model = KMeans(n_clusters=5, random_state=123, n_init=20)kmeans_model.fit(airline_scale)

保留聚类中心,后面画雷达图要用

kmeans_cc=kmeans_model.cluster_centers_ # 聚类中心kmeans_cc

统计一下样本聚类出来的标签的个数:

kmeans_labels = kmeans_model.labels_ # 样本的类别标签pd.Series(kmeans_labels).value_counts() # 统计不同类别样本的数目

赋值到数据后面

airline_features["kind"]=pd.Series(kmeans_labels)airline_features.head()

分组聚合,计算每种客户的5个特征的描述性统计量

airline_features.groupby('kind').describe()


结果可视化

data2=pd.DataFrame(airline_scale,columns=airline_features.columns[:5])data2["kind"]=pd.Series(kmeans_labels)

画小提琴图来观察不同的客户群的特点。

column = airline_features.columns.tolist() # 列表头fig = plt.figure(figsize=(30, 18), dpi=256)# 指定绘图对象宽度和高度for i in range(5):plt.subplot(2,3, i + 1)# 2行3列子图ax = sns.violinplot(x='kind',y=column[i],width=0.8,saturation=0.9,lw=0.8,palette="Set2",orient="v",inner="box",data=data2)plt.xlabel((['客户群' + str(i) for i in range(5)]),fontsize=20)plt.ylabel(column[i], fontsize=36)plt.show()

从图中我们首先看L特征,发现客户群3是比其他四个客户群具有一个较为集中的分部,说明客户群三的特点是L比较大的,即入会时间比较早。

R特征上,客户群4的r偏大,说明这一类客户的,上一次消费时间已经很久远,这些客户可能是已经将要流失的客户。

F和M的特征上,客户群2具有极高的异常点,分部极其偏态,所以客户群2是具有着消费频繁,消费金额大,即乘坐飞机次数多乘坐飞机的里程远的高价值客户群。

C特征上,客户群一是具有较高的折扣系数,说明这类客户偏向于乘坐打折的飞机。

下面画出雷达图进一步观察数据结构:

cluster_center = pd.DataFrame(kmeans_cc,columns = ['ZL','ZR','ZF','ZM','ZC']) # 将聚类中心放在数据框中cluster_center.index = pd.DataFrame(kmeans_labels).drop_duplicates().iloc[:,0]# 将样本类别作为数据框索引cluster_center

# 客户分群雷达图labels = ['ZL','ZR','ZF','ZM','ZC']legen = ['客户群' + str(i) for i in range(5)]# 客户群命名,作为雷达图的图例lstype = ['-','--',(0, (3, 5, 1, 5, 1, 5)),':','-.']kinds = list(cluster_center.iloc[:, 0])#print(kinds)# 由于雷达图要保证数据闭合,因此再添加L列,并转换为 np.ndarraycluster_center = pd.concat([cluster_center, cluster_center[['ZL']]], axis=1)centers = np.array(cluster_center.iloc[:, 0:])#centers 
# 分割圆周长,并让其闭合n = len(labels)angle = np.linspace(0, 2 * np.pi, n, endpoint=False)angle2 = np.concatenate((angle, [angle[0]]))# 绘图fig = plt.figure(figsize = (12,8))ax = fig.add_subplot(111, polar=True)# 以极坐标的形式绘制图形# 画线for i in range(len(kinds)):ax.plot(angle2, centers[i], linestyle=lstype[i], linewidth=4, label=kinds[i])# 添加属性标签ax.set_thetagrids(angle * 180 / np.pi,labels,fontsize=20)plt.title('客户特征分析雷达图',fontsize=30)plt.legend(legen,fontsize=20)plt.show()plt.close

雷达图进一步验证了我们的观察结果,即客户群0是没有任何特征的普通客户,客户群1是偏爱乘坐打折飞机的客户,客户群2是乘坐飞机次数都离城远的高净值客户,客户群3是入会时间较早的客户,客户群4是近期没有进行消费的客户。


研究结论及启示

结论

从聚类分析得到的结果可知,客户群0所有特征上的值都很小,且在特征L处的值最小,说明客户群0于新入会员较多的客户群;客户群1在特征C处的值最大,在特征F、M处的值较小,说明客户群1是偏好乘坐打折飞机航班的客户群,可以进行针对性打折,属于重要发展类客户;客户群2在特征F和M上的值最大,且在特征R上的值最小,说明客户群2的会员频繁乘机且近期都有乘机记录,是高净值客户,是重要保持客户;客户群3特征L处的值最大,在特征R处的值较小,其他特征值都比较适中,说明客户群3会时间较长,飞行频率也较高,是有比较高价值的客户群;客户群4在特征R处的值最大,在特征L、F、M和C处的值都较小,说明客户群4已经很久没有乘机,是入会时间较短的低价值的客户群。

总结出每个客户群的特征,具体结果如下表所示。

客户群价值排名

客户群

排名

排名含义

客户群2

1

重要保持客户

客户群1

2

重要发展用户

客户群3

3

重要挽留客户

客户群0

4

一般客户

客户群4

5

低价值客户

启示

对于不同类型客户采用不同的营销策略和服务管理。

(1)重要保持客户

这类客户的平均折扣系数(C)较高(一般所乘航班的舱位等级较高),最近乘机距今的时间长度(R)低,飞行次数(F)或总飞行里程(M)较高。他们是航空公司的高价值客户,是最为理想的客户类型,对航空公司的贡献最大,所占比例却较小。航空公司应该优先将资源投放到他们身上,对他们进行差异化管理和一对一营销,提高这类客户的忠诚度与满意度,尽可能延长这类客户的高水平消费。

(2)重要发展客户

这类客户的平均折扣系数(C)较高,最近乘机距今的时间长度(R)低,且飞行次数(F)或总飞行里程(M)较低。这类客户入会时间(L)短,他们是航空公司的潜在价值客’户。虽然这类客户的当前价值并不是很高,但却有很大的发展潜力。航空公司要努力促使这类客户增加在本公司的乘机消费和合作伙伴处的消费,也就是增加客户的钱包份额。通过客户价值的提升,加强这类客户的满意度,提高他们转向竞争对手的转移成本,使他们逐渐成为公司的忠诚客户。

(3)重要挽留客户

这类客户过去所乘航班的平均折扣系数(C)、飞行次数(F)或者总飞行里程(M)较高,但是最近乘机距今的时间长度(R)高或者说乘坐频率变小,客户价值变化的不确定性很高。由于这些客户价值衰退的原因各不相同,所以掌握客户的最新信息、维持与客户的互动就显得尤为重要。航空公司应该根据这些客户的最近消费时间以及消费次数的变化情况推测客户消费的异动状况,并列出客户名单,对其重点联系,采取一定的营销手段,延长客户的生命周期。

( 4)一般客户与低价值客户

这类客户所乘航班的平均折扣系数(C)很低.最近乘机距今的时间长度(R)高,飞行次数(F)或总飞行里程(M)较低,入会时间(L)短。他们是航空公司的一般客户与低价值客户,可能是在航空公司机票打折促销时,才会乘坐本公司航班。

其中,重要发展客户、重要保持客户、重要挽留客户这3类重要客户分别可以归入客户生命周期管理的发展期、稳定期、衰退期3个阶段。

根据每种客户类型的特征,对各类客户群进行客户价值排名,然后针对不同类型的客户群提供不同的产品和服务,提升重要发展客户的价值,稳定和延长重要保持客户的高水平消费,防范重要挽留客户的流失并积极进行关系恢复。