美文网首页用户的需求
Mysql与Pyhton实现复购率和回购率

Mysql与Pyhton实现复购率和回购率

作者: 番茄酱的汪 | 来源:发表于2020-02-23 15:16 被阅读0次

参考文章:https://blog.csdn.net/weixin_42389386/article/details/81221544
数据来源:CD用户消费行为数据(网上都有的)
结果对比:与python实现的进行对比

一、复购率

复购率:一段时间内,购买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与Pyhton实现复购率和回购率

    本文链接:https://www.haomeiwen.com/subject/uisjqhtx.html