本文共 3429 字,大约阅读时间需要 11 分钟。
完整代码及数据来源:
将客户关系长度L、消费时间间隔R、消费频率F、飞行里程M和折扣系数的平
均值C这5个特征作为航空公司识别客户价值的特征,记为 LRFMC模型,如图:
由于原始数据中并没有直接给出 LRFMC模型的5个特征,需要通过原始数据提取这5个特征。
(1)会员入会时间距观测窗口结束的月数L=观测窗口的结束时间一入会时间(单位月),如式(7-1)所示
L=LOAD TIME-FFP DATE (7-1)
(2)客户最近一次乘坐公司飞机距观测窗口结束的月数R=最后一次乘机时间至观察窗口末端时长(单位:月),如式(7-2)所示。
R = LAST TO END (7-2)
(3)客户在观测窗口内飞行次数F=FLIGHT-COUNT (7-3)
(4)客户在观测窗口内飞行里程M= 观测窗口总飞行千米数(单位:千米)
M=SEG_KM_SUM (7-4)
(5)客户在观测窗口乘坐舱位对应的折扣系数的平均值c=平均折扣率(单位:无)
C=avg_discount (7-5)
标准化5个特征:
完成五个特征的构建以后,对每个特征数据分布情况进行分析,其数据的取值范围如表所示。从表中数据可以发现,五个特征的取值范围数据差异较大,为了消除数量级数据带来的影响,需要对数据做标准化处理。(可以尝试:标准差标准化)
任务实现:
air_line.py文件的内容(标准化LRFMC):
import numpy as npimport pandas as pd#下面的csv文件可在上面的推荐链接下载airline_data = pd.read_csv(r"C:\Users\Administrator\Desktop\航空公司客户价值分析\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 & exp2airline_notnull = airline_data.loc[exp,:]print('删除缺失记录后数据的形状为:',airline_notnull.shape)#只保留票价非零的,或者平均折扣率不为0且总飞行公里数大于0的记录。index1 = airline_notnull['SUM_YR_1'] != 0index2 = airline_notnull['SUM_YR_2'] != 0index3 = (airline_notnull['SEG_KM_SUM']> 0) & (airline_notnull['avg_discount'] != 0)airline = airline_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 = pd.to_datetime(airline_selection["LOAD_TIME"]) - pd.to_datetime(airline_selection["FFP_DATE"])##提取数字,由于模型中L单位为:月,所以需要除以30#L = L.astype("str").str.split(' ').str[0]#L = L.astype("int")/30#对L这一列应用lambda函数,对L中的每一个x都执行函数操作L = L.apply(lambda x: round(int(str(x).split(' ')[0])/30, 2))### 合并特征airline_features = pd.concat([L, airline_selection.iloc[:, 2:]], axis = 1)print('构建的LRFMC特征前5行为:\n', airline_features.head())##标准差标准化: 使用sklearn 中preprocessing 模块的StandardScaler 函数;# 也可以使用自定义的方法(数据分析中标准化方法,因为此处不需要对训练集与测试集用同一套规则)from sklearn.preprocessing import StandardScaler ##标准差标准化data = StandardScaler().fit_transform(airline_features)np.savez('airline_scale.npz',data)print('标准化后LRFMC五个特征为:\n',data[:5,:])
结果:
airline_k_means.py文件的内容(读取上面代码生成的airline_scale.npz进行分群)
import numpy as npimport pandas as pdimport matplotlib.pyplot as pltfrom sklearn.cluster import KMeans #导入kmeans算法airline_scale = np.load('airline_scale.npz')['arr_0']k = 5 ## 确定聚类中心数#构建模型kmeans_model = KMeans(n_clusters = k)fit_kmeans = kmeans_model.fit(airline_scale) #模型训练#kmeans_model.cluster_centers_ #查看聚类中心#kmeans_model.labels_ #查看样本的类别标签print('样本的类别标签:',kmeans_model.labels_)print('样本的类别标签类型:',type(kmeans_model.labels_))#统计不同类别样本的数目#易错:只用pandas中Series类型才有value_counts()属性r1 = pd.Series(kmeans_model.labels_).value_counts()print('最终每个类别的数目为:\n',r1)
执行结果:
airline_k_means.py文件的内容继续写下面代码
这里我们选取了每一类的聚类中心kmeans_model.cluster_centers_ 作为样本点,来代表各自的类反映到雷达图。
##做可视化:plt.figure(figsize=(6,6))L=5angles = np.linspace(0, 2*np.pi, L, endpoint=False)labels = ['L', 'F', 'R', 'C', 'M']data = kmeans_model.cluster_centers_##闭合曲线:# print(data)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',data)##绘图:plt.polar(angles, data)plt.xticks(angles, labels)plt.show()
结果:
转载地址:http://ycwsi.baihongyu.com/