一、复购率

复购率:一段时间内,购买2次及以上客户人数,占该时间段内购买过的总人数的比重。

例如:一个月以内,购买该商品超过两次的人有50个人,一个月内买过该商品的人有100个人,该月内复购率就是50%。复购率计算是要剔除那些没有该买一次的客户。

1) python实现复购率

1.建立pivot_table,index为user_id,columns为月份,value为order_dt(其他只要代表消费的字段都可以),aggfunc='count'。这里的月份是已经转化成为月的值了,

df['month']=df.order_date.values.astype('datetime64[M]')

pivot_table可以实现两列不重复的字段绘制成表格,可以对表中的值进行聚合操作。和excel有点像。

关于pivote_table:pivote_table

pivoted_counts=df.pivot_table(index='user_id',columns='month',

values='order_dt',aggfunc='count').fillna(0)

#columns_month=df.month.sort_values().astype('str').unique()

pivoted_counts.head()

结果.png

2、计算购买次数>=2的客户,这里利用的是applymap,将值进行判断转化。

applymap函数没有elif,所以要用两次if else。如果是0,则是NaN,这样在count的时候就不会计算进去了。

pivoted_counts_transf=pivoted_counts.applymap(lambda x:1 if x>1

else np.NaN if x==0

else 0)

'''这里是如果购买次数大于1,则计数1;若没有购买则为NaN;\

购买一次,计数为0'''

pivoted_counts_transf.head()

结果2.png

3、最后进行计算。按照columns取出当月的sum,除以当月的count。

pivoted_counts_transf.sum()/pivoted_counts_transf.count()

image.png

2) mysql实现复购率

首先加一列为月度数据:

select date_format(order_dt,'%Y-%m-01')

筛选出每个月的order_dt的数量,用月份和order_id去group

select order_id,date_format(order_dt,'%Y-%m-01') ordermonth,count(order_dt) c from mmy.cd

group by order_id,ordermonth;

结果.png

这里面的所有购买都是至少一次,因为我们是从月份去选取,如果为0就不会出现这个值了,所以不需要过滤。

再通过这个子查询,用条件if来选出符合条件的个数,如果不符合就是null,就不会记录到count里面,同时将其除以当月的总数。这里不用where是因为where会过滤掉不符合条件的日期,这样计算的count(c)就不是总数了。

这里cast(column as decimal(4,4))是设置数值的格式。

select ordermonth,count(if(c>1,1,null)),cast(count(if(c>1,1,null))/count(c) as decimal(4,4)) as '复购率' from (

select order_id,date_format(order_dt,'%Y-%m-01') ordermonth,count(order_id) c from mmy.cd

group by order_id,ordermonth) d

group by ordermonth

order by ordermonth;

image.png

结果如上图所示,发现算出来和python算出来的是一致的。

二、回购率

回购率:在一定时间段内,购买的过的客户在下一个时间段内还会购买的比例。例如:1月消费用户1000个,他们中有300个2月依然消费,回购率是30%。与复购率的区别是两个时间窗口,而复购率是一个时间窗口的多次购买行为。

Mysql实现:

思路:

首先建立一个临时表,和复购率一样,将月度数据的格式整理一下date_format,然后按照不同的客户、不同的月度数据进行分组。

然后我们要两次用到这张临时表,需要内部join一次,然后利用DATE_SUB函数找到间隔为1月的数据,其实这个时候用where进行过滤表格,再用count找到每个月的符合回购行为的人数,就可以直接算出每个月的回购人数。代码如下:

with t0 as (select order_id,date_format(order_dt,'%Y-%m-01') t from mmy.cd

group by order_id,t)

select A.t,count(A.t) as '回购人数'

from t0 A

join t0 B

on A.order_id=B.order_id

where A.t=DATE_SUB(B.t,interval 1 month)

group by A.t

order by A.t;

回购人数

如果要求回购率,直接算出来百分比的话,还是要利用if函数,不能用where过滤,因为过滤之后进行count就不能得到所有当月购物的人数总数了。

这里还是利用count(if(A.t=DATE_SUB(B.t,interval 1 month),1,null))进行条件筛选。

而被除数记得要distinct一下,因为我们join的表格是有多个相同的order_id的行,需要去重。代码如下:

with t0 as (select order_id,date_format(order_dt,'%Y-%m-01') t from mmy.cd

group by order_id,t)

select A.t,count(if(A.t=DATE_SUB(B.t,interval 1 month),1,null)) as '重复购买的人',

count(if(A.t=DATE_SUB(B.t,interval 1 month),1,null))/count(distinct A.order_id) as '回购率'from t0 A

join t0 B

on A.order_id=B.order_id

group by A.t

order by A.t;

回购率

python实现下次补充,先把结果放在这,与mysql差不多:

python实现回购率的结果

为什么有一点区别,是因为这张表格有些事order_product不为0,但是amount为零,所以我在做python的时候是以amount金额不为零认为该用户有没有消费的,而不是order_dt等,所以有一点区别。

amount为0的结果.png

mysql复购率_Mysql与Pyhton实现复购率和回购率相关推荐

  1. mysql复购率_MYSQL系列(5) 电商常用指标查询

    表:order ,字段:orderid, userid, isPaid, price, paidTime 表:user,字段: userid, sex, birth 1.统计不同月份下单人数 sele ...

  2. mysql cascade的用法_MySQL常用操作笔记

    1.创建root用户的密码 mysqladmin -u root password "new_password"; 2.连接到Mysql服务器 mysql -u root -p 1 ...

  3. centos得mysql安装教程_Centos下Mysql安装图文教程_MySQL

    Mysql是比较常用的数据库,日常开发中也是采用地比较多.工欲善其事必先利其器,本文特地来讲解下如何在centos(其他linux发行版类似)下安装Mysql.首先准备的材料:Mysql,我这里采用的 ...

  4. mysql怎么跑代码_MySQL菜鸟入门指南_mysql

    mysql是完全网络化的跨平台关系型数据库系统,一个真正的多用户.多线程SQL数据库服务器,同时是具有客户机/服务器体系结构的分布式数据库管理系统.它具有功能强.使用简便.管理方便.容易使用.运行速度 ...

  5. mysql获取当月最后一天_mysql中获取本月第一天、本月最后一天、上月第一天、上月最后一天

    mysql获取当月最后一天_mysql中获取本月第一天.本月最后一天.上月第一天.上月最后一天等等 转自: https://blog.csdn.net/min996358312/article/det ...

  6. mysql 存储过程 定义数组_MySql存储过程

    Mysql进阶 存储过程 1 什么是存储过程 1.存储过程,带有逻辑的sql语句 2.之前的sql没有条件判断,没有循环 3.存储过程带上流程控制语句(if while) 2 存储过程特点 1)执行效 ...

  7. java中判断复选框是否选中_php 判断复选框checkbox是否被选中

    php 判断复选框checkbox是否被选中 复选框checkbox在php表单提交中经常被使用到,本文章通过实例向大家介绍php如何判断复选框checkbox中的值是否被选中,需要的朋友可以参考一下 ...

  8. 使复选框选中_勾选复选框单元格变色,自动计数,在Excel中是如何实现的?

    Excel中,我们经常会使用复选框来打勾打叉,这是复选框最基本的功能,相信很多小伙伴都会,但今天我跟大家分享的是复选框的其他操作技巧,勾选复选框变色,统计人数. 下图中,我们要利用复选框是否打钩来确定 ...

  9. 个人开发者 android内购,【开发者账号】关于内购,协议税务的一些坑

    上篇讲了开发者账号到期后续费的一个大坑, 有兴趣的可以回顾下:关于账号续订的坑 今天接着讲我接下来遇到的坑.. 当开发者账号到期后,如果不及时续费, 苹果会将你的app暂时下架, 状态为等待协议,当你 ...

最新文章

  1. ios添加全局悬浮按钮_iOS开发悬浮按钮
  2. 为什么每月工资一样,但扣的个税不一样?
  3. windows时间显示到秒
  4. 软件的安装目录 linux,linux 软件安装目录详解
  5. 营销区块链技术的艺术
  6. 提高python执行效率_提升Python程序运行效率的6个方法
  7. No primary or default constructor found for interface java.util.List
  8. Apsara Stack 技术百科 | 浅谈阿里云混合云新一代运维平台演进与实践
  9. python什么软件开发好_python怎样才能学好?python软件开发什么
  10. 理解字节序(大小端)
  11. Android项目clean之后R.java文件丢失解决办法
  12. H3C V7控制器无线优化关闭低速率
  13. dwg格式的计算机图,例举电脑dwg文件怎么打开
  14. R语言循环读取excel并保存为RData
  15. 浏览器主页被hao123锁定解决办法
  16. mac安装golang,编写第一个go程序
  17. 关于Unicode字符集,将char数组转化成LPCTSTR
  18. 实验楼Linux基础挑战2答案,实验楼-Linux基础-实验二 Linux的基本概念及操作
  19. 单纯的一个复杂的json例子
  20. python怎么定义int变量_Python 变量类型 | 菜鸟教程

热门文章

  1. 计算机如何添加新用户,Win10创建新用户图文教程 Win10怎么新建账户
  2. 关于Ubuntu18.04+win10双系统开机引导错误的解决方法
  3. Redis 发布订阅原理以及springboo中RedisTemplate集成
  4. Python提取pcap文件中原始数据
  5. 大数据、云计算该如何学习?
  6. 中华名将索引 - 第一批:李世民
  7. java整型数组转置输出,Java实现数组转置
  8. 计算机主板提示ahci,电脑BIOS没有AHCI功能没有办法BIOS刷新怎么办
  9. 【OJ每日一练】1049 - 矩阵对角线元素之和 v1.0
  10. 《重构-改善既有代码的设计》第三章(上)