使用 K-Means 进行客户分群分析

使用 K-Means 进行客户分群分析

本文将详细介绍如何使用 K-Means 聚类算法对客户的购买行为进行分群分析。我们会从数据清理和特征工程开始,到 K-Means 聚类的应用,最后进行结果的分析和商业洞察。使用的数据集为 Online Retail 数据集,包含了一家在线零售商的交易数据。

数据集概述

Online Retail 数据集包含了详细的交易信息,字段包括:

  • InvoiceNo: 每笔交易的唯一发票编号。如果发票编号以 “C” 开头,则表示该交易为退货记录。
  • StockCode: 唯一标识每种产品的代码。
  • Description: 产品的描述信息。
  • Quantity: 每笔交易中购买的产品数量。
  • InvoiceDate: 交易的日期和时间。
  • UnitPrice: 单价(英镑)。
  • CustomerID: 客户的唯一标识符。
  • Country: 客户所在国家。
数据清理与预处理

为了确保数据的准确性和完整性,首先对数据进行了必要的清理和预处理,具体步骤如下:

  1. 去除缺失的 CustomerID 数据: 数据集中有些交易记录缺少客户编号,这些记录无法关联到具体的客户,因此需要删除。
  2. 删除退货订单及交易金额小于 0 的记录: 退货订单通过 InvoiceNo 以 “C” 开头进行识别,因为这些记录不反映正常的购买行为,所以删除。同时删除交易金额小于 0 的异常记录。
  3. 计算总消费金额 (TotalPrice): 新增 TotalPrice 列,用于表示每笔交易的总金额,计算方式为 Quantity * UnitPrice

以下是数据清理的代码实现:

import pandas as pd# 读取数据集
file_path = 'Online Retail.xlsx'
data = pd.read_excel(file_path)# 数据清理
# 去除缺失的 CustomerID 行
data_cleaned = data.dropna(subset=['CustomerID'])# 将 InvoiceNo 转为字符串类型
data_cleaned['InvoiceNo'] = data_cleaned['InvoiceNo'].astype(str)# 删除退货订单及交易金额小于 0 的记录
data_cleaned = data_cleaned[~data_cleaned['InvoiceNo'].str.startswith('C')]
data_cleaned = data_cleaned[data_cleaned['Quantity'] > 0]
data_cleaned = data_cleaned[data_cleaned['UnitPrice'] > 0]# 计算总消费金额
data_cleaned['TotalPrice'] = data_cleaned['Quantity'] * data_cleaned['UnitPrice']
特征工程

在数据清理完成后,我们进行了特征工程,提取了一些反映客户购买行为的特征,这些特征用于后续的聚类分析,包括:

  • TotalQuantity: 客户的总购买数量。
  • TotalPrice: 客户的总消费金额。
  • MaxQuantity: 客户单次购买的最大数量。
  • MaxPrice: 客户购买的最高单价。
  • AvgQuantity: 客户的平均购买数量。
  • AvgPrice: 客户的平均购买价格。

以下是特征提取的代码:

# 特征工程
customer_data = data_cleaned.groupby('CustomerID').agg(TotalQuantity=('Quantity', 'sum'),TotalPrice=('TotalPrice', 'sum'),MaxQuantity=('Quantity', 'max'),MaxPrice=('UnitPrice', 'max'),AvgQuantity=('Quantity', 'mean'),AvgPrice=('UnitPrice', 'mean')
).reset_index()
数据标准化

由于不同特征的量级差异较大,例如总消费金额和平均购买数量,这些特征直接用于聚类会导致结果不一致。因此,我们使用 StandardScaler 对数据进行了标准化处理,使得各特征在相同的尺度下进行比较。

from sklearn.preprocessing import StandardScaler# 数据标准化
scaler = StandardScaler()
scaled_customer_data = scaler.fit_transform(customer_data[['TotalQuantity', 'TotalPrice', 'MaxQuantity', 'MaxPrice', 'AvgQuantity', 'AvgPrice']])
使用肘部法确定最佳 K 值

为了确定 K-Means 聚类的最佳簇数量 ( K ),我们采用了肘部法。肘部法通过绘制簇内误差平方和(Inertia)与簇数量之间的关系图,来判断最佳的聚类数量。曲线在某点出现明显弯曲时,即为“肘部”,这个点代表合适的簇数量。

from sklearn.cluster import KMeans
import matplotlib.pyplot as plt# 使用肘部法确定最佳 K 值
inertia = []
k_values = range(1, 11)
for k in k_values:kmeans = KMeans(n_clusters=k, random_state=42)kmeans.fit(scaled_customer_data)inertia.append(kmeans.inertia_)# 绘制肘部法图形
plt.figure(figsize=(8, 5))
plt.plot(k_values, inertia, marker='o')
plt.title('Elbow Method For Optimal K')
plt.xlabel('Number of Clusters (K)')
plt.ylabel('Inertia')
plt.show()

从肘部法的结果图中可以看到,在 ( K = 3 ) 附近,曲线出现明显的弯曲,因此我们选择 ( K = 3 ) 作为聚类数。

K-Means 聚类分析

基于肘部法的结果,我们使用 K-Means 算法对客户进行聚类,将所有客户分为三类,并为每个客户分配一个聚类标签。

# K-Means 聚类分析(选择 K=3)
kmeans = KMeans(n_clusters=3, random_state=42)
customer_data['Cluster'] = kmeans.fit_predict(scaled_customer_data)
结果分析与可视化

为了更好地理解每个聚类的特征,我们对每个群组进行了平均特征的分析,并通过可视化手段展示聚类结果。

# 查看每个群组的平均特征
cluster_summary = customer_data.groupby('Cluster').mean()
print(cluster_summary)# 可视化聚类结果
plt.figure(figsize=(8, 5))
plt.scatter(scaled_customer_data[:, 0], scaled_customer_data[:, 1], c=customer_data['Cluster'], cmap='viridis')
plt.title('Customer Segmentation with K-Means Clustering')
plt.xlabel('TotalQuantity (scaled)')
plt.ylabel('TotalPrice (scaled)')
plt.show()

通过分析,我们将客户分为以下三类:

  • 群组 1: 高消费客户,购买频繁,商品单价较高。
  • 群组 2: 中等消费客户,购买较为规律,整体消费较平衡。
  • 群组 3: 低消费客户,购买量少,可能是偶尔购物的客户。

这些信息可以帮助企业根据不同客户群体的行为特征制定差异化的营销策略,例如对高价值客户提供专属折扣和服务,对低消费客户进行定向推广以提升其购买频次。

结论

通过应用 K-Means 聚类算法,我们成功地对客户进行了分群,揭示了不同客户群体在购买行为上的显著差异。这些分群结果为企业制定更加精准的市场营销策略提供了数据支持,帮助提升客户满意度和忠诚度。

完整代码

以下为项目的完整代码,包括数据读取、清理、特征工程、标准化处理、聚类分析及结果展示。

import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt# 1. 读取数据集
file_path = 'Online Retail.xlsx'
data = pd.read_excel(file_path)# 2. 数据清理
# 去除缺失的 CustomerID 行
data_cleaned = data.dropna(subset=['CustomerID'])# 将 InvoiceNo 转为字符串类型
data_cleaned['InvoiceNo'] = data_cleaned['InvoiceNo'].astype(str)# 删除退货订单及交易金额小于 0 的记录
data_cleaned = data_cleaned[~data_cleaned['InvoiceNo'].str.startswith('C')]
data_cleaned = data_cleaned[data_cleaned['Quantity'] > 0]
data_cleaned = data_cleaned[data_cleaned['UnitPrice'] > 0]# 计算总消费金额
data_cleaned['TotalPrice'] = data_cleaned['Quantity'] * data_cleaned['UnitPrice']# 3. 特征工程
customer_data = data_cleaned.groupby('CustomerID').agg(TotalQuantity=('Quantity', 'sum'),TotalPrice=('TotalPrice', 'sum'),MaxQuantity=('Quantity', 'max'),MaxPrice=('UnitPrice', 'max'),AvgQuantity=('Quantity', 'mean'),AvgPrice=('UnitPrice', 'mean')
).reset_index()# 4. 数据标准化
scaler = StandardScaler()
scaled_customer_data = scaler.fit_transform(customer_data[['TotalQuantity', 'TotalPrice', 'MaxQuantity', 'MaxPrice', 'AvgQuantity', 'AvgPrice']])# 5. 使用肘部法确定最佳 K 值
inertia = []
k_values = range(1, 11)
for k in k_values:kmeans = KMeans(n_clusters=k, random_state=42)kmeans.fit(scaled_customer_data)inertia.append(kmeans.inertia_)# 绘制肘部法图形
plt.figure(figsize=(8, 5))
plt.plot(k_values, inertia, marker='o')
plt.title('Elbow Method For Optimal K')
plt.xlabel('Number of Clusters (K)')
plt.ylabel('Inertia')
plt.show()# 6. K-Means 聚类分析(选择 K=3)
kmeans = KMeans(n_clusters=3, random_state=42)
customer_data['Cluster'] = kmeans.fit_predict(scaled_customer_data)# 7. 查看每个群组的平均特征
cluster_summary = customer_data.groupby('Cluster').mean()
print(cluster_summary)# 8. 可视化聚类结果
plt.figure(figsize=(8, 5))
plt.scatter(scaled_customer_data[:, 0], scaled_customer_data[:, 1], c=customer_data['Cluster'], cmap='viridis')
plt.title('Customer Segmentation with K-Means Clustering')
plt.xlabel('TotalQuantity (scaled)')
plt.ylabel('TotalPrice (scaled)')
plt.show()

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【VUE】案例:商场会员管理系统

编写vuedfr实现对会员进行基本增删改查 1. drf项目初始化 请求: POST http://127/0.0.0.1:8000/api/auth/ {"username":"cqn", "password":"123"}返回: {"username":"cqn", "token&q…

读论文、学习时 零碎知识点记录01

1.入侵检测技术 2.深度学习、机器学习相关的概念 ❶注意力机制 ❷池化 ❸全连接层 ❹Dropout层 ❺全局平均池化 3.神经网络中常见的层

.NET Core 集成 MiniProfiler性能分析工具

前言: 在日常开发中,应用程序的性能是我们需要关注的一个重点问题。当然我们有很多工具来分析程序性能:如:Zipkin等;但这些过于复杂,需要单独搭建。 MiniProfiler就是一款简单,但功能强大的应用…

Unraid的cache使用btrfs或zfs?

Unraid的cache使用btrfs或zfs? 背景:由于在unraid中添加了多个docker和虚拟机,因此会一直访问硬盘。然而,单个硬盘实在难以让人放心。在阵列盘中,可以通过添加校验盘进行数据保护,在cache中无法使用xfs格式…

深入挖掘C++中的特性之一 — 继承

目录 1.继承的概念 2.举个继承的例子 3.继承基类成员访问方式的变化 1.父类成员的访问限定符对在子类中访问父类成员的影响 2.父类成员的访问限定符子类的继承方式对在两个类外访问子类中父类成员的影响 4.继承类模版(注意事项) 5.父类与子类间的转…

数据结构——计数、桶、基数排序

目录 引言 计数排序 1.算法思想 2.算法步骤 3.代码实现 4.复杂度分析 桶排序 1.算法思想 2.算法步骤 3.代码实现 4.复杂度分析 基数排序 1.算法思想 2.算法步骤 3.代码实现 4.复杂度分析 排序算法的稳定性 1.稳定性的概念 2.各个排序算法的稳定性 结束语 引…

C++(string类的实现)

1. 迭代器、返回capacity、返回size、判空、c_str、重载[]和clear的实现 string类的迭代器的功能就类似于一个指针,所以我们可以直接使用一个指针来实现迭代器,但如下图可见迭代器有两个,一个是指向的内容可以被修改,另一个则是指…

Pytorch最最适合研究生的入门教程,Q3 开始训练

文章目录 Pytorch最最适合研究生的入门教程Q3 开始训练3.1 训练的见解3.2 Pytorch基本训练框架work Pytorch最最适合研究生的入门教程 Q3 开始训练 3.1 训练的见解 如何理解深度学习能够完成任务? 考虑如下回归问题 由函数 y f ( x ) yf(x) yf(x)采样得到的100个…

【安当产品应用案例100集】018-Vmware Horizon如何通过安当ASP身份认证系统增强登录安全性

启用Radius认证是提高VMware Horizon环境安全性的有效方法,特别是在需要满足复杂安全要求的场景中。 启用Radius认证对于VMware Horizon具有以下几个关键优势: 增强安全性:Radius认证支持多种认证方法,包括PAP、CHAP、MS-CHAPv1…

web前端面试中拍摄的真实js面试题(真图)

web前端面试中拍摄的真实js面试题(真图) WechatIMG258.jpeg WechatIMG406.jpeg WechatIMG407.jpeg WechatIMG922.jpeg WechatIMG1063.jpeg © 著作权归作者所有,转载或内容合作请联系作者 喜欢的朋友记得点赞、收藏、关注哦!!…

TypeScript 算法手册 - 【冒泡排序】

文章目录 TypeScript 算法手册 - 冒泡排序1. 冒泡排序简介1.1 冒泡排序定义1.2 冒泡排序特点 2. 冒泡排序步骤过程拆解2.1 比较相邻元素2.2 交换元素2.3 重复过程 3. 冒泡排序的优化3.1 提前退出3.2 记录最后交换位置案例代码和动态图 4. 冒泡排序的优点5. 冒泡排序的缺点总结 …

【SpringBoot详细教程】-09-Redis详细教程以及SpringBoot整合Redis【持续更新】

🌲 Redis 简介 🌾 什么是Redis Redis 是C语言开发的一个开源高性能键值对的内存数据库,可以用来做数据库、缓存、消息中间件等场景,是一种NoSQL(not-only sql,非关系型数据库)的数据库 Redis是互联网技术领域使用最为广泛的存储中间件,它是「Remote DictionaryServic…

TARA分析方法论——威胁分析和风险评估方法

一、什么是TARA分析方法论 威胁分析和风险评估(Threat Analysis and Risk Assessment) 通过识别整车/项目的网络安全资产,分析其中的潜在的安全威胁,综合考虑威胁攻击可行性、危害影响等因素,识别出整车/项目可能存在…

Python并发编程(2)——初始Python多线程

左手编程,右手年华。大家好,我是一点,关注我,带你走入编程的世界。 公众号:一点sir,关注领取python编程资料 前言 什么是多线程? 为什么需要多线程? 多线程的优点和缺点&#xff1f…

前端规范工程-5:Git提交信息规范(commitlint + czg)

前面讲的都是在git提交之前的一些检查流程,然而我们git提交信息的时候,也应该是需要规范的。直接进入主题: 目录 需安装插件清单commitlint 介绍安装配置配置commit-msg钩子提交填写commit信息czg后续方式一:push触动build并上传…

Windows UAC权限详解以及因为权限不对等引发软件工具无法正常使用的实例分析

目录 ​1、什么是UAC? 2、微软为什么要设计UAC? 3、标准用户权限与管理员权限 4、程序到底以哪种权限运行?与哪些因素有关? 4.1、给程序设置以管理员权限运行的属性 4.2、当前登录用户的类型 4.3、如何通过代码判断某个进程…

2.1MyBatis——ORM对象关系映射

2.1MyBatis——ORM对象关系映射 1. 验证映射配置2.ResultType和ResultMap2.1ResultMap是最终的ORM依据2.2ResultType和ResultMap的使用区别 3.具体的转换逻辑3.1 TypeHandle类型转换 5.总结 概括的说,MyBatis中,对于映射关系的声明是由开发者在xml文件手…

手机USB连接不显示内部设备,设备管理器显示“MTP”感叹号,解决方案

进入小米驱动下载界面,等小米驱动下载完成后,解压此驱动文件压缩包。 5、小米USB驱动安装方法:右击“计算机”,从弹出的右键菜单中选择“管理”项进入。 6、在打开的“计算机管理”界面中,展开“设备管理器”项&…

【数据分享】2000—2023年我国省市县三级逐年植被覆盖度(FVC)数据(Shp/Excel格式)

之前我们分享过2000—2023年逐月植被覆盖度(FVC)栅格数据(可查看之前的文章获悉详情)和Excel和Shp格式的省市县三级逐月FVC数据(可查看之前的文章获悉详情),原始的逐月栅格数据来源于高吉喜学者…

深度学习:迁移学习

目录 一、迁移学习 1.什么是迁移学习 2.迁移学习的步骤 1、选择预训练的模型和适当的层 2、冻结预训练模型的参数 3、在新数据集上训练新增加的层 4、微调预训练模型的层 5、评估和测试 二、迁移学习实例 1.导入模型 2.冻结模型参数 3.修改参数 4.创建类&#xff…