数据挖掘实战:带你做客户价值分析(附代码)
来源:数据路
本文约4000字,建议阅读7分钟。
手把手教你利用利用KMeans聚类进行航空公司客户价值分析。
背景与挖掘目标
1. 背景
航空公司业务竞争激烈,从产品中心转化为客户中心
针对不同类型客户,进行精准营销,实现利润最大化
建立客户价值评估模型,进行客户分类,是解决问题的办法
2. 挖掘目标
借助航空公司客户数据,对客户进行分类
对不同的客户类别进行特征分析,比较不同类客户的客户价值
对不同价值的客户类别提供个性化服务,制定相应的营销策略
详情数据见数据集内容中的air_data.csv和客户信息属性说明。
分析方法与过程
1. 分析方法
首先,明确目标是客户价值识别
识别客户价值,应用最广泛的模型是三个指标(消费时间间隔(Recency),消费频率(Frequency),消费金额(Monetary))
以上指标简称RFM模型,作用是识别高价值的客户
消费金额,一般表示一段时间内,消费的总额。但是,因为航空票价收到距离和舱位等级的影响,同样金额对航空公司价值不同
因此,需要修改指标。选定变量,舱位因素=舱位所对应的折扣系数的平均值=C,距离因素=一定时间内积累的飞行里程=M
再考虑到,航空公司的会员系统,用户的入会时间长短能在一定程度上影响客户价值,所以增加指标L=入会时间长度=客户关系长度
总共确定了五个指标,消费时间间隔R,客户关系长度L,消费频率F,飞行里程M和折扣系数的平均值C
以上指标,作为航空公司识别客户价值指标,记为LRFMC模型
如果采用传统的RFM模型,如下图。它是依据,各个属性的平均值进行划分,但是,细分的客户群太多,精准营销的成本太高。
综上,这次案例,采用聚类的办法进行识别客户价值,以LRFMC模型为基础
本案例,总体流程如下图
2.挖掘步骤
从航空公司,选择性抽取与新增数据抽取,形成历史数据和增量数据
对步骤一的两个数据,进行数据探索性分析和预处理,主要有缺失值与异常值的分析处理,属性规约、清洗和变换
利用步骤2中的已处理数据作为建模数据,基于旅客价值的LRFMC模型进行客户分群,对各个客户群再进行特征分析,识别有价值客户
针对模型结果得到不同价值的客户,采用不同的营销手段,指定定制化的营销服务,或者针对性的优惠与关怀。(重点维护老客户)
3. 数据抽取
选取,2014-03-31为结束时间,选取宽度为两年的时间段,作为观测窗口,抽取观测窗口内所有客户的详细数据,形成历史数据
对于后续新增的客户信息,采用目前的时间作为重点,形成新增数据
4. 探索性分析
本案例的探索分析,主要对数据进行缺失值和异常值分析
发现,存在票价为控制,折扣率为0,飞行公里数为0。票价为空值,可能是不存在飞行记录,其他空值可能是,飞机票来自于积分兑换等渠道
查找每列属性观测值中空值的个数、最大值、最小值的代码如下
import pandas as pddatafile= r'/home/kesci/input/date27730/air_data.csv' #航空原始数据,第一行为属性标签resultfile = r'/home/kesci/work/test.xls' #数据探索结果表data = pd.read_csv(datafile, encoding = 'utf-8') #读取原始数据,指定UTF-8编码(需要用文本编辑器将数据装换为UTF-8编码)explore = data.describe(percentiles = [], include = 'all').T #包括对数据的基本描述,percentiles参数是指定计算多少的分位数表(如1/4分位数、中位数等);T是转置,转置后更方便查阅print(explore)explore['null'] = len(data)-explore['count'] #describe()函数自动计算非空值数,需要手动计算空值数explore = explore[['null', 'max', 'min']]explore.columns = [u'空值数', u'最大值', u'最小值'] #表头重命名print('-----------------------------------------------------------------以下是处理后数据')print(explore)'''这里只选取部分探索结果。describe()函数自动计算的字段有count(非空值数)、unique(唯一值数)、top(频数最高者)、freq(最高频数)、mean(平均值)、std(方差)、min(最小值)、50%(中位数)、max(最大值)'''
-----------------------------------------------------------------以下是处理前数据 count unique top freq mean std MEMBER_NO 62988 NaN NaN NaN 31494.5 18183.2 FFP_DATE 62988 3068 2011/01/13 184 NaN NaN FIRST_FLIGHT_DATE 62988 3406 2013/02/16 96 NaN NaN GENDER 62985 2 男 48134 NaN NaN FFP_TIER 62988 NaN NaN NaN 4.10216 0.373856 WORK_CITY 60719 3310 广州 9385 NaN NaN WORK_PROVINCE 59740 1185 广东 17507 NaN NaN WORK_COUNTRY 62962 118 CN 57748 NaN NaN ...
-----------------------------------------------------------------以下是处理后数据 空值数 最大值 最小值MEMBER_NO 0 62988 1FFP_DATE 0 NaN NaNFIRST_FLIGHT_DATE 0 NaN NaNGENDER 3 NaN NaNFFP_TIER 0 6 4WORK_CITY 2269 NaN NaNWORK_PROVINCE 3248 NaN NaNWORK_COUNTRY 26 NaN NaNAGE 420 110 6LOAD_TIME 0 NaN NaNFLIGHT_COUNT 0 213 2BP_SUM 0 505308 0...
5. 数据预处理
数据清洗
丢弃票价为空记录
丢弃票价为0、平均折扣率不为0、总飞行公里数大于0的记录
import pandas as pddatafile= '/home/kesci/input/date27730/air_data.csv' #航空原始数据,第一行为属性标签cleanedfile = '' #数据清洗后保存的文件data = pd.read_csv(datafile,encoding='utf-8') #读取原始数据,指定UTF-8编码(需要用文本编辑器将数据装换为UTF-8编码)data = data[data['SUM_YR_1'].notnull() & data['SUM_YR_2'].notnull()] #票价非空值才保留#只保留票价非零的,或者平均折扣率与总飞行公里数同时为0的记录。index1 = data['SUM_YR_1'] != 0index2 = data['SUM_YR_2'] != 0index3 = (data['SEG_KM_SUM'] == 0) & (data['avg_discount'] == 0) #该规则是“与”,书上给的代码无法正常运行,修改'*'为'&'data = data[index1 | index2 | index3] #该规则是“或”print(data)# data.to_excel(cleanedfile) #导出结果
————————————————————以下是处理后数据———————— MEMBER_NO FFP_DATE FIRST_FLIGHT_DATE GENDER FFP_TIER \0 54993 2006/11/02 2008/12/24 男 6 1 28065 2007/02/19 2007/08/03 男 6 2 55106 2007/02/01 2007/08/30 男 6 3 21189 2008/08/22 2008/08/23 男 5 4 39546 2009/04/10 2009/04/15 男 6 5 56972 2008/02/10 2009/09/29 男 6 6 44924 2006/03/22 2006/03/29 男 6 7 22631 2010/04/09 2010/04/09 女 6 8 32197 2011/06/07 2011/07/01 男 5 9 31645 2010/07/05 2010/07/05 女 6
6. 属性规约
原始数据中属性太多,根据航空公司客户价值LRFMC模型,选择与模型相关的六个属性
删除其他无用属性,如会员卡号等等
def reduction_data(data): data = data[['LOAD_TIME', 'FFP_DATE', 'LAST_TO_END', 'FLIGHT_COUNT', 'SEG_KM_SUM', 'avg_discount']] # data['L']=pd.datetime(data['LOAD_TIME'])-pd.datetime(data['FFP_DATE']) # data['L']=int(((parse(data['LOAD_TIME'])-parse(data['FFP_ADTE'])).days)/30) d_ffp = pd.to_datetime(data['FFP_DATE']) d_load = pd.to_datetime(data['LOAD_TIME']) res = d_load - d_ffp data2=data.copy() data2['L'] = res.map(lambda x: x / np.timedelta64(30 * 24 * 60, 'm')) data2['R'] = data['LAST_TO_END'] data2['F'] = data['FLIGHT_COUNT'] data2['M'] = data['SEG_KM_SUM'] data2['C'] = data['avg_discount'] data3 = data2[['L', 'R', 'F', 'M', 'C']] return data3data3=reduction_data(data)print(data3)
————————————以下是以上代码处理后数据———————————— L R F M C0 90.200000 1 210 580717 0.9616391 86.566667 7 140 293678 1.2523142 87.166667 11 135 283712 1.2546763 68.233333 97 23 281336 1.0908704 60.533333 5 152 309928 0.9706585 74.700000 79 92 294585 0.9676926 97.700000 1 101 287042 0.9653477 48.400000 3 73 287230 0.9620708 34.266667 6 56 321489 0.828478
7. 数据变换
意思是,将原始数据转换成“适当”的格式,用来适应算法和分析等等的需要
本案例,主要采用数据变换的方式为属性构造和数据标准化 3.需要构造LRFMC的五个指标
L=LOAD_TIME-FFP_DATE(会员入会时间距观测窗口结束的月数=观测窗口的结束时间-入会时间(单位:月))
R=LAST_TO_END(客户最近一次乘坐公司距观测窗口结束的月数=最后一次。。。)
F=FLIGHT_COUNT(观测窗口内的飞行次数)
M=SEG_KM_SUM(观测窗口的总飞行里程)
C=AVG_DISCOUNT(平均折扣率)
def zscore_data(data): data = (data - data.mean(axis=0)) / data.std(axis=0) data.columns = ['Z' + i for i in data.columns] return datadata4 = zscore_data(data3)data4
————————————以下是以上代码处理后数据———————————— ZL ZR ZF ZM ZC0 1.435707 -0.944948 14.034016 26.761154 1.2955401 1.307152 -0.911894 9.073213 13.126864 2.8681762 1.328381 -0.889859 8.718869 12.653481 2.8809503 0.658476 -0.416098 0.781585 12.540622 1.9947144 0.386032 -0.922912 9.923636 13.898736 1.3443355 0.887281 -0.515257 5.671519 13.169947 1.328291
模型构建
1. 客户聚类
利用K-Means聚类算法对客户数据进行客户分群,聚成五类(根据业务理解和需要,分析与讨论后,确定客户类别数量)。
代码如下:
inputfile = r'/home/kesci/input/date27730/zscoreddata.xls' #待聚类的数据文件k = 5 #需要进行的聚类类别数#读取数据并进行聚类分析data = pd.read_excel(inputfile) #读取数据#调用k-means算法,进行聚类分析kmodel = KMeans(n_clusters = k, n_jobs = 4) #n_jobs是并行数,一般等于CPU数较好kmodel.fit(data) #训练模型r1 = pd.Series(kmodel.labels_).value_counts()r2 = pd.DataFrame(kmodel.cluster_centers_)r = pd.concat([r2, r1], axis=1)r.columns = list(data.columns) + ['类别数目']# print(r)# r.to_excel(classoutfile,index=False)r = pd.concat([data, pd.Series(kmodel.labels_, index=data.index)], axis=1)r.columns = list(data.columns) + ['聚类类别']print(kmodel.cluster_centers_)print(kmodel.labels_)r
[[-0.70078704 -0.41513666 -0.1607619 -0.16049688 -0.25665898] [-0.31411607 1.68662534 -0.57386257 -0.53661609 -0.17243195] [ 0.48347647 -0.79941777 2.48236495 2.42356419 0.30943042] [ 1.16033496 -0.37744106 -0.0870043 -0.09499704 -0.15836889] [ 0.05165705 -0.00258448 -0.23089344 -0.23513858 2.17775056]][3 3 3 ... 3 3 3] ZL ZR ZF ZM ZC 聚类类别0 1.689882 0.140299 -0.635788 0.068794 -0.337186 31 1.689882 -0.322442 0.852453 0.843848 -0.553613 32 1.681743 -0.487707 -0.210576 0.158569 -1.094680 33 1.534185 -0.785184 0.002030 0.273091 -1.148787 34 0.890167 -0.426559 -0.635788 -0.685170 1.231909 45 -0.232618 -0.690983 -0.635788 -0.603898 -0.391293 06 -0.496949 1.996225 -0.706656 -0.661752 -1.311107 1
就剩下最后一步,画图:
def density_plot(data): plt.rcParams['font.sans-serif']=['SimHei'] plt.rcParams['axes.unicode_minus']=False p=data.plot(kind='kde',linewidth=2,subplots=True,sharex=False) [p[i].set_ylabel('密度') for i in range(5)] [p[i].set_title('客户群%d' %i) for i in range(5)] plt.legend() plt.show() return pltdensity_plot(data4)
clu = kmodel.cluster_centers_ x = [1,2,3,4,5] colors = ['red','green','yellow','blue','black'] for i in range(5): plt.plot(x,clu[i],label='clustre '+str(i),linewidth=6-i,color=colors[i],marker='o') plt.xlabel('L R F M C') plt.ylabel('values') plt.show()
客户群1:red,
客户群2:green,
客户群3:yellow,
客户群4:blue,
客户群5:black
客户关系长度L,消费时间间隔R,消费频率F,飞行里程M,折扣系数的平均值C。
横坐标上,总共有五个节点,按顺序对应LRFMC。
对应节点上的客户群的属性值,代表该客户群的该属性的程度。
2. 客户价值分析
我们重点关注的是L,F,M,从图中可以看到:
客户群4[blue] 的F,M很高,L也不低,可以看做是重要保持的客户;
客户群3[yellow] 重要发展客户
客户群1[red] 重要挽留客户,原因:入会时间长,但是F,M较低
客户群2[green] 一般客户
客户群5[black] 低价值客户
重要保持客户:R(最近乘坐航班)低,F(乘坐次数)、C(平均折扣率高,舱位较高)、M(里程数)高。最优先的目标,进行差异化管理,提高满意度。
重要发展客户:R低,C高,F或M较低,潜在价值客户。虽然说,当前价值不高,但是却有很大的发展潜力,促使这类客户在本公司消费和合作伙伴处消费。
重要挽留客户:C、F、M较高,但是较长时间没有乘坐(R)小。增加与这类客户的互动,了解情况,采取一定手段,延长客户生命周期。
一般与低价值客户:C、F、M、L低,R高。他们可能是在公司打折促销时才会乘坐本公司航班。
3. 模型应用
会员的升级与保级(积分兑换原理相同)
会员可以分为,钻石,白金,金卡,银卡…
部分客户会因为不了解自身积分情况,错失升级机会,客户和航空公司都会有损失
在会员接近升级前,对高价值客户进行促销活动,刺激他们消费达到标准,双方获利
4. 交叉销售
通过发行联名卡与非航空公司各做,使得企业在其他企业消费过程中获得本公司的积分,增强与本公司联系,提高忠诚度。
5. 管理模式
企业要获得长期的丰厚利润,必须需要大量稳定的、高质量的客户
维持老客户的成本远远低于新客户,保持优质客户是十分重要的
精准营销中,也有成本因素,所以按照客户价值排名,进行优先的,特别的营销策略,是维持客户的关键。
6.小结
本文,结合航空公司客户价值案例的分析,重点介绍了数据挖掘算法中K-Means聚类算法的应用。 针对,传统RFM模型的不足,结合案例进行改造,设定了五个指标的LRFMC模型。最后通过聚类的结果,选出客户价值排行,并且制定相应策略。
数据挖掘实战:带你做客户价值分析(附代码)相关推荐
- 【NLP傻瓜式教程】手把手带你RCNN文本分类(附代码)
继续之前的文本分类系列 [NLP傻瓜式教程]手把手带你CNN文本分类(附代码) [NLP傻瓜式教程]手把手带你RNN文本分类(附代码) [NLP傻瓜式教程]手把手带你fastText文本分类(附代码) ...
- 【NLP傻瓜式教程】手把手带你HAN文本分类(附代码)
继续之前的文本分类系列 [NLP傻瓜式教程]手把手带你CNN文本分类(附代码) [NLP傻瓜式教程]手把手带你RNN文本分类(附代码) [NLP傻瓜式教程]手把手带你fastText文本分类(附代码) ...
- 【NLP傻瓜式教程】手把手带你fastText文本分类(附代码)
写在前面 已经发布: [NLP傻瓜式教程]手把手带你CNN文本分类(附代码) [NLP傻瓜式教程]手把手带你RNN文本分类(附代码) 继续NLP傻瓜式教程系列,今天的教程是基于FAIR的Bag of ...
- 【NLP保姆级教程】手把手带你RNN文本分类(附代码)
写在前面 这是NLP保姆级教程的第二篇----基于RNN的文本分类实现(Text RNN) 参考的的论文是来自2016年复旦大学IJCAI上的发表的关于循环神经网络在多任务文本分类上的应用:Recur ...
- ASP.NET的MVC中使用Cookie做身份验证(附代码下载)
场景 ASP.NET的MVC中使用Session做身份验证(附代码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/1071 ...
- php输出熊猫图案,如何用CSS实现一只带帽子的大熊猫(附代码)
本篇文章给大家带来的内容是关于如何用CSS实现一只带帽子的大熊猫(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 黑眼圈的大熊猫可谓非常可爱,今天就用CSS实现以下萌萌哒的大 ...
- 教你用Python发现即将流失的客户(附代码、安装教程、学习资源)
烦恼 作为一名数据分析师,你来到这家跨国银行工作已经半年了. 今天上午,老板把你叫到办公室,面色凝重. 你心里直打鼓,以为自己捅了什么篓子.幸好老板的话让你很快打消了顾虑. 他发愁,是因为最近欧洲区的 ...
- 6 个步骤,教你在Ubuntu虚拟机环境下,用Docker自带的DNS配置Hadoop | 附代码
作者 | tianyouououou 责编 | Carol 来源 | CSDN 博客 封图 | CSDN付费下载于视觉中国 最近,作者整理了一套Hadoop搭建方案.最后的镜像大小1.4G多,使用do ...
- 【NLP傻瓜式教程】手把手带你RNN文本分类(附代码)
文章来源于NewBeeNLP,作者kaiyuan 写在前面 这是NLP傻瓜式教程的第二篇----基于RNN的文本分类实现(Text RNN) 参考的的论文是来自2016年复旦大学IJCAI上的发表的关 ...
最新文章
- javascript中有关this的使用
- window下python扩展包大全
- c# 利用反射获得某个类或者对象的所有属性
- 思科UCS服务器怎么安装系统,安装Redhat/CentOS操作系统在UCS M系列服务器
- iPhone与Android手机 各个型号的UserAgent
- IIS服务中五种身份验证的灵活运用-转
- window如何杀掉java进程_windows下java -jar 后台运行以及杀死后台进程的操作
- bi工具选型_数据分析工具:选合适了,分析也能事半功倍
- sklearn中的逻辑回归
- 关于公司财务的预测,使用sklearn中的bp神经网络
- 著名音频库多角度对比(多平台可用)
- HTTP从入门到入土(1)——五层网络模型
- LayaAr 批量加载资源 LoaderManager
- 完整的连接器设计手册_连接器设计中,仿真技术提供了力学理论依据
- 《图解HTTP》笔记
- 使用python的turtle绘画滑稽脸
- vue+ckplayer+rtmp
- 中望3D 2021 插入基准面 - 三点法
- “趣工厂”获得数百万元天使轮融资,梅鹤资本领投...
- 网络安全攻防实验室通关教程-上传关
热门文章
- 如何衡量RFID技术在仓库中的价值?
- java 8 lambda表达式
- JavaScript强化教程-JS面向对象编程
- Oracle 表的访问方式(2)-----索引扫描
- vector的插入、lower_bound、upper_bound、equal_range实例
- CentOS 安装NTFS-3G,让系统支持NTFS分区的方法
- 深入理解按位异或运算符
- HDU-3573 Buy Sticks
- 成本VS用户体验, 服务台互动语音应答(IVR)介绍
- WPF Multi-Touch 开发:高级触屏操作(Manipulation)