• 【笔记】电商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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    在这里插入图片描述

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

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

    ① 查看数据的时间周期

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

    ② 查看订单状态

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

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

    ① 扣除退款数据

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

    ② 去重

    # drop_duplicate(subset=[])
    # duplicated
    data.drop_duplicates(inplace=True)
    
    • 1
    • 2
    • 3

    三、构建RFM模型


    3.1 获取RFM数据

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

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

    (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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    (3)数据处理

    ① 观察描述性统计信息

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

    在这里插入图片描述

    ② F大于3的都归为4

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

    ③ M大于500的都归为500

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

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    (2)3种标签汇总

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

    (3)映射成文字标签

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

    (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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述


    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'])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    (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_
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    (3)画饼图

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

    在这里插入图片描述


  • 相关阅读:
    Element Plus table formatter函数返回html内容
    Modelsim 使用教程(5)——Analyzing Waveforms
    使用 Nginx 实现 HTTPS 网站设置
    pdf怎么转换成jpg图片?
    数据结构复习
    主备延迟的问题
    阿里云配置ECS实例的IPv6地址,开通公网IPv6
    Linux设置禁止SSH空密码登录
    【学习笔记43】JavaScript的事件
    《Java编程思想》读书笔记(四)
  • 原文地址:https://blog.csdn.net/SpriteNym/article/details/126179452