0%

航空公司客户价值分析

分析背景与目标

客户关系管理是企业核心问题,客户关系管理是将客户分类,通过客户分类,区分客户价值,针对不同价值的客户制定优化的个性化服务方案,采取不同营销策略,合理优化资源配置

目标:

  1. 借助累积的客户数据,对客户进行分类
  2. 对不同类别客户进行特征分析,比较不同类型客户价值
  3. 对不同价值客户类群制定相应不同的营销策略

分析方法

广泛运用于客户价值识别的RFM模型是通过三个指标(最近消费间隔Recency,消费频率 Frequency和消费金额 Monetary)对客户价值进行识别。

本案例是航空公司客户价值识别,在RFM模型的基础上对指标进行优化,采用客户关系长度L,消费时间间隔R,消费频率F,飞行里程M,和折扣系数C五个指标区分客户价值,记为LRFMC模型

分析过程

数据探索性分析

data文件夹下有两张表,表1air_data.csv为会员档案信息及其乘坐航班记录,表2 为表1各字段说明

1
2
3
4
5
import pandas as pd

data_file = '../data/air_data.csv' #原始数据表
data = pd.read_csv(data_file, encoding = 'utf-8')
data.head()#查看导入的数据

可以看到共有44个字段,62988条记录,部分字段有缺失。

使用pandas-profiling package可以快速生成数据的详细报告

1
2
import pandas_profiling  
pandas_profiling.ProfileReport(data)

数据集的概述

对各字段进行分析,字段为numeric则会进行描述统计分析,直方图,频率等一系列分析。若字段为categorical,则会分析频率,做条形图

份析各字段相关性

将报告保存为HTML放在temp文件夹下

1
2
profile = pandas_profiling.ProfileReport(data)
profile.to_file(outputfile='../temp/air_report.html')

数据预处理

  • 数据清洗
  • 属性规约
  • 数据变换

1. 数据清洗

  • 删除票价字段缺失的记录
  • 删除票价字段异常的记录(票价为0,折扣率不为0,飞行里程数不为0的字段)
1
2
3
4
5
6
7
8
9
10
11
12
13
clean_file = '../temp/data_cleaned.csv' #清洗后保存文件
# 删除票价字段**缺失**的记录
# 即保留第一年票价不为空且第二年票价也不为空的记录
data = data[data['SUM_YR_1'].notnull() * data['SUM_YR_2'].notnull()]

# 删除票价为0,平均折扣率不为0,总飞行里程数不为0的记录
# 即保留票价非0,或平均折扣总飞行里程同时为0的记录
index1 = data['SUM_YR_1'] != 0
index2 = data['SUM_YR_2'] != 0
index3 = (data['SEG_KM_SUM'] == 0)&(data['avg_discount'])

data = data[index1|index2|index3]
data.to_csv(clean_file) # 清洗后数据保存到文件

2. 属性规约

原始数据中属性高达44个,根据航空公司客户价值LRFMC模型,选择与LRFMC指标相关的6个属性

  • FFP_DATE 入会时间
  • LOAD_TIME 观测窗口结束时间
  • FIGHT_COUNT 飞行次数
  • AVG_DISCOUNT 平均折扣率
  • SEG_KM_SUM 观测窗口总飞行公里数
  • LAST_TO_END 最后一次乘机时间至观察窗口末端时长
1
data = data[['FFP_DATE','LOAD_TIME','FLIGHT_COUNT','avg_discount','SEG_KM_SUM', 'LAST_TO_END']]

3. 数据变换

将数据转换为’适当‘的格式,以适应挖掘任务及算法的需要,本案例采用的数据变换为属性构造数据标准化

  • 属性构造

    L = LOAD_TIME - FFP_DATE

    R = LAST_TO_END

    F = FIGHT_COUNT

    M = SEG_KM_SUM

    C = AVG_DISCOUNT

创建一个新的DataFrame保存构造的LRFMC数据

1
lrfmc = pd.DataFrame(columns = ['L', 'R', 'F', 'M', 'C'])

首先构造L指标,为观测窗口的结束时间-入会时间,原想两个字段相减就好了,结果发现从csv文件导入的数据日期是object对象,需要先将两个日期字段转换为datetime对象

1
2
3
# 将'FFP_DATE'和'LOAD_TIME'字段转换为datetime对象
datel = ['FFP_DATE', 'LOAD_TIME']
data[datel] = data[datel].apply(pd.to_datetime,format = '%Y-%m-%d' )

构造LRFMC数据

1
2
3
4
5
lrfmc['L'] = data['LOAD_TIME'] - data['FFP_DATE']
lrfmc['R'] = data['LAST_TO_END']
lrfmc['F'] = data['FLIGHT_COUNT']
lrfmc['M'] = data['SEG_KM_SUM']
lrfmc['C'] = data['avg_discount']

L 为两个日期相减得来,数据类型为timedelta 需转换为int类型

1
lrfmc['L'] = lrfmc['L'].dt.days
1
2
3
# 保存文件
lrfmc_file = '../temp/LRFMC.xlsx'
lrfmc.to_excel(lrfmc_file, index = False)

注意上面数据L和R是以天为单位,可以转换为月份进行后续分析也可直接用天为单位。

  • 数据标准化

    标准化有多种,此处使用标准差法标准化
    $$
    \frac {x- \mu }{ \delta }
    $$

    1
    2
    3
    4
    5
    6
    z_lrfmc = (lrfmc - lrfmc.mean(axis = 0))/(lrfmc.std(axis = 0))
    z_lrfmc.columns = ['Z'+ i for i in lrfmc.columns]

    # 保存到文件
    z_score_file = '../temp/z_score_data.xlsx'
    z_lrfmc.to_excel(z_score_file, index = False)

模型构建

  • 客户聚类(K-Means聚类算法)
  • 客户价值分析

1. 客户聚类

采用K-Means算法将客户进行分群,分为5类(结合业务理解来确定分类群数)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from sklearn.cluster import KMeans
data = z_lrfmc
k = 5 # 将客户分为5类

kmodel = KMeans(n_clusters = k, n_jobs = 4) # n_job为并行数,一般为电脑CPU数
kmodel.fit(data) # 训练模型

#查看模型中心
kmodel.cluster_centers_
#查看各样本对应的类别
kmodel.labels_

kmeansCenters = pd.DataFrame(kmodel.cluster_centers_, columns = data.columns)
labelsCounts = pd.DataFrame(kmodel.labels_)[0].value_counts()
kmeansLabels = pd.DataFrame(labelsCounts, index = None)
kmeansLabels.columns = ['Num']
kmeansResult = pd.concat([kmeansCenters, kmeansLabels], axis=1)
kmeansResult['Class'] = [1,2,3,4,5]
kmeansResult = kmeansResult[['Class','Num', 'ZL', 'ZR', 'ZF', 'ZM', 'ZC']]
kmeansResult
kmeansResult.to_excel("kmeansResult2.xlsx")
dataLabels = pd.DataFrame(kmodel.labels_, columns= ['CLASS']) + 1
data = pd.concat([data, dataLabels],axis=1)

2.数据可视化

1
2
3
4
5
6
7
8
9
10
11
import matplotlib as mlb
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

plt.bar(kmeansResult['Class'],kmeansResult['Num'],color='rgby')
plt.title(u'五类群体的数量分布')

plt.show()
%matplotlib inline

用excel绘制出5类客户的群体特征分布

分析: (这里可能群体的标签会改变,因为每次聚类的结果不太相同,但不影响)
群体1的C属性上最大

群体2的L、C属性最小

群体3的R属性最大,F、M属性最小

群体4的M、F属性属性最大,R属性最小

群体5的L属性最大

分析结论

根据LRFMC模型,我们已经将客群分为5类

重要保持客户

平均折扣率高(C↑),最近有乘机记录(R↓),乘机次数高(F↑)或里程高(M↑)
这类客户机票票价高,不在意机票折扣,经常乘机,是最理想的客户类型
公司应优先将资源投放到他们身上,维持这类客户的忠诚度

重要发展客户

平均折扣率高(C↑),最近有乘机记录(R↓),乘机次数低(F↓)或里程高(M↓)这类客户机票票价高,不在意机票折扣,最近有乘机记录,但总里程低,具有很大的发展潜力公司应加强这类客户的满意度,使他们逐渐成为忠诚客户

重要挽留客户

平均折扣率高(C↑),乘机次数高(F↑)或里程高(M↑),最近无乘机记录(R↑)这类客户总里程高,但较长时间没有乘机,可能处于流失状态公司应加强与这类客户的互动,召回用户,延长客户的生命周期

一般/低价值客户

平均折扣率低(C↓),最近无乘机记录(R↑),乘机次数低(F↓)或里程低(M↓),入会时间短(L↓)这类客户机票票价低,经常买折扣机票,最近无乘机记录,可能是趁着折扣而选择购买,对品牌无忠诚度公司需要在资源支持的情况下强化对这类客户的联系低价值客户平均折扣率低(C↓),最近无乘机记录(R↑),乘机次数低(F↓)或里程低(M↓),入会时间短(L↓)这类客户与一般客户类似,机票票价低,经常买折扣机票,最近无乘机记录,可能是趁着折扣而选择购买,对品牌无忠诚度

根据2.3的结论,我们基本可得:

客群1属于重要发展客户;

客群2属于一般客户;

客群3属于重要保持客户;

客群4属于重要挽留客户;

客群5属于一般客户。