航空公司客户价值分析笔记

	面对激烈的市场竞争,各航空公司相继推出更优惠的营销模式来吸引客户,并通过建立合理的客户价值评估模型对客户进行分类,分析比较不同客户群体的价值,并制定相应的营销策略,对不同客户群体提供个性化的服务。现某航空公司预实现以下目标:
  1、借助航空公司客户数据,对客户进行分类。
  2、对不同的客户类别进行特征分析,比较不同的客户价值。
  3、针对不同价值的客户类别制定相应的营销策略,为其提供个性化服务。
	面对庞大的原始航空公司客户数据,其分析思路主要是以下几点:
	①数据探索:对数据分布情况进行探索,本文主要从客户基本信息,乘机信息,积分信息三个方面进行探索来查看数据的分布情况。其中包括客户入会时间分布、会员年龄、会员性别分布、会员级别分布、最后一次乘机时间及时长、飞行次数、总飞行里程、积分兑换次数、总累计积分等角度。
	②相关分析:对选取的关键指标进行相关分析,通过系数矩阵和热力图来展现各变量之间的相关关系。
	③数据清洗:选取关键指标建立数据集,并对数据集进行数据清洗。
	④基于RFM模型(本文将模型延伸至LRFMC模型)对分层关键指标进行选取,建立LRFMC指标数据集。
	⑤基于K-Means模型对客户进行分层(对于无监督学习,K均值的难点在于K的选取,需要用多个K值来进行验证,如通过SSE值得观察和实际分布情况确定合适的K值)。
	⑥价值分析和策略制定。

学习过程的代码如下:

import pandas as pd
path=r"D:\Z_数据\study\航空公司客户价值分析数据\air_data.csv"
data=pd.read_csv(path,encoding = 'utf-8')  # 指定UTF-8编码(需要用文本编辑器将数据装换为UTF-8编码)
data_column=[column for column in data]   # 查看所有列名
data.head()
data_describe=data.describe().T           # 查看各列数据describe信息
data_describe["null"]=len(data)-data_describe["count"]  # 计算各字段空值个数
data_describe[data_describe["null"]!=0]   # 查看缺失值不为0的列
describe_result=data_describe[["mean","min","max","null"]]  # 选取部分字段信息(列名是索引)

# describe_result.columns=[u'平均值',u'最小值',u'最大值',u'空值'] # 修改列名1
describe_result.rename(columns={'mean':'平均值','min':'最小值','max':'最大值', \
    'null':'空值'},inplace=True) #修改列名2
describe_result=round(describe_result,2)
#describe_result.to_excel(r"D:\Z_数据\study\航空公司客户价值分析数据\describe_result.xlsx")
'''---以上为数据探索部分(描述性统计分析)'''

# 提取会员入会年份
from datetime import datetime as dt
ffp=data["FFP_DATE"].apply(lambda x: dt.strptime(x,'%Y/%m/%d'))
ffp_year=ffp.map(lambda x: x.year)
# 绘制各年份会员入会人数直方图
import matplotlib.pyplot as plt 
fig = plt.figure(figsize = (8 ,5))  # 设置画布大小
plt.rcParams['font.sans-serif'] = 'SimHei'  # 设置中文显示
plt.rcParams['axes.unicode_minus'] = False
plt.hist(ffp_year, bins='auto', color='#0504aa')
plt.xlabel('年份')
plt.ylabel('入会人数')
plt.title('各年份会员入会人数')
plt.show()
# 提取会员不同性别人数
female,male=data["GENDER"].groupby(data["GENDER"]).count()
'''或通过性别分别统计
male = pd.value_counts(data['GENDER'])['男']
female = pd.value_counts(data['GENDER'])['女']
'''
# 绘制会员性别比例饼图
fig = plt.figure(figsize = (8 ,4))  # 设置画布大小
plt.pie([ male, female], labels=['男','女'], colors=['blue', 'orange'],
       autopct='%1.1f%%')
plt.title('会员性别比例')
plt.show()
plt.close
# 提取不同级别会员人数
lv_4,lv_5,lv_6=data["FFP_TIER"].groupby(data["FFP_TIER"]).count()
nums=[lv_4,lv_5,lv_6]
x=range(0,len(nums))
# 绘制会员各级别人数条形图
fig = plt.figure(figsize = (8 ,5))  # 设置画布大小
plt.bar(x=['4','5','6'], height=[lv_4,lv_5,lv_6], width=0.4, alpha=0.8, color='skyblue')
# plt.text()添加数据标签
for a, b in zip(x, nums):
    plt.text(a, b + 2, b, ha='center', va='bottom')
plt.xlabel('会员等级')
plt.ylabel('会员人数')
plt.title('会员各级别人数')
plt.show()
plt.close()
# 提取会员年龄
age=data["AGE"].dropna().astype(int)  # 去除缺失值并修改为整数类型
# 绘制会员年龄分布箱型图
fig = plt.figure(figsize = (5 ,10))
plt.boxplot(age, 
            patch_artist=True,
            labels = ['会员年龄'],  # 设置x轴标题
            boxprops = {'facecolor':'lightblue'})  # 设置填充颜色
plt.title('会员年龄分布箱线图')
            # 显示y坐标轴的底线
plt.grid(axis='y')
plt.show()
plt.close

            # 乘机信息类别
lte = data['LAST_TO_END']
fc = data['FLIGHT_COUNT']
sks = data['SEG_KM_SUM']
# 绘制最后乘机至结束时长箱线图
fig = plt.figure(figsize = (5 ,8))
plt.boxplot(lte, 
            patch_artist=True,
            labels = ['时长'],  # 设置x轴标题
            boxprops = {'facecolor':'lightblue'})  # 设置填充颜色
plt.title('会员最后乘机至结束时长分布箱线图')
            # 显示y坐标轴的底线
plt.grid(axis='y')
plt.show()
plt.close
# 绘制客户飞行次数箱线图
fig = plt.figure(figsize = (5 ,8))
plt.boxplot(fc, 
            patch_artist=True,
            labels = ['飞行次数'],  # 设置x轴标题
            boxprops = {'facecolor':'lightblue'})  # 设置填充颜色
plt.title('会员飞行次数分布箱线图')
            # 显示y坐标轴的底线
plt.grid(axis='y')
plt.show()
plt.close
            # 绘制客户总飞行公里数箱线图
fig = plt.figure(figsize = (5 ,10))
plt.boxplot(sks, 
            patch_artist=True,
            labels = ['总飞行公里数'],  # 设置x轴标题
            boxprops = {'facecolor':'lightblue'})  # 设置填充颜色
plt.title('客户总飞行公里数箱线图')
            # 显示y坐标轴的底线
plt.grid(axis='y')
plt.show()
plt.close

# 积分信息类别
            # 提取会员积分兑换次数
ec = data['EXCHANGE_COUNT']
ec.groupby(ec<10).count()/ec.count()
    # 绘制会员兑换积分次数直方图
fig = plt.figure(figsize = (8 ,5))  # 设置画布大小
plt.hist(ec, bins=5, color='#0504aa')
plt.xlabel('兑换次数')
plt.ylabel('会员人数')
plt.title('会员兑换积分次数分布直方图')
plt.show()
plt.close
            # 提取会员总累计积分
ps = data['Points_Sum']
ps.groupby(ps).count()
            # 绘制会员总累计积分箱线图
fig = plt.figure(figsize = (5 ,8))
plt.boxplot(ps, 
            patch_artist=True,
            labels = ['总累计积分'],  # 设置x轴标题
            boxprops = {'facecolor':'lightblue'})  # 设置填充颜色
plt.title('客户总累计积分箱线图')
            # 显示y坐标轴的底线
plt.grid(axis='y')
plt.show()
plt.close

'''相关性分析'''
            # 提取属性并合并为新数据集
da_corr = data[['FFP_TIER','FLIGHT_COUNT','LAST_TO_END',
                  'SEG_KM_SUM','EXCHANGE_COUNT','Points_Sum']]
age1 = data['AGE'].fillna(0)  # 用0填补年龄缺失值
da_corr['AGE'] = age1.astype(int)
da_corr['ffp_year'] = ffp_year
            # 计算相关性矩阵
corr = da_corr.corr(method = 'pearson')
            # 绘制热力图
import seaborn as sns
plt.subplots(figsize=(10, 10)) # 设置画面大小 
sns.heatmap(corr, annot=True, vmax=1, square=True, cmap='Blues') 
plt.show()
plt.close

# 数据清洗
            # 剔除票价为空的数据
sum_YR_notnull=data.loc[data["SUM_YR_1"].notnull() & data["SUM_YR_2"].notnull(),:]
sum_YR_notnull.shape
            #保留票价为非0,或者平均折扣率不为0且总飞行公里数大于0的记录
condition1= sum_YR_notnull["SUM_YR_1"] !=0
condition2= sum_YR_notnull["SUM_YR_2"] !=0
condition3= (sum_YR_notnull["avg_discount"] !=0) & (sum_YR_notnull["SEG_KM_SUM"]>0)
condition4= sum_YR_notnull["AGE"]>100 # 要剔除年龄在100岁以上的数据
airline= sum_YR_notnull[((condition1 | condition2) | condition3) & ~condition4]
airline.shape
            # 保存清洗后的数据(编码格式写为utf_8_sig)
#airline.to_csv(r"D:\Z_数据\study\航空公司客户价值分析数据\air_clean.csv",encoding="utf_8_sig")

# RFM模型衍生(结合实际业务问题将模型指标衍生)
# ----本文采用影响客户价值的会员入会时长(L)、最近一次时间间隔(R)、乘坐次数(F)、累计飞行里程(M)、平均折扣系数(C)
airline_select= airline[['FFP_DATE','LOAD_TIME','LAST_TO_END',
                            'FLIGHT_COUNT','SEG_KM_SUM','avg_discount']]
L_days=pd.to_datetime(airline_select["LOAD_TIME"])-pd.to_datetime(airline_select["FFP_DATE"])
L=((L_days.astype("str").str.split(" ").str[0].astype("int"))/30).round(2)
        #合并数据提取5个核心指标
airline_con=pd.concat([L,airline_select.iloc[:,2:]],axis=1)
airline_con.columns = ['L','R','F','M','C']
            #数据标准化
from sklearn.preprocessing import StandardScaler as SS
data = SS().fit_transform(airline_con)
data_frame=pd.DataFrame(data)
data_frame.columns=['ZL','ZR','ZF','ZM','ZC']
#data_frame.to_excel(r'D:\Z_数据\study\航空公司客户价值分析数据\标准化后数据数据表.xlsx')
'''或者直接以np数组导出数据
import numpy as np
np.savez(r'D:\Z_数据\study\航空公司客户价值分析数据\标准化后数据.npz',data) 
'''


# K-Means聚类
import numpy as np
from sklearn.cluster import KMeans  # 导入kmeans算法
airline_data = np.load('D:\Z_数据\study\航空公司客户价值分析数据\标准化后数据.npz')['arr_0']
            # 构建模型(设置一个随机种子)
k=5
k_model=KMeans(n_clusters = k,random_state=1) #n_clusters表示聚类中心数,具体数量应根据实际业务确定
k_fit = k_model.fit(airline_data)  # 模型训练
            # 查看聚类结果
k_center = k_model.cluster_centers_  # 聚类中心
k_sign = k_model.labels_  # 各样本对应的类别标签
k_count = pd.Series(k_sign).value_counts()  # 统计不同类别样本的数目
            # 输出分群的结果
k_result=pd.DataFrame(k_center,columns=['ZL','ZR','ZF','ZM','ZC'])
k_result.index=pd.DataFrame(k_sign).drop_duplicates().iloc[:,0]   #将样本类别作为数据框的索引
# k_result.to_excel(r"D:\Z_数据\study\航空公司客户价值分析数据\k_result.xlsx")

# 画雷达图展示分类结果
import matplotlib.pyplot as plt 
legen = ['客户群' + str(i + 1) for i in k_result.index]  # 客户群命名,作为雷达图的图例
k_results=pd.concat([k_result,k_result[["ZL"]]],axis=1)
results=np.array(k_results)
kinds = list(k_results.iloc[:, 0])
label=['ZL','ZR','ZF','ZM','ZC']
angles=np.linspace(0,2*np.pi,len(label),endpoint=False)
angles=np.concatenate((angles,[angles[0]]))
fig=plt.figure(figsize=(9,9))
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(angles,results[i],linewidth=3)
# 添加属性标签
ax.set_thetagrids(angles* 180/np.pi,labels=label+[label[0]])
plt.title('客户特征分析雷达图')
plt.legend(legen)
plt.show()
plt.close

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

钢蛋小黑娃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值