python航空公司客户价值分析

1.航空公司部分数据特征说明及LRFMC模型介绍

#### 航空公司部分数据特征说明

kehu

在这里插入图片描述

LRFMC模型

1.RFM模型介绍

本项目的目标是客户价值分析,即通过航空公司客户数据识别不同价值的客户,识别客户价值应用最广泛的模型是RFM模型。

R(Recency)指的是最近一次消费时间与截止时间的间隔。通常情况下,最近一次消费时间与截止时间的间隔越短,对即时提供的商品或是服务也最有可能感兴趣。
F(Frequency)指顾客在某段时间内所消费的次数。可以说消费频率越高的顾客,也是满意度越高的顾客,其忠诚度也就越高,顾客价值也就越大。
M(Monetary)指顾客在某段时间内所消费的金额。消费金额越大的顾客,他们的消费能力自然也就越大,这就是所谓“20%的顾客贡献了80%的销售额"的二八法则。

2.用于此项目的弊端

在RFM模型中,消费金额表示在一段时间内,客户购买该企业产品金额的总和,由于航空票价受到运输距离,舱位等级等多种因素影响,同样消费金额的不同旅客对航空公司的价值是不同的,因此这个特征并不适合用于航空公司的客户价值分析。

3.LRFMC模型

本项目选择客户在一定时间内累积的飞行里程M和客户在一定时间内乘坐舱位所对应的折扣系数的平均值C两个特征代替消费金额。此外,航空公司会员入会时间的长短在一定程度上能够影响客户价值,所以在模型中增加客户关系长度L,作为区分客户的另一特征。
本项目将客户关系长度L,消费时间间隔R,消费频率F,飞行里程M和折扣系数的平均值C作为航空公司识别客户价值的关键特征,记为LRFMC模型。
如图在这里插入图片描述

K-Means聚类算法介绍

1.基本概念

K-Means聚类算法是一种基于质心的划分方法,输入聚类个数k,以及包含n个数据对象的数据库,输出满足误差平方和最小标准的k个聚类。算法步骤如下:

(1)从n个样本数据中随机选取k个对象作为初始的聚类中心。
(2)分别计算每个样本到各个聚类质心的距离,将样本分配到距离最近的那个聚类中心类别中。
(3)所有样本分配完成后,重新计算k个聚类的中心。
(4)与前一次计算得到的k个聚类中心比较,如果聚类中心发生变化,转(2),否则转(5)
(5)当质心不发生变化时停止并输出聚类结果。

2.数据类型

K-Means聚类算法是在数值类型数据的基础上进行研究,然而数据分析的样本复杂多样,因此要求不仅能够对特征为数值类型的数据进行分析,还要适应数据类型的变化,对不同特征做不同变换,以满足算法的要求。

3.参数介绍

在这里插入图片描述
在这里插入图片描述

--------------点击此处返回最顶端---------------------

2.开始数据分析

数据探索

首先先对数据集进行查看,对要分析的对象有大致的感觉。

需要注意的是:这里我们指定为UTF-8编码,因此需要用文本编辑器(如Notepad++等软件)将数据装换为UTF-8编码
可能遇到的问题:
1 - 出现中文路径使用: engine=‘python’
2 - 解码格式有这些一般: encoding=‘utf-8’ gbk gb2312

# 加载函数库
import numpy as np
import pandas as pd

# 加载数据
datafile = "air_data.csv"
data = pd.read_csv(datafile, encoding='utf-8') #读取原始数据,指定UTF-8编码
# 前五行数据预览
data.head()

前五行数据预览

# 基本属性信息
data.info()

在这里插入图片描述

# 数值属性的中心趋势度量,转置一下,看得更清楚
data.describe().T

data.describe()

PartⅠ:数据预处理

目的是为了获得高质量的数据用于数据挖掘建模

数据清洗
*删除缺失数据*

原因:通过数据探索分析,发现数据中存在缺失值,票价最小值为0、折扣率最小值为0、总飞行公里数大于0的记录。由于原始数据量大,这类数据所与比例较小,对于问题影响不大,因此对其进行丢弃处理。具体处理方法如
1.丢弃票价为空的记录。
2.丢弃票价为0、平均折扣率不为0、总飞行公里数大于0的记录。

#票价非空值才保留
data = data[data['SUM_YR_1'].notnull()&data['SUM_YR_2'].notnull()]

#只保留票价非零的,或者平均折扣率与总飞行公里数同时为0的记录。
index1 = data['SUM_YR_1'] != 0
index2 = data['SUM_YR_2'] != 0
index3 = (data['SEG_KM_SUM'] == 0) & (data['avg_discount'] == 0)

data = data[index1 | index2 | index3] 
print("清洗后的样本数量为 ",len(data))

# 输出为:清洗后的样本数量为  62044
数据集成
由于。。不需要数据集成
数据规约
*主要是属性规约*

原始数据中属性太多,根据航空公司客户价值LRFMC模型,选择与LRFMC指标相关的6个属性:FFP_DATE、LOAD_TIME、FLIGHT_COUNT、AVG_DISCOUNT、SEG_KM_SUM、LAST_TO_END。
删除与其不相关、弱相关或冗余的属性,例如,会员卡号、性别、工作地城市、工作地所在省份、工作地所在国家和年龄等属性。经过属性选择后的数

# 基于LRFMC模型获得候选属性
df = data[['FFP_DATE','LOAD_TIME','avg_discount','FLIGHT_COUNT','SEG_KM_SUM','LAST_TO_END']]
df.head()

在这里插入图片描述

# 构造L特征
df['L'] = (pd.to_datetime(data['LOAD_TIME']) - pd.to_datetime(data['FFP_DATE'])).dt.days #计算日期差,单位为天数
df.head()

在这里插入图片描述

# 构造R-M-F-C四个特征 (通过列名重命名)
df.rename(columns={'LAST_TO_END':'R','FLIGHT_COUNT':'F','SEG_KM_SUM':'M','avg_discount':'C'},inplace = True)
df.head()

在这里插入图片描述

# 删除多余的特征
df.drop(['FFP_DATE','LOAD_TIME'],axis=1, inplace = True)
df.head()

在这里插入图片描述

数据变换
*数据变换是将数据转换成“适当的“格式,以适应挖掘任务及算法的需要*。

本案例中主要采用的数据变换方式为属性构造和数据标准化。

# 计算每个特征的均值和标准差,然后Z-score标准化
df = (df - df.mean(axis=0))/(df.std(axis=0))

df.columns = ['Z'+i for i in df.columns]  #对数据列名重命名
df.head()

在这里插入图片描述
Tips:
做一个简单的相关分析:sns.pairplot()是将pandas对象的每一列与其他列做两两的相关分析,同时可视化结果
图的含义是:几乎大部分的图都呈散点分布,说明这两个属性之间几乎没关系,如果有关系的话,应该是一条线(线性相关),这对于我们来说是个好处,因为这几个属性相互独立。

import matplotlib.pyplot as plt
import seaborn as sns

%matplotlib inline
plt.rcParams['font.family'] = 'SimHei'
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号

sns.pairplot(df)
plt.show()

在这里插入图片描述

Part 2: 建模分析和性能评估
*我们采用K-Means聚类算法,看看是不是可以将客户分到不同的簇,对应于不同价值的客户群* Tips:聚类最好的点是:图像变化的时候,从*变得*最快到最慢的那个拐点的地方是最好的聚类簇
# 从sklearn导入聚类算法函数
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score

random_state = 5
score = []
inertia = []

# 遍历多个可能的候选簇数量
for n_clusters in range(3,20):
    kmeans = KMeans(n_clusters=n_clusters, random_state=random_state)
    kmeans.fit(df)
    inertia.append(kmeans.inertia_)#衡量模型性能
    score.append(silhouette_score(df, kmeans.labels_,sample_size=128, metric='euclidean')) #衡量聚类算法的指标

plt.figure(figsize=(10, 6))
plt.subplot(121)
plt.plot(score)
plt.grid(linestyle=':')
plt.xlabel('K')
plt.ylabel('Score')
plt.title('Performance of K-means')

plt.subplot(122)
plt.plot(inertia)
plt.grid(linestyle=':')
plt.xlabel('K')
plt.ylabel('Inertia')
plt.title('Inertia of K-means')
plt.show()

在这里插入图片描述

# 从sklearn导入聚类算法函数
from sklearn.cluster import KMeans

# 定义簇数量
k = 5           

# 初始化Kmeans模型
kmodel = KMeans(n_clusters=k)
kmodel.fit(df) 

#查看聚类中心
print(kmodel.cluster_centers_) 

'''
输出结果:
[[-0.25513154 -0.16114258 -0.16095751 -0.41488827 -0.70020646]
 [ 0.30863003  2.4832016   2.42472391 -0.79938326  0.48332845]
 [-0.1733261  -0.57401599 -0.53682019  1.68625847 -0.31367829]
 [-0.1559046  -0.08691852 -0.09484404 -0.37722119  1.16066672]
 [ 2.19134701 -0.22680311 -0.23125407 -0.00266813  0.05184279]]
'''
Part 3: 结果可视化:雷达图
*我们采用雷达图来比较不同客户群之间的异同*
# 特征标签
labels = df.columns

# 特征数量
k = 5 

# 可视化数据对象
plot_data = kmodel.cluster_centers_
color = ['b', 'g', 'r', 'c', 'y'] 

angles = np.linspace(0, 2*np.pi, k, endpoint=False)
plot_data = np.concatenate((plot_data, plot_data[:,[0]]), axis=1) # 闭合
angles = np.concatenate((angles, [angles[0]])) # 闭合

fig = plt.figure(figsize=(10,8))
ax = fig.add_subplot(111, polar=True) 

for i in range(len(plot_data)):
    ax.plot(angles, plot_data[i], 'o-', color = color[i], label = u'客户簇'+str(i+1), linewidth=2)# 画线
    
ax.set_rgrids(np.arange(0.01, 3.5, 0.5), np.arange(-1, 2.5, 0.5), fontproperties="SimHei")
ax.set_thetagrids(angles * 180/np.pi, labels, fontproperties="SimHei")

plt.legend(loc = 4)
plt.title("航空公司客户价值分析 - 雷达图")
plt.show()

雷达图

发布了17 篇原创文章 · 获赞 17 · 访问量 1148

猜你喜欢

转载自blog.csdn.net/baidu_41304382/article/details/105589404
今日推荐