Python数据分析案例09——航空公司客户聚类分析
参考书目: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 np
import pandas as pd
import 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 StandardScaler
scaler = StandardScaler()
scaler.fit(airline_features)
data = scaler.transform(airline_features)
data[:5]
可以看到数据已经标准化完成了。
再查看一下数据形状:
airline_scale = data
airline_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.ndarray
cluster_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个阶段。
根据每种客户类型的特征,对各类客户群进行客户价值排名,然后针对不同类型的客户群提供不同的产品和服务,提升重要发展客户的价值,稳定和延长重要保持客户的高水平消费,防范重要挽留客户的流失并积极进行关系恢复。
Python数据分析案例09——航空公司客户聚类分析相关推荐
- python客户价值分析_Python数据分析与应用航空公司客户价值分析.ppt
Python数据分析与应用航空公司客户价值分析.ppt 大数据,成就未来 * 大数据挖掘专家 * 大数据挖掘专家 大数据,成就未来 航空公司客户价值分析 * 目录 分析航空公司现状 1. 行业内竞争 ...
- python数据分析实战-Python数据分析案例实战(慕课版)
基本信息 书名:Python数据分析案例实战(慕课版) :59.80元 作者:王浩,袁琴,张明慧 著 出版社:人民邮电出版社 出版日期:2020_06_01 ISBN:9787115520845 字数 ...
- python数据分析实战案例-Python数据分析案例实战
原标题:Python数据分析案例实战 至今我们网站已经开设了多个数据分析系列的课程,大部分都是基于算法思路来开展的,课程中着重点在于算法的讲授.软件的使用,案例只是辅助学习.然而很多学员反映,希望可以 ...
- 视频教程-Python数据分析案例实战 视频课程-Python
Python数据分析案例实战 视频课程 计算机硕士,多年工作经验,技术和产品负责人. 多年推荐系统/NLP/大数据工作经验. 负责公司多个AI项目产品落地,包括文本分类.关键词抽取.命名实体识别.对话 ...
- python 数据分析 实际案例-Python数据分析案例实战
原标题:Python数据分析案例实战 至今我们网站已经开设了多个数据分析系列的课程,大部分都是基于算法思路来开展的,课程中着重点在于算法的讲授.软件的使用,案例只是辅助学习.然而很多学员反映,希望可以 ...
- 数据分析实战:航空公司客户价值分析
一.背景目标 通过对航空公司客户数据分析,对客户进行分类: 比较不同客户的客户价值,并制定不同的服务和营销策略 二.数据探索分析 2.1 数据概况 数据时间范围: 2012年4月1日至2014年3月3 ...
- python数据分析案例-利用生存分析Kaplan-Meier法与COX比例风险回归模型进行客户流失分析与剩余价值预测
目录 1. 概述 1.1 背景 1.2 目的 1.3 数据说明 2. 相关概念 2.1 事件 2.2 生存时间 2.3 删失 2.4 生存概率 2.5 中位生存时间 2.6 风险概率 3. 数据处理 ...
- Python数据分析案例19——上市银行财务指标对比
我代码栏目都是针对基础的python数据分析人群,比如想写个本科毕业论文,课程论文,做个简单的案例分析等.过去写的案例可能使用了过多的机器学习和深度学习方法,文科的同学看不懂,可能他们仅仅只想用pyt ...
- python客户价值分析_航空公司客户价值分析实例
第8章 航空公司客户价值分析 传统的识别客户价值应用最广泛的模型主要通过3个指标(最近消费时间间隔(Recency).消费频率(Frequency)和消费金额(Monetary))来进行客户细分,识别 ...
- Python数据分析案例08——预测泰坦尼克号乘员的生存(机器学习全流程)
上一篇数据分析案例是回归问题,本次案例带来分类问题的 机器学习案例.这个数据集比上个案例更小.更简单,代码也不复杂,新手都可以学一学. 1.背景分析 预测乘客是否存活下来 泰坦尼克号是数据科学机器学习 ...
最新文章
- java 如何实现导出文件
- HP-UX Root密码被锁定的非关机情况下解决方案
- 社招转行CV算法的心酸之路:越朴素的方法,往往越容易成功!
- 14.5.5 Creating a File-Per-Table Tablespace Outside the Data Directory
- 主流大数据平台及解决方案对比
- dede织梦5.7,后台采集数据导入,空文章过滤.
- python xlwt xlrd模块详解_python操作excel之xlrd、xlwt模块详解
- 博士论文致谢走红后,黄国平母校演讲再刷屏!
- 技术人生:希望有生之年开发一个“自己的解释语言”
- 【报告分享】2020中国后浪生存图鉴.pdf(附下载链接)
- 利用Python程序读取Excel创建折线图
- 【读书笔记->统计学】03-02 各种“距”和“差”-方差、标准差、标准分概念简介
- 使用SQL语句在K3里进行反结帐- -
- 将TXT文件作为数据库批量生成条形码
- 树的搜索问题1(深度优先、广度优先,爬山法和best-first)
- 抖音小程序Tiktok教程之 01 编写您第一个hello world程序(含视频教程)
- ssh登录windows
- Google Chrome谷歌浏览器崩溃,错误代码: STATUS_STACK_BUFFER_OVERRUN
- linux修改vlan子接口mac地址,macvlan虚拟接口
- SAP QM 检验点 (Inspection Point) 的使用