利用KMeans聚类进行航空公司客户价值分析
准确的客户分类的结果是企业优化营销资源的重要依据,本文利用了航空公司的部分数据,利用Kmeans聚类方法,对航空公司的客户进行了分类,来识别出不同的客户群体,从来发现有用的客户,从而对不同价值的客户类别提供个性化服务,指定相应的营销策略。
一、分析方法和过程
1.数据抽取——>2.数据探索与预处理——>3。建模与应用
传统的识别客户价值应用最广泛的模型主要通过3个指标(最近消费时间间隔(Recency)、消费频率(Frequency)和消费金额(Monetary))来进行客户细分,识别出价值高的客户,简称RFC模型。点击查看RFC
在RFC模型中,消费金额表示在一段时间内,客户购买产品的总金额。但是不适用于航空公司的数据处理。因此我们用客户在一段时间内的累计飞行里程M和客户在一定时间内乘坐舱位的折扣系数C代表消费金额。再在模型中增加客户关系长度L,所以我们用LRFMC模型。
因此本次数据挖掘的主要步骤:
1).从航空公司的数据源中进行选择性抽取与新增数据抽取分别形成历史数据和增量数据
2).对步骤1)中形成的两个数据集进行数据探索分析和预处理,包括数据缺失值和异常值分析。即数据属性的规约、清洗和变换
3).利用步骤2)中的处理的数据进行建模,利用Python下Sklearn库中提供的KMeans方法,进行聚类
4)。针对模型的结果进行分析。
二。数据处理
1.下面是本次试验数据集的一部分截图,数据集抽取2012-4-1到2014-3-31内乘客的数据,一个62988条数据。包括了会员卡号、入会时间、性别、年龄等44个属性。

2.数据探索分析:主要是对数据进行缺失值分析与异常值的分析。通过发现原始数据中存在票价为空值,票价最小值为0,折扣率最小值为0、总飞行公里数大于0的记录。
其Python代码如下:
def explore(datafile,exploreoutfile):
"""
进行数据的探索
@Dylan
:param data: 原始数据目录
:return: 探索后的结果
"""
data=pd.read_csv(datafile,encoding='utf-8')
explore=data.describe(percentiles=[],include='all').T####包含了对数据的基本描述,percentiles参数是指定计算多少分位数
explore['null']=len(data)-explore['count'] ##手动计算空值数
explore=explore[['null','max','min']]####选取其中的重要列
explore.columns=['空值数','最大值','最小值']
"""describe()函数自动计算的字段包括:count、unique、top、max、min、std、mean。。。。。
"""
# explore=explore.fillna(0)
explore.to_excel(exploreoutfile)
上面代码得到的探索结果:
3.数据预处理:
3.1数据清洗:
(1)丢弃票价为空的记录
(2)丢弃票价为0、平均折扣率不足0、总飞行公里数大于0的距离
数据清洗的Python代码如下:
def clean_data(datafile,cleanoutfile):
"""
进行数据清洗,丢弃票价为空记录,丢弃票价为0,折扣不为0且飞行距离大于0的距离
@Dylan
:param data:原始数据
:return:
"""
data=pd.read_csv(datafile,encoding='utf-8') data=data[data['SUM_YR_1'].notnull()*data['SUM_YR_2'].notnull()]####票价值非空才会保留
####只保留票价非0的,或者平均折扣率与总飞行记录同时为0 的记录
index1=data['SUM_YR_1']!=0
index2=data['SUM_YR_2']!=0
index3=(data['SEG_KM_SUM']==0) & (data['avg_discount']==0) data=data[index1 | index2 | index3]
data.to_excel(cleanoutfile)
3.2属性规约
选择与LRFMC模型指标相关的6个属性:FFP_DATE、LOAD_TIME、FLIGHT_COUNT、avg_discount、SEG_KM_SUM、LAST_TO_END。删除不相关的属性。
3.3 数据变换
由于原始数据没有直接给出LRFMC五个指标,需要自己计算,具体的计算方式为:
(1)L=LOAD_TIME-FFP_DATE
(2)R=LAST_TO_END
(3)F=FLIGHT_COUNT
(4) M=SEG_KM_SUM
(5)C=avg_discount
数据变换的Python代码如下:
def reduction_data(datafile,reoutfile):
data=pd.read_excel(cleanoutfile,encoding='utf-8')
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)
####这四行代码费了我3个小时
d_ffp=pd.to_datetime(data['FFP_DATE'])
d_load=pd.to_datetime(data['LOAD_TIME'])
res=d_load-d_ffp
data['L']=res.map(lambda x:x/np.timedelta64(30*24*60,'m')) data['R']=data['LAST_TO_END']
data['F']=data['FLIGHT_COUNT']
data['M']=data['SEG_KM_SUM']
data['C']=data['avg_discount']
data=data[['L','R','F','M','C']]
data.to_excel(reoutfile)
变换结果如下:
3.4 数据标准化
Python代码如下:
def zscore_data(datafile,zscorefile):
data=pd.read_excel(datafile)
data=(data-data.mean(axis=0))/data.std(axis=0)
data.columns=['Z'+i for i in data.columns] data.to_excel(zscorefile,index=False)
最后数据结果如下:
4.建立模型
4.1客户聚类
采用kMeans聚类算法对客户数据进行客户分组,聚成5组,Python代码如下:
import pandas as pd
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
from itertools import cycle datafile='./tmp/zscore.xls'
k=5
classoutfile='./tmp/class.xls'
resoutfile='./tmp/result.xls'
data=pd.read_excel(datafile) kmodel=KMeans(n_clusters=k,max_iter=1000)
kmodel.fit(data) # print(kmodel.cluster_centers_)
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)+['聚类类别']
# r.to_excel(resoutfile,index=False)
对数据进行聚类分群的结果如下表所示:

自定义绘图函数进行绘制出每个聚类数据的密度图像:
def density_plot(data):
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
p=data.plot(kind='kde',linewidth=,subplots=True,sharex=False)
[p[i].set_ylabel('密度') for i in range(k)]
[p[i].set_title('客户群%d' %i) for i in range(k)]
plt.legend()
return plt
下图为其中的一个

有了模型和图像后我们就可以进行分析。
利用KMeans聚类进行航空公司客户价值分析的更多相关文章
- Python数据挖掘-航空公司客户价值分析
出处:http://www.ithao123.cn/content-11127869.html 航空公司客户价值分析 目标:企业针对不同价值的客户制定个性化的服务,将有限的资源集中于高价值客户. 1. ...
- 航空公司客户价值分析(KMeans聚类)
PS.图片可能不清楚,代码 数据集都在 https://github.com/xubin97/Data-Mining_exp1 项目介绍: 本案例的目标是客户价值识别,通过航空公司客户数据识别不同价值 ...
- 基于R语言的航空公司客户价值分析
分析航空公司现状 1.行业内竞争 民航的竞争除了三大航空公司之间的竞争之外,还将加入新崛起的各类小型航空公司.民营航空公司,甚至国外航空巨头.航空产品生产过剩,产品同质化特征愈加明显,于是航空公司从价 ...
- [Python数据挖掘]第7章、航空公司客户价值分析
一.背景和挖掘目标 二.分析方法与过程 客户价值识别最常用的是RFM模型(最近消费时间间隔Recency,消费频率Frequency,消费金额Monetary) 1.EDA(探索性数据分析) #对数据 ...
- 利用K-means聚类分类,进行特征学习
这只是老师安排的一个实验,准备过程中遇到各种问题,现在贴出来供大家参考,是Andrew Ng参与的研究, 论文依据如下,第二篇是一篇相关的论文, Learning Feature Representa ...
- 航空客户价值分析特色LRFMC模型——RFM升级
本文转载自微信公众号TIpDM. 每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 我们说RFM ...
- K-Means聚类算法原理
K-Means算法是无监督的聚类算法,它实现起来比较简单,聚类效果也不错,因此应用很广泛.K-Means算法有大量的变体,本文就从最传统的K-Means算法讲起,在其基础上讲述K-Means的优化变体 ...
- K-means聚类算法
聚类分析(英语:Cluster analysis,亦称为群集分析) K-means也是聚类算法中最简单的一种了,但是里面包含的思想却是不一般.最早我使用并实现这个算法是在学习韩爷爷那本数据挖掘的书中, ...
- Kmeans聚类算法原理与实现
Kmeans聚类算法 1 Kmeans聚类算法的基本原理 K-means算法是最为经典的基于划分的聚类方法,是十大经典数据挖掘算法之一.K-means算法的基本思想是:以空间中k个点为中心进行聚类,对 ...
随机推荐
- 解决:Ubuntu12.04下使用ping命令返回ping:icmp open socket: Operation not permitted的解决
ping命令在运行中采用了ICMP协议,需要发送ICMP报文.但是只有root用户才能建立ICMP报文.而正常情况下,ping命令的权限应为-rwsr-xr-x,即带有suid的文件,一旦该权限被修改 ...
- iOS传值方式:属性,代理,block,单例,通知
正向传值均可,反向传值除属性传值不可,其余均可.下面简单介绍: (一)属性传值 第二个界面中的lable显示第一个界面textField中的文本 首先我们建立一个RootViewControllers ...
- Java可变参数/可变长参数
Java可变参数/可变长参数 传递的参数不确定长度,是变长的参数,例如小例子: package demo; public class Demo { public static int sum(int ...
- (Foundation)NSObject 、 NSString 、 NSMutableString
1 重构Student和Book类 1.1 问题 本案例需要创建一个Book类,类中有一个整型price属性,用于记录书的价格.还需要创建一个Student类,类中有两个带参属性,它们是整型的年龄ag ...
- SecureCRT rz和sz命令不可用,安装lrzsz
1.从网站下载 lrzsz-x.xx.xx.tar.gz2.解压文件[root@localhost src]# tar zxvf lrzsz-0.12.20.tar.gz3.安装[root@local ...
- jQuery对象与DOM对象之间的转换
刚开始学习jQuery,可能一时会分不清楚哪些是jQuery对象,哪些是DOM对象.至于DOM对象不多解释,我们接触的太多了,下面重点介绍一下jQuery,以及两者相互间的转换. 什么是jQuery对 ...
- 学学数据库,记记sql
(1)Truncate 和 Drop 和 Delete 1. TRUNCATE TABLE 在功能上与不带 Where 子句的 Delete 语句相同:二者均删除表中的全部行.但 TRUNCATE T ...
- LeetCode OJ String to Integer (atoi) 字符串转数字
#include <iostream> #include <assert.h> using namespace std; int ato(const char *str) { ...
- supervisor很赞!
最近,公司进行了新的架构设计,原来一个区服一组进程,变成了对外只有一台服,后面N组多进程进行服务的模式.于是,管理进程就变成了一个头痛的问题.原来是在写代码的目录里放置各种脚本解决的,关闭脚本,开启脚 ...
- Sqlserver 角色那些事
固定服务器角色 描述 sysadmin 可以在SQLServer 中执行任何活动. serveradmin 可以设置服务器范围的配置选项,关闭服务器. setupadmin 可以管理链接服务器和启动过 ...