Pandas-RFM会员价值度模型

news2025/1/10 14:42:20

文章目录

  • 一. 会员价值度模型介绍
  • 二. RFM计算与显示
    • 1. 背景
    • 2. 技术点
    • 3. 数据
    • 4. `代码`
      • ① 导入模块
      • ② 读取数据
      • ③ `数据预处理`
        • Ⅰ. 数据清洗, 即: 删除缺失值, 去掉异常值.
        • Ⅱ. 查看清洗后的数据
        • Ⅲ. 把前四年的数据, 拼接到一起
      • ④ 计算RFM的原始值
      • ⑤ 确定RFM划分区间
      • ⑥ RFM计算过程
      • ⑦ RFM图形展示
    • 5. 结论
      • ① 基于图形的交互分析
      • ② RFM用户特征分析
    • 6. 应用
    • 7. 注意点
  • 三. 保存dataframe数据
    • 1. 将数据保存到Excel
    • 2. 将数据保存到mysql数据库

一. 会员价值度模型介绍

  • 会员价值度用来评估用户的价值情况,是区分会员价值的重要模型和参考依据,也是衡量不同营销效果的关键指标之一。

  • 价值度模型一般基于交易行为产生,衡量的是有实体转化价值的行为。常用的价值度模型是RFM

  • RFM模型是根据会员

    • 最近一次购买时间R(Recency)
    • 购买频率F(Frequency)
    • 购买金额M(Monetary)计算得出RFM得分
    • 通过这3个维度来评估客户的订单活跃价值,常用来做客户分群或价值区分
    • RFM模型基于一个固定时间点来做模型分析,不同时间计算的的RFM结果可能不一样
RFM用户类别
重要价值用户
重要发展用户
重要保持用户
重要挽留用户
一般价值用户
一般发展用户
一般保持用户
一般挽留用户
  • RFM模型的基本实现过程:

    • 设置要做计算时的截止时间节点(例如2017-5-30),用来做基于该时间的数据选取和计算。
    • 在会员数据库中,以今天为时间界限向前推固定周期(例如1年),得到包含每个会员的会员ID、订单时间、订单金额的原始数据集。一个会员可能会产生多条订单记录。
    • 数据预计算。从订单时间中找到各个会员距离截止时间节点最近的订单时间作为最近购买时间;以会员ID为维度统计每个用户的订单数量作为购买频率;将用户多个订单的订单金额求和得到总订单金额。由此得到R、F、M三个原始数据量。
    • R、F、M分区。对于F和M变量来讲,值越大代表购买频率越高、订单金额越高;但对R来讲,值越小代表离截止时间节点越近,因此值越好。对R、F、M分别使用五分位法做数据分区(三分位也可以,分位数越多划分得越详细)。需要注意的是,对于R来讲需要倒过来划分,离截止时间越近的值划分越大。这样就得到每个用户的R、F、M三个变量的分位数值。
    • 将3个值组合或相加得到总的RFM得分。对于RFM总得分的计算有两种方式,一种是直接将3个值拼接到一起,例如RFM得分为312、333、132;另一种是直接将3个值相加求得一个新的汇总值,例如RFM得分为6、9、6。
  • Excel实现RFM划分案例

    • 以某电商公司为例

    • R:例如:正常新用户注册1周内交易,7天是重要的值,日用品采购周期是1个月,30天是重要的值

    • F:例如:1次购买,2次购买,3次购买,4~10次,10次以上

    • M:例如:客单价300,热销单品价格240 等

  • 常见的确定RFM划分区间的套路

    • 业务实际判断
    • 平均值或中位数
    • 二八法则
  • 提取用户最近一次的交易时间,算出距离计算时间的差值

    • 获取当前时间=TODAY()
      在这里插入图片描述

    • 计算时间间隔
      在这里插入图片描述

    • 根据天数长短赋予对应的R值,R值由我们自定,时间间隔越短R值越高

      • =IF(D2>60,1,IF(D2>30,2,IF(D2>14,3,IF(D2>7,4,5))))
        在这里插入图片描述
    • 从历史数据中取出所有用户的购买次数,根据次数多少赋予对应的F分值;购买次数越多、F值越大

      • =IF(F2>1000,5,IF(F2>500,4,IF(F2>300,3,IF(F2>230,2,1))))
        在这里插入图片描述
    • 分别求出RFM的中值,例如中位数,用中值和用户的实际值进行比较,高于中值的为高,否则为低
      在这里插入图片描述

  • 在得到不同会员的RFM之后,根据步骤⑤产生的两种结果有两种应用思路

    • 思路1:基于3个维度值做用户群体划分和解读,对用户的价值度做分析
      • 比如,RFM得分为212的会员的F是1,往往购买频率较低,那就可以针对购买频率低的客户应定期发送促销活动邮件
      • 比如,RFM得分为321的会员虽然购买频率高但是订单金额低等,这些客户往往具有较高的购买黏性,可以考虑通过关联或搭配销售的方式提升订单金额。
    • 思路2:基于RFM的汇总得分评估所有会员的价值度,并可以做价值度排名。同时,该得分还可以作为输入维度与其他维度一起作为其他数据分析和挖掘模型的输入变量,为分析建模提供基础。
  • RFM小结:

    • R就是距离自定义的时间点最近一次购买的时间间隔、间隔越小得分越高
    • F就是自定义的时间范围内购买频率、次数越多得分越高
    • M就是自定义的时间范围内购买总金额,总额越大得分越高
    • RFM的区间和其对应的得分由我们自定义

二. RFM计算与显示

1. 背景

  • 用户价值细分是了解用户价值度的重要途径,针对交易数据分析的常用模型是RFM模型

  • 业务对RFM的结果要求

    • 对用户做分组
    • 将每个组的用户特征概括和总结出来,便于后续精细化运营不同的客户群体,且根据不同群体做定制化或差异性的营销和关怀
  • 规划目标将RFM的3个维度分别做3个区间的离散化

    • 用户群体最大有3×3×3=27个
    • 划分区间过多则不利于用户群体的拆分
    • 区间过少则可能导致每个特征上的用户区分不显著
  • 交付结果

    • 给业务部门做运营的分析结果要导出为Excel文件,用于做后续分析和二次加工使用
    • RFM的结果还会供其他模型的建模使用,RFM本身的结果可以作为新的局部性特征,因此数据的输出需要有本地文件和写数据库两种方式
  • 数据说明

    • 案例的数据集为 data/sales.xlsx
    • 选择近4年订单数据,从不同的年份对比不同时间下各个分组的绝对值变化情况,方便了解会员的波动
    • 程序输出RFM得分数据写入本地文件sales_rfm_score.xlsx和MySQL数据库sales_rfm_score表中

2. 技术点

  • 用到了6个库:time、numpy、pandas、pymysql、sklearn和pyecharts。
    • time:用来记录插入数据库时的当前日期
    • numpy:用来做基本数据处理等
    • pandas:有关日期转换、数据格式化处理、主要RFM计算过程等
    • pymysql:数据库连接工具,读写MySQL数据库。
    • sklearn:使用其中的随机森林库
    • pyecharts:展示3D柱形图

3. 数据

在这里插入图片描述

  • 案例数据是某企业从2015年到2018年共4年的用户订单抽样数据,数据来源于销售系统

  • 数据在Excel中包含5个sheet,前4个sheet以年份为单位存储为单个sheet中,最后一张会员等级表为用户的等级表

  • 前4张表的数据概要如下。

    • 特征变量数:4
  • 数据记录数:30774/41278/50839/81349

    • 是否有NA值:有
  • 是否有异常值:有

  • 具体数据特征如下(前4张表的数据字段说明):

    • 会员ID:每个会员的ID唯一,由纯数字组成,整型
    • 提交日期:订单日提交日期
    • 订单号:订单ID,每个订单的ID唯一,由纯数字组成,整型
    • 订单金额:订单金额,浮点型数据
  • 会员等级表中是所有会员的会员ID对应会员等级的情况,包括以下两个字段

    • 会员ID:该ID可与前面的订单表中的会员ID关联
    • 会员等级:会员等级以数字区分,数字越大,级别越高

4. 代码

① 导入模块

import time  # 时间库
import numpy as np  # numpy库
import pandas as pd  # pandas库
from pyecharts.charts import Bar3D # 3D柱形图

② 读取数据

  • 加载数据

    # 1. 定义变量, 记录表名.
    sheet_names = ['2015', '2016', '2017', '2018', '会员等级']
    
    # 2. 读取5个excel表中的数据.
    sheet_datas = pd.read_excel('data/sales.xlsx', sheet_name=sheet_names)
    sheet_datas  # 共计: 154385行, 2列. 
    

    在这里插入图片描述

    type(sheet_datas)  # 查看变量类型: dict,   结果是字典形式: 键: Excel表格名, 值: 该表格的数据.
    
      dict
    
    # 3. 查看下 2015年的数据
    sheet_datas['2015']
    

    在这里插入图片描述

  • 查看数据基本情况

    # 4. 遍历, 查看数据(每个表格)的基本情况
    for i in sheet_names:
        print(f'==================" + {i} + "======================')
        print(sheet_datas[i].head())
        print('==================" + info + "======================')
        print(sheet_datas[i].info())
        print('==================" + describe + "======================')
        print(sheet_datas[i].describe())
    
      ==================" + 2015 + "======================
                会员ID         订单号       提交日期    订单金额
      0  15278002468  3000304681 2015-01-01   499.0
      1  39236378972  3000305791 2015-01-01  2588.0
      2  38722039578  3000641787 2015-01-01   498.0
      3  11049640063  3000798913 2015-01-01  1572.0
      4  35038752292  3000821546 2015-01-01    10.1
      ==================" + info + "======================
      <class 'pandas.core.frame.DataFrame'>
      RangeIndex: 30774 entries, 0 to 30773
      Data columns (total 4 columns):
       #   Column  Non-Null Count  Dtype         
      ---  ------  --------------  -----         
       0   会员ID    30774 non-null  int64         
       1   订单号     30774 non-null  int64         
       2   提交日期    30774 non-null  datetime64[ns]
       3   订单金额    30774 non-null  float64       
      dtypes: datetime64[ns](1), float64(1), int64(2)
      memory usage: 961.8 KB
      None
      ==================" + describe + "======================
                     会员ID           订单号           订单金额
      count  3.077400e+04  3.077400e+04   30774.000000
      mean   2.918779e+10  4.020414e+09     960.991161
      std    1.385333e+10  2.630510e+08    2068.107231
      min    2.670000e+02  3.000305e+09       0.500000
      25%    1.944122e+10  3.885510e+09      59.000000
      50%    3.746545e+10  4.117491e+09     139.000000
      75%    3.923593e+10  4.234882e+09     899.000000
      max    3.954613e+10  4.282025e+09  111750.000000
      ==================" + 2016 + "======================
                会员ID         订单号       提交日期    订单金额
      0  39288120141  4282025766 2016-01-01    76.0
      1  39293812118  4282037929 2016-01-01  7599.0
      2  27596340905  4282038740 2016-01-01   802.0
      3  15111475509  4282043819 2016-01-01    65.0
      4  38896594001  4282051044 2016-01-01    95.0
      ==================" + info + "======================
      <class 'pandas.core.frame.DataFrame'>
      RangeIndex: 41278 entries, 0 to 41277
      Data columns (total 4 columns):
       #   Column  Non-Null Count  Dtype         
      ---  ------  --------------  -----         
       0   会员ID    41278 non-null  int64         
       1   订单号     41278 non-null  int64         
       2   提交日期    41278 non-null  datetime64[ns]
       3   订单金额    41277 non-null  float64       
      dtypes: datetime64[ns](1), float64(1), int64(2)
      memory usage: 1.3 MB
      None
      ==================" + describe + "======================
                     会员ID           订单号           订单金额
      count  4.127800e+04  4.127800e+04   41277.000000
      mean   2.908415e+10  4.313583e+09     957.106694
      std    1.389468e+10  1.094572e+07    2478.560036
      min    8.100000e+01  4.282026e+09       0.100000
      25%    1.934990e+10  4.309457e+09      59.000000
      50%    3.730339e+10  4.317545e+09     147.000000
      75%    3.923182e+10  4.321132e+09     888.000000
      max    3.954554e+10  4.324911e+09  174900.000000
      ==================" + 2017 + "======================
                会员ID         订单号       提交日期    订单金额
      0  38765290840  4324911135 2017-01-01  1799.0
      1  39305832102  4324911213 2017-01-01   369.0
      2  34190994969  4324911251 2017-01-01   189.0
      3  38986333210  4324911283 2017-01-01   169.0
      4      4271359  4324911355 2017-01-01    78.0
      ==================" + info + "======================
      <class 'pandas.core.frame.DataFrame'>
      RangeIndex: 50839 entries, 0 to 50838
      Data columns (total 4 columns):
       #   Column  Non-Null Count  Dtype         
      ---  ------  --------------  -----         
       0   会员ID    50839 non-null  int64         
       1   订单号     50839 non-null  int64         
       2   提交日期    50839 non-null  datetime64[ns]
       3   订单金额    50839 non-null  float64       
      dtypes: datetime64[ns](1), float64(1), int64(2)
      memory usage: 1.6 MB
      None
      ==================" + describe + "======================
                     会员ID           订单号           订单金额
      count  5.083900e+04  5.083900e+04   50839.000000
      mean   2.882368e+10  4.332466e+09     963.587872
      std    1.409416e+10  4.404350e+06    2178.727261
      min    2.780000e+02  4.324911e+09       0.300000
      25%    1.869274e+10  4.328415e+09      59.000000
      50%    3.688044e+10  4.331989e+09     149.000000
      75%    3.923020e+10  4.337515e+09     898.000000
      max    3.954554e+10  4.338764e+09  123609.000000
      ==================" + 2018 + "======================
                会员ID         订单号       提交日期    订单金额
      0  39229691808  4338764262 2018-01-01  3646.0
      1  39293668916  4338764363 2018-01-01  3999.0
      2  35059646224  4338764376 2018-01-01    10.1
      3      1084397  4338770013 2018-01-01   828.0
      4      3349915  4338770121 2018-01-01  3758.0
      ==================" + info + "======================
      <class 'pandas.core.frame.DataFrame'>
      RangeIndex: 81349 entries, 0 to 81348
      Data columns (total 4 columns):
       #   Column  Non-Null Count  Dtype         
      ---  ------  --------------  -----         
       0   会员ID    81349 non-null  int64         
       1   订单号     81349 non-null  int64         
       2   提交日期    81349 non-null  datetime64[ns]
       3   订单金额    81348 non-null  float64       
      dtypes: datetime64[ns](1), float64(1), int64(2)
      memory usage: 2.5 MB
      None
      ==================" + describe + "======================
                     会员ID           订单号           订单金额
      count  8.134900e+04  8.134900e+04   81348.000000
      mean   2.902317e+10  4.348372e+09     966.582792
      std    1.404116e+10  4.183774e+06    2204.969534
      min    2.780000e+02  4.338764e+09       0.000000
      25%    1.902755e+10  4.345654e+09      60.000000
      50%    3.740121e+10  4.349448e+09     149.000000
      75%    3.923380e+10  4.351639e+09     899.000000
      max    3.954614e+10  4.354235e+09  174900.000000
      ==================" + 会员等级 + "======================
                会员ID  会员等级
      0       100090     3
      1  10012905801     1
      2  10012935109     1
      3  10013498043     1
      4  10014087899     4
      ==================" + info + "======================
      <class 'pandas.core.frame.DataFrame'>
      RangeIndex: 154385 entries, 0 to 154384
      Data columns (total 2 columns):
       #   Column  Non-Null Count   Dtype
      ---  ------  --------------   -----
       0   会员ID    154385 non-null  int64
       1   会员等级    154385 non-null  int64
      dtypes: int64(2)
      memory usage: 2.4 MB
      None
      ==================" + describe + "======================
                     会员ID           会员等级
      count  1.543850e+05  154385.000000
      mean   2.980055e+10       2.259701
      std    1.365654e+10       1.346408
      min    8.100000e+01       1.000000
      25%    2.213894e+10       1.000000
      50%    3.833022e+10       2.000000
      75%    3.927932e+10       3.000000
      max    3.954614e+10       5.000000
    
  • 结果说明

    • 每个sheet中的数据都能正常读取,无任何错误
    • 日期列(提交日期)已经被自动识别为日期格式,后期不必转换
    • 订单金额的分布是不均匀的,里面有明显的极值
      • 例如2016年的数据中,最大值为174900,最小值仅为0.1
      • 极大极小值相差过大,数据会受极值影响
    • 订单金额中的最小值包括0、0.1这样的金额,可能为非正常订单,与业务方沟通后确认
      • 最大值的订单金额有效,通常是客户一次性购买多个大型商品
      • 而订单金额为0.1元这类使用优惠券支付的订单,没有实际意义
      • 除此0、0.1这样的金额之外,所有低于1元的订单均有这个问题,因此需要在后续处理中去掉
    • 有的表中存在缺失值记录,但数量不多,选择丢弃或填充均可

数据预处理

Ⅰ. 数据清洗, 即: 删除缺失值, 去掉异常值.
# 1.获取表名, 即: 2015 ~ 2018, 不要最后的"会员等级"
for i in sheet_names[:-1]:
    # 2. 删除缺失值.
    sheet_datas[i] = sheet_datas[i].dropna()  # 删除缺失值.
    # 3. 去掉订单金额小于1的数据.
    sheet_datas[i] = sheet_datas[i][sheet_datas[i]['订单金额'] > 1]
    # 4. 创建新的字段, 用来记录每个sheet最后一笔消费的时间.
    # 其实就是每年的 12月31日
    sheet_datas[i]['max_year_date'] = sheet_datas[i]['提交日期'].max()  
sheet_datas['2015']

在这里插入图片描述

Ⅱ. 查看清洗后的数据
# 1. 遍历表格名列表, 获取到每个表格名
for i in sheet_names:
    # 2. 查看是否还有 空值 数据.
    print(sheet_datas[i].isnull().sum())   # 统计空值数量, 都是0.
    # 3. 查看下每个表格, 订单金额列, 最小值都是 1元 以上的价格.
    print(sheet_datas[i].describe())
会员ID             0
订单号              0
提交日期             0
订单金额             0
max_year_date    0
dtype: int64
               会员ID           订单号           订单金额
count  3.057400e+04  3.057400e+04   30574.000000
mean   2.921327e+10  4.020442e+09     967.270965
std    1.384598e+10  2.630518e+08    2073.397861
min    2.670000e+02  3.000305e+09       1.500000
25%    1.961657e+10  3.885746e+09      59.700000
50%    3.754532e+10  4.117491e+09     142.000000
75%    3.923630e+10  4.234853e+09     899.000000
max    3.954613e+10  4.282025e+09  111750.000000
会员ID             0
订单号              0
提交日期             0
订单金额             0
max_year_date    0
dtype: int64
               会员ID           订单号           订单金额
count  4.100100e+04  4.100100e+04   41001.000000
mean   2.910772e+10  4.313582e+09     963.542790
std    1.388571e+10  1.094832e+07    2485.642632
min    8.100000e+01  4.282026e+09       1.500000
25%    1.943201e+10  4.309457e+09      65.000000
50%    3.740237e+10  4.317545e+09     149.000000
75%    3.923184e+10  4.321133e+09     898.000000
max    3.954554e+10  4.324911e+09  174900.000000
会员ID             0
订单号              0
提交日期             0
订单金额             0
max_year_date    0
dtype: int64
               会员ID           订单号           订单金额
count  5.045100e+04  5.045100e+04   50451.000000
mean   2.884214e+10  4.332469e+09     970.990793
std    1.408666e+10  4.404894e+06    2185.446995
min    2.780000e+02  4.324911e+09       1.500000
25%    1.870549e+10  4.328416e+09      65.000000
50%    3.692362e+10  4.331989e+09     155.000000
75%    3.923070e+10  4.337528e+09     899.000000
max    3.954554e+10  4.338764e+09  123609.000000
会员ID             0
订单号              0
提交日期             0
订单金额             0
max_year_date    0
dtype: int64
               会员ID           订单号           订单金额
count  8.080100e+04  8.080100e+04   80801.000000
mean   2.905571e+10  4.348372e+09     973.119528
std    1.402185e+10  4.185250e+06    2210.983968
min    2.780000e+02  4.338764e+09       1.500000
25%    1.919622e+10  4.345654e+09      68.000000
50%    3.749326e+10  4.349448e+09     151.700000
75%    3.923398e+10  4.351641e+09     925.000000
max    3.954614e+10  4.354235e+09  174900.000000
会员ID    0
会员等级    0
dtype: int64
               会员ID           会员等级
count  1.543850e+05  154385.000000
mean   2.980055e+10       2.259701
std    1.365654e+10       1.346408
min    8.100000e+01       1.000000
25%    2.213894e+10       1.000000
50%    3.833022e+10       2.000000
75%    3.927932e+10       3.000000
max    3.954614e+10       5.000000
Ⅲ. 把前四年的数据, 拼接到一起
# 1. 把前四年的数据, 拼接到一起.
# sheet_datas.values() 字典的values()方法, 用于获取字典中所有的值(每个值, 都是1个df对象, 对应1个sheet表格)
# list(sheet_datas.values())        把上述的数据, 转成 列表形式
# list(sheet_datas.values())[0:-1]  获取到除了最后一张表(会员登记表)的所有数据.
# pd.concat()                       把前四年的数据(4个df对象), 拼接到一起.
data_merge = pd.concat(list(sheet_datas.values())[0:-1])
data_merge

在这里插入图片描述

# 2. 验证下上述的数据, 看下每年具体多少条数据.
data_merge['max_year_date'].value_counts()
2018-12-31    80801
2017-12-31    50451
2016-12-31    41001
2015-12-31    30574
Name: max_year_date, dtype: int64
# 3. 给拼接后的数据, 新增一列 year, 表示: 数据的年份.
data_merge['year'] = data_merge['提交日期'].dt.year

在这里插入图片描述

# 4. 给拼接后的数据, 新增一列, 表示: 提交订单的间隔时间.  
# 结果是: timedelta64[ns]类型, 即: 364 days 这样的数据.
data_merge['date_interval'] = data_merge['max_year_date'] - data_merge['提交日期'] 

在这里插入图片描述

# 5. 去掉 date_interval列的 日期单位, 从 364 days => 364
# 结果是: int64类型, 即: 364 这样的数据.
data_merge['date_interval'] = data_merge['date_interval'].dt.days   

在这里插入图片描述

# 6. 查看处理后的数据
data_merge.info()

在这里插入图片描述

  • 代码说明:
  • 汇总所有数据: 将4年的数据使用pd.concat方法合并为一个完整的dataframe data_merge,后续的所有计算都能基于同一个dataframe进行,而不用写循环代码段对每个年份的数据单独计算
  • 获取各自年份数据:
    • 先计算各自年份的最大日期与每个行的日期的差,得到日期间隔
    • 再增加一列新的字段,为每个记录行发生的年份,使用data_merge[‘提交日期’].dt.year实现
  • 关于pandas的 datetime类型
    • dt是pandas中Series时间序列datetime类属性的访问对象
    • 除了代码中用到的year外,还包括:date、dayofweek、dayofyear、days_in_month、freq、days、hour、microsecond、minute、month、quarter、second、time、week、weekday、weekday_name、weekofyear等
  • 转换日期间隔为数字:通过 .dt.days 方式获取时间差列中的间隔天数数字

④ 计算RFM的原始值

分组后聚合计算

# 基于year、会员ID列做分组之后,分别对date_interval、提交日期、订单金额做不同的运算
# as_index=False表示重置索引

# 1. 根据年份, 会员id分组, 计算用户 最近一次购买的日期, 订单总数, 订单总金额.
rfm_gb = data_merge.groupby(['year', '会员ID'], as_index=False).agg({
    # R 求分组后date_interval列中最小值:计算当年该会员最后一次订单距离年末12月31日的间隔天数
    'date_interval': 'min', 
    # F 订单频率,计算当年该会员一共消费多少次,对订单号列进行count计算
    '订单号': 'count',
    # M 计算订单总金额:计算当年该会员一共消费多少钱
    '订单金额': 'sum' 
})

在这里插入图片描述

# 2. 修改列名
rfm_gb.columns = ['year', '会员ID', 'r', 'f', 'm']

在这里插入图片描述

rfm_gb.describe()

在这里插入图片描述

  • 代码说明:
  • 上面代码框中的第一行代码,是基于年份和会员ID,分别做RFM原始值的聚合计算
  • 这里使用groupby分组,以year和会员ID为联合主键,设置as_index=False意味着year和会员ID不作为index列,而是普通的数据框结果列。后面的agg方法实际上是一个“批量”聚合功能的函数,它实现了对date_interval、提交日期、订单金额三列分别以min、count、sum做聚合计算的功能。否则,我们需要分别写3条goupby来实现3个聚合计算

⑤ 确定RFM划分区间

在做RFM划分时,基本逻辑是分别对R、F、M做离散化操作,然后再计算RFM。而离散化本身有多种方法可选,由于我们要对数据做RFM离散化,因此需要先看下数据的基本分布状态

查看数据分布

# rfm_gb.iloc[:,2:]表示只选择rfm_gb的rfm三类数据,并返回新df,
# 再做.describe().T操作,查看数据分布情况
rfm_gb.iloc[:, 2:].describe().T

在这里插入图片描述

⑥ RFM计算过程

⑦ RFM图形展示

5. 结论

① 基于图形的交互分析

② RFM用户特征分析

6. 应用

7. 注意点

三. 保存dataframe数据

1. 将数据保存到Excel

2. 将数据保存到mysql数据库

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2274390.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【理论】测试框架体系TDD、BDD、ATDD、DDT介绍

一、测试框架是什么 测试框架是一组用于创建和设计测试用例的指南或规则。框架由旨在帮助 QA 专业人员更有效地测试的实践和工具的组合组成。 这些指南可能包括编码标准、测试数据处理方法、对象存储库、存储测试结果的过程或有关如何访问外部资源的信息。 A testing framewo…

FreeU: Free Lunch in Diffusion U-Net 笔记

FreeU: Free Lunch in Diffusion U-Net 摘要 作者研究了 U-Net 架构对去噪过程的关键贡献&#xff0c;并发现其主干部分主要在去噪方面发挥作用&#xff0c;而其跳跃连接主要是向解码器模块引入高频特征&#xff0c;这使得网络忽略了主干部分的语义信息。基于这一发现&#…

JAVA 使用apache poi实现EXCEL文件的输出;apache poi实现标题行的第一个字符为红色;EXCEL设置某几个字符为别的颜色

设置输出文件的列宽&#xff0c;防止文件过于丑陋 Sheet sheet workbook.createSheet(FileConstants.ERROR_FILE_SHEET_NAME); sheet.setColumnWidth(0, 40 * 256); sheet.setColumnWidth(1, 20 * 256); sheet.setColumnWidth(2, 20 * 256); sheet.setColumnWidth(3, 20 * 25…

【STM32】无源蜂鸣器播放音乐《千与千寻》,HAL库

目录 一、工程链接 二、简单介绍 主要特点&#xff1a; 应用&#xff1a; 驱动电路&#xff1a; 三、原理图 四、cubeMX配置 时钟配置 五、keil配置 六、驱动编写 演奏函数 主函数编写 七、效果展示 八、驱动附录 music.h music.c 一、工程链接 STM32无源蜂鸣…

在 Vue 3 集成 e签宝电子合同签署功能

实现 Vue 3 e签宝电子合同签署功能&#xff0c;需要使用 e签宝提供的实际 SDK 或 API。 e签宝通常提供针对不同平台&#xff08;如 Web、Android、iOS&#xff09;的 SDK&#xff0c;而 Web 端一般通过 WebView 或直接使用嵌入式 iframe 来加载合同签署页面。 下面举个 &…

04、Redis深入数据结构

一、简单动态字符串SDS 无论是Redis中的key还是value&#xff0c;其基础数据类型都是字符串。如&#xff0c;Hash型value的field与value的类型&#xff0c;List型&#xff0c;Set型&#xff0c;ZSet型value的元素的类型等都是字符串。redis没有使用传统C中的字符串而是自定义了…

如何用Python编程实现自动整理XML发票文件

传统手工整理发票耗时费力且易出错&#xff0c;而 XML 格式发票因其结构化、标准化的特点&#xff0c;为实现发票的自动化整理与保存提供了可能。本文将详细探讨用python来编程实现对 XML 格式的发票进行自动整理。 一、XML 格式发票的特点 结构化数据&#xff1a;XML 格式发票…

Linux——修改USB网卡设备节点名称

修改驱动&#xff1a; 测试&#xff1a; 参考资料&#xff1a; https://blog.csdn.net/ablexu2018/article/details/144868950

(STM32笔记)十二、DMA的基础知识与用法 第三部分

我用的是正点的STM32F103来进行学习&#xff0c;板子和教程是野火的指南者。 之后的这个系列笔记开头未标明的话&#xff0c;用的也是这个板子和教程。 DMA的基础知识与用法 三、DMA程序验证1、DMA 存储器到存储器模式实验&#xff08;1&#xff09;DMA结构体解释&#xff08;2…

论文笔记(六十一)Implicit Behavioral Cloning

Implicit Behavioral Cloning 文章概括摘要1 引言2 背景&#xff1a;隐式模型的训练与推理3 隐式模型与显式模型的有趣属性4 policy学习成果5 理论见解&#xff1a;隐式模型的通用逼近性6 相关工作7 结论 文章概括 引用&#xff1a; inproceedings{florence2022implicit,titl…

高斯函数Gaussian绘制matlab

高斯 约翰卡尔弗里德里希高斯&#xff0c;&#xff08;德语&#xff1a;Johann Carl Friedrich Gau&#xff0c;英语&#xff1a;Gauss&#xff0c;拉丁语&#xff1a;Carolus Fridericus Gauss&#xff09;1777年4月30日–1855年2月23日&#xff0c;德国著名数学家、物理学家…

vue的路由守卫逻辑处理不当导致部署在nginx上无法捕捉后端异步响应消息等问题

近期对前端的路由卫士有了更多的认识。 何为路由守卫&#xff1f;这可能是一种约定俗成的名称。就是VUE中的自定义函数&#xff0c;用来处理路由跳转。 import { createRouter, createWebHashHistory } from "vue-router";const router createRouter({history: cr…

如何在 Ubuntu 22.04 上使用 LEMP 安装 WordPress 教程

简介&#xff1a; 本教程旨在指导你如何在 Ubuntu 22.04 上使用 LEMP 栈安装 WordPress。 WordPress 是一个用 PHP 编写的开源内容管理系统。LEMP 栈是 Linux&#xff0c;NGINX&#xff0c;MySQL 和 PHP 的缩写。WordPress 非常用户友好&#xff0c;并提供了多种选项&#xff…

PySide6基于QSlider实现QDoubleSlider

我在写小工具的时候&#xff0c;需要一个支持小数的滑动条。 我QSpinBox都找到了QDoubleSpinBox&#xff0c;QSlider愣是没找到对应的东西。 网上有好多对QSlider封装实现QDoubleSlider的文章。 似乎Qt真的没有这个东西&#xff0c;需要我们自行实现。 于是我也封装了一个&…

升级 Spring Boot 3 配置讲解 —— 支持断点传输的文件上传和下载功能

学会这款 &#x1f525;全新设计的 Java 脚手架 &#xff0c;从此面试不再怕&#xff01; 在现代 Web 应用中&#xff0c;文件上传和下载是非常常见的需求。然而&#xff0c;当文件较大时&#xff0c;传统的上传下载方式可能会遇到网络不稳定或传输中断的问题。为了解决这些问题…

Backend - C# EF Core 执行迁移 Migrate

目录 一、创建Postgre数据库 二、安装包 &#xff08;一&#xff09;查看是否存在该安装包 &#xff08;二&#xff09;安装所需包 三、执行迁移命令 1. 作用 2. 操作位置 3. 执行&#xff08;针对visual studio&#xff09; 查看迁移功能的常用命令&#xff1a; 查看…

KG-CoT:基于知识图谱的大语言模型问答的思维链提示

一些符号定义 知识图谱实体数量&#xff1a; n n n 知识图谱中关系类型数量&#xff1a; m m m 三元组矩阵&#xff1a; M ∈ { 0 , 1 } n n m \textbf{M} \in \{0, 1\}^{n \times n \times m} M∈{0,1}nnm&#xff0c; M i j k 1 M_{ij}^k 1 Mijk​1则说明实体 i i i和实…

HTML+CSS+JS制作中国传统节日主题网站(内附源码,含5个页面)

一、作品介绍 HTMLCSSJS制作一个中国传统节日主题网站&#xff0c;包含首页、节日介绍页、民俗文化页、节日活动页、联系我们页等5个静态页面。其中每个页面都包含一个导航栏、一个主要区域和一个底部区域。 二、页面结构 1. 顶部横幅区 包含传统中国风格的网站标题中国传统…

大模型WebUI:Gradio全解11——Chatbot:融合大模型的多模态聊天机器人(1)

大模型WebUI&#xff1a;Gradio全解11——Chatbots&#xff1a;融合大模型的聊天机器人&#xff08;1&#xff09; 前言本篇摘要11. Chatbot&#xff1a;融合大模型的多模态聊天机器人11.1 gr.ChatInterface()快速创建Chatbot11.1.1 定义聊天函数1. 随机回答“是”或“否”的聊…

springboot + vue+elementUI图片上传流程

1.实现背景 前端上传一张图片&#xff0c;存到后端数据库&#xff0c;并将图片回显到页面上。上传组件使用现成的elementUI的el-upload。、 2.前端页面 <el-uploadclass"upload-demo"action"http://xxxx.xxx.xxx:9090/file/upload" :show-file-list&q…