机器学习笔记-聚类分析之K-means算法案例及其Python实现

引言:
数据挖掘的本质是“计算机根据已有的数据做出决策”,其对社会的价值不必多言,相关的应用已经有很多,包括垃圾邮件拦截、客户价值分析等。
尽管数据挖掘实现过程的细节千差万别,但是从思路来说,主要包括两个方面:1、创建数据集;2、建模调整算法。
算法是数据挖掘最核心的部分,作为一名学习新人,在参考《数据挖掘导论》、《Python数据分析与挖掘实战》、《Python数据挖掘入门与实战》等前辈的书籍下,谨以此博客帮助自己梳理知识点,错误遗漏之处,请各位前辈多多指教~

聚类分析 之 K-means算法

【先抛出一个情景问题】:
航空公司怎么样对客户分群,区分高价值客户、无价值客户等,对不同的客户群体实施个性化的营销策略,实现利润最大化?
对于该类情景题,可使用聚类分析方法。

【聚类分析相关概念】
是在没有给定划分类别的情况下,根据数据的相似度进行分组的一种方法,分组的原则是组内距离最小化而组间距离最大化。

K-means算法是典型的基于距离的非层次聚类算法,在最小化误差函数的基础上将数据划分为预定的K类别,采用距离作为相似性的评级指标,即认为两个对象的距离越近,其相似度越大。

算法过程
1、从N个样本数据中随机选取K个对象作为初始的聚类质心。
2、分别计算每个样本到各个聚类中心的距离,将对象分配到距离最近的聚类中。
3、所有对象分配完成之后,重新计算K个聚类的质心。
4、与前一次的K个聚类中心比较,如果发生变化,重复过程2,否则转过程5.
5、当质心不再发生变化时,停止聚类过程,并输出聚类结果。
K-Means算法示意图

【情景问题的模型建立】
根据航空公司目前积累的大量客户会员信息和其乘坐的航班记录,可以得到包括姓名、乘坐次数、价格等十几条属性信息。

本情景案例是想要获取客户价值,识别客户价值应用的最广泛的模型是RFM模型,三个字母分别代表recency(最近消费时间间隔)、frequency(消费频率)、消费金额(monetary)这三个指标。结合具体情景,最终选取客户关系长度L、消费时间间隔R、消费频率F、飞行里程M、折扣系数的平均值C这5个指标作为航空公司识别客户价值的指标,记为LRFMC模型。

所以本案例通过对LRFMC模型的五个指标进行K-means聚类分析来识别出最优价值的客户。

航空客运数据挖掘流程

主要步骤如上图所示,主要包括:
1、对数据集进行数据探索分析与预处理,包括数据缺失与异常处理、数据属性的规约、清洗和变换。
2、利用步骤1中完成预处理的数据,基于LRFMC模型进行客户分群,对各个客户群进行特征分析,识别出有价值的客户。
3、针对不同价值的客户进行不同的营销手段,个性化服务。

Python实现代码:

【步骤一】数据清洗,删除票价为空的记录;删除票价为0、平均折扣率不为0、总飞行公里数大于0的记录

#-*- coding: utf-8 -*- 

import pandas as pd

datafile= '../air_data.csv' #航空原始数据,第一行为属性标签
cleanedfile = '../data_cleaned.csv' #数据清洗后保存的文件
data = pd.read_csv(datafile,encoding='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) #导出结果

【步骤二】标准化处理

datafile = '../data_cleaned.xls' #需要进行标准化的数据文件;
zscoredfile = '../zscoreddata.xls' #标准差化后的数据存储路径文件;

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) #数据写入

【步骤三】使用K-Means算法聚类消费行为特征数据,并导出各自类别的概率密度图

import pandas as pd
from sklearn.cluster import KMeans #导入K均值聚类算法
import matplotlib.pyplot as plt

inputfile = '../zscoreddata.xlsx' #待聚类的数据文件
outputfile = '../fenlei.xlsx'
k = 5                       #需要进行的聚类类别数
iteration = 500             #聚类最大循环数

#读取数据并进行聚类分析
data = pd.read_excel(inputfile) #读取数据

#调用k-means算法,进行聚类分析
kmodel = KMeans(n_clusters = k, n_jobs = 4) #n_jobs是并行数,一般等于CPU数较好
kmodel.fit(data) #训练模型

r1 = pd.Series(kmodel.labels_).value_counts()  #统计各个类别的数目
r2 = pd.DataFrame(kmodel.cluster_centers_)     #找出聚类中心
r = pd.concat([r2, r1], axis = 1) #横向连接(0是纵向),得到聚类中心对应的类别下的数目
r.columns = list(data.columns) + [u'类别数目'] #重命名表头
print r

r = pd.concat([data, pd.Series(kmodel.labels_, index = data.index)], axis = 1)  #详细输出每个样本对应的类别
r.columns = list(data.columns) + [u'聚类类别'] #重命名表头
r.to_excel(outputfile) #保存分类结果

def density_plot(data): #自定义作图函数  
    p = data.plot(kind='kde', linewidth = 2, subplots = True, sharex = False)
    [p[i].set_ylabel('density') for i in range(k)]
    plt.legend()
    return plt

pic_output = 'D://mypy/' #概率密度图文件名前缀
for i in range(k):
    density_plot(data[r[u'聚类类别']==i]).savefig(u'%s%s.png' %(pic_output, i))

分类结果展示与分析:

聚类中心对应类别下的样本数目:
这里写图片描述

分群1的概率密度函数图:
分群1

分群2的概率密度函数图:
这里写图片描述

分群3的概率密度函数图:
这里写图片描述

分群4的概率密度函数图:
这里写图片描述

分群5的概率密度函数图:
这里写图片描述

分析:

根据数据和图片发现,每个客户群都有显著不同的表现特征:客户群1在R属性上最大,在F、M属性上最小;客户群2在F、M属性上最大,在R属性上最小;客户群3在L、C属性上最小;客户群4在L属性上最大;客户群5在C属性上最大。

基于特征描述,本案例定义5个等级的客户案例:重要保持客户、重要发展客户、重要挽留客户、一般客户、低价值客户,每种客户类型特征如下:
1、重要保持客户:平均折扣率(C)较高(一般航班舱位的等级较高),最近乘坐公司航班(R)较低,乘坐的次数(F)或里程数(M)较高。这类客户对航空公司贡献最高,应尽可能延长这类客户的高消费水平。
2、重要发展客户:平均折扣率(C)较高,最近乘坐公司航班(R)较低,乘坐的次数(F)或里程数(M)较低。这类客户是航空公司的潜在价值客户,需要努力促使增加他们的乘机消费。
3、重要挽留客户:平均折扣率(C)较高、乘坐的次数(F)或里程数(M)较高,但最近乘坐公司航班(R)较低,很久没有乘坐本公司的航班,原因各不相同,需要采取一定的营销手段,延长客户的生命周期。
4、一般与低价值客户:平均折扣率(C)很低、乘坐的次数(F)或里程数(M)较低,最近乘坐公司航班(R)很高,入会时长(L)短,他们是公司的低价值客户,可能只在航空公司打折的时候才会乘坐航班。

可以看出重要保持客户、重要发展客户、重要挽留客户是最具价值的前三名客户类型,为了深度挖掘航空公司各类型客户的价值,需要提升重要发展客户的价值、稳定和延长重要保持客户的高水平消费、对重要挽留客户积极进行关系恢复,并策划相应的营销策略加强巩固客户关系。

评论 114 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:编程工作室 设计师:CSDN官方博客 返回首页

打赏作者

lilu916

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

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值