准确的客户分类的结果是企业优化营销资源的重要依据,本文利用了航空公司的部分数据,利用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聚类进行航空公司客户价值分析的更多相关文章

  1. Python数据挖掘-航空公司客户价值分析

    出处:http://www.ithao123.cn/content-11127869.html 航空公司客户价值分析 目标:企业针对不同价值的客户制定个性化的服务,将有限的资源集中于高价值客户. 1. ...

  2. 航空公司客户价值分析(KMeans聚类)

    PS.图片可能不清楚,代码 数据集都在 https://github.com/xubin97/Data-Mining_exp1 项目介绍: 本案例的目标是客户价值识别,通过航空公司客户数据识别不同价值 ...

  3. 基于R语言的航空公司客户价值分析

    分析航空公司现状 1.行业内竞争 民航的竞争除了三大航空公司之间的竞争之外,还将加入新崛起的各类小型航空公司.民营航空公司,甚至国外航空巨头.航空产品生产过剩,产品同质化特征愈加明显,于是航空公司从价 ...

  4. [Python数据挖掘]第7章、航空公司客户价值分析

    一.背景和挖掘目标 二.分析方法与过程 客户价值识别最常用的是RFM模型(最近消费时间间隔Recency,消费频率Frequency,消费金额Monetary) 1.EDA(探索性数据分析) #对数据 ...

  5. 利用K-means聚类分类,进行特征学习

    这只是老师安排的一个实验,准备过程中遇到各种问题,现在贴出来供大家参考,是Andrew Ng参与的研究, 论文依据如下,第二篇是一篇相关的论文, Learning Feature Representa ...

  6. 航空客户价值分析特色LRFMC模型——RFM升级

    本文转载自微信公众号TIpDM. 每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 我们说RFM ...

  7. K-Means聚类算法原理

    K-Means算法是无监督的聚类算法,它实现起来比较简单,聚类效果也不错,因此应用很广泛.K-Means算法有大量的变体,本文就从最传统的K-Means算法讲起,在其基础上讲述K-Means的优化变体 ...

  8. K-means聚类算法

    聚类分析(英语:Cluster analysis,亦称为群集分析) K-means也是聚类算法中最简单的一种了,但是里面包含的思想却是不一般.最早我使用并实现这个算法是在学习韩爷爷那本数据挖掘的书中, ...

  9. Kmeans聚类算法原理与实现

    Kmeans聚类算法 1 Kmeans聚类算法的基本原理 K-means算法是最为经典的基于划分的聚类方法,是十大经典数据挖掘算法之一.K-means算法的基本思想是:以空间中k个点为中心进行聚类,对 ...

随机推荐

  1. win10 mac地址修改器

    NoVirus Thanks MAC Address Changer NoVirus Thanks MAC Address Changer is yet another simple MAC addr ...

  2. 使用开源工具MonoDevelop开发GTK#图形界面

    转自:http://developer.51cto.com/art/201011/235040.htm Mono一直到现在的2.8已经完全可以胜任一些比较小的项目了,但相关的开发文档与教程一直比较匮乏 ...

  3. (转)MyEclipse设置注释格式

    原文:http://xinghaifeng2006.iteye.com/blog/1243565 MyEclipse设置注释格式(转载)          博客分类: Java基础知识   Windo ...

  4. android死机问题

    一般在平时工作中,基本上很多代码可以在eclipse+ndk进行调试,但如果需要用到具体的硬件设备,如媒体播放设备无法模拟的情况下,只能上硬件(盒子或手机)上进行调试.此时唯一的调试手段就是logca ...

  5. Maven Build profiles

    They modify the POM at build time, and are meant to be used in complementary sets to give equivalent ...

  6. 【LeetCode OJ】Interleaving String

    Problem Link: http://oj.leetcode.com/problems/interleaving-string/ Given s1, s2, s3, find whether s3 ...

  7. HDU1556-color the ball(线段树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1556 #include<cstdio> using namespace std; stru ...

  8. # 20145210 《Java程序设计》第06周学习总结

    教材学习内容总结 第十章 输入\输出 10.1 InputStream与OutputStream •串流设计的概念 •java将输入\输出抽象化为串流,数据有来源及目的地,衔接两者的是串流对象 •从应 ...

  9. 20145210 《Java程序设计》第一周学习总结

    教材学习内容总结 第一章: 1.Java三大平台,JavaSE的四个组成部分 Java根据应用领域的不同,区分为Java SE.Java EE.Java ME三大平台. 各应用平台的基础:Java S ...

  10. 转:Microsoft Enterprise Library 5.0 系列教程(一) Caching Application Block (高级)

    http://www.360doc.com/content/13/0918/22/15643_315482318.shtml http://www.360doc.com/content/13/0918 ...