-
2022-04-21 22:46:24
前言
客户关系管理是企业的核心问题。客户关系管理的关键问题是客户分群。通过客户分群,区分无价值客户和高价值客户。企业针对不同价值的客户制订优化的个性化服务方案,采取不同营销策略,将有限营销资源集中于高价值客户,实现企业利润最大化目标。
一、相关知识点
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 模型。
二、完整代码
##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入会时间较长,飞行频率也较高,是有较高的价值的客户群。更多相关内容 -
大数据分析技术-航空公司客户价值分析(一).doc
2021-08-21 09:33:54大数据分析技术-航空公司客户价值分析(一) -
航空公司客户价值分析案例数据air_data.csv下载
2019-03-28 20:54:12该数据为某航空公司一段时间内有乘机记录的所有客户的形成的历史数据,44个特征,总共62988条记录。 -
航空公司客户价值分析代码与数据集(修改版).zip
2020-01-11 16:39:40经过整理的航空公司客户价值分析代码与数据集,编程语言为Python。代码涉及到数据预处理与建模的各阶段。建模算法采用的是KMeans算法。 -
航空公司客户价值分析-数据集
2021-03-14 20:52:24air_data.csv -
《航空公司客户价值分析》数据源(第7章).zip
2020-12-19 17:16:12《航空公司客户价值分析》数据源(第7章).zip 详细文章教程如下:https://blog.csdn.net/Gabrielle_OyO/article/details/111406756 免费开源,欢迎补充 -
Python数据分析与应用 ---- 航空公司客户价值分析
2020-08-17 13:59:46二、依据RFM模型预处理航空客户数据 数据清洗 特征构建 数据标准化 三、使用K-...Python数据分析与应用----航空公司客户价值分析
目录:
一、RFM模型
二、依据RFM模型预处理航空客户数据
1.数据清洗
2.特征构建
3.数据标准化
三、使用K-Means算法进行客户分群
四、聚类结果可视化
1.方法一
2.方法二
3.方法三
4.方法解析
某航空公司现状:以2014年3月31日为结束时间,选取宽度为两年的时间段作为分析窗口,抽取观测窗口内有乘机记录的所有客户的详细数据,形成历史数据62988条。
现进行对客户数据分析,将客户分类并比较不同类别客户的客户价值,以便提供个性化服务,制定相应的营销策略,具体流程如下:
一、RFM模型1、什么是RFM模型
R(Recency)是指用户的最近一次消费时间与截止时间的间隔,用最通俗的话说就是,用户最后一次下单时间距今天有多长时间了,这个指标与用户流失和复购直接相关,关系到公司最近的走向。
F(Frequency)是指用户下单频率,就是用户在固定的时间段内消费了几次。这个指标反映了用户的消费活跃度。
M(Monetary)是指用户消费金额,其实就是用户在固定的周期内在平台上花了多少钱,直接反映了用户对公司贡献的价值。
本案例要求分类客户并对其价值分析评价,而识别客户价值应用最广泛的模型就是RFM模型。RFM模型通过一个客户的近期购买行为、购买的总体频率以及花了多少钱三项指标,来描述该客户的价值状况。
2、RFM模型有什么作用
RFM模型可以对客户的终生价值做一个合理的预估,基于一个理想的客户特征来衡量现实中客户价值的高低,通过此类分析,定位最有可能成为品牌忠诚客户的群体,让我们把主要精力放在最有价值的用户身上。
依据上述RFM模型,在已知的数据特征中我们后期可以选取必要的特征进行分析。
二、依据RFM模型预处理航空客户数据
依据流程图,我们对航空客户数据依次进行数据清洗、特征构建以及数据标准化处理。
1.数据清洗import numpy as np import pandas as pd # 读取数据 airline_data = pd.read_csv('data/air_data.csv',encoding='gb18030') print('原始数据的形状为:',airline_data.shape) //原始数据的形状为: (62988, 44)
利用notnull()方法取出非空数据,&—合并条件保留完整数据记录,loc切片保留最终非空数据。
# 取出票价为空值的数据 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) //删除缺失记录后的数据形状为: (62299, 44)
既然分析有价值客户,就必须得有数据,对于那些虽然非空但是为0的数据也需要清理掉。注意:这里在SUM_YR_1、SUM_YR_2的0值去除时使用的是(index1|index2),本身这两个特征代表的是观测窗口票价收入,个人理解是这里的1、2代表了两个窗口,也就是说一个人在这两个窗口的记录均为0时,才表示该客户从来没有乘坐过飞机,数据异常。
# 只保留票价非0的,或者平均折扣率不为0的且总飞行千米数大于0的 index1 = airline_notnull['SUM_YR_1'] != 0 //保留观测窗口1不为零的数据 index2 = airline_notnull['SUM_YR_2'] != 0 //保留观测窗口2不为零的数据 index3 = (airline_notnull['avg_discount'] !=0) & (airline_notnull['SEG_KM_SUM']>0) airline = airline_notnull[(index1|index2) & index3] print('删除异常记录后的数据形状为:',airline.shape) //删除异常记录后的数据形状为: (62044, 44)
2.特征构建基于RFM模型,我们需要能表示时间间隔的、表示单位时间内购买产品频率的以及单位时间内购买产品总资金的特征。但是由于航空票价受到运输距离和舱位等级的影响,同样的消费金额的不同旅客对于航空公司的价值是不同的。比如:短航线高等仓的客户就比长航线低等舱的客户价值更高些,所以此处借一段时间内的飞行里程(M)与舱位对应折扣系数的均值(C)来代替消费金额。另外,航空公司会员入会时间的长短在一定程度上也能够影响客户价值,所以在原来模型上添加客户关系长度(L),作为区分客户的另一特征。
模型 L R F M C 航空公司LRFMC模型 会员入会时间距观测窗口结束的月数 客户最近一次乘坐飞机距观测窗口结束的月数 客户在观测窗口内乘坐飞机的次数 客户在观测窗口累计的飞行里程 客户在观测窗口内乘坐舱位对应折扣系数的均值 R = LAST_TO_END F = FLIGHT_COUNT
M = SEG_KM_SUM C = AVG_DISCOUNT对比模型与实际数据供应,我们发现在客户基本信息列中仅有表示客户入会员时间列,此时特征 L 需要我们自行构建。
L = LOAD_TIME - FFP_DATE
# 选取构建 LRFMC 的特征 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']) # 计算时间差---天数 L = L.astype('str').str.split().str[0] # 转换为数值类型,方便计算月数 L = L.astype('int')/30 # 计算月数 # 合并特征 airline_features = pd.concat([L,airline_selection.iloc[:,2:]],axis=1) print(airline_features) 0 FLIGHT_COUNT LAST_TO_END avg_discount SEG_KM_SUM 0 90.200000 210 1 0.961639 580717 1 86.566667 140 7 1.252314 293678 2 87.166667 135 11 1.254676 283712 3 68.233333 23 97 1.090870 281336 4 60.533333 152 5 0.970658 309928 ... ... ... ... ... ... 62974 108.300000 2 89 0.710000 368 62975 65.366667 2 121 0.670000 368 62976 45.400000 2 39 0.225000 1062 62977 15.533333 2 464 0.250000 904 62978 36.066667 2 282 0.280000 760 [62044 rows x 5 columns]
3.数据标准化数据的标准化(normalization)是将数据按比例缩放,使之落入一个小的特定区间。
在某些比较和评价的指标处理中经常会用到,去除数据的单位限制,将其转化为无量纲的纯数值,便于不同单位或量级的指标能够进行比较和加权。# 标准差标准化数据 from sklearn.preprocessing import StandardScaler data = StandardScaler().fit_transform(airline_features) np.savez('tmp/airline_scale.npz',data) print('标准化后 LRFMC 模型的5个特征为:\n',data) 标准化后 LRFMC 模型的5个特征为: [[ 1.43571897 14.03412875 -0.94495516 1.29555058 26.76136996] [ 1.30716214 9.07328567 -0.9119018 2.86819902 13.1269701 ] [ 1.32839171 8.71893974 -0.88986623 2.88097321 12.65358345] ... [-0.14942206 -0.70666211 -0.73561725 -2.68990622 -0.77233818] [-1.20618274 -0.70666211 1.6056619 -2.55464809 -0.77984321] [-0.47965977 -0.70666211 0.60304353 -2.39233833 -0.78668323]]
三、使用K-Means算法进行客户分群K-Means算法是一种基于质心的划分方法,给定聚类个数K,以及包含n个数据对象的数据库,输出满足误差平方和最小标准的k个聚类,算法步骤如下:
- 1.从n个样本数据中随机选取k个对象作为初始的聚类中心
- 2.分别计算出每个样本到各个聚类质心的距离,将样本分配到距离最近的那个聚类中心类别中
- 3.所有样本分配完后,再重新计算k个聚类的中心
- 4.与前一次计算得到的k个聚类中心比较,若聚类中心变化,返回步骤2,继续;否则转到5
- 5.当质心不发生变化时停止并输出聚类结果。
聚类的结果依赖于初始聚类中心的随机选择。在实践中,为了得到好的效果,通常以不同的初始聚类中心多次运行K-Means算法。在所有的样本分配后,重新计算k个聚类的中心时,对于连续的数据,聚类中心取该簇的均值。
上面将ariline_scale保存时以单个数组形式保存,非关键字参数传递的数组自动取名为arr_0,所以在读取提出数据时要添加列名。
import pandas as pd import numpy as np from sklearn.cluster import KMeans //将多个数组保存到一个文件中的话,可以使用numpy.savez函数。savez函数的第一个参数是文件名,其后的参数都是需要保存的数组,也可以使用关键字参数 //为数组起一个名字,非关键字参数传递的数组会自动起名为arr_0, arr_1, …。savez函数输出的是一个压缩文件(扩展名为npz),其中每个文件都是一个 //save函数保存的npy文件,文件名对应于数组名。load函数自动识别npz文件,并且返回一个类似于字典的对象,可以通过数组名作为关键字获取数组的内容. ariline_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(ariline_scale) // 查看聚类中心 kmeans_model.cluster_centers_ array([[ 0.04240079, -0.23143046, -0.00322862, 2.17190116, -0.23585705], [-0.31316114, -0.57390748, 1.68689725, -0.17497219, -0.53673986], [ 0.48366129, 2.48319491, -0.79940665, 0.30924046, 2.42447899], [-0.70029836, -0.16066112, -0.41507386, -0.25783497, -0.16039479], [ 1.16094184, -0.08663559, -0.37743838, -0.15689301, -0.09454205]])
// 查看聚类样本的分类标签 kmeans_model.labels_ array([2, 2, 2, ..., 3, 1, 1])
// 统计不同类别的样本数目 r1 = pd.Series(kmeans_model.labels_).value_counts() print('最终分类每个样本的数目为:\n',r1) 最终分类每个样本的数目为: 3 24618 4 15733 1 12114 2 5337 0 4242 dtype: int64
四、聚类结果可视化1.方法一:整理数据:
import numpy as np import pandas as pd import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = 'SimHei' plt.rcParams['font.size'] = 12.0 plt.rcParams['axes.unicode_minus'] = False # 统计不同类别的样本数目 r1 = pd.Series(kmeans_model.labels_).value_counts() # 找出聚类中心 r2 = pd.DataFrame(kmeans_model.cluster_centers_ ) r = pd.concat([r2, r1], axis = 1) #横向连接(0是纵向),得到聚类中心对应的类别下的数目 r.columns = list(pd.DataFrame(ariline_scale).columns) + [u'类别数目'] #重命名表头 print(r) 0 1 2 3 4 类别数目 0 0.042401 -0.231430 -0.003229 2.171901 -0.235857 4242 1 -0.313161 -0.573907 1.686897 -0.174972 -0.536740 12114 2 0.483661 2.483195 -0.799407 0.309240 2.424479 5337 3 -0.700298 -0.160661 -0.415074 -0.257835 -0.160395 24618 4 1.160942 -0.086636 -0.377438 -0.156893 -0.094542 15733 center_num = r.values print(center_num) //[[ 4.24007883e-02 -2.31430460e-01 -3.22861506e-03 2.17190116e+00 // -2.35857054e-01 4.24200000e+03] // [-3.13161141e-01 -5.73907480e-01 1.68689725e+00 -1.74972187e-01 // -5.36739860e-01 1.21140000e+04] // [ 4.83661293e-01 2.48319491e+00 -7.99406654e-01 3.09240458e-01 // 2.42447899e+00 5.33700000e+03] // [-7.00298357e-01 -1.60661116e-01 -4.15073856e-01 -2.57834972e-01 // -1.60394792e-01 2.46180000e+04] // [ 1.16094184e+00 -8.66355853e-02 -3.77438378e-01 -1.56893014e-01 // -9.45420456e-02 1.57330000e+04]]
绘图:
fig=plt.figure(figsize=(10, 8)) ax = fig.add_subplot(111, polar=True) feature = ["入会时间", "飞行次数", "时间间隔差值", "平均折扣率", "总里程"] N =len(feature) 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, 'o-', 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()
enumerate()枚举:设置变量时第二个变量代表所要枚举数据中的第i个值。
b=[1,2,3,4,5,6] for i,item in enumerate(b): print (i, item) Output: 0 1 1 2 2 3 3 4 4 5 5 6
2.方法二:整理数据:
r1=pd.Series(kmeans_model.labels_).value_counts() r2=pd.DataFrame(kmeans_model.cluster_centers_) r3=pd.Series(['客户群1','客户群2','客户群3','客户群4','客户群5',]) r=pd.concat([r3,r1,r2],axis=1) r.columns=['聚类类别','聚类个数']+list(pd.DataFrame(data).columns) print(r) 聚类类别 聚类个数 0 1 2 3 4 0 客户群1 4242 0.042401 -0.231430 -0.003229 2.171901 -0.235857 1 客户群2 12114 -0.313161 -0.573907 1.686897 -0.174972 -0.536740 2 客户群3 5337 0.483661 2.483195 -0.799407 0.309240 2.424479 3 客户群4 24618 -0.700298 -0.160661 -0.415074 -0.257835 -0.160395 4 客户群5 15733 1.160942 -0.086636 -0.377438 -0.156893 -0.094542 //转置 r4=r2.T r4.columns=list(pd.DataFrame(data).columns) y=[] for x in list(pd.DataFrame(data).columns): dt= r4[x] dt=np.concatenate((dt,[dt[0]])) y.append(dt)
绘制图形:
#绘制雷达图 // 设置中文 plt.rcParams['font.sans-serif']=['SimHei'] // 设置画布大小 fig = plt.figure(figsize=(10,8)) //标签 labels = np.array(list(pd.DataFrame(data).columns)) //数据个数 dataLenth = 5 //设置子图 ax = fig.add_subplot(111, polar=True) angles = np.linspace(0, 2*np.pi, dataLenth, endpoint=False) angles = np.concatenate((angles, [angles[0]])) ax.plot(angles, y[0], 'b-', linewidth=2) ax.plot(angles, y[1], 'r-', linewidth=2) ax.plot(angles, y[2], 'g-', linewidth=2) ax.plot(angles, y[3], 'y-', linewidth=2) ax.plot(angles, y[4], 'm-', linewidth=2) ax.legend(r3,loc=1) ax.set_thetagrids(angles * 180/np.pi, labels, fontproperties="SimHei") ax.set_title("matplotlib雷达图", va='bottom', fontproperties="SimHei") ax.grid(True) plt.show()
3.方法三://做可视化: plt.figure(figsize=(6,6)) L=5 angles = np.linspace(0, 2*np.pi, L, endpoint=False) labels = ['L', 'F', 'R', 'C', 'M'] data = kmeans_model.cluster_centers_ //闭合曲线: angles = np.concatenate((angles, [angles[0]])) //为了形成闭合,把二维数组每一行下标为0的数拼接到列, // 二维数组与二维数组拼接, //所以reshape成二维的,且变成五列一行 data = np.concatenate((data, data[:,0].reshape(5,1)),axis=1).T // print('angles',angles) print('data:\n',data) //绘图: plt.polar(angles, data) plt.xticks(angles, labels) plt.show()
4.方法解析:其实说到底,要绘制这样的雷达图我们只需要两样东西:数据和绘图方法。绘图方法在matplotlib库中已经提供了,接下来就是我们找到数据,并加以处理,使之能够应用到绘图方法中去。
就拿第二种方法为例:(解析时为了方便代码会有所改动)数据处理:
r1=pd.Series(kmeans_model.labels_).value_counts() r2=pd.DataFrame(kmeans_model.cluster_centers_) r3=pd.Series(['客户群1','客户群2','客户群3','客户群4','客户群5',]) r=pd.concat([r3,r1,r2],axis=1) r.columns=['聚类类别','聚类个数']+list(pd.DataFrame(data).columns) print(r) 聚类类别 聚类个数 0 1 2 3 4 0 客户群1 4242 0.042401 -0.231430 -0.003229 2.171901 -0.235857 1 客户群2 12114 -0.313161 -0.573907 1.686897 -0.174972 -0.536740 2 客户群3 5337 0.483661 2.483195 -0.799407 0.309240 2.424479 3 客户群4 24618 -0.700298 -0.160661 -0.415074 -0.257835 -0.160395 4 客户群5 15733 1.160942 -0.086636 -0.377438 -0.156893 -0.094542 //转置 r4=r2.T r4.columns=list(pd.DataFrame(data).columns) y=[] for x in list(pd.DataFrame(data).columns): dt= r4[x] dt=np.concatenate((dt,[dt[0]])) y.append(dt)
为了清洗方便的处理在得到聚类中心转为DataFrame时,直接设置了索引和列名,方便看出转置后的变化。
r1 = pd.Series(kmeans_model.labels_).value_counts() r2 = pd.DataFrame(kmeans_model.cluster_centers_,columns=['L', 'F', 'R', 'C', 'M'],index=['客户群1','客户群2','客户群3','客户群4','客户群5']) print('r2:\n',r2)
利用转置,将数据行列互换位置,一列表示某一客户群的LFRCM模型数据r4 = r2.T print('r4\n',r4)
将数据表的列转换为数值型,否则下面循环时dt = r4[x]
会报错,因为不该为数值型,在遍历匹配时,字符型不相匹配。还有一点就是,data在读取数据后类型为naddery不能直接赋.columns,需要将其转为DataFrame类型才可以。r4.columns = list(pd.DataFrame(data).columns) print('r4.columns:\n',r4)
这一步至关重要,这幅图关键就是以闭合、多方位的形式展现数据。该步骤就是对每一列数据进行收尾闭合。numpy.concatenate() 方法能够解决闭合问题!
y=[] for x in list(pd.DataFrame(data).columns): dt= r4[x] dt=np.concatenate((dt,[dt[0]])) y.append(dt) print(y)
反观方法一与方法三,在数据处理是都有这方面的考虑,只是三种方法考虑问题的先后。
所谓先后就是整体的流程:
1.找到数据,把数据处理好了,再去画图
2.在画图的同时,遍历处理当下对应的数据
绘图:
在绘图这方面就是采用matplotlib库提供的绘图方法:1.matplotlib.pyplot.polar() 关于极区图 / 极坐标图 / 雷达图的绘制
2.matplotlib.pyplot.thetagrids() :
matplotlib.pyplot.thetagrids() 方法用于获取并设置当前极区图上的极轴。基本语法:matplotlib.pyplot.thetagrids(angles, labels=None, fmt=None, **kwargs)
参数 描述 angles 网格线的角度,浮点数、度数组成的元组 labels 每个极轴要使用的文本标签,字符串组成的元组 fmt 格式化 angles 参数,如 ‘%1.2f’ 保留两位小数,注意,将使用以弧度为单位的角度 **kwargs 其他关键字参数,参见官方文档
3.np.linspace():np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
在规定的时间内,返回固定间隔的数据。他将返回“num”个等间距的样本,在区间[start, stop]中。其中,区间的结束端点可以被排除在外。
属性 说明 start 队列的开始值 stop 队列的结束值 num 要生成的样本数,非负数,默认是50 endpoint 若为True,“stop”是最后的样本;否则“stop”将不会被包含。默认为True retstep 若为False,返回等差数列;否则返回array([samples, step])。默认为False、
说明:
会有人疑惑这里的图与教材上的图形不同,那是肯定的,按照教材上的代码画出来并非教材原图,因为教材给出的图是按照 LFRMC模型的顺序做的,可给出的源码实例并不是那个顺序。所以只需要在选择特征时把顺序改过来就好了,至于其他图形信息自行设置即可。
本文相关源码下载:https://download.csdn.net/download/qq_45797116/74466893
-
航空数据分析
2021-02-13 08:35:42航空数据分析 介绍 今天产生了大量的数据,大数据分布在大多数域中。 可以将大数据用于航班延误分析也就不足为奇了。 有几个相关因素会影响航班延误以及航班取消。 因此有必要找出与此类问题相关的原因。 改善客户... -
航空公司客户价值分析.zip
2020-05-20 10:57:46- 2.[开始数据分析](#2) - [数据探索](#2) - [Part Ⅰ:数据预处理](#2.0) - [数据清洗](#2.1) - [数据集成](#2.2) - [数据归约](#2.3) - [数据变换](#2.4) - [Part Ⅱ:建模分析和性能评估](#... -
SAS SPSS软件的 数据分析与挖掘实战 完整课程PPT课件 第7章 (共37页)实战 实例:航空公司客户价值分析....
2021-08-07 17:46:23二八定律: 20%的客户,为企业带来约80%的利益。 在竞争激烈的航空市场里,很多航空公司都推出了优惠的 营销方式来吸引更多的客户。...如果分析航空公司客户价值 ,此模型不再适用,存在一些缺陷和不足: -
航空公司客户价值分析(附完整代码)
2019-07-22 09:04:59航空公司客户价值分析完整代码 项目背景:为某航空公司需要以客户为中心,按照客户的需求,在对客户的特点了解上使用不同的营销手段,目的是争取更多新客户,降低客户流失率,降低服务成本,提高业务收入,增加ARPU... -
基于数据挖掘的航空公司客户价值分析.pdf
2021-07-14 14:41:48基于数据挖掘的航空公司客户价值分析.pdf -
航空公司-客户数据集.csv
2021-04-06 16:48:45航空公司数据集 -
《Rapid Miner数据分析与挖掘实战》第20章 航空公司客户价值分析
2019-05-03 15:04:29《Rapid Miner数据分析与挖掘实战》第20章 航空公司客户价值分析,word文档及相关数据 -
Python:航空公司客户价值分析实战
2018-08-17 13:27:26⑴借助航空公司的客户数据,对客户进行分类;⑵对不同类的客户类别进行特征分析,比较不同类客户的客户价值;⑶从营销角度讲,客户价值分析实际上是一个市场细分问题,解决市场细分问题比较常用的方法是聚类分析;⑷... -
大数据分析技术-航空公司客户价值分析(二)
2021-11-22 15:27:47大数据分析技术-航空公司客户价值分析(二) 1.复习如何使用python选取构建LRFMC模型需要的特征 2.使用sklearn相关功能模块标准化LRFMC模型的特征 3.使用sklearn的cluster模块提供的kmeans函数对不同客户群体LRMFC... -
快速数据挖掘数据分析实战RapidMiner工具应用第20章 航空公司客户价值分析V1.1.pdf
2021-08-07 22:55:21通过建立合理的客户价值评估模型,对客户进行分群,分析比较不同客户群的客户价值,并制定相应的营销策略,对不同的客户群提供个性化的客户服务是必须的和有效的。目前该航空公司已积累了大量的会员档案信息和其乘坐... -
航空公司客户价值分析_python_评估_
2021-10-02 17:09:43建立合理的客户价值评估模型,对客户进行分群 -
航空公司客户价值大数据分析源代码含数据python版
2019-04-05 17:30:01航空公司客户价值大数据分析全部的源代码,使用python编写,含数据部分 -
Python数据分析与应用--航空公司客户价值分析.ppt
2020-04-24 11:53:46;1;分析航空公司现状;分析航空公司现状;目前航空公司已积累了大量的会员档案信息和其乘坐航班记录 以2014-03-31为结束时间选取宽度为两年的时间段作为分析观测窗口抽取观测窗口内有乘机记录的...借助航空公司客户数据 -
【数据分析与挖掘实战】航空公司客户价值分析
2021-12-05 16:24:14在竞争激烈的航空市场里,很多航空公司都推出了优惠的营销方式来吸引更多的客户。在此种环境下,如何将公司有限的资源充分利用,提示企业竞争力,为企业带来更多的利益。 2.传统方法存在的缺陷 广泛用于分析客户...1.案例背景
- 二八定律: 20%的客户,为企业带来约80%的利益。
- 在企业的客户关系管理中,对客户分类,区分不同价值的客户。针对不同价值的客户提供个性化服务方案,采取不同营销策略,将有限营销资源集中于高价值客户,实现企业利润最大化目标。
- 在竞争激烈的航空市场里,很多航空公司都推出了优惠的营销方式来吸引更多的客户。在此种环境下,如何将公司有限的资源充分利用,提示企业竞争力,为企业带来更多的利益。
2.传统方法存在的缺陷
广泛用于分析客户价值的是RFM模型,它是通过三个指标(最近消费时间间隔(Recency)、消费频率(Frequency)、消费金额(Monetary))来进行客户细分,识别出高价值的客户。如果分析航空公司客户价值,此模型不再适用,存在一些缺陷和不足:
一:在模型中,消费金额表示在一段时间内,客业产品金额的总和。因航空票价受到运输距离、舱位等级等多种因素影响,同样消费金额的不同旅客对航空公司的价值是不同的。因此这个指标并不适合用于航空公司的客户价值分析。
二:传统模型分析是利用属性分箱方法进行分析如图,但是此方法细分的客户群太多,需要一一识别客户特征和行为,提高了针对性营销的成本。3.原始数据说明
客户信息属性说明,针对航空客户的信息,对每个属性进行相应说明。
航空客户信息,其中已经包含会员档案信息和其乘坐航班记录等
4.挖掘目标
1、借助航空公司客户数据,对客户进行分类;
2、对不同的客户类别进行特征分析,比较不同类客户的客户价值;
3、对不同价值的客户类别提供个性化服务,制定相应的营销策略。5.分析方法与过程
初步分析:提出使用航空公司的LRFMC模型
因消费金额指标在航空公司中不适用,故选择客户在一定时间内累积的飞行里程M和客户乘坐舱位折扣系数的平均值C两个指标代替消费金额。此外,考虑航空公司会员加入时间在一定程度上能够影响客户价值,所以在模型中增加客户关系长度L,作为区分客户的另一指标,因此构建出LRFMC模型。
采用聚类的方法对客户进行细分,并分析每个客户群的特征,识别其客户价值。
总体流程:
5.1数据抽取
以2014-03-31为结束时间,选取宽度为两年的时间段作为分析观测窗口,抽取观测窗口内有乘机记录的所有客户的详细数据形成历史数据。对于后续新增的客户详细信息,利用其数据中最大的某个时间点作为结束时间,采用上述同样的方法进行抽取,形成增量数据。
根据末次飞行日期,从航空公司系统内抽取2012-04-01至2014-03-31内所有乘客的详细数据
5.2探索分析
#-*- coding: utf-8 -*- #对数据进行基本的探索 #返回缺失值个数以及最大最小值 import pandas as pd datafile= '../data/air_data.csv' #航空原始数据,第一行为属性标签 resultfile = '../tmp/explore.xls' #数据探索结果表 data = pd.read_csv(datafile, encoding = 'utf-8') #读取原始数据,指定UTF-8编码(需要用文本编辑器将数据装换为UTF-8编码) explore = data.describe(percentiles = [], include = 'all').T #包括对数据的基本描述,percentiles参数是指定计算多少的分位数表(如1/4分位数、中位数等);T是转置,转置后更方便查阅 explore['null'] = len(data)-explore['count'] #describe()函数自动计算非空值数,需要手动计算空值数 explore = explore[['null', 'max', 'min']] explore.columns = [u'空值数', u'最大值', u'最小值'] #表头重命名 '''这里只选取部分探索结果。 describe()函数自动计算的字段有count(非空值数)、unique(唯一值数)、top(频数最高者)、freq(最高频数)、mean(平均值)、std(方差)、min(最小值)、50%(中位数)、max(最大值)''' explore.to_excel(resultfile) #导出结果
- 原始数据中存在票价为空值,票价为空值的数据可能是客户不存在乘机记录造成。
- 票价最小值为0、折扣率最小值为0、总飞行公里数大于0的数据。其可能是客户乘坐0折机票或者积分兑换造成。
5.3数据预处理
5.3.1数据清洗
(1)丢弃票价为空的数据。
(2)丢弃票价为0、平均折扣率不为0、总飞行公里数大于0的数据。#-*- coding: utf-8 -*- #数据清洗,过滤掉不符合规则的数据 import pandas as pd datafile= '../data/air_data.csv' #航空原始数据,第一行为属性标签 cleanedfile = '../tmp/data_cleaned.csv' #数据清洗后保存的文件 data = pd.read_csv(datafile,encoding='utf-8') #读取原始数据,指定UTF-8编码(需要用文本编辑器将数据装换为UTF-8编码) 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] #该规则是“或” data.to_excel(cleanedfile) #导出结果
5.3.2属性规约
原始数据中属性太多,根据LRFMC模型,选择与其相关的六个属性,删除不相关、弱相关或冗余的属性。
5.3.3数据变换
(1)属性构造
因原始数据中并没有直接给出LRFMC五个指标,需要构造这五个指标。L = LOAD_TIME - FFP_DATE
会员入会时间距观测窗口结束的月数 = 观测窗口的结束时间 - 入会时间[单位:月R = LAST_TO_END
客户最近一次乘坐公司飞机距观测窗口结束的月数 = 最后一次乘机时间至观察窗口末端时长[单位:月]F = FLIGHT_COUNT
客户在观测窗口内乘坐公司飞机的次数 = 观测窗口的飞行次数[单位:次]M = SEG_KM_SUM
客户在观测时间内在公司累计的飞行里程 = 观测窗口总飞行公里数[单位:公里]C = AVG_DISCOUNT
客户在观测时间内乘坐舱位所对应的折扣系数的平均值 = 平均折扣率[单位:无]
(2)数据标准化#-*- coding: utf-8 -*- #标准差标准化 import pandas as pd datafile = '../data/zscoredata.xls' #需要进行标准化的数据文件; zscoredfile = '../tmp/zscoreddata.xls' #标准差化后的数据存储路径文件; #标准化处理 #或者可以直接使用zscore()实现 data = pd.read_excel(datafile) data = (data - data.mean(axis = 0))/(data.std(axis = 0)) #简洁的语句实现了标准化变换,类似地可以实现任何想要的变换。 data.columns=['Z'+i for i in data.columns] #表头重命名。 data.to_excel(zscoredfile, index = False) #数据写入
5.4模型构建
5.4.1客户K-Means聚类
采用K-Means聚类算法对客户数据进行分群,将其聚成五类(需要结合业务的理解与分析来确定客户的类别数量)。
#-*- coding: utf-8 -*- #K-Means聚类算法 import pandas as pd import numpy as np from pandas.core.frame import DataFrame from sklearn.cluster import KMeans #导入K均值聚类算法 inputfile = '../tmp/zscoreddata.xls' #待聚类的数据文件 k = 5 #需要进行的聚类类别数 #读取数据并进行聚类分析 data = pd.read_excel(inputfile) #读取数据 #调用k-means算法,进行聚类分析 kmodel = KMeans(n_clusters = k, n_jobs = 4) #n_jobs是并行数,一般等于CPU数较好 kmodel.fit(data) #训练模型 # kmodel.cluster_centers_ #查看聚类中心 labels=kmodel.labels_ #查看各样本对应的类别 label=DataFrame(labels) # print(label.value_counts()) # print(kmodel.cluster_centers_ ) result=DataFrame(kmodel.cluster_centers_) result.columns={'ZL','ZR','ZF','ZM','ZC'} result.to_excel("C://Python//DataAndCode//chapter7//demo//data//result.xls",index=False)
聚类结果:
聚类后的数据集:
绘制雷达图:# -*- coding: utf-8 -*- """ Created on Sun Dec 5 17:16:39 2021 @author: 守住1.份坚持 """ import numpy as np import pandas as pd import matplotlib.pyplot as plt # 用于正常显示中文 plt.rcParams['font.sans-serif'] = 'SimHei' #用于正常显示符号 plt.rcParams['axes.unicode_minus'] = False # 使用ggplot的绘图风格,这个类似于美化了,可以通过plt.style.available查看可选值,你会发现其它的风格真的丑。。。 plt.style.use('ggplot') data=pd.read_excel("C://Python//DataAndCode//chapter7//demo//data//result.xls") feature=['ZL','ZR','ZF','ZM','ZC'] values1=data.loc[:,['ZL']] values2=data.loc[:,['ZR']] values3=data.loc[:,['ZF']] values4=data.loc[:,['ZM']] values5=data.loc[:,['ZC']] # 设置每个数据点的显示位置,在雷达图上用角度表示 angles=np.linspace(0, 2*np.pi,len(feature), endpoint=False) angles=np.concatenate((angles,[angles[0]])) # 绘图 fig=plt.figure() for values in [values1, values2,values3,values4,values5]: # 拼接数据首尾,使图形中线条封闭 values=np.concatenate((values,[values[0]])) # 设置为极坐标格式 ax = fig.add_subplot(111, polar=True) # 绘制折线图 ax.plot(angles, values, 'o-', linewidth=2) # 填充颜色 ax.fill(angles, values, alpha=0.25) # 设置图标上的角度划分刻度,为每个数据点处添加标签 ax.set_thetagrids(angles * 180/np.pi, feature) # 设置雷达图的范围 ax.set_ylim(0,5) # 添加标题 plt.title('客户群特征分析图') # 添加网格线 ax.grid(True) plt.show()
5.4.2客户价值分析
对聚类结果进行特征分析,其中客户群1在F、M属性最大,在R属性最小;客户群2在L属性上最大;客户群3在R属性上最大,在F、M属性最小;客户群4在L、C属性上最小;客户群5在C属性上最大。
根据业务定义五个等级的客户类别:重要保持客户、重要发展客户、重要挽留客户、一般客户、低价值客户。
5.4.3扩展思考
在国内航空市场竞争日益激烈的背景下,客户流失问题是影响公司利益的重要因素之一。如何如何改善流失问题,继而提高客户满意度、忠诚度,维护自身的市场和利益?
客户流失分析可以针对目前老客户进行分类预测。针对航空公司客户信息数据附件(见:/示例程序/air_data.csv)可以进行老客户以及客户类型的定义(例如:将其中将飞行次数大于6次的客户定义为老客户,已流失客户定义为:第二年飞行次数与第一年飞行次数比例小于50%的客户等)。
选取客户信息中的关键属性如:会员卡级别,客户类型(流失、准流失、未流失),平均折扣率,积分兑换次数,非乘机积分总和,单位里程票价,单位里程积分等。通过这些信息构建客户的流失模型,运用模型预测未来客户的类别归属(未流失、准流失,或已流失)。
-
python数据分析之航空公司客户价值分析
2021-07-13 20:23:49本篇文章是根据航空公司提供的乘客个人信息,通过建立合理的客户价值评估模型,对客户进行分群,比较分析不同客户群的特点和价值,来指定相应的营销策略,从而减少客户流失,挖掘出潜在客户,实现盈利。在这里是用K-...一.引言
本篇文章是根据航空公司提供的乘客个人信息,通过建立合理的客户价值评估模型,对客户进行分群,比较分析不同客户群的特点和价值,来指定相应的营销策略,从而减少客户流失,挖掘出潜在客户,实现盈利。在这里是用K-
means聚类方法来对乘客进行分群的。源数据部分如下图所示:
各属性解释如下:
二.数据探索
通过调用describe()函数对数据进行一个大致的了解,主要是查看缺失值和异常值。通过观察发现,存在票价为零,折扣率为0,总飞行数为0的情况。通过简单处理,我输出了一个包含个属性空值个数,最大值,最小值数据的表格。部分如下:
对应代码:
import pandas as pd datafile='D:/航空公司客户价值分析/data/air_data2.csv' resultfile='D:/航空公司客户价值分析/explore.xls' data=pd.read_csv(datafile) explore=data.describe().T#对数据的统计性描述,T是我进行了转置 explore['null']=len(data)-explore['count'] df=explore[['max','min','null']] df.to_excel(resultfile) [/code] 三.数据预处理 1.数据清洗 通过上一步的数据探索分析发现数据中存在缺失值,而这一部分的比例相对较小,故直接删掉。具体处理如下: * 丢弃票价为空的记录 * 丢弃票价为0,平均折扣率不为0且总飞行公里数大于零的记录。 2.属性规约与数据变换 原始数据中的属性太多。而评估航空公司客户价值通常根据LRFMC模型,与其相关的只有6个属性即,FFP_DATE、LOAD_TIME、FLIGHT_COUNT、AVG_DISCOUNT、SEG_KM_SUM、LAST_TO_END。 简单介绍下LRFMC模型,即客户关系长度L、消费时间间隔R、消费频率F、飞行里程M和折扣系数的平均值C。这五个指标为评价客户价值的重要因素,而上面6个属性与这5个指标的关系如下: * L=LOAD_TIME-FFP_DATE 会员入会时间距观测窗口结束的月数=观测窗口结束的时间-入会时间 * R=LAST_TO_END 客户最近一次乘坐公司飞机距观测窗口结束的月数=最后一次乘机时间至观察窗口末端时长[单位:月] * F=FLIGHT_COUNT 客户在观测窗口内乘坐公司飞机的次数=观测窗口的飞行次数[单位:次] * M=SEG_KM_SUM 客户在观测时间内在公司累计的飞行里程=观测窗口的总飞行公里数[单位:公里] * C=AVG_DISCOUNT 客户在观测时间内乘坐舱位所对应的折扣系数的平均值=平均折扣率 提取了相关的数据后,发现这5个指标的取值范围相差较大所以需对数据进行标准化处理。 代码如下: ```code import pandas as pd import datetime #数据清洗 #删除空值,异常值 datafile='D:/航空公司客户价值分析/data/air_data2.csv' resultfile='D:/航空公司客户价值分析/data_cleaned.csv' data=pd.read_csv(datafile) 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] data.to_csv(resultfile,encoding = 'utf_8_sig')#输出为utf8格式,不然excel打开中文会乱码 #属性规约与数据变换 #根据航空公司的LRFMC价值指标,删除掉无关属性 d1,d2=[],[] for x in data['LOAD_TIME']: d1.append(datetime.datetime.strptime(x,'%Y/%m/%d')) for y in data['FFP_DATE']: d2.append(datetime.datetime.strptime(y,'%Y/%m/%d')) d3=[d1[i]-d2[i] for i in range(len(d1))] data['L']=[round((x.days/30),2) for x in d3] data2=data[['L','LAST_TO_END','FLIGHT_COUNT','SEG_KM_SUM','avg_discount']] data2.columns=['L','R','F','M','C'] data2.to_csv('D:/航空公司客户价值分析/zscoredata.csv',encoding = 'utf_8_sig',index=False) [/code] 输出为:  将以上数据进行零—均值标准化: ```code import pandas as pd datafile='D:/航空公司客户价值分析/zscoredata.csv' resultfile='D:/航空公司客户价值分析/standard_data.csv' data=pd.read_csv(datafile) data=(data-data.mean(axis=0))/(data.std(axis=0)) data.columns=['Z'+i for i in data.columns] data.to_csv(resultfile,encoding = 'utf_8_sig',index=False) [/code] 此时输出为:  四.模型构建 客户价值分析模型由两个部分构成。第一个部分是根据航空公司客户5个指标,对客户进行聚类分群,第二部分是对分群后的客户群进行特征分析,并对客户群的客户价值进行排名。 1.K-Means聚类算法对客户数据进行分群,k=5,即把客户分成5类。k-means位于scikit-Learn库中,需要先安装这个库。 ```code import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn.externals import joblib from sklearn.cluster import KMeans if __name__=='__main__':#防止模块范围内的代码在子进程中被重新执行,因为Windows中没有fork()函数 datafile='D:/航空公司客户价值分析/standard_data.csv' resultfile='D:/航空公司客户价值分析/kmeans.csv' k=5 data=pd.read_csv(datafile) #调用K-Means方法进行聚类分析 kmodel=KMeans(n_clusters=k,n_jobs=4)#n_jobs是并行数,一般赋值为电脑的CPU数。 # #save model # joblib.dump(kmodel,'kmeans.model',compress=3) # #load model to model # model=joblib.load('kmeans.model') kmodel.fit(data) r1=pd.Series(kmodel.labels_).value_counts() r2=pd.DataFrame(kmodel.cluster_centers_) r3=pd.Series(['客户群1','客户群2','客户群3','客户群4','客户群5',]) r=pd.concat([r3,r1,r2],axis=1) r.columns=['聚类类别','聚类个数']+list(data.columns) r.to_csv(resultfile,encoding = 'utf_8_sig',index=False) [/code] 输出聚类分析结果:  上图可以看到各个类群的客户个数,及聚类中心。 2.客户价值分析 针对上面的聚类结果,对客户进行特征分析,绘制雷达图。 ```code #绘制雷达图 labels = np.array(list(data.columns))#标签 dataLenth = 5#数据个数 r4=r2.T r4.columns=list(data.columns) fig = plt.figure() y=[] for x in list(data.columns): dt= r4[x] dt=np.concatenate((dt,[dt[0]])) y.append(dt) ax = fig.add_subplot(111, polar=True) angles = np.linspace(0, 2*np.pi, dataLenth, endpoint=False) angles = np.concatenate((angles, [angles[0]])) ax.plot(angles, y[0], 'b-', linewidth=2) ax.plot(angles, y[1], 'r-', linewidth=2) ax.plot(angles, y[2], 'g-', linewidth=2) ax.plot(angles, y[3], 'y-', linewidth=2) ax.plot(angles, y[4], 'm-', linewidth=2) plt.rcParams['font.sans-serif']=['SimHei'] ax.legend(r3,loc=1) ax.set_thetagrids(angles * 180/np.pi, labels, fontproperties="SimHei") ax.set_title("matplotlib雷达图", va='bottom', fontproperties="SimHei") ax.grid(True) plt.show() [/code]  由上图可以很清晰的看到每个客户群的指标情况,将每个客户群的优势特征,劣势特征总结如下: 优势特征: 客户群1:R 客户群2:F、M、L 客户群3:L 客户群4:C 客户群5:无 劣势特征: 客户群1:F、M 客户群2:R 客户群3:R、F、M、C 客户群4:F、M 客户群5:R、L、C 基于LRFMC模型的具体含义,我们可以对这5个客户群进行价值排名。同时,将这5个客户群重新定义为五个等级的客户类别:重要保持客户,重要挽留客户,重要发展客户,一般客户,低价值客户。 * 重要保持客户:这类客户平均折扣率(C)和入会员时间(L)都很高(入会员时间越长,会员级别越高,折扣越大),最近乘坐过本航班时间间隔(R)低,乘坐的次数(F)或(M)高。说明他们经常乘坐飞机,且有一定经济实力,是航空公司的高价值 客户。对应客户群2。 * 重要发展客户:这类客户平均折扣率高(C),最近乘坐过本航班时间间隔(R)短,但是乘坐的次数(F)和(M)都很低。说明这些乘客刚入会员不久,所以乘坐飞机次数少,是重要发展客户,对应客户群4。 * 重要挽留客户:这类客户入会时间长(L),最近乘坐过本航班时间间隔(R)较长,里程数和乘坐次数都变低,为重要挽留客户。对应客户群3 * 一般与低价值客户:这类客户乘坐时间间隔长(R)或乘坐次数(F)和总里程(M)低,平均折扣也很低。对应客户群5和客户群1. 针对以上不同的价值客户群,航空公司应当及时出台相应的营销策略,针对不同的客户群提供相应的产品和服务,提升客户价值,维持和稳定重要客户,挽留高价值客户的流失。价值排名如下:  因为乘客情况是实时变动的,所以该模型并不稳定,应根据实际情况,定期更新数据,对新增的客户信息进行聚类分析,重新训练模型进行调整。 
-
数据分析与挖掘实战-航空公司客户流失分析
2018-12-20 10:49:38航空公司客户流失分析 -
基于聚类算法的航空客户价值分析的学习总结
2021-07-01 21:12:16一般情况下拿到数据进行分析,首先要对数据进行预处理,根据经典的特征工程选取相应的特征向量,前几步一般都是一样的,然后进行模型训练与数据预测,最后进行决策分析。 首先要导入一些机器学习的包,要好好学习... -
python之航空公司客户价值分析 (二)-附件资源
2021-03-05 15:27:45python之航空公司客户价值分析 (二)-附件资源 -
数据分析案例——航空公司客户价值分析
2020-07-18 17:49:58本项目的目标是客户价值分析,即通过航空公司客户数据识别不同价值的客户,识别客户价值应用最广泛的模型是RFM模型。 R(Recency)指的是最近一次消费时间与截止时间(采集数据)的间隔。 F(Frequency)指顾客在某... -
python实践项目 航空公司客户价值分析
2020-11-22 16:34:44了解航空公司现状与客户价值分析任务描述与分析1.1 前言 信息时代的来临使得企业营销焦点从产品转向了客户,客户关系管理(Customer relationship management ,CRM)成为企业的核心问题。客户关系管理的关键问题是客户... -
关于K-means算法在航空公司客户价值分析
2020-01-02 16:56:09文档,数据,以及代码应有尽有!解压即可使用,code直接丢到spyder里面,如果不想改路径就想使用,直接解压到桌面上面运行。文档和代码以及数据均是网络上的综合之后,根据本人经验进行修改。 -
数据分析实践:航空公司客户价值分析
2020-07-06 16:08:26本次利用获取到的航空公司客户数据,结合RFM模型,采用K-Means聚类算法,分类出不同具有客户价值分群,以此学习kmeans算法的实际运用。 实现目标 (1)对原始数据集进行分析,提取我们需要使用的数据 (2)对抽取的... -
数据挖掘实战—航空公司客户价值分析
2021-04-05 16:18:13文章目录引言一、数据探索分析(EDA)1.数据质量分析1.1 缺失值分析1.2 异常值分析1.3 重复数据分析2.数据特征分析2.1 描述性统计分析2.2 分布分析2.2.1 客户基本信息分布...本文将使用航空公司客户数据,结合RFM模型,