数据分析学习笔记--航空公司客户价值分析(代码)

前言
客户关系管理是企业的核心问题。客户关系管理的关键问题是客户分群。通过客户分群,区分无价值客户和高价值客户。企业针对不同价值的客户制订优化的个性化服务方案,采取不同营销策略,将有限营销资源集中于高价值客户,实现企业利润最大化目标。

一、相关知识点
1.RFM模型:
RFM模型是识别客户价值应用最广泛的模型.
(1) R
R(Recency)指的是最近一次消费时间与械止时间的间隔。通常情况下,最近一次消费时间与截止时间的间隔越短,客户对即时提供的商品或是服务也最有可能感兴趣。这也是为什么消费时间间隔为 0~6个月的顾客收到的沟通信息多于一年以上的顾客。最近一次消费时间与截止时间的间隔不仅能够为确定促销客户群体提供依据,还能够从中得出企业发展的趋势。如果分析报告显示距离最近一次消费时间很近的客户在增加,则表示该公司是个稳步 上升的公司。反之,距离最近一次消费时问很近的客户越来越少,则说明该公司需要找到问题所在,及时调整营销策略。
(2) F
F(Frequency)指顾客在某段时问内所消费的次数。消费频率越高的顾客,也是满意度越高的顾客,其忠诚度越高,顾客价值也就越大。增加顾客购买的次数意味着从竞争对手处抢得市场占有率,赚取营业额。商家需要做的,是通过各种营销方式去不断地刺激顾客消费,提高他们的消费频率,提升店铺的复购率。
(3) M
M(Monetarv)指顾客在某段时问内所消费的金额。消费金额越大的顾客,他们的消费能力自然也就越大,这就是所谓 "20%的顾客贡献了 80%的销售额" 的二八法则。而这批顾客也必然是商家在进行营销活动时蛋要特别照顾的群体,尤其是在商家前期资源不足的时候。不过需要注意一点,不论采用哪种营销方式,以不对顾客造成骚扰为大前提,否则营销只会产生负面效果。

在RFM 模型理论中,最近一次消费时间与截止时间的间隔、消费频率、消费金额是测算容户价值最重要的特征。这了个特征对营销活动具有十分重要的意义。其中,最近次消费时间与截止时间的间隔是最有力的特征。

2.对于航空客户价值分析的 LRFMC 模型
在RFM 模型中,消费金额表示在一段时间内客户购买该企业产品金额的总和。由于航空票价受到运输距离、舱位等级等多种因素影响,同样消费金额的不同旅客对航空公司的价值是不同的,比如一位购买长航线、低等级舱位票的旅客与一位购买短航线、高等级舱位票的旅客相比,后者对于航空公司而言价值可能更高。因此这个特征并不适合用于航空公司的客户价值分析。选择客户在一定时间内累积的飞行里程 M 和客户在一定时间内乘坐舱位所对应的折扣系数的平均值 C 两个特征代替消费金额。此外,航空公司会员人会时间的长短在一定程度上能够影响容户价值,所以在模型中增加容户关系长度 L,作为区分客户的另一特征。

将客户关系长度L、消费时间间隔R、消费频率F、飞行里程 M 和折扣系数的乎均值C这5个特征作为航空公司识别客户价值的特征。记为 LRFMC 模型。

二、完整代码

```python
##1.预处理航空客户数据
import numpy as np
import pandas as pd
airline_data = pd.read_csv("./data/air_data.csv",
encoding="gb18030") #导入航空数据
print('原始数据的形状为:',airline_data.shape)
## 去除票价为空的记录
exp1 = airline_data["SUM_YR_1"].notnull()
exp2 = airline_data["SUM_YR_2"].notnull()
exp = exp1 & exp2
airline_notnull = airline_data.loc[exp,:]
print('删除缺失记录后数据的形状为:',airline_notnull.shape)
#只保留票价非零的,或者平均折扣率不为0且总飞行公里数大于0的记录。
index1 = airline_notnull['SUM_YR_1'] != 0
index2 = airline_notnull['SUM_YR_2'] != 0
index3 = (airline_notnull['SEG_KM_SUM']> 0) & \
(airline_notnull['avg_discount'] != 0)
airline = airline_notnull[(index1 | index2) & index3]
print('删除异常记录后数据的形状为:',airline.shape)

##2.选取需求特征
airline_selection = airline[["FFP_DATE","LOAD_TIME",
"FLIGHT_COUNT","LAST_TO_END",
"avg_discount","SEG_KM_SUM"]]
## 构建L特征
L = pd.to_datetime(airline_selection["LOAD_TIME"]) - pd.to_datetime(airline_selection["FFP_DATE"]) #计算结果为:数字+空格+days的形式
L = L.astype("str").str.split().str[0] #要想取出其中的数字可进行操作:先将类型转换为str,然后在进行分割,最后才进行取数
L = L.astype("int")/30
## 合并特征
airline_features = pd.concat([L,
airline_selection.iloc[:,2:]],axis = 1) #行合并
print('构建的LRFMC特征前5行为:\n',airline_features.head())
#标准化
from sklearn.preprocessing import StandardScaler
data = StandardScaler().fit_transform(airline_features)
np.savez('./tmp/airline_scale.npz',data)
print('标准化后LRFMC五个特征为:\n',data[:5,:])

##3.使用K-Means算法进行客户分群
import numpy as np
import pandas as pd
from sklearn.cluster import KMeans #导入kmeans算法
airline_scale = np.load('./tmp/airline_scale.npz')['arr_0']
k = 5 ## 确定聚类中心数
#构建模型
kmeans_model = KMeans(n_clusters = k,n_jobs=4,random_state=123)
fit_kmeans = kmeans_model.fit(airline_scale) #模型训练
c1=kmeans_model.cluster_centers_ #查看聚类中心
print('查看聚类中心:\n',c1)
l1=kmeans_model.labels_ #查看样本的类别标签
print('查看样本的类别标签:\n',l1)
#统计不同类别样本的数目
r1 = pd.Series(kmeans_model.labels_).value_counts()
print('最终每个类别的数目为:\n',r1)
# 输出聚类分群的结果
cluster_center = pd.DataFrame(c1,columns = ['ZL','ZR','ZF','ZM','ZC']) # 将聚类中心放在数据框中
cluster_center.index = pd.DataFrame(l1).drop_duplicates().iloc[:,0] # 将样本类别作为数据框索引
print(cluster_center)

##4.客户分群雷达图
labels = ['ZL','ZR','ZF','ZM','ZC']
legen = [' customers' + str(i + 1) for i in cluster_center.index] # 客户群命名,作为雷达图的图例
lstype = ['-',':','-.','--','-.']
kinds = list(cluster_center.iloc[:, 0])
# 由于雷达图要保证数据闭合,因此再添加L列,并转换为 np.ndarray
cluster_center = pd.concat([cluster_center, cluster_center[['ZR']]], axis=1)
centers = np.array(cluster_center.iloc[:, 0:])
# 分割圆周长,并让其闭合
n = len(labels)
angle = np.linspace(0, 2 * np.pi, n, endpoint=False)
angle = np.concatenate((angle, [angle[0]]))
import matplotlib.pyplot as plt
# 绘图
fig = plt.figure(figsize = (8,6))
ax = fig.add_subplot(111, polar=True) # 以极坐标的形式绘制图形
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
# 画线
for i in range(len(kinds)):
ax.plot(angle, centers[i], linestyle=lstype[i], linewidth=3, label=kinds[i])
# 添加属性标签
ax.set_thetagrids(angle * 180 / np.pi, labels)
plt.title('Customer Profile Analysis')
plt.legend(legen)
plt.show()
```

结合业务分析,通过比较各个特征在群间的大小对某一个群的特征进行评价分析。其中客户群3在特征C处的值最大,在特征F、M处的值较小,说明客户群是偏好乘坐高级舱位的客户群;客户群2在特征F和M上的值最大,且在特征R上的值最小,说明客户群2的会员频繁乘机且近期都有乘机记录;客户群3在特征R处的值最大,在特征L、F、M和C处的值都较小,说明客户群3已经很久没有乘机,是入会时间较短的低价值的客户群;客户群4在所有特征上的值都很小,且在特征L处的值最小,说明客户群4属于新入会会员较多的客户群;客户群5在特征L处的值最大,在特征R处的值较小,其他特征值都比较适中,说明客户群5入会时间较长,飞行频率也较高,是有较高的价值的客户群。

posted @ 2022-04-21 23:31  mariow  阅读(556)  评论(0编辑  收藏  举报