ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

AARRR:2.4

2022-08-28 13:32:46  阅读:171  来源: 互联网

标签:count buy df AARRR df5 user id 2.4


学习来源:

https://blog.csdn.net/qq_22790151/article/details/109700735

https://blog.csdn.net/fei347795790/article/details/98620124

https://zhuanlan.zhihu.com/p/285676746

 

import pandas as pd
df=pd.read_csv('user_behavior.csv')
df['timestamps']=pd.to_datetime(df['timestamps'],unit='s')

1.购买前十的商品及数目:

(1)mysql:

SELECT *,row_number() over(order by t.`购买次数` desc) as 排序 from
(SELECT item_id,count(*) as 购买次数 from userbehavior
where behavior='buy'
GROUP BY item_id) t

 

 

 没有使用并列排序,因为购买次数均为1-4

同理可求点击:

SELECT *,row_number() over(order by t.`点击次数` desc) as 排序 from
(SELECT item_id,count(*) as 点击次数 from userbehavior
where behavior='pv'
GROUP BY item_id) t

 

 

 

(2)python

df2=pd.DataFrame(columns=['购买前10类目','购买前10数量'])
pv_count= df[df["behavior"]=='buy']["category_id"].value_counts().head(10)
df2['购买前10类目']=pv_count.index
df2['购买前10数量']=pv_count.values
df2

 

 

 把category_id改成item_id

 

 

 同理可求点击:

df1=pd.DataFrame(columns=['点击前10类目','点击前10数量'])
pv_count= df[df["behavior"]=='pv']["category_id"].value_counts().head(10)
df1['点击前10类目']=pv_count.index
df1['点击前10数量']=pv_count.values

 

 

 2.购买率

#1.日购买行为
day_buy_user_num = df[df.behavior == 'buy'].drop_duplicates(['user_id', 'dates']).groupby('dates')['user_id'].count()
day_active_user_num = df.drop_duplicates(['user_id', 'dates']).groupby('dates')['user_id'].count()
day_buy_rate = day_buy_user_num / day_active_user_num

#2.时购买行为
hour_buy_user_num = df[df.behavior == 'buy'].drop_duplicates(['user_id', 'hour']).groupby('hour')['user_id'].count()
hour_active_user_num = df.drop_duplicates(['user_id', 'hour']).groupby('hour')['user_id'].count()
hour_buy_rate = hour_buy_user_num / hour_active_user_num

3.复购率

(1)mysql

原文方法,结果是:

SELECT count(t.user_id) as 购买人数,
  count(case when t.`购买次数`>1 then t.user_id else null end)as 复购人数,
  CONCAT(round(100*count(case when t.`购买次数`>1 then t.user_id else null end)/count(t.user_id),2),'%') as 复购率
from
  (

  SELECT
    user_id,count(item_id) as 购买次数
  from userbehavior
  where behavior='buy'
  GROUP BY user_id

  )t
;

 

 

 我的方法是:

select sum(case when t2.`购买次数`>0 then 1 else 0 end)as 购买人数,
sum(case when t2.`购买次数`>1 then 1 else 0 end)as 复购人数,
CONCAT(round(100*sum(case when t2.`购买次数`>1 then 1 else 0 end)/count(t2.user_id),2),'%') as 复购率
from
(
  select user_id,count(date1) as '购买次数'
  from
    (
    SELECT
      user_id,date1
    from userbehavior
    where behavior='buy'
    GROUP BY user_id,date1

    ) t1
  group by user_id
) t2

 

 

 原因在于口径的原因,购买次数的计算,我的计算:第一天购买,以后的每一天任一次或多次购买均属于复购,按照日期。作者是根据类别count,购买了A,然后购买了B就算复购。如果同一天上午购买,下午也购买算复购,指标计算也需要更改。

(2)python

方法一:

#计算复购率(9日复购率)
data_user_buy_all =df[df["behavior"]=='buy'].groupby("user_id")["dates"].apply(lambda x:len(x.unique()))
first = data_user_buy_all.count()
again = data_user_buy_all[data_user_buy_all>=2].count()
print("复购率:",format(again/first,".2%"))

 

 

 方法二:

#计算复购率(9日复购率)
df_rebuy = df[df.behavior == 'buy'].drop_duplicates(['user_id','dates']).groupby('user_id')['dates'].count()
First = df_rebuy.count()
Again = df_rebuy[df_rebuy >= 2].count()

 

 

 4.RF分析

由于并没有消费金额的记录,因此忽略RFM模型中的M,用购买频率F和最近一次购买时间R来划分顾客。

-- 建立R表,离2017-12-04日期越近,R值越高
-- 建立F表,区间段里购买次数越多,F值越大

df4=df
df4['timestamps']=pd.to_datetime(df4['timestamps'],unit='s')
df4['日期']=df4['timestamps'].dt.strftime('%Y-%m-%d').astype('datetime64[ns]')
df4=df4[(df4['timestamps']>=datetime(2017,11,25,0,0,0))&(df4['timestamps']<datetime(2017,12,4,0,0,0))&(df4['behavior']=='buy')]

#求R值
df4['diff']=(datetime(2017,12,4)-df4['日期']).dt.days
r=df4.groupby('user_id')['diff'].min().reset_index()

#求F值(用户在某日多次购买,只计一次)
f=df4.groupby(['user_id','日期']).count().reset_index().groupby('user_id')['日期'].count().reset_index() 

#将表r、表f合并
df5=pd.merge(r,f,on='user_id',how='inner')[['user_id','diff','日期']]
df5.columns=['user_id','r','f']

 

 

 打分:首先分5类,然后分2类

#基于业务节点打分 (区间左开右闭)
df5['r_score']=pd.cut(df5['r'],bins=[0,1,3,5,7,100],labels=[5,4,3,2,1]).astype(int)
df5['f_score']=pd.cut(df5['f'],bins=[0,1,3,5,7,100],labels=[1,2,3,4,5]).astype(int)
#得分与均值比较
df5['r是否大于平均值']=(df5['r_score']>df5['r_score'].mean())*1 #r平均值3.53
df5['f是否大于平均值']=(df5['f_score']>df5['f_score'].mean())*1 #f平均值1.69
df5['rfm']=10*df5['r是否大于平均值']+1*df5['f是否大于平均值']

 

 

 然后给对应的类别打上业务标签:

 

 

标签:count,buy,df,AARRR,df5,user,id,2.4
来源: https://www.cnblogs.com/djbwxh/p/16632598.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有