基于RFM和K-Means的用户分群

本文介绍了基于RFM模型和K-Means算法进行用户分群的过程。首先,详细阐述了RFM模型的计算方法,包括Recency(最近购买时间)、Frequency(购买频率)和MonetaryValue(购买金额)。接着,讨论了如何通过阈值划分将用户分为金牌、银牌和普通客户。然后,针对K-Means算法,进行了数据预处理,包括log转换和归一化,以确定最佳的K值。最后,通过簇内离差平方和拐点法确定了K值为6。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、项目背景

在本项目中,我们基于用户购买数据(Transaction Data)做用户的分群,使用的方法一次是RFM模型和K-means算法。
数据来源:http://archive.ics.uci.edu/ml/datasets/online+retail

二、数据的读取

import pandas as pd
import numpy as np
import datetime as dt
# 读取transaction数据, 数据有些大,读取会需要点时间
df = pd.read_excel('OnlineClean.xlsx')
df.head()

在这里插入图片描述

df.shape
(397884, 8)

对于上面的数据稍作解释一下:

  • InvoiceNo: 每一次的Transaction的unique number. 比如你去了超市,买了5件东西,那这些东西就构成一个InvoiceNo
  • StockCode: 表示的是每一件商品的unique number.
  • Description: 商品的描述
  • Quantity: 购买的数量
  • InvoiceDate: Transaction的时间
  • UnitPrice: 每一件商品的价格
  • CustomerID: 用户ID
  • Country: 国家
df.dtypes
InvoiceNo               int64
StockCode              object
Description            object
Quantity                int64
InvoiceDate    datetime64[ns]
UnitPrice             float64
CustomerID              int64
Country                object

二、数据清洗

# 对于时间属性做个转换,只保留年月日
df['InvoiceDate'] = df['InvoiceDate'].dt.date
df.dtypes
InvoiceNo        int64
StockCode       object
Description     object
Quantity         int64
InvoiceDate     object
UnitPrice      float64
CustomerID       int64
Country         object
dtype: object
df.head()

在这里插入图片描述

# 一般情况下,在使用RFM模型的时候,一般需要过去一年的Transaction数据。为了提取过去一年的数据,我们首先对时间做一下处理。 
print('Min date = {}, Max date = {}'.format(min(df.InvoiceDate), max(df.InvoiceDate)))
Min date = 2010-12-01, Max date = 2011-12-09

从以上的输出可以看到,时间比一年稍微多点。所以我们就把2010-12-01到 2010-12-09忽略不计,从 2010-12-10开始算到2011-12-09, 这样就刚好一年的时间。

# 只考虑大于2010-12-09
df = df[df['InvoiceDate']>dt.date(2010,12,9)]
df.head()

在这里插入图片描述

# 创建一个新的变量,叫做snapshot_date。 举个例子,我们已经有了过去一年的历史数据,然后基于历史数据要计算出R, F, M。 
# 如果历史数据是昨天为止的,那当我们计算R(recency)的时候, 就需要今天 - 历史。 这样一来,今天其实就是昨天日期+1就可以了,这个
# 我们把它叫作snapshot_date
snapshot_date = max(df.InvoiceDate) + dt.timedelta(days=1)
snapshot_date
datetime.date(2011, 12, 10)
# 我们再创建一个column叫作TotalSum, 来表示购买某一种商品的总额
df['TotalSum'] = df['Quantity'] * df['UnitPrice']
df.head()

在这里插入图片描述
到目前为止数据方面的整理工作已经就绪。接下来呢,需要来计算R,F,M的值了。 为了计算R,F,M需要对每一位Customer做Aggregation操作,这部分可以通过df.

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值