当前位置:文档之家› 利用K-Means聚类进行航空公司客户价值分析.doc

利用K-Means聚类进行航空公司客户价值分析.doc

利用 K-Means 聚类进行航空公司客户价值分析1.背景与挖掘目标 1.1 背景航空公司业务竞争激烈,从产品中心转化为客户中心。

针对不同类型客户,进行精准营销,实现利润最大化。

建立客户价值评估模型,进行客户分类,是解决问题的办法 1.2 挖掘目标借助航空公司客户数据,对客户进行分类。

对不同的客户类别进行特征分析,比较不同类客户的客户价值对不同价值的客户类别提供个性化服务,制定相应的营销策略。

详情数据见数据集内容中的air_data.csv 和客户信息属性说明 2.分析方法与过程 2.1 分析方法首先,明确目标是客户价值识别。

识别客户价值,应用最广泛的模型是三个指标(消费时间间隔(Recency) ,消费频率( Frequency),消费金额( Monetary ))以上指标简称RFM 模型,作用是识别高价值的客户消费金额,一般表示一段时间内,消费的总额。

但是,因为航空票价收到距离和舱位等级的影响,同样金额对航空公司价值不同。

因此,需要修改指标。

选定变量,舱位因素=舱位所对应的折扣系数的平均值=C,距离因素 =一定时间内积累的飞行里程 =M 。

再考虑到,航空公司的会员系统,用户的入会时间长短能在一定程度上影响客户价值,所以增加指标 L= 入会时间长度 =客户关系长度总共确定了五个指标,消费时间间隔 R,客户关系长度 L ,消费频率 F,飞行里程 M 和折扣系数的平均值 C 以上指标,作为航空公司识别客户价值指标,记为LRFMC 模型如果采用传统的 RFM 模型,如下图。

它是依据,各个属性的平均值进行划分,但是,细分的客户群太多,精准营销的成本太高。

综上,这次案例,采用聚类的办法进行识别客户价值,以LRFMC 模型为基础本案例,总体流程如下图2.2 挖掘步骤从航空公司,选择性抽取与新增数据抽取,形成历史数据和增量数据对步骤一的两个数据,进行数据探索性分析和预处理,主要有缺失值与异常值的分析处理,属性规约、清洗和变换利用步骤 2 中的已处理数据作为建模数据,基于旅客价值的 LRFMC 模型进行客户分群,对各个客户群再进行特征分析,识别有价值客户。

针对模型结果得到不同价值的客户,采用不同的营销手段,指定定制化的营销服务,或者针对性的优惠与关怀。

(重点维护老客户) 2.3 数据抽取选取, 2014-03-31 为结束时间,选取宽度为两年的时间段,作为观测窗口,抽取观测窗口内所有客户的详细数据,形成历史数据对于后续新增的客户信息,采用目前的时间作为重点,形成新增数据 2.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 topfreq mean stdMEMBER_NO 62988 NaNNaN NaN 31494.5 18183.2FFP_DATE 62988 3068 2011/01/13184 NaN NaNFIRST_FLIGHT_DATE 62988 3406 2013/02/1696 NaN NaNGENDER 62985 2男48134 NaN NaNFFP_TIER 62988 NaN NaNNaN 4.10216 0.373856WORK_CITY 60719 3310 广州9385 NaN NaNWORK_PROVINCE 59740 1185广东17507 NaN NaNWORK_COUNTRY 62962 118CN 57748 NaN NaN...----------------------------------------------------------------- 以下是处理后数据空值数最大值最小值MEMBER_NO 0 62988 1 FFP_DATE 0 NaNNaNFIRST_FLIGHT_DATE 0 NaN NaN GENDER 3 NaN NaN FFP_TIER 0 6 4 WORK_CITY 2269 NaN NaN WORK_PROVINCE 3248 NaN NaN WORK_COUNTRY 26 NaN NaN AGE 420 110 6 LOAD_TIME 0 NaN NaN FLIGHT_COUNT 0 213 2BP_SUM 0 505308 0 ...2.3 数据预处理数据清洗丢弃票价为空记录丢弃票价为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_DATEFIRST_FLIGHT_DATE GENDER FFP_TIER\0 54993 2006/11/02 2008/12/24 男 61 28065 2007/02/19 2007/08/03 男 62 55106 2007/02/01 2007/08/30 男 63 21189 2008/08/22 2008/08/23 男 54 39546 2009/04/10 2009/04/15 男 65 56972 2008/02/10 2009/09/29 男 66 44924 2006/03/22 2006/03/29 男 67 22631 2010/04/09 2010/04/09 女 68 32197 2011/06/07 2011/07/01 男 59 31645 2010/07/05 2010/07/05 女 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['F FP_DATE'])#data['L']=int(((parse(data['LOAD_TIME'])-parse(data['FFP_AD TE'])).days)/30)d_ffp = pd.to_datetime(data['FFP_DATE'])d_load = pd.to_datetime(data['LOAD_TIME'])res = d_load - d_ffpdata2=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.5333335 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数据变换意思是,将原始数据转换成“适当”的格式,用来适应算法和分析等等的需要。

相关主题