信息时代的来临使得企业营销焦点从产品转向了客户,客户关系管理(Customerrelationship management,CRM)成为企业的核心问题。客户关系管理的关键问题是客户分群。通过客户分群,区分无价值客户和高价值客户。企业针对不同价值的客户制订优化的个性化服务方案,采取不同营销策略,将有限营销资源集中于高价值客户,实现企业利润最大化目标。准确的客户分群结果是企业优化营销资源分配的重要依据,客户分群越来越成为客户关系管理中亟待解决的关键问题之一。
项目目标:
本篇将使用航空公司客户数据,结合LRFMC模型,采用 K-Means聚类算对客户进行分群,比较不同类别客户的客户价值,从而制定相应的营销策略。 项目学习目标: (1)熟悉航空客户价值分析的步骤和流程。 (2)了解RFM模型的基本原理。 (3)掌握 K-Means算法的基本原理与使用方法。 (4)比较不同类别客户的客户价值,制定相应的营销策略。
项目拆分任务一:了解航空公司现状与客户价值分析
任务描述 面对激烈的市场竞争,各个航空公司都推出了更多的优惠来吸引客户。国内某航空司面临着常旅客流失、竞争力下降和资源未充分利用等经营危机。通过建立合理的客户价值评估模型,对客户进行分群,分析及比较不同客户群的客户价值,并制定相应的营销策略,对不同的客户群提供个性化的服务。 任务分析 (1)了解航空公司现状。 (2)认识客户价值分析。 (3)熟悉航空公司客户价值分析的步骤与流程。
了解航空公司现状 目前该航空公司已积累了大量的会员档案信息和其乘坐航班记录。以2014年3月3 日为结束时间,选取宽度为两年的时间段作为分析观测窗口,抽取观测窗口内有乘机记录的所有客户的详细数据,形成历史数据,总共62988条记录。其中包含了会员卡号、入会时间、性别、年龄、会员卡级别、工作地城市、工作地所在省份、工作地所在国家、观测的窗口结束时间、总累计积分、观测窗口的总飞行千米数、观测窗口内的飞行次数、平均乘机时间间隔和平均折扣系数等特征 数据表结构: shape(62988, 44)
表属性:
特征名称 | 特征说明 |
MEMBER_NO | 会员卡号 |
FFP_DATE | 入会时间 |
FIRST_FLIGHT_DATE | 第一次飞行日期 |
GENDER | 性别 |
FFP_TIER | 会员卡级别 |
WORK_CITY | 工作地城市 |
WORK_PROVINCE | 工作地所在省份 |
WORK_COUNTRY | 工作地所在国家 |
AGE | 年龄 |
FLIGHT_COUNT | 观测窗口内的飞行次数 |
LOAD_TIME | 观测窗口的结束时间 |
LAST_TO_END | 最后一次乘机时间至观测窗口结束时长 |
AVG_DISCOUNT | 平均折扣率 |
SUM_YR | 观测窗口的票价收入 |
SEG_KM_SUM | 观测窗口的总飞行公里数 |
LAST_FLIGHT_DATE | 末次飞行日期 |
AVG_INTERVAL | 平均乘机时间间隔 |
MAX_INTERVAL | 最大乘机间隔 |
EXCHANGE_COUNT | 积分兑换次数 |
EP_SUM | 总精英积分 |
PROMOPTIVE_SUM | 促销积分 |
PARTNER_SUM | 合作伙伴积分 |
POINTS_SUM | 总累计积分 |
POINT_NOTFLIGHT | 非乘机的积分变动次数 |
BP_SUM | 总基本积分 |
结合目前航空公司的数据情况,可以实现以下目标。 1)借助航空公司客户数据,对客户进行分群。 2)对不同的客户类别进行特征分析,比较不同类别客户的客户价值。 3)对不同价值的客户类别提供个性化服务,制定相应的营销策略。 注意:数据参见ari_data.csv (表在后面贴git链接)
认识客户价值分析: 全球经济环境和市场环境已经悄然改变,企业的业务逐步从以产品为主导转向以客户需求为主导。一种全新的“以客户为中心”的业务模式正在形成并被提升到前所未有的高度。然而与客户保持关系需要花费成本,企业所拥有的客户中只有一部分能为企业带来利润。企业的资源也是有限的,忽视高潜力的客户而对所有客户都提供同样的服务,将使企业的资源无法发挥其最大效用去创造最大化的利润。任何企业要想生存和发展,都必须获得利润,追求利润最大化是企业生存和发展的宗旨之一。所以企业不可能也不应该和所有的客户都保持同样的关系。客户营销战略的倡导者Jay& Adam Curry从对国外数百家公司进行的客户营销实施的经验中提炼了如下经验。 (1)公司收入的80%来自顶端的20%的客户。 (2)20%的客户其利润率为100%。 (3)90%以上的收入来自现有客户。 (4)大部分的营销预算经常被用在非现有客户上。 (5)5%~30%的客户在客户金字塔中具有升级潜力。 (6)客户金字塔中的客户升级2%,意味着销售收入增加10%,利润增加50%。
这些经验也许并不完全准确,但是它揭示了新时代客户分化的趋势,也说明了对客户价值分析的迫切性和必要性。如果把客户的盈利性加以分析,就会发现客户盈利结构已发生了重大变化,只有特定的一部分客户给企业带来了利润。企业如果想获得长期发展,必须对这类客户做到有效的识别和管理。如果用同样的方法应对所有与个业有业务往来的客户,必然不会获得成功。 众多的企业管理者虽然知道客户价值分析的重要性,但对如何进行客户价值分析却知之甚少。如何全方位、多角度地考虑客户价值因素,进行有效的客户价值分析,这是摆在所有企业面前需要认真思索的一个问题。只有甄选出有价值的客户并将精力集中在这些客户身上,才能有效地提升企业的竞争力,使企业获得更大的发展。 在客户价值分析领域,最具影响力并得到实证检验的理论与模型有客户终生价值理论客户价值金字塔模型、策略评估矩阵分析法和RFM客户价值分析模型等。本章将运用改进的客户价值RFM模型进行分析。
熟悉航空客户价值分析的步骤与流程 航空客户价值分析项目的总体流程如图7-1所示。主要包括以下4个步骤。 (1)抽取航空公司2012年4月1日至2014年3月31日的数据。 (2)对抽取的数据进行数据清洗、特征构建和标准化等操作。 (3)基于RFM模型,使用 K-Means算法进行客户分群。 (4)针对模型结果得到不同价值的客户,采用不同的营销手段,提供定制化的服务。
项目拆分任务二: 预处理航空客户数据
任务描述: 航空公司客户原始数据存在少量的缺失值和异常值,需要清洗后才能用于分析。同 由于原始数据的特征过多,不便直接用于客户价值分析,因此需要对特征进行筛选,挑选出衡量客户价值的关键特征。
任务分析: 对航空客户数据进行预处理可以分为以下3个步骤 (1)处理数据缺失值与异常值。 (2)结合RFM模型筛选特征。 (3)标准化筛选后的数据
1.处理数据缺失值与异常值: 通过对数据观察发现原始数据中存在票价为空值、票价最小值为0、折扣率最小值为0 总飞行千米数大于0的记录。票价为空值的数据可能是由于不存在乘机记录造成的。其他的数据可能是由于客户乘坐0折机票或者积分兑换造成的。由于原始数据量大,这类数所占比例较小,对问题影响不大,因此对其进行丢弃处理。具体处理方法如下 (1)丢弃票价为空的记录。 (2)丢弃票价为0、平均折扣率不为0、总飞行千米数大于0的记录。
代码语言:javascript复制import pandas as pd #导入数据处理库pandas 安装方法pip install pandas
import numpy as np #导入科学计算库numpy 安装方法pip install numpy
from sklearn.cluster import KMeans #导入KMeans非监督聚类算法 安装方法太麻烦百度吧
import matplotlib.pyplot as plt #导入绘图库matplotlib 安装方法pip install matplotlib
'''处理数据缺失值与异常值'''
data = pd.read_csv("air_data.csv", encoding="ansi") #使用pandas的read_csv读取csv文件
print(data.shape) #查看当前数据的结构
##要求1、丢弃票价为空的记录。 #那就取了票价不为空的数据
data = data[data["SUM_YR_1"].notnull() & data["SUM_YR_2"].notnull()] #两个价格分别为YR_1和YR_2
# print(data.shape) #查看当前数据的结构
##要求2、丢弃票价为0、平均折扣率不为0、总飞行千米数大于0的记录
##那就把票价不为0,飞行公里==0,平均折扣==0的找出来。
doc1 = (data["SUM_YR_1"] !=0) | (data["SUM_YR_2"] !=0) #票价不为0的, '|'是或。 '&'是与。
doc2 = (data["SEG_KM_SUM"] == 0) & (data["avg_discount"] == 0) #飞行公里==0,平均折扣==0的
data = data[doc1 | doc2]
# print(data.shape)
2.构建航空客户价值分析关键特征: 构建航空客户价值分析的 LRFMC模型 本篇选择客户在一定时间内累积的飞行里程M和客户在一定时间内乘坐舱位所对应的折扣系数的平均值C两个特征代替消费金额。此外,航空公司会员入会时间的长短在一定程度上能够影响客户价值,所以在模型中增加客户关系长度L,作为区分客户的另一特征。 本篇将客户关系长度L、消费时间间隔R、消费频率F、飞行里程M和折扣系数的平 均值C这5个特征作为航空公司识别客户价值的特征,记为 LRFMC模型。
根据航空公司客户价值 LRFMC模型,选择与 LRFMC特征相关的6个特征FFP DATE、 LOAD TIME、 FLIGHT COUNT、 AVG DISCOUNT、 SEG KM SUM、LAST TO END。删除与其不相关、弱相关或冗余的特征,例如会员卡号、性别、工作地城市、工作地所在国家、年龄等特征。
由于原始数据中并没有直接给出 LRFMC模型的5个特征,需要通过原始数据提取这5个特征。 (1)会员入会时间距观测窗口结束的月数L=观测窗口的结束时间一入会时间(单位月),如式(7-1)所示
- L=LOAD TIME-FFP DATE
(2)客户最近一次乘坐公司飞机距观测窗口结束的月数R=最后一次乘机时间至观察窗口末端时长(单位:月),如式(7-2)所示。
- R = RELAST TO END
(3)客户在观测窗口内飞行里程F=(某段时间消费次数)
- F=FLIGHT-COUNT
(4)客户在观测窗口内飞行里程M= 观测窗口总飞行千米数(单位:千米)
- M=SEG_KM_SUM
(5)客户在观测窗口乘坐舱位对应的折扣系数的平均值C=平均折扣率(单位:无)
- C=AVG_DISCOUNT
‘’‘构建航空客户价值分析关键特征’’
#使用LRFMC模型 我们要拿到需要的属性。上面写着有属性要求。
##1、会员入会时间距观测窗口结束的月数L = 观测窗口的结束时间LOAD_TIME - 入会时间(单位月) FFP_DATE
data["LOAD_TIME"] = pd.to_datetime(data["LOAD_TIME"]) #要按pd.datetime格式转换时间格式
data["FFP_DATE"] = pd.to_datetime(data["FFP_DATE"])
data["会员入会时间"] = (((data["LOAD_TIME"] - data["FFP_DATE"]))) # L - F = 入会的总天数,然后转成月
mon = [] #设置一个空列表
for i in data["会员入会时间"]: #遍历下时间
months = int(i.days/30) #计算出对应的月份
mon.append(months) #加入空列表
data["会员入会月份"] = np.array(mon) #在data里面重新插入一列月份
# print(data["会员入会月份"])
data["LAST_TO_END"] = data["LAST_TO_END"]/30 #最后飞行时间。算的是月数,直接除以30了。
##FLIGHT_COUNT:消费次数 LAST_TO_END最后一次时间 SEG_KM_SUM:总飞行公里数 avg_discount平均折扣率
my_data = data[["会员入会月份", "LAST_TO_END", "FLIGHT_COUNT" , "SEG_KM_SUM", "avg_discount"]]
print(my_data)
标准化5个特征:
完成五个特征的构建以后,对每个特征数据分布情况进行分析,其数据的取值范围如表所示。从表中数据可以发现,五个特征的取值范围数据差异较大,为了消除数量级数据带来的影响,需要对数据做标准化处理。(可以尝试:标准差标准化)
代码语言:javascript复制# 数据标准化处理 # 将输入序列进行小数定标标准化
def decimal_clean(arr): # :param arr:输入的待优化的序列
k = np.ceil(np.log10(np.max(np.abs(arr)))) # 通过移动数据的小数点位置来进行标准化
# np.ceil:向上取整 np.abs:绝对值 np.max:最大值 np.log10:求对数,若N=a**x,x=loga**N
return arr / 10 ** k # :return:标准化后的序列
# 利用pandas中的concat连接函数,iloc切片函数,先切片再标准化然后合并起来。
xyzqw = pd.concat([decimal_clean(my_data.iloc[:, 0]), decimal_clean(my_data.iloc[:, 1]),
decimal_clean(my_data.iloc[:, 2]),decimal_clean(my_data.iloc[:, 3]),
decimal_clean(my_data.iloc[:, 4])], axis=1, join="outer")
# print(xyzqw)
# print(type(xyzqw))
'''K-means聚类算法'''
x = xyzqw[['会员入会月份','LAST_TO_END','FLIGHT_COUNT','SEG_KM_SUM','avg_discount']]
kms = KMeans(n_clusters=5) #Kmeans方法 导入5个聚类中心
y = kms.fit_predict(x) #计算聚类中心并预测每个样本的聚类指数
# print(y) # y是numpy数组
项目结果分析:
第一种分5份的图:
代码语言:javascript复制'''绘制雷达图:'''
def drow():
plt.figure(figsize=(10,6))
plt.rcParams['font.sans-serif'] = ['KaiTi']
# plt.style.use('ggplot') #ggplot样式
tu = plt.subplot(321,polar=True)
tu1 = plt.subplot(322,polar=True)
tu2 = plt.subplot(323,polar=True)
tu3 = plt.subplot(324,polar=True)
tu4 = plt.subplot(325,polar=True)
labels = np.array(['会员入会月份','LAST_TO_END','FLIGHT_COUNT','SEG_KM_SUM','avg_discount']) #设置标签
theta = np.linspace(0,2*np.pi,5,endpoint=False) #生成角度值,从0开始到2π,生成5份,终端点为False
theta = np.concatenate((theta,[theta[0]])) #闭合:加上之后首尾相接,保持第一个值和最后一个值一样
data = [x["会员入会月份"][y==0],x["LAST_TO_END"][y==0],x["FLIGHT_COUNT"][y==0],x["SEG_KM_SUM"][y==0],x["avg_discount"][y==0]] #
data1 = [x["会员入会月份"][y==1],x["LAST_TO_END"][y==1],x["FLIGHT_COUNT"][y==1],x["SEG_KM_SUM"][y==1],x["avg_discount"][y==1]] #
data2 = [x["会员入会月份"][y==2],x["LAST_TO_END"][y==2],x["FLIGHT_COUNT"][y==2],x["SEG_KM_SUM"][y==2],x["avg_discount"][y==2]] #
data3 = [x["会员入会月份"][y==3],x["LAST_TO_END"][y==3],x["FLIGHT_COUNT"][y==3],x["SEG_KM_SUM"][y==3],x["avg_discount"][y==3]] #
data4 = [x["会员入会月份"][y==4],x["LAST_TO_END"][y==4],x["FLIGHT_COUNT"][y==4],x["SEG_KM_SUM"][y==4],x["avg_discount"][y==4]] #
data = np.concatenate((data, [data[0]])) #闭合:保持第一个值和最后一个值相等
data1 = np.concatenate((data1,[data1[0]]))
data2 = np.concatenate((data2,[data2[0]]))
data3 = np.concatenate((data3,[data3[0]]))
data4 = np.concatenate((data4,[data4[0]]))
tu .plot(theta,data, marker =(5,1))
tu1.plot(theta,data1,marker = 'x')
tu2.plot(theta,data2,marker ="o")
tu3.plot(theta,data3,marker ="o")
tu4.plot(theta,data4,marker ="o")
tu.set_xticklabels(labels)
tu1.set_xticklabels(labels)
tu2.set_xticklabels(labels)
tu3.set_xticklabels(labels)
tu4.set_xticklabels(labels)
tu.set_xticklabels(labels)
plt.xticks(theta,labels)
plt.title("卒")
plt.show()
drow()
第二种5合1的雷达图: 以聚类中心为坐标
代码语言:javascript复制plt.figure(figsize=(10,6))
plt.rcParams['font.sans-serif'] = ['KaiTi']
tu = plt.subplot(111,polar=True)
datalenth=5
angle = np.linspace(0,2*np.pi,datalenth)
# angle = np.concatenate((angle,[angle[0]]))
data = kms.cluster_centers_ #聚类中心
# labels = ['1','2','3','4','5']
np.concatenate((data,[data[0]]))
plt.polar(angle,data,marker=(5,1))
plt.title('聚类中心')
labels1 = np.array(['会员入会月份','LAST_TO_END','FLIGHT_COUNT','SEG_KM_SUM','avg_discount']) #设置标签
tu.set_xticklabels(labels1)
plt.show()
加上一条属性更好看点。在plt.polar中加上linestyle。 因为是以聚类中心为坐标,所以图会变。 plt.polar(angle,data,marker=(5,1),linestyle=’:’)
本案例定义了5个等级的客户类别:重要保持客户、重要发展客户、重要挽留客户、一 般客户和低价值客户。
(1)重要保持客户。这类客户的平均折扣系数©较高(一般所乘航班的舱位等级较高),最近乘机距今的时间长度®低,飞行次数(F)或总飞行里程(M)较高。他们是航空公司的高价值客户,是最为理想的客户类型,对航空公司的贡献最大,所占比例却较小。航空公司应该优先将资源投放到他们身上,对他们进行差异化管理和一对一营销提高这类客户的忠诚度与满意度,尽可能延长这类客户的高水平消费。
(2)重要发展客户。这类客户的平均折扣系数©较高,最近乘机距今的时间长度®低,但飞行次数(F)或总飞行里程(M)较低。这类客户入会时长(L)短,他们是航空公司的潜在价值客户。虽然这类客户的当前价值并不是很高,但却有很大的发展潜力航空公司要努力促使这类客户增加在本公司的乘机消费和合作伙伴处的消费,也就是增加客户的钱包份额。通过客户价值的提升,加强这类客户的满意度,提高他们转向竞争对手的转移成本,使他们逐渐成为公司的忠诚客户。
(3)重要挽留客户。这类客户过去所乘航班的平均折扣系数©、飞行次数(F)或者总飞行里程(M)较高,但是已经较长时间没有乘坐本公司的航班(R高)或是乘坐频率变小。这类客户价值变化的不确定性很高。由于这类客户衰退的原因各不相同,所以掌握客户的最新信息,维持与客户的互动就显得尤为重要。航空公司应该根据这类客户的最近消费时间、消费次数的变化情况,推测客户消费的异动状况,并列出客户名单,对其重点联系,采取一定的营销手段,延长客户的生命周期。
(4)一般客户与低价值客户。这类客户所乘航班的平均折扣系数©很低,较长所间没有乘坐过本公司航班(R较高),飞行次数(F)或总飞行里程(M)较低,入会时长(L)短。他们是航空公司的一般用户与低价值客户,可能是在航空公司机票打折促销时才会乘坐本公司航班。
其中,重要发展客户、重要保持客户和重要挽留客户这3类重要客户分别可以归A客户生命周期管理的发展期、稳定期和衰退期3个阶段。 根据每种客户类型的特征,对各类客户群进行客户价值排名,其结果如表7-10所示。 不类型的客户群提供不同的产品和服务,提升重要发展客户的价值,稳定和延长重要保持客户的高水平消费,防范重要挽留客户的流失并积极进行关系恢复。
本模型采用历史数据进行建模,随着时间的变化,分析数据的观测窗口也在变换。因 此,对于新增客户的详细信息,考虑业务的实际情况,该模型建议每一个月运行一次,对其新增客户信息通过聚类中心进行判断,同时对本次新增客户的特征进行分析。如果增量数据的实际情况与判断结果差异大,需要业务部门重点关注,查看变化大的原因以及确认模型的稳定性。如果模型稳定性变化大,需要重新训练模型进行调整。目前模型进行重新训练的时间没有统一标准,大部分情况都是根据经验来决定的。根据经验建议:每隔半年训练一次模型比较合适。
模型应用
根据对各个客户群进行特征分析,采取下面的一些营销手段和策略,为航空公司的价 值客户群管理提供参考。 1。会员的升级与保级 航空公司的会员可以分为白金卡会员、金卡会员、银卡会员和普通卡会员,其中非普 通卡会员可以统称为航空公司的精英会员。虽然各个航空公司都有自己的特点和规定,但 会员制的管理方法是大同小异的。成为精英会员一般都是要求在一定时间内(如一年)积累一定的飞行里程或航段,达到这种要求后就会在有效期内(通常为两年)成为精英会员,并享受相应的高级别服务。有效期快结束时,根据相关评价方法确定客户是否有资格继续作为精英会员,然后对该客户进行相应的升级或降级。 然而,由于许多客户并没有意识到或根本不了解会员升级或保级的时间与要求(相关的文件说明往往复杂且不易理解),经常在评价期过后才发现自己其实只差一点就可以实现升级或保级,却错过了机会,使之前的里程积累白白损失。同时,这种认知还可能导致客因此,航空公司在对会员升级或保级进行评价的时间点之前,可以对那些接近但尚未户的不满,就放弃在本公司的消费。达到要求的较高消费客户进行适当提醒甚至采取一些促销活动,刺激他们通过消费达到相应标准。这样既可以获得收益,同时也提高了客户的满意度,增加了公司的精英会员。 2。首次兑换 航空公司常旅客计划中最能够吸引客户的内容就是客户可以通过消费积累的里程来换免票或免费升舱等。各个航空公司都有一个首次兑换标准,也就是当客户的里程或期段积累到一定程度时才可以实现第一次兑换,这个标准会高于正常的里程兑换标准。但是多公司的里程积累随着时间会进行一定的削减,例如有的公司会在年末对该年积累的里进行折半处理。这样会导致许多不了解情况的会员白白损失自己好不容易积累的里程,甚至总是难以实现首次兑换。同样,这也会引起客户的不满或流失。可以采取的措施是据库中提取出接近但尚未达到首次兑换标准的会员,对他们进行提醒或促销,使他们通过消费达到标准。一旦实现了首次兑换,客户在本公司进行再次消费兑换就比在其他公司行兑换要容易许多,等于在一定程度上提高了转移的成本。另外,在一些特殊的时间点(如里程折半的时间点)之前可以给客户一些提醒,这样可以增加客户的满意度。 3。交叉销售 通过发行联名卡等与非航空类企业的合作,使客户在其他企业的消费过程中获得本司的积分,增强与公司的联系,提高他们的忠诚度。如可以查看重要客户在非航空类合作伙伴处的里程积累情况,找出他们习惯的里程积累方式(是否经常在合作伙伴处消费,更喜欢消费哪些类型合作伙伴的产品),对他们进行相应促销。客户识别期和发展期为客户关系打下基石,但是这两个时期带来的客户关系是短暂的不稳定的。企业要获取长期的利润,必须具有稳定的、高质量的客户。保持客户对于企业是至关重要的,不仅因为争取一个新客户的成本远远高于维持老客户的成本,更重要的是客户流失会造成公司收益的直接损失。因此,在这一时期,航空公司应该努力维系客户关系水平,使之处于较高的水准,最大化生命周期内公司与客户的互动价值,并使这样的高水平尽可能延长。对于这一阶段的客户,主要应该通过提供优质的服务产品和提高服务水平来提高客户的满意度。通过根据对常旅客数据库的数据分析,进行客户细分,可以获得重要保持客户的名单。这类客户一般所乘航班的平均折扣系数©较高,最近乘机距今的时间长度®低,飞行次数(F)或总飞行里程(M)也较高。他们是航空公司的价值客户,是最为理想的客户类型,对航空公司的贡献最大,所占比例却比较小。航空公司应该优先将资源投放到他们身上,对他们进行差异化管理和一对一营销,提高这类客户的忠诚度与满意度,尽可能延长这类客户的高水平消费。
github源码 数据地址: https://github.com/lixi5338619/K-means-/tree/master