1.案例——航空公司客户
(1)数据选取与清洗
根据题目要求随机选取30000条数据,然后对数据进行清洗,删除SUM_YR_1、SUM_YR_2、avg_discount为零的数据,具体实现代码如下:
# 数据读取
data =pd.read_csv('air_data.csv',encoding='ISO-8859-1')
# 随机抽取数据
data = data.sample(30000)
print("已随机抽取"+str(len(data))+'条数据')
# 数据清洗
data = data[data['SUM_YR_1'].notnull() & data['SUM_YR_2'].notnull()] # 保留总票价非空值
term_1 = data['SUM_YR_1'] != 0
term_2 = data['SUM_YR_2'] != 0
term_3 = data['avg_discount'] == 0
data = data[term_1 | term_2 | term_3] # 保留票价非零值或平均折扣率为零的值
# 重排序
data = data.reset_index(drop=True)
(2)构建LRFMC特征
通过调研文献与网络资料,可知在航空数据分析领域,LRFCM模型可有效挖掘用户的价值,其中,L表示客户关系长度,即客户加入会员的日期至观测窗口结束日期的间隔,该特征反映了用户可能的活跃时长。R表示最近一次乘机时间,即最近一次乘机日期至观测窗口结束日期的间隔,该特征反映用户当前的活跃状态。F表示乘机频率,即客户在观测窗口期内乘坐飞机的次数,该特征反映了客户的忠诚度。M表示飞行总里程,即客户在观测窗口期内的飞行总里程。g该特征反映了客户对乘机的依赖性。C表示平均折扣率,即客户在观测窗口期内的平均折扣率,该特征侧面反映客了户价值高低。
LRFMC特征构造实现代码如下:
# 选取特征字段
data = data[['LOAD_TIME', 'FFP_DATE', 'LAST_TO_END', 'FLIGHT_COUNT', 'SEG_KM_SUM', 'avg_discount']]
# 将数据字段转换成LRFMC
data['LOAD_TIME'] = pd.to_datetime(data['LOAD_TIME'])
data['FFP_DATE'] = pd.to_datetime(data['FFP_DATE'])
data_LRFMC = pd.DataFrame()
data_LRFMC['L'] = ((data['LOAD_TIME'] - data['FFP_DATE']) / np.timedelta64(1, 'D')) / 30
data_LRFMC['R'] = data['LAST_TO_END']
data_LRFMC['F'] = data['FLIGHT_COUNT']
data_LRFMC['M'] = data['SEG_KM_SUM']
data_LRFMC['C'] = data['avg_discount']
(3)数据标准化与基于KMeans的用户分类
本小节,基于sklearn,采用KMeans聚类算法对用户进行分类,聚类特征为LRFMC五个特征,聚类类簇个数为5,在聚类之前,对数据进行了标准化,具体实现代码如下:
# 对LRFMC进行规格化处理
data_LRFMC = (data_LRFMC - data_LRFMC.mean(axis=0)) / (data_LRFMC.std(axis=0))
data_LRFMC.columns = ['Z'+i for i in data_LRFMC.columns]
# KMeans聚类
clf_KMeans = KMeans(n_clusters=5).fit(data_LRFMC)
(4)聚类结果分析与展示
为进一步分析聚类结果,采用图表的形式对结果进行可视化展示,首先,在LRFMC特征数据集上添加聚类类别列,然后统计聚类中心,最后采用图表的形式进行展示,具体实现代码如下:
# 添加类别列
r = pd.concat([data_LRFMC, pd.Series(clf_KMeans.labels_, index=data_LRFMC.index)], axis=1)
r.columns = list(data_LRFMC.columns) + ['mem_class']
# 获取聚类中心点结果
r1 = pd.Series(clf_KMeans.labels_).value_counts() # 统计各个类别的数目
r2 = pd.DataFrame(clf_KMeans.cluster_centers_) # 找出聚类中心
max_v = r2.values.max()
min_v = r2.values.min()
r_center = pd.concat([r2, r1], axis=1) # 横向连接(0是纵向),得到聚类中心对应的类别下的数目
r_center.columns = list(data_LRFMC.columns) + ['mem_class']
# 查看每个类别下,每个数值得分布数据
for i in range(5):
data_LRFMC[r['mem_class'] == i].plot(kind='kde', linewidth=2, subplots=True, sharex=False,
layout=(1, data_LRFMC.shape[1]), figsize=(16, 2))
plt.legend()
plt.show()
# 将各个类别中心点值在同一图形上展示(便于对比)
clu = clf_KMeans.cluster_centers_
feature = ['L', 'R', 'F', 'M', 'C']
colors = ['red', 'green', 'yellow', 'blue', 'black']
for i in range(5):
plt.plot(feature, clu[i], label='clustre ' + str(i), linewidth=2, color=colors[i], marker='o')
plt.ylabel('values')
plt.show()
# 以雷达图得方式展示(更加直观)
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, polar=True)
center_num = r_center.values
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="category_%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_v - 0.1, max_v + 0.1)
# 添加标题
plt.title('LRFCM', 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()
聚类结果展示如图1-1、1-2、1-3、1-4、1-5、1-6、1-7所示。
图1-1 类别1客户特征分布展示
图1-2 类别2客户特征分布展示
图1-3 类别3客户特征分布展示
图1-4 类别3客户特征分布展示
图1-5 类别5客户特征分布展示
图1-6 特征分布展示
图1-7 各类别数据量雷达图
(5)营销策略制定
忠诚客户:根据上诉图表分析结果可知,类别5客户F、M特征值非常高,L特征值较高,在乘机次数和飞行里程以及会员资历上具有较大优势,属于经常乘机的老客户,忠诚度较高,在营销时可加大对这类客户的资源投入,维持此类客户的忠诚度。
发展客户:根据上诉图表分析结果可知,类别2客户C特征值较高,即客户机票票价高,不在意机票折扣,但是,乘机次数不多,在营销时,可加大对此类用户的互动,正确将此类用户发展为乘机次数较多的忠诚客户。
潜在价值客户:根据上诉图表分析结果可知,类别4客户R特征值平均较高,即最近有乘机记录,但是其余特征值均较低,属于发展客户,在营销时,可适当予以优惠等政策,增加该类用户的满意度,努力发展为忠诚用户。
一般客户:根据上诉图表分析结果可知,类别3客户L特征值较高,即会员资历较老,但是F和M值以及R却较低,即乘机次数和里程较少,且最近无乘机,在营销时,可针对性的对此类用户进行回访和优惠,争取挽回此类用户。
低价值用户:根据上诉图表分析结果可知,类被1客户所有特征值均较低,属于低价值用户,在营销时,可较少对此类用户的互动。