python聚类分析实现电商用户细分(基于RFM用户价值分析模型)

2021年11月21日 4点热度 0条评论

背景

聚类分析在机器学习领域属于无监督学习的一种,能够根据一些特征对样本数据进行分类。使用聚类分析分完的类具有“类中相似,类间区别”的特点。RFM模型是非常常见的分析用户价值的方法,其核心思想是根据用户的最近购买时间、购买频次、花费金额3个特征来对用户进行分群,针对每个群体采取不同的营销手段。k-means是常用的聚类分析算法之一,基于欧氏距离对样本进行分类。k-means算法运行速度快,能够处理的数据量大,且易于理解。但缺点也很明显,就是算法性能有限,在高维上可能不是最佳选项。在当前动辄上亿的数据量来看,k-means算法是比较好的选择了。还有需要提醒的一点是,一定要结合业务使用算法,任何特征都可能拿来聚类,但是聚类的结果呢,能不能很好的解释和指导业务?如果不能,那么这个算法就没有什么意义。本次使用的数据来源于数据不吹牛公众号,这里也是小打一波广告。
本案例将从一个简单的k-means机器学习模型入手,在介绍聚类算法的同时也简单介绍机器学习的常规步骤。

1、数据概览

首先,我们导入数据,并查看前5行。

import pandas as pd
import numpy as np
df = pd.read_excel(r'F:\数据分析项目\电商数据的RFM模型\RFM\PYTHON-RFM实战数据.xlsx')
df.head(5)


总览数据:

df.info()


数据共有28833行,9列,而且数据非常干净,没有空值,省去了我们处理空值的过程。
根据RFM模型的要求,我们需要的是买家昵称、购买日期、实付金额三个变量。其中购买日期和实付金额用于帮助我们训练模型,买家昵称则让我们确定每个用户所属的类别。

选取交易成功的用户:

df['订单状态'].value_counts()
df = df[df['订单状态'] == '交易成功']


选择我们需要的字段:

data = df[['买家昵称', '付款日期',  '实付金额']]
data.head(5)

有个细节需要注意,订单每一行代表着单个用户的单次购买行为,什么意思呢?如果一个用户在一天内购买了4次,订单表对应记录着4行,而在实际的业务场景中,一个用户在一天内的多次消费行为,应该从整体上看作一次。 ----- 数据不吹牛 小Z

2、特征构建

根据我们的RFM模型,我们需要构建3列数据,这个原始表中是没有直接提供的,需要我们根据原始表的数据来提取。
所以这里需要先提取付款日期数据:

data['paytime'] = pd.to_datetime(data['付款日期'].apply(lambda x:x.date()))
data.head()


根据paytime计算最后一次付款时间距当前的天数(数据引用的背景当前时间是2019-07-01):

# 提取每个用户最近(最大)的购买日期
data_r = data.groupby('买家昵称')['paytime'].max().reset_index()
# 与当前日期相减,取得最近一次购买距当前的天数。
data_r['recency'] = data_r['paytime'].apply(lambda x:(pd.to_datetime('2019-07-01')-x).days)
# 两个日期相减,得到的数据类型是timedelta类型,要进行数值计算,需要提取出天数数字。
data_r.drop('paytime',axis = 1,inplace = True)
data_r.head()


提取购买次数数据:

# 分组聚合,得到每个用户发生于不同日期的购买次数
data_f = data.groupby(['买家昵称','paytime'])['付款日期'].count().reset_index()
data_f = data_f.groupby('买家昵称')['paytime'].count().reset_index()
# 修改列名
data_f.rename({ 'paytime':'frequence'},axis = 1,inplace =