【Python机器学习系列】建立KMeans模型实现航空客户聚类分群(案例+源码)

news2024/11/24 22:52:45

这是我的第301篇原创文章。

一、引言

       在企业的客户关系管理中,对客户分类,区分不同价值的客户。针对不同价值的客户提供个性化服务方案,采取不同营销策略,将有限营销资源集中于高价值客户,实现企业利润最大化目标。广泛用于分析客户价值的是 RFM 模型,它 是通过三个指标(最近消费时间间隔 (Recency) 、消费频率 (Frequency) 、消费金额 (Monetary) )来进行客户细分,识别出高价值的客户 。

图片

挖掘目标

  • 借助航空公司客户数据,对客户进行分类;

  • 对不同的客户类别进行特征分析,比较不同类客户的客户价值;

  • 对不同价值的客户类别提供个性化服务,制定相应的营销策略。

二、实现过程

2.1 数据读取

data = pd.read_csv('air_data.csv', sep=',', encoding='ANSI')
print(data)

data:

图片

2.2 数据清洗

丢弃票价为0、平均折扣率不为0、总飞行公里数大于0的数据。

data = data[data['SUM_YR_1'].notnull() * data['SUM_YR_2'].notnull()]  # 票价非空值才保留
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]  # 该规则是“或”
print(data)

data:

图片

2.3 属性规约

原始数据中属性太多,选择与其相关的六个属性,删除不相关、弱相关或冗余的属性。

data = data[["FFP_DATE", "LOAD_TIME", "FLIGHT_COUNT", "SUM_YR_1", "SUM_YR_2", "SEG_KM_SUM", "AVG_INTERVAL", "MAX_INTERVAL", "avg_discount"]]
print(data)

data:

图片

2.4  数据转换

本模型将以下6个特征作为识别客户价值的特征。

data["LOAD_TIME"] = pd.to_datetime(data["LOAD_TIME"])
data["FFP_DATE"] = pd.to_datetime(data["FFP_DATE"])
data["入会时间"] = data["LOAD_TIME"] - data["FFP_DATE"]
data["平均每公里票价"] = (data["SUM_YR_1"] + data["SUM_YR_2"]) / data["SEG_KM_SUM"]
data["时间间隔差值"] = data["MAX_INTERVAL"] - data["AVG_INTERVAL"]
data = data.rename(columns = {"FLIGHT_COUNT" : "飞行次数", "SEG_KM_SUM" : "总里程", "avg_discount" : "平均折扣率"},inplace = False)
data = data[["入会时间", "飞行次数", "平均每公里票价", "总里程", "时间间隔差值", "平均折扣率"]]
data['入会时间'] = data['入会时间'].astype(np.int64)/(60*60*24*10**9)

数据标准化:

data = (data - data.mean(axis=0))/(data.std(axis=0))
print(data)

data:

图片

2.5 构建模型

采用计算SSE的方法,尝试找到最好的K数值。

nums, SSE = test_Kmeans_nclusters(data)
sns.set(font_scale=1.2)
plt.rc('font', family=['Times New Roman', 'SimSun'], size=12)
# 绘图观测SSE与簇个数的关系
fig=plt.figure(figsize=(10, 8))
ax=fig.add_subplot(1,1,1)
ax.plot(nums,SSE,marker="+")
ax.set_xlabel("n_clusters", fontsize=18)
ax.set_ylabel("SSE", fontsize=18)
fig.suptitle("KMeans", fontsize=20)
plt.show()

可视化结果:

图片

分析k=5时的结果:聚类结果进行特征分析,绘制客户分群雷达图:

kmodel = KMeans(n_clusters=5)
kmodel.fit(data)
# 简单打印结果
r1 = pd.Series(kmodel.labels_).value_counts()  # 统计各个类别的数目
r2 = pd.DataFrame(kmodel.cluster_centers_)  # 找出聚类中心
# 所有簇中心坐标值中最大值和最小值
max = r2.values.max()
min = r2.values.min()
r = pd.concat([r2, r1], axis=1)  # 横向连接(0是纵向),得到聚类中心对应的类别下的数目
r.columns = list(data.columns) + [u'类别数目']  # 重命名表头

# 绘图
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, polar=True)
center_num = r.values
feature = ["入会时间", "飞行次数", "平均每公里票价", "总里程", "时间间隔差值", "平均折扣率"]
N = len(feature)
feature = np.concatenate((feature, [feature[0]]))

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()

结果:

图片

2.6 结果解读

通过观察可知:

  • 当k取值4时,每个人群包含的信息比较复杂,且特征不明显;

  • 当k取值5时,分析的结果比较合理,分出的五种类型人群都有自己的特点又不相互重复;

  • 当k取值6时,各种人群也都有自己的特点,但是第4簇人群完全在第5簇人群特征中包含了,有点冗余的意思;

综上,当k取值为5时,得到最好的聚类效果,将所有的客户分成5个人群,再进一步分析可以得到以下结论:

  • 第一簇人群,最大的特点是时间间隔差值最大,分析可能是“季节型客户”,一年中在某个时间段需要多次乘坐飞机进行旅行,其他的时间则出行的不多,这类客户我们需要在保持的前提下,进行一定的发展;

  • 第二簇人群,最大的特点就是入会的时间较长,属于老客户按理说平均折扣率应该较高才对,但是观察窗口的平均折扣率较低,而且总里程和总次数都不高,分析可能是流失的客户,需要在争取一下,尽量让他们“回心转意”;

  • 第三簇人群,各方面的数据都是比较低的,属于一般或低价值用户;

  • 第三簇人群,最大的特点就是平均每公里票价和平均折扣率都是最高的,应该是属于乘坐高等舱的商务人员,应该重点保持的对象,也是需要重点发展的对象,另外应该积极采取相关的优惠政策是他们的乘坐次数增加;

  • 第五簇人群,总里程和飞行次数都是最多的,而且平均每公里票价也较高,是重点保持对象。

作者简介:

读研期间发表6篇SCI数据挖掘相关论文,现在某研究院从事数据算法相关科研工作,结合自身科研实践经历不定期分享关于Python、机器学习、深度学习、人工智能系列基础知识与应用案例。致力于只做原创,以最简单的方式理解和学习,关注我一起交流成长。需要数据集和源码的小伙伴可以关注底部公众号添加作者微信。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1821307.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Covalent 承诺向 Consensys Builders Scale 提供 250 万美元资助

作为 Web3.0 领域主要的模块化数据基础设施层 Covalent Network(CQT)承诺向「Consensys Builders Scale 计划」提供 250 万美元的资助, 用于助力 Consensys 生态的发展。这一重大举措体现了 Covalent Network(CQT)的使…

ETL可视化工具 DataX -- 简介( 一)

引言 DataX 系列文章: ETL可视化工具 DataX – 安装部署 ( 二) 1.1 DataX 1.1.1 Data X概览 DataX 是阿里云DataWorks数据集成的开源版本,在阿里巴巴集团内被广泛使用的离线数据同步工具/平台。DataX 实现了包括 MySQL、Oracle、OceanBase、SqlServ…

基于深度学习视觉算法的多模型文件融合检测系统设计与实现及优化(工人姿态检测+安全帽佩戴检测系统)

1,融合pose.pt(姿态检测)(安全帽佩戴检测)效果图 实时检测优化后FPS可达20 2,原理介绍 YOLOv5是目前应用广泛的目标检测算法之一,其主要结构分为两个部分:骨干网络和检测头。 输入(Input): YOLOv5的输入是一张RGB图像…

2024全站焕新,重塑3D轻量体验!

3D模型当前应用广泛,正以惊人的速度实现数据增长,轻量化需求随之增多。老子云团队一直在探索如何借助自研轻量化技术的能力,打破用户模型处理思维惯性,构建更高效、实用、简单的体验范式,来帮助用户解决3D素材数据处理…

12月5-7日西安氢能源及燃料电池产业博览会

展会概况: 作为战略性新兴产业,发展氢能已经成为全国各地布局未来产业的重要方向。2023年以来,在政策与市场的双重驱动下,氢能的应用领域正在不断拓展和创新,当前我国氢能源迎来发展热潮,预计到 2025 年国…

如何提高pcdn的效率?

要提高PCDN的效率,可以考虑以下几个方面的操作: 1、优化网络类型:确保使用的是全锥型或公网型网络,避免使用受限的网络类型。如果网络类型受限,可以尝试调整路由器设置或联系网络提供商进行升级。 2、合理配置设备硬…

机器学习python实践——关于ward聚类分层算法的一些个人心得

最近在利用python跟着参考书进行机器学习相关实践,相关案例用到了ward算法,但是我理论部分用的是周志华老师的《西瓜书》,书上没有写关于ward的相关介绍,所以自己网上查了一堆资料,都很难说清楚ward算法,幸…

美PPI意外下降,标普纳指四日连创新高,苹果市值反超微软,美债收益率十周最低

午盘前美股指数一度集体转跌,苹果、微软、英伟达、台积电、高通、博通、美光科技等继续新高,推动标普、纳指和芯片股再破纪录,但道指连跌三日且盘初跌300点,CrowdStrike和甲骨文脱离最高,特斯拉涨7.8%后收涨2.9%&#…

Java——LinkedList

1、链表 1.1 链表的概念及结构 链表在逻辑层面上是连续的,在物理层面上不一定是连续的 链表结构可分为,单向或双向、带头或不带头、循环或非循环,组合共计8种 重点:无头单向非循环链表、无头双向链表 1.2 模拟实现无头单向非…

某信用合作社数据架构规划方案(115页PPT)

方案介绍:为应对数字化转型挑战,某信用合作社计划实施一套新的数据架构,以提高数据处理效率、确保数据安全,并满足业务快速发展的需求。预期成效是完善的数据架构能够全面地提升我社六个方面的竞争能力,更好地服务于目…

大模型辅助编程助手:『小浣熊 Raccoon』 如何使用?

认识 Raccoon Raccoon (Raccoon is Another Code CO-pilOt Navigator) 是基于 AI 的代码助手,是商汤科技发布基于商汤自研大语言模型的智能编程助手,代码小浣熊 Raccoon 支持 Python、Java、JavaScript、C、Go、SQL 等30主流编程语言和 VS Code、Intell…

OpenGL3.3_C++_Windows(3)

GLSL Shader基础 Shader(把输入转化为输出,运行在GPU上):首先要声明版本,有各自的入口点main()顶点数据上限:16个包含4分量:16 * 4 64个分量向量:容器vec。使用.x、.y、.z和.w&am…

docker一些常用命令以及镜像构建完后部署到K8s上

docker一些常用命令以及镜像构建完后部署到K8s上 1.创建文件夹2.删除文件3.复制现有文件内容到新建文件4.打开某个文件5.查看文件列表6.解压文件(tar格式)7.解压镜像8.查看镜像9.删除镜像10.查看容器11.删除容器12.停止运行容器13.构建镜像14.启动容器15…

200元的5G热点机能作为渗透测试测试机,还能当128G移动硬盘,怎么算都值

最近,迫于很多的app渗透测试,急需一个真机,在咸鱼上发现了一款低价5G手机,平时可以当随身WiFi,还可以进行app渗透测试,它就是中兴远航30。 中兴远航30是2022年4月发布的机器,全系只有4G128G和6G…

单例模式、工厂模式 c++关键字 static

static 关键字的作用: 主要作用在于 控制变量或函数的作用域、生命周期以及它们如何被不同部分的程序访问,从而帮助程序员管理内存、避免命名冲突,并实现特定的设计模式(如单例模式)。 1. 静态局部变量:当…

Unity Protobuf+RPC+UniTask

远程过程调用(RPC)协议详解 什么是RPC协议RPC的基本原理RPC的关键组件RPC的优缺点Protobuf函数绑定CallEncodeRecvDecodeSocket.Send和Recv项目地址 什么是RPC协议 远程过程调用(Remote Procedure Call,简称RPC)是一种…

配置Windows客户端连接iSCSI设备

1、运行iSCSI发起程序 控制面板–>系统和安全–>管理工具–>iSCSI发起程序。 2、更改客户端iqn属性 3、点击连接,就会在本次磁盘新加一款硬盘。 4、通过格式化新建卷就可使用该硬盘。

eBay测评,自养号应该如何做?

测评自养号就是自己搭建国外的服务器和IP环境,实现自己注册eBay的买家账号,通过电脑端环境一台电脑就可以无限养号,一次可以开十几个窗口同时浏览下单,每个窗口都是独立的环境,一账号一环境一IP一卡 买家账号掌握在卖…

ARM32开发--存储器介绍

知不足而奋进 望远山而前行 目录 文章目录 前言 存储器分类 RAM ROM EEPROM Flash 总结 前言 在现代计算机系统中,存储器扮演着至关重要的角色,不仅影响着数据的存取速度和稳定性,还直接关系到计算机系统的性能和应用场景的选择。存…

ARM32开发--IIC时钟案例

知不足而奋进 望远山而前行 目录 文章目录 前言 目标 内容 需求 开发流程 移植驱动 修改I2C实现 测试功能 总结 前言 在现代嵌入式系统开发中,移植外设驱动并测试其功能是一项常见的任务。本次学习的目标是掌握移植方法和测试方法,以实现对开…