背景
用户是互联网经营的外围,客户关系治理(Customer Relationship Management,CRM)是企业的外围问题。CRM 的关键问题是客户分类,搭建用户标签体系,构建用户画像。通过客户分类,辨别无价值客户、高价值客户,针对不同价值的客户制订优化的个性化服务计划,采取不同营销策略,将无限营销资源集中于高价值客户,实现企业利润最大化指标。
面对强烈的市场竞争,各个航空公司都推出了更优惠的营销形式来吸引更多的客户,国内某航空公司面临着旅客散失、竞争力降落和航空资源未充分利用等经营危机。通过建设正当的客户价值评估模型,对客户进行分群,剖析比拟不同客户群的客户价值,并制订相应的营销策略,对不同的客户群提供个性化的客户服务是必须和无效的。目前该航空公司已积攒了大量的会员档案信息和其乘坐航班记录。
指标
- 借助航空公司客户数据,对客户进行分类。
- 对不同的客户类别进行特征分析,比拟不同类客户的客户价值。
- 对不同价值的客户类别提供个性化服务,制订相应的营销策略。
剖析框架
我的项目指标是客户价值辨认,即通过航空公司客户数据辨认不同价值的客户。辨认客户价值利用最宽泛的模型是通过 3 个指标 (最近生产工夫距离(Recency)、生产频率(Frequency) 和生产金额 (Monetary) 来进行客户细分,辨认出高价值的客户,简称 RFM 模型。
在 RFM 模型中,生产金额示意在一段时间内,客户购买该企业产品金额的总和。因为飞机票价受到运输间隔、舱位等级等多种因素影响,同样生产金额的不同旅客对航空公司的价值是不同的。例如,一位购买长航线、低等级舱位票的旅客与一位购买短航线、高等级舱位票的旅客相比,后者对于航空公司而言价值可能更高。因而,这个指标并不适用于航空公司的客户价值剖析。这里,抉择每位客户的公里支出作为掂量值。此外,思考航空公司会员人会工夫的长短在肯定水平上可能影响客户价值,所以在模型中减少客户关系时常 L,作为辨别客户的另一指标。
RMF 模型将客户空间分为 $2^3=8$ 局部,如果应用相似 RFM 的分类办法,LRFPKC 将产生 $2^5=32$ 种分类后果,细分群体太多。因而,本文采纳聚类办法对客户进行分类。
我的项目流程
![上传中 …]()
主体
数据抽取
import pandas as pd
import numpy as np
import random as rnd
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
import warnings
warnings.filterwarnings('ignore')
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = [u'SimHei']
plt.rcParams['axes.unicode_minus'] = False
从航空公司零碎内的客户根本信息、伺机信息以及积分信息等具体数据中,依据末次航行日期(LAST_FLIGHT_DATE),抽取 2012-04-01 至 2014-03-31 内所有乘客的具体数据,总共有 62988 条记录。其中蕴含了会员卡号、入会工夫、性别、年龄、会员卡级别、工作地城市、工作地所在省份、工作地所在国家、观测窗口完结工夫、观测窗口伺机积分、航行公里数、航行次数、航行工夫、伺机工夫距离和均匀折扣率等 44 个属性。(数据来源于互联网)
# 数据前五行
data = pd.read_csv('air_data.csv')
data.head().T
0 | 1 | 2 | 3 | 4 | |
---|---|---|---|---|---|
MEMBER_NO | 54993 | 28065 | 55106 | 21189 | 39546 |
FFP_DATE | 2006/11/2 | 2007/2/19 | 2007/2/1 | 2008/8/22 | 2009/4/10 |
FIRST_FLIGHT_DATE | 2008/12/24 | 2007/8/3 | 2007/8/30 | 2008/8/23 | 2009/4/15 |
GENDER | 男 | 男 | 男 | 男 | 男 |
FFP_TIER | 6 | 6 | 6 | 5 | 6 |
WORK_CITY | . | NaN | . | Los Angeles | 贵阳 |
WORK_PROVINCE | 北京 | 北京 | 北京 | CA | 贵州 |
WORK_COUNTRY | CN | CN | CN | US | CN |
AGE | 31.0 | 42.0 | 40.0 | 64.0 | 48.0 |
LOAD_TIME | 2014/3/31 | 2014/3/31 | 2014/3/31 | 2014/3/31 | 2014/3/31 |
FLIGHT_COUNT | 210 | 140 | 135 | 23 | 152 |
BP_SUM | 505308 | 362480 | 351159 | 337314 | 273844 |
EP_SUM_YR_1 | 0 | 0 | 0 | 0 | 0 |
EP_SUM_YR_2 | 74460 | 41288 | 39711 | 34890 | 42265 |
SUM_YR_1 | 239560.0 | 171483.0 | 163618.0 | 116350.0 | 124560.0 |
SUM_YR_2 | 234188.0 | 167434.0 | 164982.0 | 125500.0 | 130702.0 |
SEG_KM_SUM | 580717 | 293678 | 283712 | 281336 | 309928 |
WEIGHTED_SEG_KM | 558440.14 | 367777.2 | 355966.5 | 306900.88 | 300834.06 |
LAST_FLIGHT_DATE | 2014/3/31 | 2014/3/25 | 2014/3/21 | 2013/12/26 | 2014/3/27 |
AVG_FLIGHT_COUNT | 26.25 | 17.5 | 16.875 | 2.875 | 19.0 |
AVG_BP_SUM | 63163.5 | 45310.0 | 43894.875 | 42164.25 | 34230.5 |
BEGIN_TO_FIRST | 2 | 2 | 10 | 21 | 3 |
LAST_TO_END | 1 | 7 | 11 | 97 | 5 |
AVG_INTERVAL | 3.483254 | 5.194245 | 5.298507 | 27.863636 | 4.788079 |
MAX_INTERVAL | 18 | 17 | 18 | 73 | 47 |
ADD_POINTS_SUM_YR_1 | 3352 | 0 | 3491 | 0 | 0 |
ADD_POINTS_SUM_YR_2 | 36640 | 12000 | 12000 | 0 | 22704 |
EXCHANGE_COUNT | 34 | 29 | 20 | 11 | 27 |
avg_discount | 0.961639 | 1.252314 | 1.254676 | 1.09087 | 0.970658 |
P1Y_Flight_Count | 103 | 68 | 65 | 13 | 71 |
L1Y_Flight_Count | 107 | 72 | 70 | 10 | 81 |
P1Y_BP_SUM | 246197 | 177358 | 169072 | 186104 | 128448 |
L1Y_BP_SUM | 259111 | 185122 | 182087 | 151210 | 145396 |
EP_SUM | 74460 | 41288 | 39711 | 34890 | 42265 |
ADD_Point_SUM | 39992 | 12000 | 15491 | 0 | 22704 |
Eli_Add_Point_Sum | 114452 | 53288 | 55202 | 34890 | 64969 |
L1Y_ELi_Add_Points | 111100 | 53288 | 51711 | 34890 | 64969 |
Points_Sum | 619760 | 415768 | 406361 | 372204 | 338813 |
L1Y_Points_Sum | 370211 | 238410 | 233798 | 186100 | 210365 |
Ration_L1Y_Flight_Count | 0.509524 | 0.514286 | 0.518519 | 0.434783 | 0.532895 |
Ration_P1Y_Flight_Count | 0.490476 | 0.485714 | 0.481481 | 0.565217 | 0.467105 |
Ration_P1Y_BPS | 0.487221 | 0.489289 | 0.481467 | 0.551722 | 0.469054 |
Ration_L1Y_BPS | 0.512777 | 0.510708 | 0.51853 | 0.448275 | 0.530943 |
Point_NotFlight | 50 | 33 | 26 | 12 | 39 |
数据摸索
缺失值剖析
# 数据根本统计信息
description = data.describe(include='all').T
description['null'] = len(data) - description['count']
description
count | unique | top | freq | mean | std | min | 25% | 50% | 75% | max | null | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
MEMBER_NO | 62988.0 | NaN | NaN | NaN | 31494.5 | 18183.213715 | 1.0 | 15747.75 | 31494.5 | 47241.25 | 62988.0 | 0.0 |
FFP_DATE | 62988 | 3068 | 2011/1/13 | 184 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 0 |
FIRST_FLIGHT_DATE | 62988 | 3406 | 2013/2/16 | 96 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 0 |
GENDER | 62985 | 2 | 男 | 48134 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 3 |
FFP_TIER | 62988.0 | NaN | NaN | NaN | 4.102162 | 0.373856 | 4.0 | 4.0 | 4.0 | 4.0 | 6.0 | 0.0 |
WORK_CITY | 60719 | 3309 | 广州 | 9385 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 2269 |
WORK_PROVINCE | 59740 | 1183 | 广东 | 17507 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 3248 |
WORK_COUNTRY | 62962 | 118 | CN | 57748 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 26 |
AGE | 62568.0 | NaN | NaN | NaN | 42.476346 | 9.885915 | 6.0 | 35.0 | 41.0 | 48.0 | 110.0 | 420.0 |
LOAD_TIME | 62988 | 1 | 2014/3/31 | 62988 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 0 |
FLIGHT_COUNT | 62988.0 | NaN | NaN | NaN | 11.839414 | 14.049471 | 2.0 | 3.0 | 7.0 | 15.0 | 213.0 | 0.0 |
BP_SUM | 62988.0 | NaN | NaN | NaN | 10925.081254 | 16339.486151 | 0.0 | 2518.0 | 5700.0 | 12831.0 | 505308.0 | 0.0 |
EP_SUM_YR_1 | 62988.0 | NaN | NaN | NaN | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
EP_SUM_YR_2 | 62988.0 | NaN | NaN | NaN | 265.689623 | 1645.702854 | 0.0 | 0.0 | 0.0 | 0.0 | 74460.0 | 0.0 |
SUM_YR_1 | 62437.0 | NaN | NaN | NaN | 5355.376064 | 8109.450147 | 0.0 | 1003.0 | 2800.0 | 6574.0 | 239560.0 | 551.0 |
SUM_YR_2 | 62850.0 | NaN | NaN | NaN | 5604.026014 | 8703.364247 | 0.0 | 780.0 | 2773.0 | 6845.75 | 234188.0 | 138.0 |
SEG_KM_SUM | 62988.0 | NaN | NaN | NaN | 17123.878691 | 20960.844623 | 368.0 | 4747.0 | 9994.0 | 21271.25 | 580717.0 | 0.0 |
WEIGHTED_SEG_KM | 62988.0 | NaN | NaN | NaN | 12777.152439 | 17578.586695 | 0.0 | 3219.045 | 6978.255 | 15299.6325 | 558440.14 | 0.0 |
LAST_FLIGHT_DATE | 62988 | 731 | 2014/3/31 | 959 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 0 |
AVG_FLIGHT_COUNT | 62988.0 | NaN | NaN | NaN | 1.542154 | 1.786996 | 0.25 | 0.428571 | 0.875 | 1.875 | 26.625 | 0.0 |
AVG_BP_SUM | 62988.0 | NaN | NaN | NaN | 1421.440249 | 2083.121324 | 0.0 | 336.0 | 752.375 | 1690.270833 | 63163.5 | 0.0 |
BEGIN_TO_FIRST | 62988.0 | NaN | NaN | NaN | 120.145488 | 159.572867 | 0.0 | 9.0 | 50.0 | 166.0 | 729.0 | 0.0 |
LAST_TO_END | 62988.0 | NaN | NaN | NaN | 176.120102 | 183.822223 | 1.0 | 29.0 | 108.0 | 268.0 | 731.0 | 0.0 |
AVG_INTERVAL | 62988.0 | NaN | NaN | NaN | 67.749788 | 77.517866 | 0.0 | 23.37037 | 44.666667 | 82.0 | 728.0 | 0.0 |
MAX_INTERVAL | 62988.0 | NaN | NaN | NaN | 166.033895 | 123.39718 | 0.0 | 79.0 | 143.0 | 228.0 | 728.0 | 0.0 |
ADD_POINTS_SUM_YR_1 | 62988.0 | NaN | NaN | NaN | 540.316965 | 3956.083455 | 0.0 | 0.0 | 0.0 | 0.0 | 600000.0 | 0.0 |
ADD_POINTS_SUM_YR_2 | 62988.0 | NaN | NaN | NaN | 814.689258 | 5121.796929 | 0.0 | 0.0 | 0.0 | 0.0 | 728282.0 | 0.0 |
EXCHANGE_COUNT | 62988.0 | NaN | NaN | NaN | 0.319775 | 1.136004 | 0.0 | 0.0 | 0.0 | 0.0 | 46.0 | 0.0 |
avg_discount | 62988.0 | NaN | NaN | NaN | 0.721558 | 0.185427 | 0.0 | 0.611997 | 0.711856 | 0.809476 | 1.5 | 0.0 |
P1Y_Flight_Count | 62988.0 | NaN | NaN | NaN | 5.766257 | 7.210922 | 0.0 | 2.0 | 3.0 | 7.0 | 118.0 | 0.0 |
L1Y_Flight_Count | 62988.0 | NaN | NaN | NaN | 6.073157 | 8.175127 | 0.0 | 1.0 | 3.0 | 8.0 | 111.0 | 0.0 |
P1Y_BP_SUM | 62988.0 | NaN | NaN | NaN | 5366.72055 | 8537.773021 | 0.0 | 946.0 | 2692.0 | 6485.25 | 246197.0 | 0.0 |
L1Y_BP_SUM | 62988.0 | NaN | NaN | NaN | 5558.360704 | 9351.956952 | 0.0 | 545.0 | 2547.0 | 6619.25 | 259111.0 | 0.0 |
EP_SUM | 62988.0 | NaN | NaN | NaN | 265.689623 | 1645.702854 | 0.0 | 0.0 | 0.0 | 0.0 | 74460.0 | 0.0 |
ADD_Point_SUM | 62988.0 | NaN | NaN | NaN | 1355.006223 | 7868.477 | 0.0 | 0.0 | 0.0 | 0.0 | 984938.0 | 0.0 |
Eli_Add_Point_Sum | 62988.0 | NaN | NaN | NaN | 1620.695847 | 8294.398955 | 0.0 | 0.0 | 0.0 | 345.0 | 984938.0 | 0.0 |
L1Y_ELi_Add_Points | 62988.0 | NaN | NaN | NaN | 1080.378882 | 5639.857254 | 0.0 | 0.0 | 0.0 | 0.0 | 728282.0 | 0.0 |
Points_Sum | 62988.0 | NaN | NaN | NaN | 12545.7771 | 20507.8167 | 0.0 | 2775.0 | 6328.5 | 14302.5 | 985572.0 | 0.0 |
L1Y_Points_Sum | 62988.0 | NaN | NaN | NaN | 6638.739585 | 12601.819863 | 0.0 | 700.0 | 2860.5 | 7500.0 | 728282.0 | 0.0 |
Ration_L1Y_Flight_Count | 62988.0 | NaN | NaN | NaN | 0.486419 | 0.319105 | 0.0 | 0.25 | 0.5 | 0.711111 | 1.0 | 0.0 |
Ration_P1Y_Flight_Count | 62988.0 | NaN | NaN | NaN | 0.513581 | 0.319105 | 0.0 | 0.288889 | 0.5 | 0.75 | 1.0 | 0.0 |
Ration_P1Y_BPS | 62988.0 | NaN | NaN | NaN | 0.522293 | 0.339632 | 0.0 | 0.25815 | 0.514252 | 0.815091 | 0.999989 | 0.0 |
Ration_L1Y_BPS | 62988.0 | NaN | NaN | NaN | 0.468422 | 0.338956 | 0.0 | 0.167954 | 0.476747 | 0.728375 | 0.999993 | 0.0 |
Point_NotFlight | 62988.0 | NaN | NaN | NaN | 2.728155 | 7.364164 | 0.0 | 0.0 | 0.0 | 1.0 | 140.0 | 0.0 |
能够看出客户性别、工作城市、省份、国家、年龄、总票价有缺失,其中须要对最重要的总票价缺失进行解决。
data.head().T
0 | 1 | 2 | 3 | 4 | |
---|---|---|---|---|---|
MEMBER_NO | 54993 | 28065 | 55106 | 21189 | 39546 |
FFP_DATE | 2006/11/2 | 2007/2/19 | 2007/2/1 | 2008/8/22 | 2009/4/10 |
FIRST_FLIGHT_DATE | 2008/12/24 | 2007/8/3 | 2007/8/30 | 2008/8/23 | 2009/4/15 |
GENDER | 男 | 男 | 男 | 男 | 男 |
FFP_TIER | 6 | 6 | 6 | 5 | 6 |
WORK_CITY | . | NaN | . | Los Angeles | 贵阳 |
WORK_PROVINCE | 北京 | 北京 | 北京 | CA | 贵州 |
WORK_COUNTRY | CN | CN | CN | US | CN |
AGE | 31.0 | 42.0 | 40.0 | 64.0 | 48.0 |
LOAD_TIME | 2014/3/31 | 2014/3/31 | 2014/3/31 | 2014/3/31 | 2014/3/31 |
FLIGHT_COUNT | 210 | 140 | 135 | 23 | 152 |
BP_SUM | 505308 | 362480 | 351159 | 337314 | 273844 |
EP_SUM_YR_1 | 0 | 0 | 0 | 0 | 0 |
EP_SUM_YR_2 | 74460 | 41288 | 39711 | 34890 | 42265 |
SUM_YR_1 | 239560.0 | 171483.0 | 163618.0 | 116350.0 | 124560.0 |
SUM_YR_2 | 234188.0 | 167434.0 | 164982.0 | 125500.0 | 130702.0 |
SEG_KM_SUM | 580717 | 293678 | 283712 | 281336 | 309928 |
WEIGHTED_SEG_KM | 558440.14 | 367777.2 | 355966.5 | 306900.88 | 300834.06 |
LAST_FLIGHT_DATE | 2014/3/31 | 2014/3/25 | 2014/3/21 | 2013/12/26 | 2014/3/27 |
AVG_FLIGHT_COUNT | 26.25 | 17.5 | 16.875 | 2.875 | 19.0 |
AVG_BP_SUM | 63163.5 | 45310.0 | 43894.875 | 42164.25 | 34230.5 |
BEGIN_TO_FIRST | 2 | 2 | 10 | 21 | 3 |
LAST_TO_END | 1 | 7 | 11 | 97 | 5 |
AVG_INTERVAL | 3.483254 | 5.194245 | 5.298507 | 27.863636 | 4.788079 |
MAX_INTERVAL | 18 | 17 | 18 | 73 | 47 |
ADD_POINTS_SUM_YR_1 | 3352 | 0 | 3491 | 0 | 0 |
ADD_POINTS_SUM_YR_2 | 36640 | 12000 | 12000 | 0 | 22704 |
EXCHANGE_COUNT | 34 | 29 | 20 | 11 | 27 |
avg_discount | 0.961639 | 1.252314 | 1.254676 | 1.09087 | 0.970658 |
P1Y_Flight_Count | 103 | 68 | 65 | 13 | 71 |
L1Y_Flight_Count | 107 | 72 | 70 | 10 | 81 |
P1Y_BP_SUM | 246197 | 177358 | 169072 | 186104 | 128448 |
L1Y_BP_SUM | 259111 | 185122 | 182087 | 151210 | 145396 |
EP_SUM | 74460 | 41288 | 39711 | 34890 | 42265 |
ADD_Point_SUM | 39992 | 12000 | 15491 | 0 | 22704 |
Eli_Add_Point_Sum | 114452 | 53288 | 55202 | 34890 | 64969 |
L1Y_ELi_Add_Points | 111100 | 53288 | 51711 | 34890 | 64969 |
Points_Sum | 619760 | 415768 | 406361 | 372204 | 338813 |
L1Y_Points_Sum | 370211 | 238410 | 233798 | 186100 | 210365 |
Ration_L1Y_Flight_Count | 0.509524 | 0.514286 | 0.518519 | 0.434783 | 0.532895 |
Ration_P1Y_Flight_Count | 0.490476 | 0.485714 | 0.481481 | 0.565217 | 0.467105 |
Ration_P1Y_BPS | 0.487221 | 0.489289 | 0.481467 | 0.551722 | 0.469054 |
Ration_L1Y_BPS | 0.512777 | 0.510708 | 0.51853 | 0.448275 | 0.530943 |
Point_NotFlight | 50 | 33 | 26 | 12 | 39 |
散布剖析
客户根本信息
- 会员入会年份散布
year = data['FFP_DATE'].str.split('/').apply(lambda x:x[0])
plt.figure(dpi=100)
df = year.value_counts().sort_index()
p = sns.barplot(df.index,df.values)
plt.xlabel('年份')
plt.ylabel('入会人数')
title = plt.title('会员入会年份散布')
能够看出,在 12-14 年有过伺机记录的客户中,入会工夫随年限逐步减少,且 2012 年达到峰值。
- 会员性别比例
fig = plt.figure(dpi=100)
gender = data['GENDER'].value_counts()
p = plt.pie(gender,labels=gender.index,explode=[0.1,0],colors=['lightskyblue', 'lightcoral'],autopct='%.1f %%')
title = plt.title('会员性别比例')
- 会员等级散布
tier = data['FFP_TIER'].value_counts()
plt.figure(dpi=100)
p = sns.barplot(tier.index,tier.values)
title = plt.title('会员等级散布')
plt.xlabel('会员等级')
y = plt.ylabel('各级别会员人数')
能够看出,大部分会员等级为 4。
- 会员年龄散布
plt.figure(figsize=(3,4),dpi=100)
p = plt.boxplot(data['AGE'].dropna(),
labels = ['会员年龄'],
patch_artist=True,
boxprops = {'facecolor':'lightblue'}
)
客户伺机信息
- 最初伺机至完结工夫散布(Recency)
fig = plt.figure(dpi=100)
p = sns.distplot(data['LAST_TO_END'])
plt.xlim([0,750])
title = plt.title('Recency 分布图')
plt.xlabel('最初一次伺机至观测窗口完结工夫(天)')
plt.show()
- 伺机次数散布
plt.figure(dpi=100)
sns.scatterplot(x=data['FLIGHT_COUNT'],y=data['SEG_KM_SUM'])
plt.xlabel('航行次数')
plt.ylabel('总里程')
plt.show()
fig,axes = plt.subplots(2,1,dpi=100)
sns.boxplot(data['FLIGHT_COUNT'],width=0.5,ax=axes[0])
axes[0].set_ylabel('伺机次数')
axes[0].set_xlabel('单位:次')
q = sns.boxplot(data['SEG_KM_SUM'])
axes[1].set_ylabel('总里程')
axes[1].set_xlabel('单位:千米')
plt.tight_layout()
plt.show()
相关性剖析
data['DAYS_FROM_FFP'] = (pd.DatetimeIndex(data['LOAD_TIME'])-pd.DatetimeIndex(data['FFP_DATE'])).days
data['SUM_YR_1'] = data['SUM_YR_1'].interpolate()
data['SUM_YR_2'] = data['SUM_YR_2'].interpolate()
data['SUM_YR'] = data['SUM_YR_1'] + data['SUM_YR_2']
data['AGE'] = data['AGE'].interpolate()
data_corr_col = ['DAYS_FROM_FFP','AGE',
'FLIGHT_COUNT','BP_SUM',
'EP_SUM_YR_2','SUM_YR',
'SEG_KM_SUM','LAST_TO_END',
'AVG_INTERVAL','EXCHANGE_COUNT',
'avg_discount','Points_Sum','Point_NotFlight']
data_corr_name = ['入会时长','年龄',
'航行次数','总根本积分',
'总精英积分','票价支出',
'航行总里数','最初一次伺机工夫至完结时长',
'均匀伺机距离','积分兑换次数',
'均匀折扣率','总累计积分','非伺机积分变动次数']
data_corr = data[data_corr_col]
data_corr.columns = data_corr_name
plt.figure(dpi=100)
sns.heatmap(data_corr.corr(),annot=True,vmax=1,
square=True,cmap='Blues',fmt='.2g',annot_kws={"size":6},
)
plt.show()
积分之间的相关系数较高,只保留总累计积分;总里程跟票价支出相关性较高,因而合并为客公里支出。为下一步剖析做筹备。
data['AVG_REVENUE_PER_KM'] = data['SUM_YR']/data['SEG_KM_SUM']
data_corr_col = ['DAYS_FROM_FFP','AGE',
'FLIGHT_COUNT',
'AVG_REVENUE_PER_KM',
'LAST_TO_END',
'AVG_INTERVAL','EXCHANGE_COUNT',
'avg_discount','Points_Sum','Point_NotFlight']
data_corr_name = ['入会时长','年龄','航行次数',
'客公里支出',
'最初一次伺机工夫至完结时长',
'均匀伺机距离','积分兑换次数',
'均匀折扣率','总累计积分','非伺机积分变动次数']
data_corr = data[data_corr_col]
data_corr.columns = data_corr_name
plt.figure(dpi=100)
sns.heatmap(data_corr.corr(),annot=True,vmax=1,
square=True,cmap='Blues',fmt='.2g',annot_kws={"size":8},
)
plt.show()
数据预处理
数据荡涤
通过数据摸索剖析,发现数据中存在缺失值,票价最小值为 0、折扣率最小值为 0、总航行公里数大于 0 的记录。因为原始数据量大,这类数据所占比例较小,对于问题影响不大,因而对其进行抛弃解决。具体解决办法如下:
- 抛弃票价为空的记录。
- 抛弃票价为 0、均匀折扣率不为 0、总航行公里数大于 0 的记录。
- 抛弃年龄大于 100 的记录
data_notnull = data.loc[data['SUM_YR_1'].notnull() & data['SUM_YR_2'].notnull(),:]
index1 = data_notnull['SUM_YR_1'] != 0
index2 = data_notnull['SUM_YR_2'] != 0
index3 = (data_notnull['SEG_KM_SUM']> 0) & (data_notnull['avg_discount'] != 0)
index4 = data_notnull['AGE'] < 100
cleaned = data_notnull[(index1 | index2) & index3 & index4]
cleaned.to_csv('cleaned.csv')
属性规约
依据 LRFMC 模型抉择无关数据:
LRFPKC_col = ['DAYS_FROM_FFP','LAST_TO_END','FLIGHT_COUNT','AVG_REVENUE_PER_KM','avg_discount']
LRFPKC_name = ['入会时长','最初一次伺机工夫至完结时长','航行次数','客公里支出','均匀折扣率']
LRFPKC = cleaned[LRFPKC_col]
LRFPKC.columns = LRFPKC_name
LRFPKC.head()
入会时长 | 最初一次伺机工夫至完结时长 | 航行次数 | 客公里支出 | 均匀折扣率 | |
---|---|---|---|---|---|
0 | 2706 | 1 | 210 | 0.815798 | 0.961639 |
1 | 2597 | 7 | 140 | 1.154043 | 1.252314 |
2 | 2615 | 11 | 135 | 1.158217 | 1.254676 |
3 | 2047 | 97 | 23 | 0.859648 | 1.090870 |
4 | 1816 | 5 | 152 | 0.823617 | 0.970658 |
数据转换
思考特色取值范畴差距过大,应用 z -score 对其进行标准化:
from sklearn.preprocessing import StandardScaler
LRFPKC_std = StandardScaler().fit_transform(LRFPKC)
LRFPKC_std[:5]
array([[1.43882234, -0.94915181, 14.07566741, 0.61197005, 1.29423225],
[1.31018626, -0.91649044, 9.10229207, 1.81587258, 2.86392282],
[1.33142892, -0.8947162 , 8.74705098, 1.83072868, 2.87667299],
[0.66110514, -0.42656991, 0.78965043, 0.76804339, 1.99209638],
[0.38849107, -0.92737757, 9.9548707 , 0.63979888, 1.3429354]])
模型构建
客户价值分析模型构建次要由两个局部形成:
- 依据航空公司客户 5 个指标的数据,对客户进行聚类分群。
- 联合业务对每个客户群进行特征分析,剖析其客户价值,并对每个客户群进行排名。
客户聚类
from sklearn.cluster import KMeans
from sklearn.metrics.cluster import silhouette_score
for n_cluster in range(2,10):
kmeans = KMeans(n_clusters=n_cluster).fit(LRFPKC_std)
clusters = kmeans.predict(LRFPKC_std)
score = silhouette_score(LRFPKC_std,clusters)
print(f"[簇数 n,轮廓系数]:[{n_cluster},{score}]")
[簇数 n,轮廓系数]:[2,0.21180867362877892]
[簇数 n,轮廓系数]:[3,0.21682527317521122]
[簇数 n,轮廓系数]:[4,0.23458690018354902]
[簇数 n,轮廓系数]:[5,0.2547333390111371]
[簇数 n,轮廓系数]:[6,0.23153895865778043]
[簇数 n,轮廓系数]:[7,0.22505718907587122]
[簇数 n,轮廓系数]:[8,0.23082440068116344]
[簇数 n,轮廓系数]:[9,0.2288289785882708]
能够看出,当 n = 5 时成果较好,因而选用 n = 5 作为类别数。
kmeans = KMeans(n_clusters=5).fit(LRFPKC_std)
results = pd.DataFrame(kmeans.cluster_centers_,columns=LRFPKC_name)
results.index=pd.DataFrame(kmeans.labels_).drop_duplicates().iloc[:,0]
results.sort_index(inplace=True)
results
入会时长 | 最初一次伺机工夫至完结时长 | 航行次数 | 客公里支出 | 均匀折扣率 | |
---|---|---|---|---|---|
0 | -0.081117 | 0.222797 | -0.247092 | 1.754166 | 1.660268 |
1 | -0.692687 | -0.435114 | -0.139366 | -0.268944 | -0.283914 |
2 | 1.173148 | -0.387797 | -0.062622 | -0.192853 | -0.163570 |
3 | 0.515652 | -0.827545 | 2.773150 | 0.260380 | 0.347196 |
4 | -0.319813 | 1.662404 | -0.566370 | -0.349429 | -0.334762 |
labels = LRFPKC_name
legends = ['客户群' + str(i + 1) for i in results.index] # 客户群命名,作为雷达图的图例
line_stype = ['-','--',(0, (3, 5, 1, 5, 1, 5)),':','-.']
kinds = list(results.iloc[:, 0])
# 因为雷达图要保证数据闭合,因而再增加 L 列,并转换为 np.ndarray
results = pd.concat([results, results[['入会时长']]], axis=1)
centers = np.array(results)
# 宰割圆周长,并让其闭合
n = len(labels)
angle = np.linspace(0, 2 * np.pi, n, endpoint=False)
angle = np.concatenate((angle, [angle[0]]))
# 绘图
fig = plt.figure(figsize = (8,6),dpi=100)
ax = fig.add_subplot(111, polar=True) # 以极坐标的模式绘制图形
# 画线
for i in range(len(kinds)):
ax.plot(angle, centers[i], linestyle=line_stype[i], linewidth=2, label=kinds[i])
# 增加属性标签
ax.set_thetagrids(angle * 180 / np.pi,labels+['入会时长'])
plt.title('客户特征分析雷达图')
p = plt.legend(legends,bbox_to_anchor=(0, 1))
客户价值剖析
- 重要放弃客户:均匀折扣率(C)、客公里支出(PK)较高,最近一次乘坐工夫(R)很近,乘坐频次(F)较高,入会工夫(L)较长。是航空公司的高价值客户,是最为现实的客户类型,对航空公司的奉献最大。航空公司应该优先将资源投放到他们身上,对他们进行差异化治理和一对一营销,进步这类客户的忠诚度与满意度,尽可能缩短这类客户的高水平生产。
- 重要倒退客户:这类客户均匀折扣率(C)、客公里支出(PK)很高,然而乘坐频次(F)较低,不常常乘坐公司的航班,入会工夫(L)也绝对较短,是具备很大后劲的客户群体。公司该当加大对这类客户的资源投入,进步客户价值,进步满意度,使其转变为虔诚客户。
- 重要挽留客户 :这类客户过来所乘航班的均匀折扣率(C)、客公里支出(PK)、乘坐次数(F) 较高。他们客户价值变动的不确定性很高。因为这些客户消退的起因各不相同,所以把握客户的最新信息、维持与客户的互动就显得尤为重要。航空公司应该依据这些客户的最近生产工夫、生产次数的变动状况,揣测客户生产的异动情况,并列出客户名单,对其重点分割,采取肯定的营销伎俩,缩短客户的生命周期。
- 个别与低价值客户 : 这类客户所乘航班的均匀折扣率(C)、客公里支出(PK)很低,较长时间没有乘坐过本公司航班(R) 高,乘坐的次数 (F) 较低,入会时长 (L) 短。他们是航空公司的个别用户与低价值客户,可能是在航空公司机票打折促销时,才会乘坐本公司航班。
客户群 | 优先级 | 优先级含意 |
---|---|---|
客户群 4 | 1 | 重要放弃客户 |
客户群 2 | 2 | 重要倒退客户 |
客户群 1 | 3 | 重要挽留客户 |
客户群 3 | 4 | 个别客户 |
客户群 5 | 5 | 低价值客户 |
模型利用
依据对各个客户群进行特征分析, 采取上面的一些营销伎俩和策略,为航空公司的价值客户群治理提供参考。
- 会员的降级与保级
航空公司的会员能够分为白金卡会员、金卡会员、银卡会员、普通卡会员,其中非普通卡会员能够统称为航空公司的精英会员。尽管各个航空公司都有本人的特点和规定,但会员制的治理办法是大同小异的。成为精英会员个别都是要求在肯定工夫内 (如一 - 年) 积攒肯定的航行里程或航段,达到这种要求后就会在有效期内 (通常为两年) 成为精英会员,并享受相应的高级别服务。有效期快完结时,依据相干评估办法确定客户是否有资格持续作为精英会员,而后对该客户进行相应地降级或降级。
然而,因为许多客户并没有意识到或基本不理解会员降级或保级的工夫与要求(相干的文件阐明往往简单且不易了解),常常在评估期过后才发现自己其实只差一点就可 以实现降级或保级,却错过了机会, 使之前的里程积攒白白损失。同时,这种认知还可能导致客户的不满,罗唆放弃在本公司的生产。
因而,航空公司能够在对会员降级或保级进行评估的工夫点之前,对那些靠近但尚未达到要求的较高生产客户进行适当揭示甚至采取一些促销流动,刺激他们通过生产达到相应规范。这样既能够取得收益,同时也进步了客户的满意度,减少了公司的精英会员。
- 首次兑换
航空公司常旅客打算中最可能吸引客户的内容就是客户能够通过生产积攒的里程来兑换免票或收费升舱等。各个航空公司都有一个首次兑换规范,也就是当客户的里程或航段积攒到肯定水平时才能够实现第一次兑换,这个规范会高于失常的里程兑换规范。然而很多公司的里程积攒随着工夫会进行肯定地削减,例如有的公司会在年末对该年积攒的里程进行折半解决。这样会导致许多不理解状况的会员白白损失本人好不容易积攒的里程,甚至总是难以实现首次兑换。同样,这也会引起客户的不满或散失。能够采取的措施是从数据库中提取出靠近但尚未达到首次兑换规范的会员,对他们进行揭示或促销,使他们通过生产达到规范。一旦实现了首次兑换,客户在本公司进行再次生产兑换就比在其余公司进行兑换要容易许多,在肯定水平上等于进步了转移的老本。另外,在一些非凡的工夫点 (如里程折半的工夫点) 之前能够给客户一些揭示,这样能够减少客户的满意度。
- 穿插销售
通过发行联名卡等与非航空类企业的单干,使客户在其余企业的生产过程中取得本公司的积分,加强与公司的分割,进步他们的忠诚度。例如,能够查看重要客户在非航空类合作伙伴处的里程积攒状况,找出他们习惯的里程积攒形式 (是否常常在合作伙伴处生产、更喜爱生产哪些类型合作伙伴的产品),对他们进行相应促销。客户辨认期和发展期为客户关系打下基石,然而这两个期间带来的客户关系是短暂的、不稳固的。企业要获取长期的利润,必须具备稳固的、高质量的客户。放弃客户对于企业是至关重要的,不仅因为争取一个新客户的老本远远高于维持老客户的老本,更重要的是客户散失会造成公司收益的间接损失。因而,在这一时期,航空公司应该致力维系客户关系,使之处于较高的水准,最大化生命周期内公司与客户的互动价值,并使这样的高水平尽可能缩短。对于这一阶段的客户,次要应该通过提供优质的服务产品和进步服务水平来进步客户的满意度。通过对旅客数据库的数据挖掘、进行客户细分,能够取得重要放弃客户的名单。这类客户个别所乘航班的均匀折扣率(C) 较高,最近乘坐过本公司航班 (R 低)、乘坐的频率(F) 或里程 (M) 也较高。他们是航空公司的价值客户,是最现实的客户类型,对航空公司的奉献最大,所占比例却比拟小。航空公司应该优先将资源投放到他们身上,对他们进行差异化治理和一对一营销,进步这类客户的忠诚度与满意度,尽可能缩短!