Pandas-RFM会员价值度模型

文章目录

  • 一. 会员价值度模型介绍
  • 二. 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数据库

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Git 入门指南:如何高效管理你的代码库

文章目录 Git 的介绍安装 Git创建仓库Git 三板斧addcommitpush 冲突问题常用 Git 指令 Git 的介绍 Git 是一个分布式版本控制系统&#xff0c;用于跟踪文件的变化并支持团队协作开发。最初由 Linus Torvalds&#xff08;Linux 操作系统的创始人&#xff09;开发&#xff0c;Gi…

execl条件比较两个sheet每个单元格的值

1.把对比的sheet复制到对比文件中 2.选择首个单元格 3.新建规则 4.选择公式 5.编写公式 A3<>Sheet1!A36.选择差异颜色 7.选择应用范围 $1:$655368.选择应用范围

2025新年源码免费送

2025很开门很开门的源码免费传递。不需要馒头就能获取4套大开门源码。 听泉偷宝&#xff0c;又进来偷我源码啦&#x1f44a;&#x1f44a;&#x1f44a;。欢迎偷源码 &#x1f525;&#x1f525;&#x1f525; 获取免费源码以及更多源码&#xff0c;可以私信联系我 我们常常…

本地LLM部署--Open WebUI(多媒体工具FFMPEG作用)

OpenWebUI 和 FFmpeg 的关系主要体现在 多媒体处理需求 上。OpenWebUI 是一个基于 Web 的接口项目&#xff0c;提供与各种 AI 模型交互的功能&#xff0c;而 FFmpeg 则是一种多媒体处理工具&#xff0c;用于处理音视频数据。二者的关系主要体现为 依赖和功能互补&#xff0c;具…

使用双向链表优化数组操作的性能

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 背景 双向链表的优势 实现方案 性能优化 …

Inno Setup制作安装包,安装给win加环境变量

加 ; 加环境变量&#xff0c;开启&#xff0c;下面一行 ChangesEnvironmentyes 和 ; 加环境变量wbrj变量名&#xff0c;{app}\project\bin变量值&#xff0c;{app}\后接文件名&#xff0c;{app}表示安装路径。下面一行,{olddata};原来的值上拼接 Root: HKLM; Subkey: “SYSTEM\…

积分与签到设计

积分 在交互系统中&#xff0c;可以通过看视频、发评论、点赞、签到等操作获取积分&#xff0c;获取的积分又可以参与排行榜、兑换优惠券等&#xff0c;提高用户使用系统的积极性&#xff0c;实现引流。这些功能在很多项目中都很常见&#xff0c;关于功能的实现我的思路如下。 …

Taro+Vue实现图片裁剪组件

cropper-image-taro-vue3 组件库 介绍 cropper-image-taro-vue3 是一个基于 Vue 3 和 Taro 开发的裁剪工具组件&#xff0c;支持图片裁剪、裁剪框拖动、缩放和输出裁剪后的图片。该组件适用于 Vue 3 和 Taro 环境&#xff0c;可以在网页、小程序等平台中使用。 源码 https:…

AI赋能服装零售:商品计划智能化,化危机为转机

在服装零售这片竞争激烈的战场上&#xff0c;每一个细微的决策都可能成为品牌兴衰的关键。当市场波动、消费者口味变化、供应链挑战接踵而至时&#xff0c;许多品牌往往将危机归咎于外部环境。然而&#xff0c;真相往往更为深刻——“危机不是外部的&#xff0c;而是你的商品计…

Flutter:吸顶效果

在分页中&#xff0c;实现tab吸顶。 TDNavBar的screenAdaptation: true, 开启屏幕适配。 该属性已自动对不同手机状态栏高度进行适配。我们只需关注如何实现吸顶。 view import package:ducafe_ui_core/ducafe_ui_core.dart; import package:flutter/material.dart; import p…

企业级PHP异步RabbitMQ协程版客户端 2.0 正式发布

概述 workerman/rabbitmq 是一个异步RabbitMQ客户端&#xff0c;使用AMQP协议。 RabbitMQ是一个基于AMQP&#xff08;高级消息队列协议&#xff09;实现的开源消息组件&#xff0c;它主要用于在分布式系统中存储和转发消息。RabbitMQ由高性能、高可用以及高扩展性出名的Erlan…

信号弱开启手机Wifi通话,MIUI显示/隐藏5G开关的方法

1.开启手机Wi-Fi通话&#xff0c;提升无信号或弱信号时的通话质量 Wi-Fi 通话(Wi-Fi calling)&#xff0c;又称VoWiFi&#xff0c;是一项名为“ Voice over Wi-Fi ”的服务&#xff0c;它允许手机用户使用他们的智能手机使用 Wi-Fi网络拨打电话&#xff0c;即在Wi-Fi环境下就能…

Echarts的认识和基本用法

Echarts介绍和使用 Echarts介绍 官网地址&#xff1a;Apache ECharts Echarts是一个基于JavaScript的开源可视化图表库&#xff0c;由百度前端开发团队研发和维护。它提供了丰富的图表类型、数据统计分析、动态数据更新、多维数据展示等功能&#xff0c;可以帮助开发人员在 W…

在JavaScript开发中,如何判断对象自身为空?

前言 如何判断一个对象为空是我们在开发中经常会遇到的问题&#xff0c;今天我们来聊聊几种经常使用的方法&#xff0c;以及在不同的场景下我们如何去使用。 1. JSON.stringify JSON.stringify 方法可以使对象序列化&#xff0c;转为相应的 JSON 格式。 const obj {};cons…

大语言模型训练的数据集从哪里来?

继续上篇文章的内容说说大语言模型预训练的数据集从哪里来以及为什么互联网上的数据已经被耗尽这个说法并不专业&#xff0c;再谈谈大语言模型预训练数据集的优化思路。 1. GPT2使用的数据集是WebText&#xff0c;该数据集大概40GB&#xff0c;由OpenAI创建&#xff0c;主要内…

Wireshark 学习笔记1

1.wireshark是什么 wireshark是一个可以进行数据包的捕获和分析的软件 2.基本使用过程 &#xff08;1&#xff09;选择合适的网卡 &#xff08;2&#xff09;开始捕获数据包 &#xff08;3&#xff09;过滤掉无用的数据包 &#xff08;4&#xff09;将捕获到的数据包保存为文件…

RK3568平台(USB篇)禁用USB端口

一.linux中怎样查看usb的端口号 在USB口插入U盘: [ 198.141319][ T106] usb 3-1.3: new SuperSpeed Gen 1 USB device number 5 using xhci-hcd [ 198.161695][ T106] usb 3-1.3: New USB device found, idVendor=0781, idProduct=5591, bcdDevice= 1.00 [ 198.161721]…

3298.统计重新排列后包含另一个字符串的字符串数目 I II滑动窗口 优化思路解析全网最详细

II相比于I是数据范围变成了10的6次方了 我们来维护大小关系&#xff0c;把不用的都去掉&#xff0c;优化到O&#xff08;26n&#xff09; 首先判断一下要找子字符串的s长度是否小于t字符串&#xff0c;如果小于的话直接返回0 初始答案变量和left左指针为0 用Counter来记录t中所…

双向导航和单向导航

目录 双向导航 单向导航 迁移数据库异常 解决办法 1.导航属性改为空 2.使用 ON DELETE NO ACTION 或 ON UPDATE NO ACTION 选择 双向导航 一对多&#xff1a;一个Article有多个Comment class Article {public long Id { get; set; }public string Title { get; set; }pu…

静态路由配置与调试——计算机网络实训day1

TOC 软件及基本配置下载 通过网盘分享的文件&#xff1a;计网实训 链接: https://pan.baidu.com/s/1AY5qNSN1dnw5Vy1OtwdJGg?pwdijde 提取码: ijde 操作前准备 1.下载软件 2.双击1.基本配置.pkt 3.进入实验环境 一、实验目的 1、掌握路由器的基本配置&#xff1b; 2、掌握…