使用 K-Means 进行客户分群分析
本文将详细介绍如何使用 K-Means 聚类算法对客户的购买行为进行分群分析。我们会从数据清理和特征工程开始,到 K-Means 聚类的应用,最后进行结果的分析和商业洞察。使用的数据集为 Online Retail 数据集,包含了一家在线零售商的交易数据。
数据集概述
Online Retail 数据集包含了详细的交易信息,字段包括:
- InvoiceNo: 每笔交易的唯一发票编号。如果发票编号以 “C” 开头,则表示该交易为退货记录。
- StockCode: 唯一标识每种产品的代码。
- Description: 产品的描述信息。
- Quantity: 每笔交易中购买的产品数量。
- InvoiceDate: 交易的日期和时间。
- UnitPrice: 单价(英镑)。
- CustomerID: 客户的唯一标识符。
- Country: 客户所在国家。
数据清理与预处理
为了确保数据的准确性和完整性,首先对数据进行了必要的清理和预处理,具体步骤如下:
- 去除缺失的 CustomerID 数据: 数据集中有些交易记录缺少客户编号,这些记录无法关联到具体的客户,因此需要删除。
- 删除退货订单及交易金额小于 0 的记录: 退货订单通过
InvoiceNo
以 “C” 开头进行识别,因为这些记录不反映正常的购买行为,所以删除。同时删除交易金额小于 0 的异常记录。 - 计算总消费金额 (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',