-
2020-01-11 16:19:40
利用Python分析航空公司客户价值
一、背景介绍
随着社会生活中数据量的急剧增多,如何从这些海量的数据中提取与发掘出对我们决策有用的信息成为当前亟待解决的题,因此,数据分析与挖掘技术在这些年得到了广泛的发展,也受到了足够的重视。面对不同领域的数据,不同的任务目标,我们在进行数据分析时也会选择不同的模型来进行建模,从而发现数据中的特征,提取其中的价值。常见的数据挖掘模型有:分类与预测、聚类分析、关联规则、时序模式、离群点检测等。这些模型,在我们的生活中已经有了广泛的应用。例如航空公司的客户价值分析,就是对用户数据进行聚类分析,发掘出不同价值群的用户,然后有针对性的制定相应的营销手段,实现精准化运营,以期获取最大的用户转化率。(更多内容,可参阅程序员在旅途)
本篇博文的实例来源于《Python数据分析与挖掘实践》(第二版)中的第七章。实现的主要目标是:
1,借助航空公司客户数据,对客户进行分类。
2,对不同客户类别进行特征分析,比较不同类别的客户价值。
3,针对不同价值的客户类别制定相应的营销策略,为其提供个性化服务。二、分析步骤与流程
此案例的总体流程图如下所示。简单来说就是:因为最开始只是要构建模型,所以不需要使用航空公司的全部客户数据,只需要先从业务系统中抽取某一时段的客户数据作为训练即可,然后对数据从宏观上进行分析,之后对数据进行处理,使之能够达到建模的要求,最后选择合适的聚类算法建模并且对结果进行反馈。
2.1. 建模数据的获取:
这个可以从公司的业务系统选择性抽取,例如抽取最近两年的数据。数据的属性说明如下图所示:
2.2. 数据的宏观性探索分析:
2.2.1 描述性统计分析 - 查看属性字段的缺失值、平均值、最大值、最小值等情况,从宏观层面上了解数据。
import pandas as pd datafile = r'C:\Users\itour\Desktop\air_customer_data.csv' data = pd.read_csv(datafile, encoding='utf-8') explore = data.describe(percentiles=[], include='all').T # 使用统计函数对数据进行统计分析 explore['null'] = len(data) - explore['count'] # 计算空值数 # describe有很多统计子项,这里就取我们要用到的即可 explore = explore[['null', 'mean', 'max', 'min']] explore.columns = ['空值记录数', '最大值', '最小值', '平均值'] print(explore)
通过上图可以看出有一些记录含有空值,这样的数据对建模可能会有影响,因此,在后面的数据预处理环节,要把这些空值删掉。
2.2.2 数据的分布分析 - 寻找客户信息的分布规律,例如入会时间分布、年龄分布、性别分布、会员等级分布等等。
1)入会时间分布图展示
import pandas as pd from datetime import datetime import matplotlib.pyplot as plt datafile = r'C:\Users\itour\Desktop\air_customer_data.csv' data = pd.read_csv(datafile, encoding='utf-8') ffp = data['FFP_DATE'].apply(lambda x: datetime.strptime(x, '%Y/%m/%d')) ffp_year = ffp.map(lambda x: x.year) plt.rcParams['font.sans-serif'] = 'SimHei' plt.rcParams['axes.unicode_minus'] = False # 绘制各年份会员入会人数直方图 plt.hist(ffp_year, bins='auto', color='green') plt.xlabel('年份') plt.ylabel('入会人数') plt.title('各年份会员入会人数') plt.show()
2)会员性别比例分布图
import matplotlib.pyplot as plt datafile = r'C:\Users\itour\Desktop\air_customer_data.csv' data = pd.read_csv(datafile, encoding='utf-8') # 获取会员中不同的性别人数 male = pd.value_counts(data['GENDER'])['男'] female = pd.value_counts(data['GENDER'])['女'] # 绘制会员分布饼状图 plt.rcParams['font.sans-serif'] = 'SimHei' plt.rcParams['axes.unicode_minus'] = False plt.pie([male, female], labels=['男', '女'], colors=['lightskyblue', 'green'], autopct='%1.1f%%') plt.title('会员性别比例') plt.show()
3)会员年龄分布箱型图
import pandas as pd from datetime import datetime import matplotlib.pyplot as plt datafile = r'C:\Users\itour\Desktop\air_customer_data.csv' data = pd.read_csv(datafile, encoding='utf-8') # 提取会员的年龄 age = data['AGE'].dropna() age = age.astype('int64') # 绘制会员年龄分布箱型图 plt.rcParams['font.sans-serif'] = 'SimHei' plt.rcParams['axes.unicode_minus'] = False plt.boxplot(age, patch_artist=True, labels=['会员年龄'], boxprops={'facecolor': 'lightblue'}) plt.title('会员年龄分布箱型图') plt.grid(axis='y') plt.show()
2.2.3 数据属性之间的相关性分析 - 这对特征的选择来说非常有用,通过分析属性之间的关联性,可以确定选择哪些属性作为特征值,哪些则是可以忽略的。
import pandas as pd from datetime import datetime datafile = r'C:\Users\itour\Desktop\air_customer_data.csv' data = pd.read_csv(datafile, encoding='utf-8') data_corr = data[['FFP_TIER', 'FLIGHT_COUNT', 'LAST_TO_END', 'SEG_KM_SUM', 'EXCHANGE_COUNT', 'Points_Sum']] age_1 = data['AGE'].fillna(0) data_corr['AGE'] = age_1.astype('int64') ffp = data['FFP_DATE'].apply(lambda x: datetime.strptime(x, '%Y/%m/%d')) ffp_year = ffp.map(lambda x: x.year) data_corr['ffp_year'] = ffp_year # 计算相关性矩阵 dt_corr = data_corr.corr(method='pearson') print(dt_corr)
从上面的图可以看出,有些属性的相关性较强,有些则较弱。例如 ffp_year与FFP_TIER的相关性就弱,已经是负相关了。而FLIGHT与FFP_TIER的相关性就稍微强一些。属性之间的相关性关系,也是在做特征降维的一个重要参考量,有时候特征较多会严重增加建模的时间,为了提高效率,需要对特征进行降维,构建有代表性的特征进行建模。
2.3. 数据预处理:
通过前面的宏观分析我们也看到,有一些记录是空值,还有一些值出现了明显的错误,而且,在我们后面要构建的LRFMC模型中,这三个特征并不能直接从属性中抽取,而是要根据规则重新计算得到,因此,需要对这些从业务系统中抽取的数据做预处理,使之能够适合建模的需要。数据预处理主要包括数据清洗、属性规约、数据变换等步骤。
2.3.1 数据清洗 - 删除异常值
import pandas as pd from datetime import datetime datafile = r'C:\Users\itour\Desktop\air_customer_data.csv' clean_datafile = r'C:\Users\itour\Desktop\air_customer_data_clean.csv' data = pd.read_csv(datafile, encoding='utf-8') print('原始数据的数据大小:', data.shape) # 去除票价为空的票价 airline_notnull = data.loc[data['SUM_YR_1'].notnull() & data['SUM_YR_2'].notnull(), :] print(airline_notnull.shape) # 只保留票价非0的,或者平均折扣率不为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) index4 = airline_notnull['AGE'] > 0 clean_data = airline_notnull[(index1 | index2) & index3 & ~index4] print(clean_data.shape) # 保存清洗后的文件 clean_data.to_csv(clean_datafile)
2.3.2 属性规约 - 选取参与建模的属性
属性规约的目的就是从众多的属性中选取需要参与建模的、能够反应数据整体特征的属性,删除不相关、弱相关、或者冗余的属性 ,从而提高建模效率。在属性特征选择过程中,可以根据上面步骤的相关性分析,大致了解属性的相关性,然后推导出参与建模的属性。在客户价值识别方面,应用最广泛的模型就是RFM模型,其中,R(Recency)代表指的是最近一次消费时间与截止时间的间隔,F(Frequency)指客户某段时间内所消费的次数,M(Monetary)指客户在某段时间内所消费的金额。在RFM模型中,(R,F,M)是计算客户价值的最重要的特征。在航空公司客户价值领域,常用的是LRFMC模型,需要在上述模型的基础上再加两个特征,LRFMC模型的属性意义如下图:
根据LRFMC模型,需要选择的属性有:FFP_DATE,LOAD_TIME,FLIGHT_COUNT,AVG_DISCOUNT,SEG_KM_SUM,LAST_TO_END。从数据集中选取需要的属性,代码如下:
import pandas as pd from datetime import datetime clean_datafile = r'C:\Users\itour\Desktop\air_customer_data_clean.csv' guiyue_datafile = r'C:\Users\itour\Desktop\air_customer_data_guiyue.csv' clean_data = pd.read_csv(clean_datafile, encoding='utf-8') # 选取需要的属性 air_selection = clean_data[['FFP_DATE', 'LOAD_TIME', 'LAST_TO_END', 'FLIGHT_COUNT', 'SEG_KM_SUM', 'avg_discount']] print(air_selection.head()) # 保存规约后的数据 air_selection.to_csv(guiyue_datafile)
2.3.2 数据变换 - 构建建模特征值,进行数据标准化
在LRFMC模型中,这其中的特征值需要经过规约后的属性通过变换得到,得到这些特征值之后,往往还需要对数据集进行标准化处理,为什么要进行标准化呢?因为不同属性的值通常具有不同的计量单位和数量级。当各指标间的水平相差很大时,如果直接用原始指标值进行分析,就会突出数值较高的指标在综合分析中的作用,相对削弱数值水平较低指标的作用。因此,为了保证结果的可靠性,需要对原始指标数据进行标准化处理。做法通常有:将数据按比例缩放,使之落入一个小的特定区间。去除数据的单位限制,将其转化为无单位限制的纯数值,便于不同单位或量级的指标能够进行比较和加权处理。
数据变换代码如下:
import pandas as pd import numpy as np from sklearn.preprocessing import StandardScaler guiyue_datafile = r'C:\Users\itour\Desktop\air_customer_data_guiyue.csv' stand_datafile = r'C:\Users\itour\Desktop\air_customer_data_std.npz' guiyue_data = pd.read_csv(guiyue_datafile, encoding='utf-8') # 特征构造,并将时间类型转化为int类型 L = pd.to_datetime(guiyue_data['LOAD_TIME']) - pd.to_datetime(guiyue_data['FFP_DATE']) L = (L.astype('str').str.split().str[0]).astype('int') / 30 air_feature = pd.concat([L, guiyue_data.iloc[:, 3:]], axis=1) print('构建的 LRFMC 模型属性的前5个数据为:\n', air_feature.head()) # 数据标准化 std_data = StandardScaler().fit_transform(air_feature) np.savez(stand_datafile, std_data) print('标准化后 LRFMC 的 前5个属性数据为:\n', std_data[:5, :])
2.4. 模型构建:
客户的价值模型构建主要有两个部分组成:第一部分,根据之前归纳出的5个特征,对客户进行聚类分群;第二部分,对每个群的客户进行特征分析,探索其中的客户价值规律,并对各个客户群进行排名。
2.4.1 聚类分群
import pandas as pd import numpy as np from sklearn.cluster import KMeans guiyue_datafile = r'C:\Users\itour\Desktop\air_customer_data_guiyue.csv' stand_datafile = r'C:\Users\itour\Desktop\air_customer_data_std.npz' # 读取标准化之后的数据 std_data = np.load(stand_datafile)['arr_0'] k = 5 # 确定聚类中心数,这里选择5,也就是分为5个群。这个值的确定,是有一定的要求的,这里不做描述 # 模型训练 kmeans_model = KMeans(n_clusters=k, n_jobs=4, random_state=123) fit_kmeans = kmeans_model.fit(std_data) # 查看聚类结果 kmeans_cc = kmeans_model.cluster_centers_ # 聚类中心 print('各聚类中心为: \n', kmeans_cc) kmeans_label = kmeans_model.labels_ # 样本的类别标签 r = pd.Series(kmeans_label).value_counts() # 统计不同类别样本的数目 print('每个类别的数目为:\n', r) # 输出聚类分群的结果 cluster_center = pd.DataFrame(kmeans_cc, columns=['ZL', 'ZR', 'ZF', 'ZM', 'ZC']) cluster_center['聚类个数'] = r cluster_center.index = pd.DataFrame(kmeans_label).drop_duplicates().iloc[:, 0] print('聚类结果如下表所示:\n', cluster_center)
2.4.2 客户价值分析
针对聚类的结果进行特征分析,绘制客户分群雷达图,如下所示:
import pandas as pd import numpy as np from sklearn.cluster import KMeans import matplotlib.pyplot as plt guiyue_datafile = r'C:\Users\itour\Desktop\air_customer_data_guiyue.csv' stand_datafile = r'C:\Users\itour\Desktop\air_customer_data_std.npz' # 读取标准化之后的数据 std_data = np.load(stand_datafile)['arr_0'] k = 5 # 确定聚类中心数,这里选择5,也就是分为5个群。这个值的确定,是有一定的要求的,这里不做描述 # 模型训练 kmeans_model = KMeans(n_clusters=k, n_jobs=4, random_state=123) fit_kmeans = kmeans_model.fit(std_data) # 查看聚类结果 kmeans_cc = kmeans_model.cluster_centers_ # 聚类中心 kmeans_label = kmeans_model.labels_ # 样本的类别标签 # 输出聚类分群的结果 labels = ['ZL', 'ZR', 'ZF', 'ZM', 'ZC'] cluster_center = pd.DataFrame(kmeans_cc, columns=labels) legen = ['客户群' + str(i + 1) for i in cluster_center.index] # 客户群命名 lstype = ['-', '--', (0, (3, 5, 1, 5, 1, 5)), ':', '-.'] kinds = list(cluster_center.iloc[:, 0]) cluster_center = pd.concat([cluster_center, cluster_center[['ZL']]], 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]])) # 绘制雷达图 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=2, label=kinds[i]) # 添加属性标签 ax.set_thetagrids(angle * 180 / np.pi, labels) plt.title('客户特征分析雷达图') plt.legend(legen) plt.show()
通过分析各个客户群的雷达图,可以看到不同类的客户偏好还是有一些差别的,我们可以根据这些差别制定符合客户群的营销手段和策略。
三、总结
这篇博文的示例以航空公司客户价值分析为基础,介绍了原始数据的宏观性分析、数据预处理、数据建模的一整套流程,涉及了数据分析的主要过程。因此,还是非常有借鉴意义的。通过这个案例,可以很好的够掌握建模过程中的基本方法,以及Python这种语言的基本用法。
更多相关内容 -
Python:航空公司客户价值分析实战
2018-08-17 13:27:26⑴借助航空公司的客户数据,对客户进行分类;⑵对不同类的客户类别进行特征分析,比较不同类客户的客户价值;⑶从营销角度讲,客户价值分析实际上是一个市场细分问题,解决市场细分问题比较常用的方法是聚类分析;⑷... -
航空公司客户价值大数据分析源代码含数据python版
2019-04-05 17:30:01航空公司客户价值大数据分析全部的源代码,使用python编写,含数据部分 -
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
-
【机器学习项目实战】Python实现聚类(Kmeans)分析客户分组
2021-08-20 17:45:35【机器学习项目实战】Python实现聚类(Kmeans)分析客户分组 资料说明:包括数据集+源代码+Word文档说明。 资料内容包括: 1)问题定义; 2)数据收集; 3)数预处理; 4)探索性数据分析; 5)聚类模型; 6)聚类可视化... -
python实践项目 航空公司客户价值分析
2020-11-22 16:34:44了解航空公司现状与客户价值分析任务描述与分析1.1 前言 信息时代的来临使得企业营销焦点从产品转向了客户,客户关系管理(Customer relationship management ,CRM)成为企业的核心问题。客户关系管理的关键问题是客户...[让我看看]目录
前言
信息时代的来临使得企业营销焦点从产品转向了客户,客户关系管理(Customer relationship management ,CRM)成为企业的核心问题。客户关系管理的关键问题是客户分群。通过客户分群,区分无价值客户和高价值客户。企业针对不同价值的客户定制优化的个性化服务方案,采取不同营销策略,将有限营销资源集中于高价值客户,实现企业例利润最大化目标。准确的客户分群结果是企业优化营销资源分配的重要依据,客户分群越来越成为客户关系管理中亟待解决的关键问题之一。下面将使用航空公司客户数据,结合RFM模型,采用K-Means聚类算法,对客户进行分群,比较不同类别客户的客户价值,从而指定相应的营销策略。
学习目标
(1) 熟悉航空客户价值分析的步骤和流程
(2) 了解RFM模型的基本原理
(3) 掌握K-Means 算法的基本原理与使用方法.
(4) 比较不同类别客户的客户价值,制定相应的营销策略+1.了解航空公司现状与客户价值分析
任务描述与分析
任务描述
面对激烈的市场竞争,各个航空公司都推出了更多的优惠来吸引客户。国内某航空公司面临着常旅客流失,竞争力下降和资源未充分利用等经营危机。通过建立合理的客户价值评估模型,对客户进行分群,分析及比较不同客户群的客户价值,并制定相应的营销策略,对不同的客户群提供个性化服务。
任务分析
(1)了解航空公司现状
(2)认识客户价值分析
(3) 熟悉航空公司客户价值分析的步骤与流程1.1 了解航空公司现状
行业内竞争
民航的竞争除了三大航空公司之间的竞争之外,还将加入新崛起的各类小型航空公司、民营航空公司,甚至国外航空巨头。航空产品生产过剩,产品同质化特征愈加明显,于是航空公司从价格、服务间的竞争逐渐转向对客户的竞争。
行业外竞争
随着高铁、动车等铁路运输的兴建,航空公司受到巨大冲击。
1.1.1航空公司数据特征说明
目前航空公司已积累了大量的会员档案信息和其乘坐航班记录。
以2014-03-31为结束时间,选取宽度为两年的时间段作为分析观测窗口,抽取观测窗口内有乘机记录的所有客户的详细数据形成历史数据,44个特征,总共62988条记录。数据特征及其说明如右表所示。
项目目标
结合目前航空公司的数据情况,可以实现以下目标。
借助航空公司客户数据,对客户进行分类。
对不同的客户类别进行特征分析,比较不同类别客户的客户价值。
对不同价值的客户类别提供个性化服务,制定相应的营销策略。1.2了解客户价值分析
客户营销战略倡导者Jay & Adam Curry从国外数百家公司进行了客户营销实施的经验中提炼了如下经验。
(1)公司收入的80%来自顶端的20%的客户。
(2)20%的客户其利润率100%。
(3)90%以上的收入来自现有客户。
(4)大部分的营销预算经常被用在非现有客户上。
(5)5%至30%的客户在客户金字塔中具有升级潜力。
(6)客户金字塔中客户升级2%,意味着销售收入增加10%,利润增加50%。
这些经验也许并不完全准确,但是它揭示了新时代客户分化的趋势,也说明了对客户价值分析的迫切性和必要性。1.3 熟悉航空客户价值分析的步骤与流程
航空客户价值分析项目的总体流程如图7-1所示.主要包括以下4个步骤
(1)抽取航空公司2012年4月1日至2014年3月31日的数据
(2)对抽取的数据进行数据清洗,特征构建和标准化等操作
(3)基于RFM模型,使用K-means算法进行客户分群
(4)针对模型结果得到不同价值的客户,采用不同的营销手段,提供定制化的服务
2.预处理航空客户数据
任务描述与分析
任务描述
航空公司客户原始数据存在少量的缺失值和异常值,需要清洗后才能用于分析。同时由于原始数据的特征过多,不便直接用于客户价值分析,因此需要对特征进行刷选,挑选出衡量客户价值的关键特征任务分析
(1)处理数据缺失值与异常值
(2)结合RFM模型刷选特征
(3)标准化刷选后的数据2.1处理数据缺失值与异常值
通过对数据观察发现原始数据中存在票价为空值,票价最小值为0,折扣率最小值为0,总飞行公里数大于0的记录。票价为空值的数据可能是客户不存在乘机记录造成。
处理方法:丢弃票价为空的记录。
其他的数据可能是客户乘坐0折机票或者积分兑换造成。由于原始数据量大,这类数据所占比例较小,对于问题影响不大,因此对其进行丢弃处理。
处理方法:保留票价非0,或者平均折扣率不为0且总飞行公里数大于0的记录。2.2构建航空客户价值分析关键特征
1. RFM模型介绍
本项目的目标是客户价值分析,即通过航空公司客户数据识别不同价值的客户,识别客户价值应用最广泛的模型是RFM模型。
R(Recency)指的是最近一次消费时间与截止时间的间隔。通常情况下,最近一次消费时间与截止时间的间隔越短,对即时提供的商品或是服务也最有可能感兴趣。
F(Frequency)指顾客在某段时间内所消费的次数。可以说消费频率越高的顾客,也是满意度越高的顾客,其忠诚度也就越高,顾客价值也就越大。
M(Monetary)指顾客在某段时间内所消费的金额。消费金额越大的顾客,他们的消费能力自然也就越大,这就是所谓“20%的顾客贡献了80%的销售额”的二八法则。2. RFM模型结果解读
RFM模型包括三个特征,使用三维坐标系进行展示,如图所示。X轴表示Recency,Y轴表示Frequency,Z轴表示Monetary,每个轴一般会分成5级表示程度,1为最小,5为最大。
3. 传统RFM模型在航空行业的缺陷在RFM模型中,消费金额表示在一段时间内,客户购买该企业产品金额的总和,由于航空票价受到运输距离,舱位等级等多种因素影响,同样消费金额的不同旅客对航空公司的价值是不同的,因此这个特征并不适合用于航空公司的客户价值分析。
4. 航空客户价值分析的LRFMC模型本项目选择客户在一定时间内累积的飞行里程M和客户在一定时间内乘坐舱位所对应的折扣系数的平均值C两个特征代替消费金额。此外,航空公司会员入会时间的长短在一定程度上能够影响客户价值,所以在模型中增加客户关系长度L,作为区分客户的另一特征。
本项目将客户关系长度L,消费时间间隔R,消费频率F,飞行里程M和折扣系数的平均值C作为航空公司识别客户价值的关键特征(如表 3 2所示),记为LRFMC模型。
2.3 标准化LRFMC五个特征
完成五个特征的构建以后,对每个特征数据分布情况进行分析,其数据的取值范围如表所示。从表中数据可以发现,五个特征的取值范围数据差异较大,为了消除数量级数据带来的影响,需要对数据做标准化处理。
L、R、F、M和C五个特征的数据示例,上图为原始数据,下图为标准差标准化处理后的数据
2.4任务实现
import numpy as np import pandas as pd air_data = pd.read_csv("./air_data.csv",encoding = "gb18030") print('原始数据的形状为:',air_data.shape)
# 丢失的数据的数目及其丢失的比率 total = air_data.isnull().sum().sort_values(ascending=False) percent = (air_data.isnull().sum()/air_data.count()).sort_values(ascending=False) missing_data = pd.concat([total,percent],axis = 1,keys = ['Total','Percent']) missing_data.head(10)
# 去掉票价为空的记录 exp1 = air_data['SUM_YR_1'].notnull() exp2 = air_data['SUM_YR_2'].notnull() exp = exp1 & exp2 air_notnull = air_data.loc[exp,:] print('删除缺失记录后数据的形状: ',air_notnull.shape)
只保留票价非零的 , 或者平均折扣率不为0 且总飞行公里数大于0的记录
# 只保留票价非零的 , 或者平均折扣率不为0 且总飞行公里数大于0的记录 index1 = air_notnull['SUM_YR_1'] != 0 index2 = air_notnull['SUM_YR_2'] != 0 index3 = (air_notnull['SEG_KM_SUM']> 0) & (air_notnull['avg_discount'] != 0) airline = air_notnull[(index1 | index2) & index3] print('删除异常记录后数据的形状为: ', airline.shape)
选取需求特征
# 选取需求特征 airline_selection = airline[['FFP_DATE','LOAD_TIME','FLIGHT_COUNT','LAST_TO_END', 'avg_discount','SEG_KM_SUM']]
#构建L特征
#构建L特征 L = pd.to_datetime(airline_selection['LOAD_TIME']) - pd.to_datetime(airline_selection['FFP_DATE']) # astype()函数可用于转化dateframe某一列的数据类型 L = L.astype('str').str.split().str[0] L = L.astype('int')/30
3 . 标准化LRFMC模型的特征
由于聚类模型并不需要划分数据集为训练集和测试集,标准化可以
使用sklearn的preprocessing模块,也可以使用自定义函数的方法实现#合并特征 #iloc 索引中的特定位置获取行(或列) 这里选取所有行,0,1,2,即第3列后面的 airline_features = pd.concat([L,airline_selection.iloc[:,2:]],axis = 1) print('构建的LRFMC特征前5行为: \n',airline_features.head())
3.使用K-Means算法进行客户分群
任务描述与分析
任务描述
聚类模型的用途非常广泛,从用户画像到客户价值分析,均有其身影。K-Means算法是一种最常用的聚类算法,简单易行且使用于中大型数据量的数据聚类。本任务将使用K-Means算法进行航空公司用户分群,最终得到不同特征的客户群,并分析不同客户群的特征,指定相对应的策略。
任务分析
(1)了解K-Means算法的基本原理
(2) 使用K-Means算法对航空客户进行分群
(3) 根据分群结果制定营销策略3.1 了解K-Means聚类算法
- 基本概念
K-Means聚类算法是一种基于质心的划分方法,输入聚类个数k,以及包含n个数据对象的数据库,输出满足误差平方和最小标准的k个聚类。算法步骤如下。
(1)从n个样本数据中随机选取k个对象作为初始的聚类中心。
(2)分别计算每个样本到各个聚类质心的距离,将样本分配到距离最近的那个聚类中心类别中。
(3)所有样本分配完成后,重新计算k个聚类的中心。
(4)与前一次计算得到的k个聚类中心比较,如果聚类中心发生变化,转(2),否则转(5)。
(5)当质心不发生变化时停止并输出聚类结果。- 数据类型
K-Means聚类算法是在数值类型数据的基础上进行研究,然而数据分析的样本复杂多样,因此要求不仅能够对特征为数值类型的数据进行分析,还要适应数据类型的变化,对不同特征做不同变换,以满足算法的要求。
- kmeans函数及其参数介绍
sklearn的cluster模块提供了KMeans函数构建K-Means聚类模型,其基本语法如下。
sklearn.cluster.KMeans(n_clusters=8, init=‘k-means++’, n_init=10, max_iter=300, tol=0.0001,precompute_distances=‘auto’, verbose=0, random_state=None, copy_x=True, n_jobs=1,algorithm=‘auto’)
常用参数及其说明如表所示。
K-Means模型构建完成后可以通过属性查看不同的信息,如表所示。对数据进行聚类分群的结果如表所示。
针对聚类结果进行特征分析,如图所示。
3.2 分析聚类结果
结合业务分析,通过比较各个特征在群间的大小对某一个群的特征进行评价分析,从而总结出每个群的优势和弱势特征,具体结果如表所示。
基于特征描述,本项目定义五个等级的客户类别:重要保持客户,重要发展客户,重要挽留客户,一般客户,低价值客户。每种客户类别的特征如图所示。
3.3模型应用
根据对各个客户群进行特征分析,采取下面的一些营销手段和策略,为航空公司的价值客户群管理提供参考。
1 会员的升级与保级:航空公司可以在对会员升级或保级进行评价的时间点之前,对那些接近但尚未达到要求的较高消费客户进行适当提醒甚至采取一些促销活动,刺激他们通过消费达到相应标准。这样既可以获得收益,同时也提高了客户的满意度,增加了公司的精英会员。
2 首次兑换:采取的措施是从数据库中提取出接近但尚未达到首次兑换标准的会员,对他们进行提醒或促销,使他们通过消费达到标准。一旦实现了首次兑换,客户在本公司进行再次消费兑换就比在其他公司进行兑换要容易许多,在一定程度上等于提高了转移的成本。
3 交叉销售:通过发行联名卡等与非航空类企业的合作,使客户在其他企业的消费过程中获得本公司的积分,增强与公司的联系,提高他们的忠诚度。
3.4 任务实现
导入包
from sklearn.cluster import KMeans #导入kmeans算法 k = 5 #确认聚类中心数 # airline_scale = np.load('./airline_scale.npz')['arr_0'] # 构建模型 kmeans_model = KMeans(n_clusters = k,n_jobs = 4,random_state=123) fit_kmeans = kmeans_model.fit(data) #模型训练
查看聚类中心
kmeans_model.cluster_centers_
统计不同类别样本的数目pd.Series(kmeans_model.labels_).value_counts()
result = pd.DataFrame(kmeans_model.cluster_centers_) result.columns = ['L','R','F','M','C'] num = pd.DataFrame({'聚类个数':[4242,12114,5337,24618,15733]}) leibie = pd.DataFrame({'聚类类别':['客户群5','客户群3','客户群1','客户群4','客户群2']}) # axis = 0, 表示在水平方向(row)进行连接 axis = 1, # 表示在垂直方向(column)进行连接 kmeans_result = pd.concat([leibie,num,result],axis = 1) kmeans_result
客户聚类结果特征展示画图的代码import matplotlib.pyplot as plt import math import matplotlib.colors as mcolors # 导入中文 import matplotlib.font_manager as font_manager font_dirs = ['./font'] font_files = font_manager.findSystemFonts(fontpaths=font_dirs) font_list = font_manager.createFontList(font_files) font_manager.fontManager.ttflist.extend(font_list) plt.rcParams['font.family'] = 'SimHei' # 启用主题 plt.style.use('ggplot') # 获取极径范围 def get_range(data_list): max = min = 0 for _, data in data_list.items(): for v in data: if v < min: min = v if v > max: max = v return [min, max] # 生成能力分布图 def generate_ability_map(abilities, data_list, rows=3): min, max = get_range(data_list) # 根据能力项等分圆 angles = np.linspace(0, 2 * np.pi, len(abilities), endpoint=False) angles = np.append(angles, angles[0]) # 生成n个子图 fg, axes = plt.subplots(math.ceil(len(data_list) / rows), rows, subplot_kw=dict(polar=True),figsize=(9,9)) # 调整子图间距 plt.subplots_adjust(wspace =0.6, hspace =0.6) # 打散为一维数组 axes = axes.ravel() # 获取所有支持的颜色 colors = list(mcolors.TABLEAU_COLORS) # 循环绘制 i = 0 for name, data in data_list.items(): data = np.append(np.array(data), data[0]) ax = axes[i] # 绘制线条 ax.plot(angles, data, color=colors[i]) # 填充颜色 ax.fill(angles, data, alpha=0.7, color=colors[i]) # 设置角度 ax.set_xticks(angles) # 设置坐标轴名称 ax.set_xticklabels(abilities) # 设置名称 ax.set_title(name, size=10, color='black', position=(0.5, 0.4)) # 设置极径最小值 ax.set_rmin(min) # 设置极径最大值(最大值加0.1,要不线条最外圈线显示不完全) ax.set_rmax(max + 0.1) i = i + 1 plt.show()
调用上面函数进行画图展示
RFM_index = list(kmeans_result.columns[1:]) # 取索引名字 并将其转化为列表形式 RFM_result = {'客户群5':list(kmeans_result.loc[0][2:]), '客户群3':list(kmeans_result.loc[1][2:]), '客户群1':list(kmeans_result.loc[2][2:]), '客户群4':list(kmeans_result.loc[3][2:]), '客户群2':list(kmeans_result.loc[4][2:])} #画图 generate_ability_map(RFM_index,RFM_result)
小结
本项目结合航空公司客户价值分析的案例,重点介绍了数据分析算法中K-Means聚类算法在客户价值分析中的应用。针对RFM客户价值分析模型的不足,使用K-Means算法构建了航空客户价值分析LRFMC模型,详细描述了数据分析的整个过程。
-
python数据分析与挖掘实战---chapter7航空公司客户价值分析
2020-09-11 19:34:00客户关系管理的关键问题是客户分类,通过客户分类, 针对不同价值的客户制定优化的个性化服务方案,采取不同营销策略 1.2 目标 借助航空公司客户数据,对客户进行分类。 对不同的客户类别进行特征分析,比较不同类...1. 背景与挖掘目标
1.1 背景
- 企业营销焦点从产品中心转变为客户中心,客户关系管理成为企业的核心问题
- 客户关系管理的关键问题是客户分类,通过客户分类,
- 针对不同价值的客户制定优化的个性化服务方案,采取不同营销策略
1.2 目标
- 借助航空公司客户数据,对客户进行分类。
- 对不同的客户类别进行特征分析,比较不同类客户的客户价值。
- 对不同价值的客户类别提供个性化服务,制定相应的营销策略。
2. 分析方法与过程
本案例的目标是客户价值识别。
识别客户价值应用最广泛的模型是通过3个指标(最近消费时间间隔(Recency)、消费频率(Frequency)和消费金额(Monetary))来进行客户细分,识别出高价值的客户,简称RFM模型。在RFM模型中,消费金额表示在一段时间内,客户购买该企业产品金额的总和。由于航空票价受到运输距离、舱位等级等多种因素影响,同样消费金额的不同旅客对航空公司的价值是不同的。例如,一位购买长航线、低等级舱位票的旅客与一位购买短航线、高等级舱位票的旅客相比,后者对于航空公司而言价值可能更高。因此,这个指标并不适用于航空公司的客户价值分析。
我们选择客户在一定时间内累积的飞行里程M和客户在一定时间内乘坐舱位所对应的折扣系数的平均值C两个指标代替消费金额。此外,考虑航空公司会员入会时间的长短在一定程度上能够影响客户价值,所以在模型中增加客户关系长度L,作为区分客户的另一指标。
本案例将客户关系长度L、消费时间间隔R、消费频率F、飞行里程M和折扣系数的平均值C五个指标作为航空公司识别客户价值指标(见表7-3 ),记为LRFMC模型。
针对航空公司LRFMC模型,如果采用传统RFM模型分析的属性分箱方法(依据属性的平均值进行划分,其中大于平均值的表示为↑,小于平均值的表示为↓),虽然也能够识别出最有价值的客户,但是细分的客户群太多,提高了针对性营销的成本。因此,本案例采用聚类的方法识别客户价值。通过对航空公司客户价值的LRFMC模型的五个指标进行K-Means聚类,识别出最有价值客户。
本案例航空客户价值分析的总体流程
航空客运信息挖掘主要包括以下步骤。
- 从航空公司的数据源中进行选择性抽取与新增数据抽取分别形成历史数据和增量数据。
- 对步骤1.中形成的两个数据集进行数据探索分析与预处理,包括数据缺失值与异常值的探索分析,数据的属性规约、清洗和变换。
- 利用步骤2.中形成的已完成数据预处理的建模数据,基于旅客价值LRFMC模型进行客户分群,对各个客户群进行特征分析,识别出有价值的客户。
- 针对模型结果得到不同价值的客户,采用不同的营销手段,提供定制化的服务。
3. 数据加载与探索
import numpy as np import pandas as pd from sklearn.cluster import KMeans
data = pd.read_csv('./chapter7/demo/data/air_data.csv') data.info()
- 有62988条数据,44个属性
explore = data.describe(percentiles= [], include= 'all').T # percentiles,统计中的百分位数 explore['null'] = len(data) - explore['count'] # 添加空值数量列 explore = explore[['null', 'max', 'min']] explore
- 通过对数据观察发现原始数据中存在票价(SUM_YR)为空值,票价(SUM_YR)最小值为0、折扣率(avg_discount)最小值为0的记录。票价为空值的数据可能是客户不存在乘机记录造成,其他的数据可能是客户乘坐0折机票或者积分兑换产生的。
4. 数据预处理
4.1 数据清洗
通过数据探索分析,发现数据中存在缺失值,票价最小值为0、折扣率最小值为0的记录。由于原始数据量大,这类数据所占比例较小,对于问题影响不大,因此对其进行丢弃处理。具体处理方法如下。
- 丢弃票价为空的记录。
- 丢弃票价为0、平均折扣率不为0、总飞行公里数大于0的记录。
# 数据清洗 data = data[data['SUM_YR_1'].notnull() & data['SUM_YR_2'].notnull()] index1 = (data['SUM_YR_1'] != 0) & (data['SEG_KM_SUM'] != 0) # 票价不为0且有总公里数,避免票价不为0却没有总公里数的错误数据 index2 = (data['SUM_YR_2'] != 0) & (data['SEG_KM_SUM'] != 0) index3 = (data['SEG_KM_SUM'] != 0) & (data['avg_discount'] == 0) # 总飞行公里数不为0时平均折扣率为0,可能是0折机票或积分兑换(积分兑换算在平均折扣里吗) data = data[index1 | index2 | index3] # 当三个判断都为false时丢弃该数据,index1,2票价为0时,index3:总公里数不为0,有折扣却不为0,票价异常,或总公里数等于0 data
4.2 属性规约
原始数据中属性太多,根据航空公司客户价值LRFMC模型,选择与LRFMC 指标相关的6个属性:FFP_DATE、LOAD_TIME、FLIGHT_COUNT、AVG_DISCOUNT、SEG_KM_SUM、LAST_TO_END。删除与其不相关、弱相关或冗余的属性,例如,会员卡号、性别、工作地城市、工作地所在省份、工作地所在国家和年龄等属性。
data = data[['LOAD_TIME', 'FFP_DATE', 'LAST_TO_END', 'FLIGHT_COUNT', 'SEG_KM_SUM', 'avg_discount']] data
4.3 数据变换
数据变换是将数据转换成“适当的”格式,以适应挖掘任务及算法的需要。本案例中主要采用的数据变换方式为属性构造和数据标准化。
由于原始数据中并没有直接给出LRFMC五个指标,需要通过原始数据提取这五个指标,具体的计算方式如下。- L= LOAD_TIME一 FFP_DATE
会员人会时间距观测窗口结束的月数=观测窗口的结束时间一入会时间[单位:月] - R=LAST_TO_END
客户最近一次乘坐公司飞机距观测窗口结束的月数=最后一次乘机时间至观察窗口末端时长[单位:月] - F= FLIGHT_COUNT
客户在观测窗口内乘坐公司飞机的次数=观测窗口的飞行次数[单位:次] - M=SEG_KM_SUM
客户在观测时间内在公司累计的飞行里程=观测窗口的总飞行公里数[单位:公里] - C=AVG_DISCOUNT
客户在观测时间内乘坐舱位所对应的折扣系数的平均值=平均折扣率[单位:无]
5个指标的数据提取后,对每个指标数据分布情况进行分析,5个指标的取值范围数据差异较大,为了消除数量级数据带来的影响,需要对数据进行标准化处理。
L = (pd.to_datetime(data['LOAD_TIME']) - pd.to_datetime(data['FFP_DATE'])) lrfmc = pd.DataFrame((L / np.timedelta64(1, 'D')) / 30, columns= ['L']) lrfmc['R'] = data['LAST_TO_END'] / 30 lrfmc['F'] = data['FLIGHT_COUNT'] lrfmc['M'] = data['SEG_KM_SUM'] lrfmc['C'] = data['avg_discount'] lrfmc
lrfmc = (lrfmc - lrfmc.mean()) / lrfmc.std() lrfmc.columns = ['Z' + i for i in lrfmc.columns] lrfmc
5. 模型构建
5.1 客户聚类
k = 5 kmodel = KMeans(n_clusters= k) kmodel.fit(lrfmc)
result = pd.DataFrame({"聚类类别": ['客户群1', '客户群2', '客户群3', '客户群4', '客户群5']}) c1 = pd.Series(kmodel.labels_).value_counts() r2 = pd.DataFrame(kmodel.cluster_centers_) r = pd.concat([c1, r2], axis=1) result = pd.concat([result, r], axis =1) result.columns = ['聚类类别', '聚类个数', 'ZL', 'ZR', 'ZF', 'ZM', 'ZC'] result
5.2 客户价值分析
result_lp = result.iloc[:, 2:] import plotly.graph_objects as go fig = go.Figure() categories = ['ZL', 'ZR', 'ZF', 'ZM', 'ZC'] fig.add_trace(go.Scatterpolar(r= result_lp.loc[0], theta= categories, fill= 'toself', name= '客户群1')) fig.add_trace(go.Scatterpolar(r= result_lp.loc[1], theta= categories, fill= 'toself', name= '客户群2')) fig.add_trace(go.Scatterpolar(r= result_lp.loc[2], theta= categories, fill= 'toself', name= '客户群3')) fig.add_trace(go.Scatterpolar(r= result_lp.loc[3], theta= categories, fill= 'toself', name= '客户群4')) fig.add_trace(go.Scatterpolar(r= result_lp.loc[4], theta= categories, fill= 'toself', name= '客户群5')) fig.update_layout(polar= dict(radialaxis= dict(visible= True,range = [-1, 2.5]))) fig.show()
- 针对聚类结果进行特征分析,如图。其中,客户群1在F、M属性上最大,在R属性上最小;客户群2在L属性上最大;客户群3在L、R属性上最小;客户群4在R属性上最大,在F、M属性上最小;客户群5在C属性上最大。结合业务分析,通过比较各个指标在群间的大小对某一个群的特征进行评价分析。例如客户群1在F、M属性最大,在R指标最小,因此可以说F、M、R在客户群Ⅰ是优势特征。以此类推,F、M在客户群4上是劣势特征。从而总结出每个群的优势和弱势特征。
由上述的特征分析的图表说明每个客户群的都有显著不同的表现特征,基于该特征描述,本案例定义五个等级的客户类别:重要保持客户、重要发展客户、重要挽留客户、一般客户、低价值客户。他们之间的区别如图7-4所示,其中每种客户类别的特征如下:- 重要保持客户:这类客户的平均折扣率(C)较高(一般所乘航班的舱位等级较高),最近乘坐过本公司航班(R)低,乘坐的次数(F)或里程(M)较高。他们是航空公司的高价值客户,是最为理想的客户类型,对航空公司的贡献最大,所占比例却较小。航空公司应该优先将资源投放到他们身上,对他们进行差异化管理和一对一营销,提高这类客户的忠诚度与满意度,尽可能延长这类客户的高水平消费。
- 重要发展客户:这类客户的平均折扣率(C)较高,最近乘坐过本公司航班(R)低,但乘坐次数(F)或乘坐里程(M)较低。这类客户入会时长(L)短,他们是航空公司的潜在价值客户。虽然这类客户的当前价值并不是很高,但却有很大的发展潜力。航空公司要努力促使这类客户增加在本公司的乘机消费和合作伙伴处的消费,也就是增加客户的钱包份额。通过客户价值的提升,加强这类客户的满意度,提高他们转向竞争对手的转移成本,使他们逐渐成为公司的忠诚客户。
- 重要挽留客户:这类客户过去所乘航班的平均折扣率©、乘坐次数(F)或者里程(M)较高,但是较长时间已经没有乘坐本公司的航班(R)高或是乘坐频率变小。他们客户价值变化的不确定性很高。由于这些客户衰退的原因各不相同,所以掌握客户的最新信息、维持与客户的互动就显得尤为重要。航空公司应该根据这些客户的最近消费时间、消费次数的变化情况,推测客户消费的异动状况,并列出客户名单,对其重点联系,采取一定的营销手段,延长客户的生命周期。
- 一般与低价值客户:这类客户所乘航班的平均折扣率(C)很低,较长时间没有乘坐过本公司航班(R)高,乘坐的次数(F)或里程(M)较低,入会时长(L)短。他们是航空公司的一般用户与低价值客户,可能是在航空公司机票打折促销时,才会乘
坐本公司航班。
其中,重要发展客户、重要保持客户、重要挽留客户这三类重要客户分别可以归人客户生命周期管理的发展期、稳定期、衰退期三个阶段。
根据每种客户类型的特征,对各类客户群进行客户价值排名。针对不同类型的客户群提供不同的产品和服务,提升重要发展客户的价值、稳定和延长重要保持客户的高水平消费、防范重要挽留客户的流失并积极进行关系恢复。 -
数据挖掘-Python-航空公司客户流失分析决策树模型分类预测(数据表+源码+报告)
2022-07-03 11:08:43数据表+源码+报告 大三数据挖掘实验 -
Python数据分析与应用航空公司客户价值分析.ppt
2020-12-11 00:44:39Python数据分析与应用航空公司客户价值分析.ppt大数据,成就未来 * 大数据挖掘专家 * 大数据挖掘专家 大数据,成就未来 航空公司客户价值分析 * 目录 分析航空公司现状 1. 行业内竞争 民航的竞争除了三大航空公司... -
基于机器学习的航空公司客户价值分析与流失预测【毕业设计】【Python】【数据可视化】【数据分析】【机器...
2022-06-16 00:17:07本项目对某航空公司今年来积累的大量的会员档案...4. 基于决策树的航空客户流失预测建模 数据集预处理和训练集划分 xgboost客户流失模型训练 客户流失预测模型评估 特征重要程度情况 ROC 曲线 混淆矩阵计算 5. 结论 -
Python-航空公司客户价值分析
2020-12-19 17:10:31Python-航空公司客户价值分析 记第一次用python做项目是如此困难(仅仅是基础练习项目)以下是我学习的【干货】心路历程。 项目思路流程(大纲) 一个完整的数据分析项目由如下几个步骤组成: 1)数据获取:分为... -
大数据分析技术-航空公司客户价值分析(二)
2021-11-22 15:27:47大数据分析技术-航空公司客户价值分析(二) 1.复习如何使用python选取构建LRFMC模型需要的特征 2.使用sklearn相关功能模块标准化LRFMC模型的特征 3.使用sklearn的cluster模块提供的kmeans函数对不同客户群体LRMFC... -
Python--KMeans聚类实例--航空公司客户价值分析
2020-05-11 17:34:23数据来源: https://github.com/apachecn/python_data_analysis_and_mining_action/tree/master/chapter7/data 借助航空公司客户数据对客户分类 对不同的客户类别进行特征分析,比较不同类客户的客户价值 对不同价值... -
python之航空公司客户价值分析(一)
2019-01-27 23:43:42python之航空公司客户价值分析 (一) 背景与挖掘目标分析方法与过程 背景与挖掘目标 企业营销的焦点从产品中心转变为客户中心,客户关系管理成为企业的核心问题。客户管理关键是客户分类,通过客户分类,区分一般... -
【项目实战】Python基于RFM模型和K-Means聚类算法进行航空公司客户价值分析
2022-01-15 15:52:40Python基于RFM模型和K-Means聚类算法进行航空公司客户价值分析 -
航空客户价值分析
2019-10-17 14:12:38航空客户价值分析 航空公司在客户关系管理的关键问题是客户分类,通过客户分类,区分无价值客户、高价值客户。 通过借助数据,使用各类算法对客户进行分类。对不同类别的客户进行特征分析,比较不同类客户的客户... -
python数据分析之民航业客户建模分析实战
2021-10-28 20:03:24目录1背景与挖掘目标1.1 航空信息属性表(一部分列)1.2 分析方法和过程2 数据预处理3 描述性分析 1背景与挖掘目标 客户关系管理是企业的核心业务。客户管理的关键在于客户分类。通过客户分类,区分无价值和高价值... -
Python数据挖掘-RFM模型K-means聚类分析-航空公司客户价值分析
2021-05-01 10:20:06使用教材:《Python数据分析与挖掘实战》 模型:RFM模型 算法:K-means聚类;其他方法还用到了层次聚类 数据:需要数据的可以评论里call。 内容: (1)案例: 航空公司客户价值分析 (2)基于RFM客户价值理论的特征... -
航空公司客户价值分析笔记
2022-05-09 00:44:22面对激烈的市场竞争,各航空公司相继推出更优惠的营销模式来吸引客户,并通过建立合理的客户价值评估模型对客户进行分类,分析比较不同客户群体的价值,并制定相应的营销策略,对不同客户群体提供个性化的服务。... -
航空公司客户价值分析
2022-02-18 11:55:41数据清洗,特征分析 -
大数据之Python数据分析 实训 航空公司客户价值分析之二、使用 K-Means 算法进行客户分群
2019-12-21 13:19:14使用 K-Means 算法进行客户分群 ...1 实训目标 使用 K-Means 算法对客户进行分群。 2 实训环境 (1) 使用 3.6 版本的 Python 。 (2) 使用 jupyter notebook 编辑器。 (3) os , pandas , N umP... -
数据分析与挖掘实战-航空公司客户流失分析
2018-12-20 10:49:38航空公司客户流失分析 -
基于Python的客户分类和挖掘系统
2020-12-09 02:51:39Communication软件开发与应用基于Python的客户分类和挖掘系统宝音图刘真真(大连民族大学信息与通信工程学院,辽宁大连116600)摘要:在现在的市场当中,市场营销的重点与以前大不相同,以前的工作重心是产品,而现在... -
[机器学习笔记] 用Python进行航空公司客户价值分析笔记
2020-04-01 23:31:48用Python进行航空公司客户价值分析(数据分析) 学习资料: 图书:《Python数据分析与挖掘实战》(机械工业出版社)第7章 博文:https://blog.csdn.net/a857553315/article/details/79177524 目标 书中介绍了... -
Python数据挖掘:利用聚类算法进行航空公司客户价值分析
2018-02-01 11:05:53无小意丶 个人博客地址:无小意 知乎主页:无小意丶 公众号: 数据路(shuju_lu) ...本篇文章是本书第七章的实战:航空公司客户价值分析。 相关附件代码、数据和PDF,关注公众号“数据路”,回复:挖掘实战。 更 -
python数据分析与挖掘实战---航空公司客户价值分析
2018-05-19 10:13:24航空公司客户价值分析一、背景与挖掘目标 客户关系管理是企业的核心问题,关键在于客户的分类:区别无价值客户,高价值客户,针对不同客户群体有的放矢投放具体服务方案,实现企业利润最大化的目标。 各大航空... -
Python实现RFM客户价值分析
2020-12-11 00:45:19我今天就来说下用户分层经典的模型RFM模型与聚类分析模型,今天主要介绍RFM模型一、什么是RFM模型RFM是3个指标的缩写,最近一次消费时间间隔(Recency),消费频率(Frequency),消费金额(Monetary)。而RFM模型就是通过... -
《Python数据分析与挖掘实战》第7章——航空公司客户价值分析(kmeans)
2019-08-31 17:24:54本文是基于《Python数据分析与挖掘实战》的实战部分的第七章的数据——《航空公司客户价值分析》做的分析。 旨在补充原文中的细节代码,并给出文中涉及到的内容的完整代码。 1)在数据预处理部分增加了属性规约、... -
第7章 航空公司客户价值分析
2021-01-24 16:58:477.1 背景与挖掘目标 客户分类 区分客户 个性化服务方案 不同营销策略 利润最大化 目标: 借助航空公司客户数据,对客户进行分类 对不同的客户类别进行特征分析,比较不同类客户的客户价值 对不同价值的客户类别提供...