【笔记】电商RFM模型

一、理论基础

(1)RFM模型

R:Recency 最近一次购买–付款日期-按照买家昵称 groupby 取付款日期的信息

F:Frequency 购买频次-付款日期-按照买家昵称 groupby 取付款曰期次数

M:Monetary 购买金额-实付金额-按照买家昵称 groupby 取实付金额的求和

RFM标签
重要价值客户
重要保持客户
重要发展客户
重要挽留客户
一般价值客户
一般保持客户
一般发展客户
一般挽留客户

(2)问题:客户往往是聚集程度比较高的(从可视化角度),不会均质的分布在8个维度里。

(3)背景:业务方/需求方可能需要我们对应的对客户进行分群,以对应他们准备的3种不同的礼包/优惠券/套餐/推荐,我们作为数据分析师,需要根据客户的一些特征进行分群。

(4)算法思路:

  1. 分类:事先需要准备训练数据集,将训练数据集只保留特征,并提报给业务/需求方由较为有经验的资深员工,进行标签标注。划定哪些客户为第一类,哪些第二类,哪些第三类。标注结束后,用以训练模型并且预测其他客户的分类。

  2. 聚类:使用R/F/M三个特征进行kmeans建模,直接给定k值为3,完成三种不同客户类群的直接划分。


二、导入数据并查看

(1)总览信息查看

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

data = pd.read_excel('data/电商用户价值挖掘.xlsx')
data.head()
data.info()
data.isnull().mean()

在这里插入图片描述

在这里插入图片描述

城市有空值,但不影响RFM模型。

(2)分别查看各有用字段

① 查看数据的时间周期

# 最早的时间为min
data['付款日期'].min()  # Timestamp('2019-01-01 00:17:59')
# 最晚的时间为max
data['付款日期'].max()  # Timestamp('2019-06-30 22:46:22.511000')

② 查看订单状态

data['订单状态'].value_counts()
"""
交易成功                 27793
付款以后用户退款成功,交易自动关闭     1040
Name: 订单状态, dtype: int64
"""

(3)进行一些简单的预处理

① 扣除退款数据

data = data[data['订单状态'] == '交易成功']

② 去重

# drop_duplicate(subset=[])
# duplicated
data.drop_duplicates(inplace=True)

三、构建RFM模型


3.1 获取RFM数据

(1)添加距窗口日期结束天数列

# 构造R值
data['R_'] = (end_date - data['付款日期']).dt.days

(2)求出RFM

# 只取需要的列
users_df = data[['买家昵称', 'R_', '付款日期', '实付金额']].copy()
# groupby一次性求出RFM
rfm_df = users_df.groupby('买家昵称').agg({'R_':'min', '付款日期':'count', '实付金额':'sum'})
# 改名
rfm_df.columns = ['R', 'F', 'M']
# 查看
rfm_df.head()

在这里插入图片描述

(3)数据处理

① 观察描述性统计信息

rfm_df.describe([0.01, 0.99]).T

在这里插入图片描述

② F大于3的都归为4

rfm_df['F'][rfm_df['F']>3] = 4

③ M大于500的都归为500

rfm_df['M'][rfm_df['M']>500] = 500

3.2 建立统计学的RFM模型

(1)制作阈值,打上标签

# 制作阈值
R_threshold = rfm_df['R'].median()
rfm_df.loc[:,'R_SCORE'] = rfm_df['R'].map(lambda x: x > R_threshold)

F_threshold = rfm_df['F'].median()
rfm_df.loc[:,'F_SCORE'] = rfm_df['F'].map(lambda x: x > F_threshold)

M_threshold = rfm_df['M'].median()
rfm_df.loc[:,'M_SCORE'] = rfm_df['M'].map(lambda x: x > M_threshold)

(2)3种标签汇总

# 汇总的标签
rfm_df['SCORE'] = rfm_df['R_SCORE'] * 100 + rfm_df['F_SCORE'] * 10 + rfm_df['M_SCORE'] * 1

(3)映射成文字标签

# 基于最后score进行映射,完成对应的代码和对应的分类
user_cate_dict = {
    1: '重要挽留客户',
    111: '重要价值客户',
    11: '重要保持客户',
    101: '重要发展客户',
    0: '一般挽留客户',
    110: '一般价值客户',
    10: '一般保持客户',
    100: '一般发展客户'
}
rfm_df['user_cate'] = rfm_df['SCORE'].map(user_cate_dict)

(4)画饼图

plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False

plt.figure(figsize=(12,8))
plt.pie(rfm_df['user_cate'].value_counts(),labels=rfm_df['user_cate'].value_counts().index,autopct='%.1f%%')

plt.show()

在这里插入图片描述


3.3 KMeans聚类分群

(1)数据预处理

# 数据预处理 标准化
from sklearn.preprocessing import StandardScaler

# 标准化 实例化 - 转化
ss = StandardScaler()
rfm = ss.fit_transform(rfm_df[['R', 'F', 'M']])

# 重新创建DataFrame对象
rfm = pd.DataFrame(data=rfm, columns=['R', 'F', 'M'])

(2)建模分群并评分

from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_samples, silhouette_score

# 使用KMeans进行建模
kmeans = KMeans(n_clusters=4)
# kmeans也可以先fit 再transform
kmeans.fit(rfm)
# 相当于predict
labels = kmeans.labels_
# 使用轮廓系数查看总体评分
silhouette_score(rfm, labels)

# 如何去找一个聚类的代表(聚类中心)
centers = kmeans.cluster_centers_

(3)画饼图

# 画图
plt.figure(figsize=(12,8))
plt.pie(pd.Series(labels).value_counts(),labels=pd.Series(labels).value_counts().index,autopct='%.1f%%')

plt.show()

在这里插入图片描述


  • 6
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sprite.Nym

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值