文章目录

  • 项目背景
  • 读取数据
  • 数据分析
    • 分析 Recent
    • 分析 Frequency
    • 分析 Mount
  • RFM模型
    • 分位数分层
    • 自定义分层
    • 定义客户标签
  • 数据可视化
  • 结论

本文可以学习到以下内容:

  1. RFM 模型的原理及代码实现
  2. 使用 pandas 中的 read_sql 读取 sqlite 中的数据
  3. 使用 dropna 删除含有缺失数据的行
  4. 使用 to_datetime、map 方法计算距离用户上次消费所过去的天数
  5. 使用 groupby+agg 方法统计消费频次、消费总金额
  6. 使用 merge 方法合并 datafram 数据
  7. 使用 quantile 方法计算用户消费数据的分位数
  8. 使用 cut 方法将消费数据划分不同的区间,并打上不同的标签
  9. 使用 value_counts 方法统计各个用户标签的数据量及占比
  10. 使用 pyecharts 绘制环形图

关注微信公众号《帅帅的Python》,后台回复《数据分析》获取数据及源码

项目背景

运营部的同学需要对客户进行分类管理,需要数据部门提供一个方案进行参考。

小凡提出用RFM模型可以快速方便的将用户进行区分,模型的含义:

Recent:用户最近一次购买商品距今的时长

Frequency:用户在一段时间购买商品的次数

Mount:用户在一段时间内消费的金额

将这三个维度的数据划分不同的区间,每个区间对应相应的分数,最后根据总分将用户划分不同的标签,方便管理。

众人听后,一致通过该方案,并任命小凡为该项目的负责人。

读取数据

小凡常用的数据分析工具:

import os
import datetime
import numpy as np
import pandas as pd
from sqlalchemy import create_engine

数据放在上一级的目录下名为 data.db 的文件

# 数据库地址:数据库放在上一级目录下
db_path = os.path.join(os.path.dirname(os.getcwd()), "data.db")
engine_path = "sqlite:///" + db_path
# 创建数据库引擎
engine = create_engine(engine_path)# sql 语句
sql = """
select * from business
"""
# read_sql 获取数据
df = pd.read_sql(sql,engine)
# 随机展示 5
df.sample(5)

user_id:用户唯一id字段

create_time:订单创建时间

order_id:订单id

amount:订单金额

df.info()

可以看到create_time数据量为76048,amount的数据量为76043,说明数据中存在缺失,而且缺失数据占比不大,所以,使用 dropna 方法将含有缺失的数据删除。

# create_time和amount有缺失值,去掉缺失值
df2 = df.copy()# dropna() 默认只要该行有 nan 值就删除
df2 = df2.dropna()df2.info()

# 查看数据量
len(df2.user_id.unique())
# 55540

删除后的数据有76041条,有55540名客户。

数据分析

分析 Recent

数据中的 create_time 为订单创建时间,可以用 to_datetime 方法计算出时间差

同一个用户又有多次购买记录,用 groupby 和 agg 的方法统计出最小的时间差

now_ = pd.to_datetime(datetime.datetime.now())
# 添加时间差数据
df2["recent"] = df2["create_time"].map(lambda x:(now_-pd.to_datetime(x)).days)df2.sample(5)

# 用户最近一次购买商品的时间
recent_df = df2.groupby(by="user_id",as_index=False).agg({"recent":"min"})

分析 Frequency

根据 user_id 将用户分组,对 order_id 计数计算出用户的购买频率

frequency_df = df2.groupby(by="user_id",as_index=False).agg({"order_id":"count"})
frequency_df.sort_values(by="order_id",ascending=False).head()

分析 Mount

根据 user_id 将用户分组,对 amount 求和计算出用户的消费金额

mount_df = df2.groupby(by="user_id",as_index=False).agg({"amount":"sum"})
mount_df.sort_values(by="amount",ascending=False).head()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e87f8pc8-1641883628124)(./图片/6.png)]

RFM模型

将分析完成的数据根据 user_id 合并到一起方便分析

# 根据 user_id 合并数据
rfm_df = recent_df.merge(frequency_df,on="user_id",how="left"
).merge(mount_df,on="user_id",how="left"
)
rfm_df2 = rfm_df.copy()
rfm_df2.head()

分位数分层

np.linespace 获取(0,1)之间的等分点

quantile 根据划分好的等分点,计算出对应的原始数据

mount_labels = [1,2,3,4,5]
m_bins = rfm_df2["amount"].quantile(q=np.linspace(0,1,num=6),interpolation='nearest')recent_labels = [5,4,3,2,1]
r_bins = rfm_df2["recent"].quantile(q=np.linspace(0,1,num=6),interpolation='nearest')rfm_df2["R"] = pd.cut(rfm_df2["recent"],bins=r_bins,labels=recent_labels,include_lowest=True)rfm_df2["M"] = pd.cut(rfm_df2["amount"],bins=m_bins,labels=mount_labels,include_lowest=True)rfm_df2.head()

自定义分层

客户的购买频率集中在1次,使用分位数效果不佳,用自定义的区间来划分

frequency_bins = [1,3,5,12]
frequency_labels = [1,2,3]rfm_df2["F"] = pd.cut(rfm_df2["order_id"],bins=frequency_bins,labels=frequency_labels,include_lowest=True
)rfm_df2.sample(5)

定义客户标签

定义一个总分 RFM,其中各权益的占比为 R:F:M=3:2:2

使用 cut 客户划分为 5 个不同的等级

使用 value_counts 统计各标签的数量

rfm_df2 = rfm_df2.astype(int)
rfm_df2["RFM"] = rfm_df2["R"]*3+rfm_df2["F"]*2+rfm_df2["M"]*5rfm_bins =rfm_df2["RFM"].quantile(q=np.linspace(0,1,num=6),interpolation='nearest').unique()
rfm_labels = ['流失客户','一般维持客户','重要挽留客户','重要唤回客户','重要价值客户']rfm_df2["客户标签"] = pd.cut(rfm_df2["RFM"],bins=rfm_bins,labels=rfm_labels,include_lowest=True,duplicates="drop"
)rfm_df2["客户标签"].value_counts()

数据可视化

用 pyecharts 可视化绘制饼图

from pyecharts import options as opts
from pyecharts.charts import Pie
from pyecharts.faker import Fakeri = rfm_df2["客户标签"].value_counts().index.tolist()
v = rfm_df2["客户标签"].value_counts().values.tolist()
c = (Pie().add("",[list(z) for z in zip(i, v)],radius=["30%", "75%"],).set_global_opts(title_opts=opts.TitleOpts(title="客户分层占比"),legend_opts=opts.LegendOpts(orient="vertical", pos_top="15%", pos_left="2%"),).set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {d}%"))
)
c.render_notebook()

结论

RFM模型不需要任何算法的支撑,除python外,excel、sql等工具都可以实现。核心思想就是将三个指标划分出不同的区间,根据区间的不同获取相应的权重。

小凡完成该模型后,将输出的结果保存为 Excel 发给运营部,为业务人员对客户采用不同的营销方式提供了参考。

第三章:用python实现常用的用户分层模型(RFM模型)相关推荐

  1. python数据分析实战之用户分析及RFM模型分析

    理论基础知识可以看我之前的博客: 1.python之Numpy知识点详细总结 2.python最最最重要的数据分析工具之pandas 3.pandas之表连接与高级查询 也可以进入我的专栏:欢迎订阅哦 ...

  2. 第三章 嵌入式Python概述(三)

    文章目录 第三章 嵌入式Python概述(三) 使用 SQL 使用Globals 一起使用 ObjectScript 和 Python 创建混合 InterSystems IRIS 类 在 Pytho ...

  3. 【Python语法系列】第三章:Python判断语句

    进行逻辑判断,是生活中常见的行为.同样,在程序中,进行逻辑判断也是最为基础的功能,一个逻辑判断的流程非常简单,我们有一个判断的条件,那么他无非给我们返回两个结果,是或者否,是的话有是的操作,否的话也有 ...

  4. 第三章:Python基础の函数和文件操作实战

    本課主題 Set 集合和操作实战 函数介紹和操作实战 参数的深入介绍和操作实战 format 函数操作实战 lambda 表达式介绍 文件操作函数介紹和操作实战 本周作业 Set 集合和操作实战 Se ...

  5. 第三章:python项目的结构和包的创建

    python项目的结构和包的创建 在python的圈子里,有许多人无偿得公开自己开发的程序库,使用者可以通过pip 命令来安装这些库,我们在发布时需要将其创建成一种特殊的文件,这种文件就是程序包,我们 ...

  6. 第九章、python中常用函数及方法------打开函数open,写入write、writelines,读取read、readlines、 readline

    目录 9.7 python的打开函数open (1)参数file (2)参数mode (3)参数buffering (4)参数encoding (5)参数errors (6)参数newline (7) ...

  7. 【学习笔记】第三章——内存 I(交换技术、进程七状态模型、动态分区分配、动态分区算法)

    文章目录 一. 交换状态.进程七状态模型 二. 内存的分配方式 三. 动态分配算法 一. 交换状态.进程七状态模型 交换技术:内存空间紧张,把某些进程暂时换出外存.(进程在内存与磁盘间动态调度) 进程 ...

  8. 自动化调参NNI学习(三):使用python启动NNI框架调整随机森林(RandomForest)模型

    首先按照NNI框架的要求写一个调参的代码文件my_rf.py: import nni from sklearn.model_selection import train_test_split impo ...

  9. 用Python分析淘宝用户行为

    数据来源: 阿里云 天池数据集https://tianchi.aliyun.com/dataset/dataDetail?dataId=46 阿里巴巴提供的移动端淘宝用户的行为数据集,包含2014-1 ...

  10. Python基础——第二章:Python基础语法

    前言 本文是根据黑马程序员Python教程所作之笔记,目的是为了方便我本人以及广大同学们查漏补缺. 不想做笔记直接来我的频道.当然啦,自己的笔记才是最好的哦! PS:感谢黑马程序员! 教程链接:黑马程 ...

最新文章

  1. java9-6 内部类
  2. 依赖注入及AOP简述(六)——字符串请求模式 .
  3. 电脑打字手指正确姿势_写字坐姿不正确的难题,已被家长攻克,果然高手在民间...
  4. 如何“神还原”数据中心? 阿里联合NTU打造了工业级精度的仿真沙盘!
  5. mysql 同一字段分别统计,mysql查询同一个字段根据不同值分组成不同列统计
  6. 不会点SQLite,都不好意思说自己是开发的
  7. MVC5中Model层开发数据注解
  8. 局域网中只有一台电脑无法连接共享打印机,其他电脑均可正常连接解决方案
  9. 无向带权图的存储结构_每天5分钟用C#学习数据结构(27)图 Part 8
  10. renren-fast:使用人人开源renren-fast报错Error:(11, 39) java: 程序包io.renren.datasource.annotation不存在
  11. java中json转对象_Java开发中json使用,各对象与json相互转换
  12. 易居IPO后首份成绩单透露了什么秘密?|一点财经
  13. how to manage your time effectively!!
  14. EasyExcel导出数据到Excel,浏览器提供下载
  15. 白杨SEO:微信视频号直播功能怎么开通?视频号有什么价值?
  16. 移动端h5图片下载-前端小白初长成
  17. java截取视频第几秒与另一个秒之间生成gif
  18. mysql数据库备份工具
  19. tplink 虚拟服务器没有https,tplink虚拟服务器设置
  20. 收编娘内幕整合版(高质量PDF版)

热门文章

  1. c4d渲染测试软件,C4D常用的4大主流渲染器
  2. 数字图像处理 - 实验作业一 - Python
  3. Hash算法及数字签名【六】
  4. Linux修改文件编码格式的三种方式
  5. vocabulary
  6. ztree去掉文字前面的文件夹图标
  7. 如何注册海外邮箱?如何进行邮箱注册163,这些技巧交给你
  8. 05Echarts - 折线图(Smoothed Line Chart)
  9. 数据库中的主键、超键、候选键、外键
  10. eureka多台注册中心_spring cloud eureka集群,注册中心再添加一台服务器