用户行为分析--SQL

作者: 李静数据分析 | 来源:发表于2019-08-24 19:56 被阅读0次

    一、数据来源及说明

    数据来源:
    https://tianchi.aliyun.com/dataset/dataDetail?dataId=46&userId=1

    本文从数据集中选取包含了2014年11月18日至2014年12月18日之间,9967名随机用户共1876222条行为数据,数据集的每一行表示一条用户行为,共6列。

    列字段包含以下:

    • user_id:用户身份
    • item_id:商品ID
    • behavior_type:用户行为类型(包含点击、收藏、加购物车、购买四种行为,分别用数字1、2、3、4表示)
    • user_geohash:地理位置(有空值)
    • item_category:品类ID(商品所属的品类)
    • time:用户行为发生的时间

    二、提出问题

    1、整体用户的购物情况
    pv(总访问量)、日均访问量、uv(用户总数)、有购买行为的用户数量、用户的购物情况、复购率分别是多少?

    2、用户行为转化漏斗
    点击— 加购物车— 收藏— 购买各环节转化率如何?购物车遗弃率是多少,如何提高?

    3、购买率高和购买率为 0 的人群有什么特征

    4、基于时间维度了解用户的行为习惯

    5、基于RFM模型的用户分析

    三、数据清洗

    1.导入数据

    由于数据量有100多万,通过数据库管理工具 workbench 将数据集导入 MySQL 数据库会表较慢,我这里使用ETL工具kettle进行导数,能够提高导数效率,也方便后续实现报表自动化处理,数据库的表名为user。

    2.缺失值处理

    item_category 列表示地理位置信息,由于数据存在大量空值,且位置信息被加密处理,难以研究,因此后续不对item_category列进行分析。

    mysql> select * from user limit 10;
    +-----------+-----------+---------------+--------------+---------------+---------------+
    | user_id   | item_id   | behavior_type | user_geohash | item_category | time          |
    +-----------+-----------+---------------+--------------+---------------+---------------+
    |  98047837 | 232431562 |             1 |              |          4245 | 2014-12-06 02 |
    |  97726136 | 383583590 |             1 |              |          5894 | 2014-12-09 20 |
    |  98607707 |  64749712 |             1 |              |          2883 | 2014-12-18 11 |
    |  98662432 | 320593836 |             1 | 96nn52n      |          6562 | 2014-12-06 10 |
    |  98145908 | 290208520 |             1 |              |         13926 | 2014-12-16 21 |
    |  93784494 | 337869048 |             1 |              |          3979 | 2014-12-03 20 |
    |  94832743 | 105749725 |             1 |              |          9559 | 2014-12-13 20 |
    |  95290487 |  76866650 |             1 |              |         10875 | 2014-11-27 16 |
    |  96610296 | 161166643 |             1 |              |          3064 | 2014-12-11 23 |
    | 100684618 |  21751142 |             3 |              |          2158 | 2014-12-05 23 |
    +-----------+-----------+---------------+--------------+---------------+---------------+
    10 rows in set (0.00 sec)
    

    3.数据一致化处理

    由于 time 字段的时间包含(年-月-日)和小时,为了方便分析,将该字段分成 2 个字段,一个日期列(date)和一个小时列(time)。

    mysql> alter table user add date varchar(20) not null after item_category;
    mysql> update user set date = time;
    mysql> update user set date = replace(date,date,substring_index(date,' ',1));
    mysql> update user set time = replace(time,time,substring_index(time,' ',-1));
    mysql> select * from user limit 5;
    +----------+-----------+---------------+--------------+---------------+------------+------+
    | user_id  | item_id   | behavior_type | user_geohash | item_category | date       | time |
    +----------+-----------+---------------+--------------+---------------+------------+------+
    | 98047837 | 232431562 |             1 |              |          4245 | 2014-12-06 | 02   |
    | 97726136 | 383583590 |             1 |              |          5894 | 2014-12-09 | 20   |
    | 98607707 |  64749712 |             1 |              |          2883 | 2014-12-18 | 11   |
    | 98662432 | 320593836 |             1 | 96nn52n      |          6562 | 2014-12-06 | 10   |
    | 98145908 | 290208520 |             1 |              |         13926 | 2014-12-16 | 21   |
    +----------+-----------+---------------+--------------+---------------+------------+------+
    5 rows in set (0.00 sec)
    

    由于 behavior_type 列的四种行为类型分别用 1,2,3,4 表示点击、收藏、加购物车、购买四种行为,为了方便查看数据,将1,2,3,4替换为 ‘pv'、’fav‘,’cart',‘buy' 。

    mysql> alter table user modify behavior_type varchar(20);
    mysql> update user set behavior_type = replace(behavior_type,1,'pv');
    mysql> update user set behavior_type = replace(behavior_type,2,'fav');
    mysql> update user set behavior_type = replace(behavior_type,3,'cart');
    mysql> update user set behavior_type = replace(behavior_type,4,'buy');
    mysql> select * from user limit 5;
    +----------+-----------+---------------+--------------+---------------+------------+------+
    | user_id  | item_id   | behavior_type | user_geohash | item_category | date       | time |
    +----------+-----------+---------------+--------------+---------------+------------+------+
    | 98047837 | 232431562 | pv            |              |          4245 | 2014-12-06 | 02   |
    | 97726136 | 383583590 | pv            |              |          5894 | 2014-12-09 | 20   |
    | 98607707 |  64749712 | pv            |              |          2883 | 2014-12-18 | 11   |
    | 98662432 | 320593836 | pv            | 96nn52n      |          6562 | 2014-12-06 | 10   |
    | 98145908 | 290208520 | pv            |              |         13926 | 2014-12-16 | 21   |
    +----------+-----------+---------------+--------------+---------------+------------+------+
    5 rows in set (0.00 sec)
    

    通过查询表结构,可以看到 date 列日期列不是日期类型:

    mysql> desc user;
    +---------------+-------------+------+-----+---------+-------+
    | Field         | Type        | Null | Key | Default | Extra |
    +---------------+-------------+------+-----+---------+-------+
    | user_id       | int(11)     | YES  |     | NULL    |       |
    | item_id       | int(11)     | YES  |     | NULL    |       |
    | behavior_type | varchar(20) | YES  |     | NULL    |       |
    | user_geohash  | text        | YES  |     | NULL    |       |
    | item_category | int(11)     | YES  |     | NULL    |       |
    | date          | varchar(20) | NO   |     | NULL    |       |
    | time          | varchar(20) | YES  |     | NULL    |       |
    +---------------+-------------+------+-----+---------+-------+
    7 rows in set (0.00 sec)
    

    将date 列改成 date 类型:

    mysql> alter table user modify date date;
    mysql> desc user;
    +---------------+-------------+------+-----+---------+-------+
    | Field         | Type        | Null | Key | Default | Extra |
    +---------------+-------------+------+-----+---------+-------+
    | user_id       | int(11)     | YES  |     | NULL    |       |
    | item_id       | int(11)     | YES  |     | NULL    |       |
    | behavior_type | varchar(20) | YES  |     | NULL    |       |
    | user_geohash  | text        | YES  |     | NULL    |       |
    | item_category | int(11)     | YES  |     | NULL    |       |
    | date          | date        | YES  |     | NULL    |       |
    | time          | varchar(20) | YES  |     | NULL    |       |
    +---------------+-------------+------+-----+---------+-------+
    7 rows in set (0.00 sec)
    

    四、构建模型和分析问题

    1.总体用户购物情况

    (1)pv(总访问量)

    mysql> select count(behavior_type) as 总访问量
        -> from user
        -> where behavior_type = 'pv';
    +--------------+
    | 总访问量     |
    +--------------+
    |      1768720 |
    +--------------+
    1 row in set (0.61 sec)
    

    (2)日均访问量

    mysql> select date, count(behavior_type) as 日均访问量 from user where behavior_type = 'pv' group by date order by date limit 10;
    +------------+-----------------+
    | date       | 日均访问量      |
    +------------+-----------------+
    | 2014-11-18 |           52940 |
    | 2014-11-19 |           52021 |
    | 2014-11-20 |           50978 |
    | 2014-11-21 |           47847 |
    | 2014-11-22 |           52362 |
    | 2014-11-23 |           55367 |
    | 2014-11-24 |           54978 |
    | 2014-11-25 |           53898 |
    | 2014-11-26 |           52194 |
    | 2014-11-27 |           53284 |
    +------------+-----------------+
    10 rows in set (1.23 sec)
    

    (3)uv(用户总数)

    mysql> select count(distinct user_id)  as 用户总数 from user;
    +--------------+
    | 用户总数     |
    +--------------+
    |         9967 |
    +--------------+
    

    (4)有购买行为的用户数量

    mysql> select count(distinct user_id) as 购买用户数 from user where behavior_type = 'buy';
    +-----------------+
    | 购买用户数      |
    +-----------------+
    |            5878 |
    +-----------------+
    

    (5)用户的购物情况

    mysql> create view user_behavior as
        -> select user_id, count(behavior_type),
        -> sum(case when behavior_type='pv' then 1 else 0 end) as 点击次数,
        -> sum(case when behavior_type='fav' then 1 else 0 end) as 收藏次数,
        -> sum(case when behavior_type='cart' then 1 else 0 end) as 加购物车次数,
        -> sum(case when behavior_type='buy' then 1 else 0 end) as 购买次数
        -> from user
        -> group by user_id
        -> order by count(behavior_type) desc;
    mysql> select * from user_behavior limit 5;
    +-----------+----------------------+--------------+--------------+--------------------+--------------+
    | user_id   | count(behavior_type) | 点击次数     | 收藏次数     | 加购物车次数       | 购买次数     |
    +-----------+----------------------+--------------+--------------+--------------------+--------------+
    |  65645933 |                 4161 |         3661 |          487 |                 10 |            3 |
    |  73196588 |                 4003 |         4003 |            0 |                  0 |            0 |
    | 130270245 |                 3968 |         3776 |          151 |                 40 |            1 |
    |  83813302 |                 3493 |         3416 |           57 |                 16 |            4 |
    |  36233277 |                 3117 |         2790 |          290 |                 30 |            7 |
    +-----------+----------------------+--------------+--------------+--------------------+--------------+
    

    (6)复购率:产生两次或两次以上购买的用户占购买用户的比例

    mysql> select
        -> sum(case when 购买次数>1 then 1 else 0 end) as 购买数大于1次,
        -> sum(case when 购买次数>0 then 1 else 0 end) as 总购买数,
        -> concat(round(sum(case when 购买次数>1 then 1 else 0 end)/sum(case when 购买次数>0 then 1 else 0 end)*100,2),'%') as 复购率
        -> from user_behavior;
    +---------------------+--------------+-----------+
    | 购买数大于1次       | 总购买数     | 复购率    |
    +---------------------+--------------+-----------+
    |                3649 |         5878 | 62.08%    |
    +---------------------+--------------+-----------+
    

    2.用户行为转化漏斗

    在购物环节中收藏和加入购物车两个环节没有先后之分,所以将这两个环节可以放在一起作为购物环节的一步。最终得到用户购物行为各环节转化率,如下:

    mysql> select sum(点击次数) as 点击总数, sum(收藏次数) as 收藏总数, sum(加购物车次数) as 加购物车总数, sum(购买次数) as 购买总数
        -> from user_behavior;
    +--------------+--------------+--------------------+--------------+
    | 点击总数     | 收藏总数     | 加购物车总数       | 购买总数     |
    +--------------+--------------+--------------------+--------------+
    |      1768720 |        37000 |              52180 |        18322 |
    +--------------+--------------+--------------------+--------------+
    
    mysql> select
        -> concat(round(sum(点击次数)/sum(点击次数)*100,2),'%') as pv,
        -> concat(round((sum(收藏次数)+sum(加购物车次数))/sum(点击次数)*100,2),'%') as pv_to_favCart,
        -> concat(round(sum(购买次数)/sum(点击次数)*100,2),'%') as pv_to_buy
        -> from user_behavior;
    +---------+---------------+-----------+
    | pv      | pv_to_favCart | pv_to_buy |
    +---------+---------------+-----------+
    | 100.00% | 5.04%         | 1.04%     |
    +---------+---------------+-----------+
    1 row in set (2.18 sec)
    

    不同的行业转化率会有差异,据2012年的一项研究表明,在整个互联网范围内,平均转化率为2.13%(数据来源于《精益数据分析》),图中所示购买行为的转化率为1.04%,与行业平均值存在较大差异,淘宝移动端用户行为的转化率还有很大的增长空间。

    3.购买率高和购买率为低的人群有什么特征

    购买率高用户特征:

    #按购买率从高到低排序
    mysql> select user_id, 点击次数, 加购物车次数, 购买次数, round(购买次数/点击次数*100,2) as 购买率 from user_behavior group by user_id order by 购买率 desc limit 5;
    +----------+--------------+--------------------+--------------+-----------+
    | user_id  | 点击次数     | 加购物车次数       | 购买次数     | 购买率    |
    +----------+--------------+--------------------+--------------+-----------+
    | 56970308 |            4 |                  0 |            5 |    125.00 |
    | 39912392 |            1 |                  0 |            1 |    100.00 |
    | 84281661 |            1 |                  0 |            1 |    100.00 |
    | 39095072 |            2 |                  0 |            2 |    100.00 |
    | 47763414 |            2 |                  0 |            1 |     50.00 |
    +----------+--------------+--------------------+--------------+-----------+
    5 rows in set, 4 warnings (2.24 sec)
    #按购买率从低到高排序
    mysql> select user_id, 点击次数, 加购物车次数, 购买次数, round(购买次数/点击次数*100,2) as 购买率 from user_behavior group by user_id order by 购买率  limit 5;
    +-----------+--------------+--------------------+--------------+-----------+
    | user_id   | 点击次数     | 加购物车次数       | 购买次数     | 购买率    |
    +-----------+--------------+--------------------+--------------+-----------+
    |  69033110 |            0 |                  1 |            0 |      NULL |
    |  45881494 |            0 |                  0 |            1 |      NULL |
    |  24869620 |            0 |                  0 |            2 |      NULL |
    | 117489231 |            0 |                  0 |            1 |      NULL |
    |  12222620 |          140 |                  1 |            0 |      0.00 |
    +-----------+--------------+--------------------+--------------+-----------+
    

    由以上结果可以看出,购买率高的用户点击率反而不是最多的,这些用户收藏数和加购物车的次数也很少,一般不点击超过5次就直接购买,由此可以推断出这些用户为理智型消费者,有明确的购物目标,属于缺啥买啥型,很少会被店家广告或促销吸引。
    购买率为低用户特征:

    mysql> select user_id, 点击次数, 加购物车次数, 购买次数, round(购买次数/点击次数*100,2) as 购买率 from user_behavior group by user_id order by 购买次数 limit 10;
    +-----------+--------------+--------------------+--------------+-----------+
    | user_id   | 点击次数     | 加购物车次数       | 购买次数     | 购买率    |
    +-----------+--------------+--------------------+--------------+-----------+
    |  12222620 |          140 |                  1 |            0 |      0.00 |
    |  26438512 |          193 |                 14 |            0 |      0.00 |
    | 136496700 |           48 |                  2 |            0 |      0.00 |
    |  84614339 |            7 |                  0 |            0 |      0.00 |
    | 138162465 |           83 |                  0 |            0 |      0.00 |
    |   1041761 |          287 |                  0 |            0 |      0.00 |
    |  21818576 |          140 |                  1 |            0 |      0.00 |
    |  33077425 |          301 |                  2 |            0 |      0.00 |
    |  21984163 |           30 |                  0 |            0 |      0.00 |
    |  39883816 |            6 |                  1 |            0 |      0.00 |
    +-----------+--------------+--------------------+--------------+-----------+
    10 rows in set, 4 warnings (2.23 sec)
    

    由以上结果可以看出,购买率为低用户分为两类,一类是点击次数少的,一方面的原因是这类用户可能是不太会购物或者不喜欢上网的用户,可以加以引导,另一方面是从商品的角度考虑,是否商品定价过高或设计不合理;第二类用户是点击率高、收藏或加购物车也多的用户,此类用户可能正为商家的促销活动做准备,下单欲望较少且自制力较强,思虑多或者不会支付,购物难度较大。

    4.基于时间维度了解用户的行为习惯

    (1)一天中用户活跃时段分布

    mysql> select time, count(behavior_type) as 用户行为总量,
        -> sum(case when behavior_type='pv' then 1 else 0 end) as 点击次数,
        -> sum(case when behavior_type='fav' then 1 else 0 end) as 收藏次数,
        -> sum(case when behavior_type='cart' then 1 else 0 end) as 加购物车次数,
        -> sum(case when behavior_type='buy' then 1 else 0 end) as 购买次数
        -> from user
        -> group by time
        -> order by time;
    +------+--------------------+--------------+--------------+--------------------+--------------+
    | time | 用户行为总量       | 点击次数     | 收藏次数     | 加购物车次数       | 购买次数     |
    +------+--------------------+--------------+--------------+--------------------+--------------+
    | 00   |              79057 |        74498 |         1648 |               2138 |          773 |
    | 01   |              40866 |        38657 |          927 |               1019 |          263 |
    | 02   |              22163 |        20974 |          492 |                571 |          126 |
    | 03   |              14828 |        14072 |          313 |                379 |           64 |
    | 04   |              11989 |        11338 |          295 |                302 |           54 |
    | 05   |              13470 |        12789 |          306 |                326 |           49 |
    | 06   |              24138 |        22828 |          544 |                615 |          151 |
    | 07   |              44268 |        41991 |          900 |               1081 |          296 |
    | 08   |              60635 |        57323 |         1211 |               1527 |          574 |
    | 09   |              74415 |        69935 |         1625 |               1955 |          900 |
    | 10   |              84487 |        79142 |         1753 |               2511 |         1081 |
    | 11   |              80614 |        75554 |         1662 |               2302 |         1096 |
    | 12   |              81581 |        76733 |         1512 |               2242 |         1094 |
    | 13   |              91904 |        86323 |         1801 |               2615 |         1165 |
    | 14   |              90378 |        84904 |         1790 |               2592 |         1092 |
    | 15   |              91234 |        85684 |         1843 |               2632 |         1075 |
    | 16   |              87846 |        82640 |         1721 |               2411 |         1074 |
    | 17   |              77514 |        73061 |         1495 |               2178 |          780 |
    | 18   |              83854 |        79208 |         1649 |               2256 |          741 |
    | 19   |             112641 |       106714 |         2175 |               2852 |          900 |
    | 20   |             143282 |       135775 |         2533 |               3784 |         1190 |
    | 21   |             167176 |       158072 |         3119 |               4635 |         1350 |
    | 22   |             167580 |       158172 |         3011 |               4970 |         1427 |
    | 23   |             130302 |       122333 |         2675 |               4287 |         1007 |
    +------+--------------------+--------------+--------------+--------------------+--------------+
    24 rows in set (2.46 sec)
    
    image.png

    可以看出,每日0点到5点用户活跃度快速降低,降到一天中的活跃量最低值,6点到10点用户活跃度快速上升,10点到18点用户活跃度较平稳,17点到23点用户活跃度快速上升,达到一天中的最高值。

    (2)一周中用户活跃时段分布
    由于第一周和第五周的数据不全,因此这两周的数据不考虑到此次数据分析中。

    mysql> select date_format(date,'%w') as weeks, count(behavior_type) as 用户行为总量,
        -> sum(case when behavior_type='pv' then 1 else 0 end) as 点击次数,
        -> sum(case when behavior_type='fav' then 1 else 0 end) as 收藏次数,
        -> sum(case when behavior_type='cart' then 1 else 0 end) as 加购物车次数,
        -> sum(case when behavior_type='buy' then 1 else 0 end) as 购买次数
        -> from user
        -> group by weeks
        -> order by weeks;
    +-------+--------------------+--------------+--------------+--------------------+--------------+
    | weeks | 用户行为总量       | 点击次数     | 收藏次数     | 加购物车次数       | 购买次数     |
    +-------+--------------------+--------------+--------------+--------------------+--------------+
    | 0     |             244035 |       230288 |         5028 |               6589 |         2130 |
    | 1     |             238739 |       225341 |         4633 |               6524 |         2241 |
    | 2     |             296893 |       280178 |         5846 |               8155 |         2714 |
    | 3     |             296527 |       279804 |         5952 |               8091 |         2680 |
    | 4     |             302815 |       285496 |         6063 |               8602 |         2654 |
    | 5     |             264299 |       247736 |         4795 |               7978 |         3790 |
    | 6     |             232914 |       219877 |         4683 |               6241 |         2113 |
    +-------+--------------------+--------------+--------------+--------------------+--------------+
    7 rows in set (2.43 sec)
    
    image.png

    由以上结果可以看出,每周用户活跃度较稳定,每周四活跃度会有小幅降低,但是周末会慢慢回升。

    5.基于 RFM 模型找出有价值的用户

    RFM模型是衡量客户价值和客户创利能力的重要工具和手段,其中由3个要素构成了数据分析最好的指标,分别是:

    • R-Recency(最近一次购买时间)
    • F-Frequency(消费频率)
    • M-Money(消费金额)
      由于数据源没有相关的金额数据,暂且通过 R 和 F 的数据对客户价值进行打分。
      (1)计算R-Recency
      由于数据集包含的时间是从2014年11月18日至2014年12月18日,这里选取2014年12月19日作为计算日期,统计客户最近发生购买行为的日期距离2014年12月19日间隔几天,再对间隔时间进行排名,间隔天数越少,客户价值越大,排名越靠前。
    mysql> select a.*, (@rank := @rank+1) as recent_rank
        -> from (
        -> select user_id, datediff('2014-12-19', max(date)) as recent
        -> from user
        -> where behavior_type = 'buy'
        -> group by user_id
        -> order by recent) as a,
        -> (select @rank := 0) as b
        -> limit 5;
    +-----------+--------+-------------+
    | user_id   | recent | recent_rank |
    +-----------+--------+-------------+
    |  35205411 |      1 |           1 |
    |   4361577 |      1 |           2 |
    | 119191477 |      1 |           3 |
    |  28467700 |      1 |           4 |
    | 103439105 |      1 |           5 |
    +-----------+--------+-------------+
    5 rows in set, 2 warnings (0.66 sec)
    

    (2)计算F-Frequency
    先统计每位用户的购买频率,再对购买频率进行排名,频率越大,客户价值越大,排名越靠前。

    mysql> select a.*, (@rank := @rank+1) as freq_rank
        -> from (
        -> select user_id, count(behavior_type) as frequency
        -> from user
        -> where behavior_type = 'buy'
        -> group by user_id
        -> order by frequency desc) as a,
        -> (select @rank := 0) as b
        -> limit 5;
    +-----------+-----------+-----------+
    | user_id   | frequency | freq_rank |
    +-----------+-----------+-----------+
    | 122338823 |       161 |         1 |
    |  51492142 |        87 |         2 |
    |  56560718 |        52 |         3 |
    | 123842164 |        49 |         4 |
    |  35306096 |        46 |         5 |
    +-----------+-----------+-----------+
    5 rows in set, 2 warnings (0.63 sec)
    

    (3)对用户进行评分
    对5878名有购买行为的用户按照排名进行分组,共划分为四组,对排在前四分之一的用户打4分,排在前四分之一到四分之二(即二分之一)的用户打3分,排在前四分之二到前四分之三的用户打2分,剩余的用户打1分,按照这个规则分别对用户时间间隔排名打分和购买频率排名打分,最后把两个分数合并在一起作为该名用户的最终评分。计算脚本如下:

    mysql> SELECT r.user_id,r.recent,r.recent_rank,f.frequency,f.freq_rank,                                     
        -> CONCAT(   --  对客户购买行为的日期排名和频率排名进行打分
        -> CASE WHEN r.recent_rank <= (5878/4) THEN '4'
        -> WHEN r.recent_rank > (5878/4) AND r.recent_rank <= (5878/2) THEN '3'
        -> WHEN f.freq_rank > (5878*2/4) AND f.freq_rank <= (5878*3/4) THEN '2' ELSE '1' END,
        -> CASE WHEN f.freq_rank <= (5758/4) THEN '4'
        -> WHEN f.freq_rank > (5758/4) AND f.freq_rank <= (5758/2) THEN '3'
        -> WHEN f.freq_rank > (5758/2) AND f.freq_rank <= (5758*3/4) THEN '2' ELSE '1' END) AS user_value
        -> from
    --  对每位用户最近发生购买行为的间隔时间进行排名(间隔天数越少,客户价值越大)
        -> (SELECT a.*,(@rank := @rank + 1) AS recent_rank
        -> FROM  --  统计客户最近发生购买行为的日期距离'2014-12-19'间隔几天
        -> (SELECT user_id,DATEDIFF('2014-12-19',MAX(date)) AS recent
        -> FROM user
        -> WHERE behavior_type = 'buy'
        -> GROUP BY user_id
        -> ORDER BY recent) AS a,
        -> (SELECT @rank := 0) AS b) AS r,
    -- 对每位用户的购买频率进行排名(频率越大,客户价值越大)
        -> (SELECT a.*,(@rank2 := @rank2 + 1) AS freq_rank
        -> FROM   --  统计每位用户的购买频率
        -> (SELECT user_id,COUNT(behavior_type) AS frequency
        -> FROM user
        -> WHERE behavior_type = 'buy'
        -> GROUP BY user_id
        -> ORDER BY frequency DESC) AS a,
        -> (SELECT @rank2 := 0) AS b) AS f
        -> WHERE r.user_id = f.user_id
        -> limit 10;
    +-----------+--------+-------------+-----------+-----------+------------+
    | user_id   | recent | recent_rank | frequency | freq_rank | user_value |
    +-----------+--------+-------------+-----------+-----------+------------+
    |  35205411 |      1 |           1 |         3 |      1648 | 43         |
    |   4361577 |      1 |           2 |        24 |        17 | 44         |
    | 119191477 |      1 |           3 |         2 |      3202 | 42         |
    |  28467700 |      1 |           4 |        14 |        69 | 44         |
    | 103439105 |      1 |           5 |        11 |       138 | 44         |
    |  95161544 |      1 |           6 |         6 |       593 | 44         |
    |  63929694 |      1 |           7 |         6 |       742 | 44         |
    | 104683710 |      1 |           8 |         7 |       536 | 44         |
    | 126024699 |      1 |           9 |        12 |       115 | 44         |
    |  39367110 |      1 |          10 |         2 |      3263 | 42         |
    +-----------+--------+-------------+-----------+-----------+------------+
    10 rows in set, 4 warnings (1.30 sec)
    

    通过打分可以了解每位顾客的特性,从而实现差异化营销。比如对于 user_value = 44 的用户,为重点用户需要关注;对于user_value = 41 这类忠诚度高而购买能力不足的,可以可以适当给点折扣或捆绑销售来增加用户的购买频率。对于 user_value = 14 这类忠诚度不高而购买能力强的,需要关注他们的购物习性做精准化营销。还可以通过每个月对用户的评分变化,推测客户消费的异动状况,对于即将流失的客户,通过电话问候、赠送礼品、加大折扣力度等有效的方式挽回客户。

    五、结论

    1、总体转化率只有 1%,用户点击后收藏和加购物车的转化率在 5% ,需要提高用户的购买意愿,可通过活动促销、精准营销等方式。

    2、购买率高且点击量少的用户属于理智型购物者,有明确购物目标,受促销和广告影响少;而购买率低的用户可以认为是等待型或克制型用户群体,下单欲望较少且自制力较强,购物难度较大。

    3、大部分用户的主要活跃时间在10点到23点,在19点到23点达到一天的顶峰。每周五的活跃度有所下降,但周末开始回升。可以根据用户的活跃时间段精准推送商家的折扣优惠或促销活动,提高购买率。

    4、通过 R 和 F 的数据对用户行为进行打分,对每位用户进行精准化营销,还可以通过对R 和 F 的数据监测,推测客户消费的异动状况,挽回流失客户。

    相关文章

      网友评论

        本文标题:用户行为分析--SQL

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