发布日期:2022-03-01 VIP内容

用户消费行为分析:复购率和回购率计算

下面我们演示一个使用Hive来统计某电商用户消费行为的案例。主要包括内容:

    创建Hive表结构,并加载数据;
  • 统计不同月份的下单人数;
  • 统计每个月的复购率;
  • 统计每个月的回购率。

数据集说明

在PBLP平台的~/data/hive/user_order/目录下,我们提供了两个数据文件。一个是订单数据文件order_info_utf.csv,一个是用户数据文件user_info_utf.csv。其中:

order_info_utf.csv数据格式如下:

订单id,用户id,支付状态,支付价格,日期
1,11211,已支付,833,2016/3/1 0:04
2,11211,已支付,487,2016/3/1 0:03
3,11211,未支付,794,
4,74553,已支付,737,2016/3/1 0:02
5,37799,已支付,647,2016/3/1 0:01
...

user_info_utf.csv数据格式如下:

用户id,性别,出生日期
1,女,1969/1/21
2,女,1978/9/6
3,男,1973/9/3
4,女,1982/4/27
5,男,1970/7/30
...

创建Hive表结构,并加载数据

首先创建订单信息表orderinfo:

CREATE TABLE IF NOT EXISTS ORDERINFO  ( 
    ORDERID     string,
    USERID      string,
    ISPAID      string,
    PRINCE      string,
    PAIDTIME    string 
) ROW FORMAT DELIMITED
  FIELDS TERMINATED BY ',';

然后创建用户信息表userinfo:

CREATE TABLE IF NOT EXISTS USERINFO  ( 
    USERID  string,
    SEX     string,
    BIRTH   string 
) ROW FORMAT DELIMITED
  FIELDS TERMINATED BY ',';

执行下面两个load语句,分别导入两个数据文件到相应的Hive表中:

load data local inpath "/home/hduser/data/hive/user_order/order_info_utf.csv" into table ORDERINFO;

load data local inpath "/home/hduser/data/hive/user_order/user_info_utf.csv" into table USERINFO; 

测试数据导入是否成功:

select * from orderinfo limit 5;

select * from userinfo limit 5;

统计不同月份的下单人数

这里我们需要做两个处理。一是将日期格式化为yyyy-MM的形式,二是过滤已下单的订单记录。

select paidmonth, count(1) as `下单人数`
from (
    select *, from_unixtime(unix_timestamp(paidtime,"yyyy/MM/dd HH:mm"),"yyyy-MM") as paidmonth
    from orderinfo
    where ispaid="已支付"
) t
group by paidmonth;

执行以上Hive QL查询语句,计算结果如下所示:

2016-03 238474
2016-04 223324
2016-05 7

统计用户3月份的复购率

什么是复购率?

复购率指的是在本月消费中消费一次以上的占比。

也就是说,我们需要统计,userid分组之后,按月,消费次数大于1的统计。

select sum(t.`复购用户`) as `复购用户数`,count(t.userid) as `总用户数`, ROUND(sum(t.`复购用户`)/count(t.userid), 4) as `复购率`
from (
      select userid,case when count(userid)>1 then 1 else 0 end as `复购用户`
      from ORDERINFO
      where ispaid = '已支付' and from_unixtime(unix_timestamp(paidtime,"yyyy/MM/dd HH:mm"),"yyyy-MM")='2016-03'
      group by userid 
) as t;

在上面的代码中,我们使用case when语句标记消费次数大于1次的用户为1,否则为0。然后再对标记1求和,就得到复购用户数。拿复购用户数去除以总用户数,就得到了复购率。

执行以上Hive QL查询语句,计算结果如下所示:

16916   54799   0.3087

可以看到,2016年3月份的复购率是30.87%。

统计用户各个月份的回购率

什么是回购率?

所谓回购,指的是用户本月购买和并且下个月也购买。因此回购率指的是用户下月进行回购的比率。

也就是说,我们需要统计,userid分组之后,按月,消费次数大于1的统计。

这里实现的思路是,我们以本月的记录为左表,以下个月的记录为右表,然后执行一个左表连接,这样连接以后的表中就包含了本月消费用户和下月回购用户,接着执行group by分组统计即可。

这里有个小托雷斯,在执行left join时,on的条件中,虚拟表1的对应月份字段为虚拟表2对应月份字段+1就可以。

select a.paidmonth as `月份`,count(distinct a.userid) as `本月消费的用户数量`,count(b.userid) as `本月回购的用户数` , cast(round(count(b.userid)/count(distinct a.userid),4) as decimal(10,4)) as `回购率`
from ( 
      select  userid, month(from_unixtime(unix_timestamp(paidtime,"yyyy/MM/dd HH:mm"),"yyyy-MM-dd")) as paidmonth 
      from ORDERINFO
      where ISPAID = '已支付'
      group by userid,month(from_unixtime(unix_timestamp(paidtime,"yyyy/MM/dd HH:mm"),"yyyy-MM-dd"))
    ) a left join (
                 select  userid, month(from_unixtime(unix_timestamp(paidtime,"yyyy/MM/dd HH:mm"),"yyyy-MM-dd")) as paidmonth 
                 from ORDERINFO
                 where ISPAID = '已支付'
                 group by userid,month(from_unixtime(unix_timestamp(paidtime,"yyyy/MM/dd HH:mm"),"yyyy-MM-dd"))
      ) b 
      on a.userid = b.userid and a.paidmonth = b.paidmonth+1
group by a.paidmonth;

执行以上Hive QL查询语句,计算结果如下所示:

3       54799   0       0.0000
4       43967   13119   0.2984
5       6       4       0.6667

因为3月份是第一个月,没有上个月的消费记录,所以回购率是0。而4月份的回购率是29.84%,5月份的回购率是66.67%。