数据分析实战:航空公司客户价值分析 通过对航空公司客户数据分析,对客户进行分类,并根据不同客户价值,制定不同的服务和营销策略

一、背景目标

  1. 通过对航空公司客户数据分析,对客户进行分类;
  2. 比较不同客户的客户价值,并制定不同的服务和营销策略

二、数据探索分析

2.1 数据概况

  • 数据时间范围:2012年4月1日至2014年3月31日的数据
  • 数据记录数:62988
  • 字段数:44 个
  • 数据属性说明(字段)

        根据字段类型将数据属性分为三类:客户基本信息、乘机信息和积分信息。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv('航空公司客户价值分析/air_data.csv',header=0)
# 行数、列数
df.shape
# 预览数据
df.head()

2.2 数据质量分析

2.2.1 缺失值分析

  • 检查每一列的缺失值,并降序排列

# 检查每一列的缺失值,并降序排列
df.isnull().sum().sort_values(ascending=False)

 

 有 7 个属性列存在缺失值,分别是国家、省份、城市、年龄、性别及2个票价列

根据属性特点,在后续的分析中,年龄、票价的相关性较高,需要进行缺省值的预处理。

2.2.2 重复值分析

# 查询是否有重复值
df.duplicated().sum()

没有重复值。

 2.3 数据特征分析

数据存在缺失值,在进行数据预处理之前,对这些数据属性的特征进行分析,确定数据预处理的方案。

通过描述性分析,查看每个属性特征的总记录数及最大值、最小值、平均值、标准差等值分布:

# 查看每个特征的总条数以及五值分布:平均值、最大值、最小值、标准差、四分位数。
df.describe().T

从上述表格中,结合常识性知识,发现原始数据中存在票价为空值,票价最小值为0、折扣率最小值为0、总飞行公里数大于0的记录,这些属于异常值分析的范畴。

  • 年龄(AGE)最大值是110岁 ,需要对年龄进行数据处理;
  • EP_SUM_YR_1 和 EP_SUM_YR_2、SUM_YR_1 和 SUM_YR_2 这两对数据分别是第一年和第二年的 精英资格积分和票价,而观测窗口在2012年到2014年,这里认为 总精英资格积分EP_SUM_YR = EP_SUM_YR_1 + EP_SUM_YR_2,总票价 SUM_YR = SUM_YR_1 + SUM_YR_1,某一年没有积分或者没有票价,实际业务时也是存在可能性。
  • BEGIN_TO_FIRST (第一次飞行时间到max的时长)的min=0,结合飞行票价和积分情况,该会员可能并未有乘机飞行的行为。

明显的数据问题在于AGE的异常是非正常情况,需要处理。

三、数据预处理

3.1 数据清洗

3.1.1 删除重复值

前面分析,数据中无重复值,跳过该步骤。

3.1.2 缺失值处理

数据分析时已知,存在缺失值的属性中,对于我们后续数据分析时,相关性较高的属性是年龄(AGE)和票价(SUM_YR_1 与 SUM_YR_2)

进行缺失值处理时,仅针对这些属性处理,其他属性忽略。

 (62043, 44)

df_data_clean.describe().T

 

AGE(年龄)列 已无>100的记录

# 重新检查清洗后的数据
df_data_clean = pd.read_csv('./data_clean.csv', header=0)
df_data_clean.isnull().sum().sort_values(ascending=False)

 

 接下来处理AGE(年龄)的空值,使用平均值填充空值

# 用年龄平均值填充年龄缺失值
df_data_clean['AGE'].fillna(df_data_clean['AGE'].mean(), inplace=True)

 再检查,AGE已无空值

df_data_clean.isnull().sum().sort_values(ascending=False)

四、数据分析

本次分析主要针对用户价值进行分析,通常使用RFM模型(消费时间间隔-Recency、消费频率-Frequency、消费金额-Monetary),对于航空公司的业务,存在一定的特殊性,采用通用RFM模型进行分析,略有不足,因此,需对RFM模型进行一定的改进。

航空公司业务的特殊性:

  • 舱位等级:舱位分为商务舱、经济舱,机票价格不同;
  • 用户等级:普通用户、银卡、金卡、白金卡等,不同等级拥有不同的折扣权利;
  • 影响票价的因素:飞行运输距离、舱位、用户等级折扣。譬如(一位商务舱乘客短距离飞行的票价可能低于一位经济舱乘客长距离飞行的票价)
  • 积分:积分高的客户,在近期消费间隔时间较长,其客户价值不一定比近2年消费频率高的新客户(积分还较低)价值
  • 会员的入会时间长短,也在一定程度上影响到客户价值,我们也要考虑进来;

航空公司高价值客户的特征:

  • 飞行距离短的高等舱的客户能为航空公司创造更大的价值;
  • 总飞行里程 和 飞行次数高的客户具有更大的价值;
  • 在观察窗口内,飞行频率高的客户、最大乘机间隔小的客户,更值得航空公司进行精细化的服务或票价优惠;

4.1 构建LRFMC模型

 鉴于上述因素,我们采用RFM优化模型——LRFMC模型:

LRFMC模型指标说明
指标指标说明指标计算公式
L会员入会时间距离观测窗口结束的月数LOAD_TIME - LOAD_TIME
R客户最后一次乘坐飞机距离观测窗口结束的月数LAST_TO_END
F客户在观察窗口内乘坐飞机的次数FLIGHT_COUNT
M由于票价受折扣、舱位等多种因素影响,使用票价作为M参数,数据波动太大,这里使用飞行里程数作为M参数,观测窗口的总飞行公里数SEG_KM_SUM
C观测时间内乘坐舱位所对应的的折扣系数的平均值avg_discount

根据LRFMC模型,选择 LOAD_TIME、LOAD_TIME、LAST_TO_END、FLIGHT_COUNT、SEG_KM_SUM、avg_discount 这 6 个属性,构建 LRFMC 指标。

# 选择 LRFMC模型的6个属性
data_select = data_clean[['FFP_DATE','LOAD_TIME','LAST_TO_END', 'FLIGHT_COUNT','SEG_KM_SUM','avg_discount']]
# 构造指标L
L = pd.to_datetime(data_select['LOAD_TIME']) - pd.to_datetime(data_select['FFP_DATE']) # 日期差,但有 " days" 单位尾缀,需要删除单位
# L 值中存在" days"单位子串 
L = L.astype('str').str.split().str[0]
L=pd.to_numeric(L) # object -> int64
# 构造 LRFMC 模型指标
mdl_LRFMC = pd.concat([L, data_select.iloc[:, 2:]], axis=1)
mdl_LRFMC.columns = ['L','R','F','M','C']
mdl_LRFMC

 4.2 标准化处理

我们对指标进行描述性分析,看看数据的分布情况

mdl_LRFMC.describe().loc[['min','max','mean','std','50%']].T

从 5个指标的数据取值范围跨度比较大,为了消除数量级的影响,需要对指标数据进行标准化处理,这里选择z-score进行数据标准化处理,z-score方法的原理是将各个指标数据按比例缩放,使各个指标数据落在特定的区间内(平均值为0,标准差为1).

z-score,也叫标准分数(standard score)是一个数与平均数的差再除以标准差的过程。

公式:

        z-score =(x - mean) / std

# 数据标准化
def zscore_data(data):
 data2=(data-data.mean(axis=0))/data.std(axis=0)
 data2.columns=["Z"+i for i in data.columns]
 return data2
z_LRFMC = zscore_data(mdl_LRFMC)
z_LRFMC.head()

4.3 客户聚类

采用Kmeans算法对客户进行聚类,基于业务逻辑,聚类为5群。

kmeans = KMeans(n_clusters=5,n_jobs=-1,random_state=1234)
# 模型训练
kmeans_fit = kmeans.fit(z_LRFMC)
# 聚类中心
kmeans_cluster = kmeans_fit.cluster_centers_
# 聚类后样本的类别标签
kmeans_label = kmeans_fit.labels_
# 聚类后各个类别数目
r1 = pd.Series(kmeans_label).value_counts()
# 输出聚类分群结果
cluster_center = pd.DataFrame(kmeans_cluster,columns=['ZL','ZR','ZF','ZM','ZC'])
cluster_center.index = pd.DataFrame(kmeans_label).drop_duplicates().iloc[:,0]
cluster = pd.concat([cluster_center, r1],axis=1)
# 修改第一列列名
list_column = list(cluster.columns)
list_column[len(list_column)-1] = '类别数目'
cluster.columns = list_column
cluster

 

 

 

绘制客户聚类雷达图,直观展示客户特征分布

max = cluster_center.values.max()
min = cluster_center.values.min()
# 绘图
fig=plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, polar=True)
center_num = cluster.values
feature = ["入会时间","最后乘机间隔","总乘机次数","飞行公里数","平均折扣率"]
N =len(feature)
center_num
for i, v in enumerate(center_num):
 # 设置雷达图的角度,用于平分切开一个圆面
 angles=np.linspace(0, 2*np.pi, N, endpoint=False)
 # 为了使雷达图一圈封闭起来,需要下面的步骤
 center = np.concatenate((v[:-1],[v[0]]))
 angles=np.concatenate((angles,[angles[0]]))
 # 绘制折线图
 ax.plot(angles, center, '', linewidth=2, label = "第%d类客群:%d人"% (i+1,v[-1]))
 # 填充颜色
 ax.fill(angles, center, alpha=0.25)
 # 添加每个特征的标签
 ax.set_thetagrids(angles * 180/np.pi, feature, fontsize=15)
 # 设置雷达图的范围
 ax.set_ylim(min-0.1, max+0.1)
 # 添加标题
 plt.title('客户群特征分析图', fontsize=20)
 # 添加网格线
 ax.grid(True)
 # 设置图例
 plt.legend(loc='upper right', bbox_to_anchor=(1.3,1.0),ncol=1,fancybox=True,shadow=True)
# 显示图形
plt.show()

将LRFMC标签替换为中文,便于理解和客户特征分析,效果如下图所示:

 

 

 分析五类客户群的特征:

第一类客户:飞行里程数小,最近飞行间隔时间段,机票折扣率高,此类客户一般为乘坐商务舱的商务型客户;

第二类客户:各项指标都比较小,该客户群体可能有较多的新入会的会员。

第三类客户:入会时间长,飞行间隔时间短,说明此类客户飞行频率高;

第四类客户:乘机次数和飞行里程都较高,且飞行间隔很小,说明此类客户是活跃客户;

第五类客户:乘机间隔时间长,飞行次数和飞行里程数都较小,说明此类用户消费价值较低;

4.4 客户价值分析 

根据上述客户群体的特征,结合LRFMC模型中各指标情况,对客户价值进行划分,以便于针对不同客户价值的群体,采取不同的措施,提高客户留存率及提高用户消费行为。

根据RFM用户价值分类,LC指标作为辅助指标进行分析

 

第一类客户是折扣率高,近期活跃的商务人员,是高价低频的重点发展客户。

第四类客户是高价值客户,应该作为重点关注和保持沟通服务的客户。

第三类客户是活跃老用户,是航空公司小额活跃用户,当前价值不高,但是具有潜力,需要发展为优质客户,重点发展客户

第二类客户具有新用户特征明显,应加大留新的优惠来发展。

第五类客户各项指标数据都比较差,属于是低价值客户,有较大的流失风险。


五、结论

经过上述数据的分析,对航空公司客户群分类

重点价值客户:乘坐频次高、近期活跃度高的用户,对航空公司的贡献大。对于此类客户投入更多的资源,提供相应的优惠政策,提高这类客户的忠诚度和满意度,尽可能延长这类客户的高消费水平。

重点发展客户:飞行次数不高,但活跃度高,且票价折扣大,属于乘坐高等舱的商务人员,应该重点维护,以提高其乘坐的次数。

重点挽留客户:对于享受较高机票折扣率,飞行次数或里程数较高,但近期活跃度高的老用户,可对其提供一些营销活动,激活其来参与乘机消费。

一般客户与低价值客户:折扣率较低、入会时间段,且飞行频率小的非活跃用户,流失可能性较高。

作者:harvensage原文地址:https://blog.csdn.net/harvensage/article/details/127700345

%s 个评论

要回复文章请先登录注册