赞
踩
天池实验室数据:UserBehavior.csv
分析工具:SQLyog,Tableau,Mysql
文件名称 | 说明 | 包含特征 |
---|---|---|
UserBehavior.csv | 包含所有的用户行为数据 | 用户ID,商品ID,商品类目ID,行为类型,时间戳 |
数据集包含了2017年11月25日至2017年12月3日之间,有行为的约一百万随机用户的所有行为(行为包括点击、购买、加购、喜欢)。数据集的每一行表示一条用户行为,由用户ID、商品ID、商品类目ID、行为类型和时间戳组成,并以逗号分隔。关于数据集中每一列的详细描述如下:
列名称 | 说明 |
---|---|
用户ID | 整数类型,序列化后的用户ID |
商品ID | 整数类型,序列化后的商品ID |
商品类目ID | 整数类型,序列化后的商品所属类目ID |
行为类型 | 字符串类型,包括(‘pv’, ‘buy’, ‘cart’, ‘fav’) |
时间戳 | 行为发生的时间戳 |
用户行为类型共有四种,它们分别是:
行为类型 | 说明 |
---|---|
pv | 商品详情页pv,等价于点击 |
buy | 商品购买 |
cart | 将商品加入购物车 |
fav | 收藏商品 |
分析背景:通过对2017年11月25日至2017年12月3日之间的用户行为数据分析,优化更加合理的隐式反馈推荐系统,原数据约为1亿条用户行为数据,数据过大,所以对原数据集抽样10万条数据进行淘宝用户数据行为的分析。
分析思路:根据所选数据集——淘宝用户行为数据,从以下三个方面进行分析:
用户行为分析(基于AARRR模型与漏斗分析模型)
用户偏好分析
用户价值分析(基于RFM模型)
导入SQLyog查看数据(文件-打开-所有数据类型)
在所使用数据库下创建一个与原数据集匹配的数据表,然后点开表选择导入本地csv文件(原数据集没有表头)
USE dbtest1;
CREATE TABLE IF NOT EXISTS user_behavior(user_id INT not null,sku_id INT not null,category_id INT not null,behavior VARCHAR(15) not null,order_time VARCHAR(15));
SHOW CREATE TABLE user_behavior;
由于原数据集量过大,此次选择导入前10万条数据进行分析:
CREATE TABLE user_bh
AS
SELECT * FROM user_behavior
LIMIT 100000;
数据去重:
select DISTINCT * FROM user_bh
group by user_id,sku_id,category_id,behavior,order_time;
缺失值处理:
select * FROM user_bh
where user_id is null and sku_id is null and category_id is null and behavior is null and order_time is null;
-- 结果显示无缺失值
**时间戳数据处理:**统一数据口径,划分成日期时间、日期、时间三列
-- 新增 order_dt 日期时间列
ALTER TABLE user_bh ADD COLUMN order_dt DATETIME;
UPDATE user_bh
SET order_dt = FROM_UNIXTIME(order_time);
-- 新增 order_date 日期列
ALTER TABLE user_bh ADD COLUMN order_date DATE;
UPDATE user_bh
SET order_date = FROM_UNIXTIME(order_time);
-- 新增 order_dtime 时间列
ALTER TABLE user_bh ADD COLUMN order_dtime TIME;
UPDATE user_bh
SET order_dt = FROM_UNIXTIME(order_time);
**异常值处理:**将2017年11月25日至2017年12月3日时间段之外的信息数据进行剔除。
delete from user_bh
where order_date < '2017-11-25' or order_date > '2017-12-03';
共有44条异常数据,剔除后还剩余99956行数据。
相关数据校对:
SELECT MAX(order_date),MIN(order_date) FROM user_bh;
-- 2017-11-25至2017-12-03
SELECT first_date,COUNT(DISTINCT user_id) new_uv
FROM (SELECT user_id,MIN(order_date) first_date FROM user_bh
where MIN(order_date) between '2017-11-25' and '2017-12-04'
GROUP BY user_id) t
GROUP BY first_date;
order_date | new_uv |
---|---|
2017/11/25 | 695 |
2017/11/26 | 170 |
2017/11/27 | 59 |
2017/11/28 | 32 |
2017/11/29 | 19 |
2017/11/30 | 8 |
分析:
分析总体uv,pv,人均浏览次数以及日均uv,pv,人均浏览次数情况,查看统计时间段内数据是否存在异常波动,从用户侧,商品侧反应平台吸引用户的能力以及用户粘性和忠诚度
整体情况:
-- 计算总体uv、pv、人均浏览次数
SELECT COUNT(DISTINCT user_id) AS uv,(SELECT COUNT(*) FROM user_bh WHERE behavior = 'pv') AS pv,
(SELECT COUNT(*) FROM user_bh WHERE behavior = 'pv')/COUNT(DISTINCT user_id) AS '人均浏览次数' FROM user_bh;
日均情况:
-- 计算日均uv、pv、人均浏览次数
SELECT t1.order_date,t1.uv '日均uv',t2.pv '日均pv',t2.pv/t1.uv '人均浏览次数'
FROM
(SELECT order_date,COUNT(DISTINCT user_id) AS uv FROM user_bh GROUP BY order_date) t1
LEFT JOIN (SELECT order_date,COUNT(*) pv FROM user_bh WHERE behavior = 'pv' GROUP BY order_date)t2
ON t1.order_date = t2.order_date;
分析:
分析次日留存率、3日留存率、七日留存率的思路:先找出每个用户使用时间和第一次使用时间,计算出两者之间的间隔天数,对这些间隔天数进行分段即得第一次使用时间后的次日留存人数、3日留存人数,7日留存人数;
-- 获取每个用户的使用时间与第一次使用时间
SELECT t1.user_id,t2.first_day,t1.order_date
FROM (SELECT DISTINCT user_id,order_date FROM user_bh)t1
INNER JOIN (SELECT user_id,MIN(order_date) first_day FROM user_bh GROUP BY user_id) t2 ON t1.user_id = t2.user_id;
-- 计算后面使用时间与首次使用时间之间相隔的天数
SELECT user_id,first_day,order_date,DATEDIFF(order_date,first_day) df_day
FROM
(SELECT t1.user_id,t2.first_day,t1.order_date
FROM (SELECT DISTINCT user_id,order_date FROM user_bh)t1
INNER JOIN (SELECT user_id,MIN(order_date) first_day FROM user_bh GROUP BY user_id) t2 ON t1.user_id = t2.user_id)t;
-- df_day表示留存天数 SELECT first_day, SUM(CASE WHEN df_day=0 THEN 1 ELSE 0 END) AS 'day_0', SUM(CASE WHEN df_day=1 THEN 1 ELSE 0 END) AS 'day_1', SUM(CASE WHEN df_day=2 THEN 1 ELSE 0 END) AS 'day_2', SUM(CASE WHEN df_day=3 THEN 1 ELSE 0 END) AS 'day_3', SUM(CASE WHEN df_day=4 THEN 1 ELSE 0 END) AS 'day_4', SUM(CASE WHEN df_day=5 THEN 1 ELSE 0 END) AS 'day_5', SUM(CASE WHEN df_day=6 THEN 1 ELSE 0 END) AS 'day_6', SUM(CASE WHEN df_day=7 THEN 1 ELSE 0 END) AS 'day_7', SUM(CASE WHEN df_day=8 THEN 1 ELSE 0 END) AS 'day_8' FROM (SELECT user_id,first_day,order_date,DATEDIFF(order_date,first_day) df_day FROM (SELECT t1.user_id,t2.first_day,t1.order_date FROM (SELECT DISTINCT user_id,order_date FROM user_bh)t1 INNER JOIN (SELECT user_id,MIN(order_date) first_day FROM user_bh GROUP BY user_id) t2 ON t1.user_id = t2.user_id)t)a GROUP BY first_day;
-- 计算留存率 select first_day,concat(cast((day_0/day_0)*100 as DECIMAL(18,2)),'%') as '当日新增人数', concat(cast((day_1/day_0)*100 as DECIMAL(18,2)),'%') as '次日留存', concat(cast((day_2/day_0)*100 as DECIMAL(18,2)),'%') as '2日留存', concat(cast((day_3/day_0)*100 as DECIMAL(18,2)),'%') as '3日留存', concat(cast((day_4/day_0)*100 as DECIMAL(18,2)),'%') as '4日留存', concat(cast((day_5/day_0)*100 as DECIMAL(18,2)),'%') as '5日留存', concat(cast((day_6/day_0)*100 as DECIMAL(18,2)),'%') as '6日留存', concat(cast((day_7/day_0)*100 as DECIMAL(18,2)),'%') as '7日留存', concat(cast((day_8/day_0)*100 as DECIMAL(18,2)),'%') as '8日留存' from (-- df_day表示留存天数 SELECT first_day, SUM(CASE WHEN df_day=0 THEN 1 ELSE 0 END) AS 'day_0', SUM(CASE WHEN df_day=1 THEN 1 ELSE 0 END) AS 'day_1', SUM(CASE WHEN df_day=2 THEN 1 ELSE 0 END) AS 'day_2', SUM(CASE WHEN df_day=3 THEN 1 ELSE 0 END) AS 'day_3', SUM(CASE WHEN df_day=4 THEN 1 ELSE 0 END) AS 'day_4', SUM(CASE WHEN df_day=5 THEN 1 ELSE 0 END) AS 'day_5', SUM(CASE WHEN df_day=6 THEN 1 ELSE 0 END) AS 'day_6', SUM(CASE WHEN df_day=7 THEN 1 ELSE 0 END) AS 'day_7', SUM(CASE WHEN df_day=8 THEN 1 ELSE 0 END) AS 'day_8' FROM (SELECT user_id,first_day,order_date,DATEDIFF(order_date,first_day) df_day FROM (SELECT t1.user_id,t2.first_day,t1.order_date FROM (SELECT DISTINCT user_id,order_date FROM user_bh)t1 INNER JOIN (SELECT user_id,MIN(order_date) first_day FROM user_bh GROUP BY user_id) t2 ON t1.user_id = t2.user_id)t)a GROUP BY first_day) p;
分析:
11月25日新增的客户一直处于稳定留存状态;
11月30日新增的用户在3日留存后出现断崖式下降,可以假设是由于促销活动等吸引过来的不稳定用户;
结合数据可以知道数据基本在前3天稳定留存,但是后期无法持久留存。
如何提高留存率呢?
select order_date,sum(购买) as '日成交量'
from
(select order_date,count(behavior) as '购买'
from user_bh
where behavior='buy'
group by order_date) as a
group by order_date;
-- 消费次数大于等于两次以上的用户 select distinct user_id,count(behavior) as '购买次数' from user_bh where behavior='buy' group by user_id having 购买次数>=2; -- 购买的总共用户数 select count(distinct user_id) from user_bh where behavior='buy'; # 671 -- 计算复购率 select (select count(*) from (select distinct user_id,count(behavior) as '购买次数' from user_bh where behavior='buy' group by user_id having 购买次数>=2)f) '复购次数',(select count(distinct user_id) from user_bh where behavior='buy') '购买次数',(select count(*) from (select distinct user_id,count(behavior) as '购买次数' from user_bh where behavior='buy' group by user_id having 购买次数>=2)f)/(select count(distinct user_id) from user_bh where behavior='buy') as '复购率' from user_bh limit 1; -- 购买次数人数分布 select buyer '购买次数' ,count(*) '购买人数' from (select distinct user_id,count(behavior) as buyer from user_bh where behavior='buy' group by user_id having buyer>=2)f group by buyer;
分析:
-- 创建用户行为视图 create view ub as select distinct user_id,sum(case when behavior = pv then 1 else 0 end) if_pv,sum(case when behavior = fav then 1 else 0 end) if_fav,sum(case when behavior = cart then 1 else 0 end) if_cart,sum(case when behavior = buy then 1 else 0 end) if_buy from user_bh group by user_id; -- 浏览(点击)人数 select count(user_id) as '浏览(点击)人数' from ub; -- 浏览加购人数 select sum(case when if_pv>0 and if_cart >0 then 1 else 0 end) as '浏览加购用户数' from ub; -- 收藏人数 select sum(case when if_pv>0 and if_cart >0 and if_fav >0 then 1 else 0 end) as '浏览加购收藏用户数' from ub; -- 购买人数 select sum(case when if_pv>0 and if_cart >0 and if_fav >0 and if_buy >0 then 1 else 0 end) as '浏览加购收藏购买用户数' from ub; -- 基于用户购买路径 -- 浏览-购买 人数 select sum(case when if_buy>0 then 1 else 0 end) as '购买用户数' from ub where if_fav = 0 and if_cart = 0; -- 浏览-收藏-购买 人数 select sum(case when if_fav >0 then 1 else 0 end) as '浏览收藏用户数',sum(case when if_fav >0 and if_buy >0 then 1 else 0 end) as '浏览收藏购买用户数' from ub where if_cart = 0; -- 浏览-加购-购买 人数 select sum(case when if_cart >0 then 1 else 0 end) as '浏览加购用户数',sum(case when if_cart >0 and if_buy>0 then 1 else 0 end) as '浏览加购购买用户数' from ub where if_fav = 0; -- 浏览-收藏且加购-购买 select sum(case when if_fav > 0 and if_cart >0 then 1 else 0 end) as '浏览加购和收藏用户数',sum(case when if_fav >0 and if_cart >0 and if_buy >0 then 1 else 0 end) as '浏览加购收藏购买用户数' from ub; -- 浏览-收藏或加购-购买 select sum(case when if_fav > 0 or if_cart >0 then 1 else 0 end) as '浏览加购和收藏用户数',sum(case when (if_fav >0 or if_cart >0) and if_buy >0 then 1 else 0 end) as '浏览加购收藏购买用户数' from ub;
分析:
-- 商品种类总数
select count(category_id) '商品种类总数' from (select DISTINCT category_id from user_bh) t;
-- 点击次数TOP10的商品种类
SELECT category_id,COUNT(category_id) AS '点击次数' FROM user_bh WHERE behavior= 'pv' GROUP BY category_id ORDER BY COUNT(category_id) DESC LIMIT 10;
-- 收藏次数TOP10的商品种类
SELECT category_id,COUNT(category_id) AS '收藏次数' FROM user_bh WHERE behavior= 'fav' GROUP BY category_id ORDER BY COUNT(category_id) DESC LIMIT 10;
-- 加购次数TOP10的商品种类
select category_id,count(category_id) as '加购次数'FROM user_bh WHERE behavior= 'cart' GROUP BY category_id ORDER BY COUNT(category_id) DESC LIMIT 10;
-- 购买次数TOP10的商品种类
select category_id,count(category_id) as '购买次数'FROM user_bh WHERE behavior= 'buy' GROUP BY category_id ORDER BY COUNT(category_id) DESC LIMIT 10;
-- 需求频率以pv指标去衡量 SELECT a.category_id,a.需求品类频次, (SELECT COUNT(category_id) FROM user_bh WHERE behavior='buy' AND category_id= a.category_id)AS '购买品类频次' ,CONCAT(((SELECT COUNT(category_id) FROM user_bh WHERE behavior='buy' AND category_id= a.category_id)*100/a.需求品类频次),'%') 'ROI' FROM (SELECT category_id,COUNT(category_id) AS '需求品类频次' FROM user_bh WHERE behavior='pv' GROUP BY category_id ORDER BY 需求品类频次 DESC LIMIT 10) AS a ; -- 购买频率以buy指标去衡量 select a.category_id , (select count(category_id) from user_bh where behavior='pv' and category_id=a.category_id )as '需求品类频次', a.购买品类频次,CONCAT((a.购买品类频次*100/(SELECT COUNT(category_id) FROM user_bh WHERE behavior='buy' AND category_id= a.category_id)),'%') 'ROI' from (select category_id,count(category_id) as '购买品类频次' from user_bh where behavior='buy' group by category_id order by 购买品类频次 DESC limit 10) as a;
分析:
受欢迎商品品类分析:
流失分析:
需求品类频次,意指商家推送广告的流量多,点击率就会提高。
ROI=用户贡献消费额/获客费用,我们姑且用ROI的类似的概念解决性价比的问题;ROI=购物品类频次/需求品类频次,通俗’性价比’,推送的广告多,转化率最好也要高,满足用户需求
ROI越高证明投放的广告越满足用户的购买要求,匹配程度越高;反之越低,证明投放广告并没有带来较高的转化率,匹配程度低,需要改善。
需求品类排名图中,ROI最低的是2520377,其次是982629,突出表现的是3002521
购买品类排名图中,ROI最低的4756105,此品类是投放量最多的品类,但购买力却很差,ROI最高的是1464116,其次是4789432,1299190,2735466
整体概况(vs对比):
结论:
措施:
从时间的维度分析用户的行为习惯,按照24小时时间段统计用户行为数据,针对不同行为的在各个时间段的数据统计,找出用户活跃的日期以及每天的活跃时间段,可以进行符合用户在平台购物习惯的营销活动
-- 24小时各时间段的用户行为习惯分布
-- 创建视图统计用户使用时段
CREATE VIEW m AS
SELECT user_id,category_id,behavior,order_date,
order_dtime,HOUR(order_dtime) dtime FROM user_bh;
-- 统计各时段使用用户人数
select dtime,count(behavior) as '用户行为总数',
sum(case when behavior ='pv' then 1 else 0 end) as 'pv',
sum(case when behavior ='fav' then 1 else 0 end) as 'fav',
sum(case when behavior ='cart' then 1 else 0 end) as 'cart',
sum(case when behavior ='buy' then 1 else 0 end) as 'buy'
from m
group by dtime
order by dtime;
分析:
由于原数据集中没有消费金额,因此只分析RF两个值,F是消费频数,R是近期消费时间,选择这两个维度进行用户分层,挖掘更多的用户价值
按照打分标准计算用户的R与F得分情况:
得分 | R得分标准 | F得分标准 |
---|---|---|
4 | 0<=R值<=2 | F值>14 |
3 | 2<R值<=4 | 10<F值<=14 |
2 | 4<R值<=6 | 6<F值<=10 |
1 | 6<R值2 | F值<=6 |
-- 创建近期消费时间视图,将近期购买时间提取到视图中 create view R as select user_id,max(order_date) as '近期购买时间' from user_bh where behavior = 'buy' group by userid; -- 建立R等级划分视图,将客户近期购买时间进行等级划分,越接近2017-12-04的R越大; create view R等级划分 as select user_id, 近期购买时间,datediff('2017-12-04',近期购买时间) as 'R' from R; -- 构建R数值型和R字符串型,前者用于后续的计算全体用户的平均值,后者用于计算每个等级的数量; SELECT user_id, 近期购买时间,CASE WHEN R<=2 THEN '4' WHEN R<=4 THEN '3' WHEN R<=6 THEN '2' ELSE '1' END AS 'R值' FROM R等级划分; -- 创建消费频数视图 create view F as select DISTINCT user_id, count(behavior) as '购买次数' from user_bh where behavior = 'buy' group by user_id having 购买次数>=2; -- 创建F等级划分视图 create view F等级划分 as SELECT user_id, 购买次数,CASE WHEN 购买次数<=6 THEN '1' WHEN 购买次数<=10 THEN '2' WHEN 购买次数<=14 THEN '3' ELSE '4' END AS 'F值' FROM F;
-- 构建RFM模型 -- 计算R平均值与F平均值 select AVG(R值) as 'R平均值' FROM r等级划分; #3.02 select avg(F值) as 'F平均值' from f等级划分; #1.19 -- 根据用户个人R,F的得分与整体R,F得分的平均值作比较,进行用户分层 CREATE VIEW RFM AS SELECT a.user_id,a.近期购买时间,b.购买次数,a.R值,b.F值, (CASE WHEN a.R值>=3.02 AND b.F值>=1.19 THEN '重要高价值客户' WHEN a.R值<3.02 AND b.F值>=1.19 THEN '重要保持客户' WHEN a.R值>=3.02 AND b.F值<1.19 THEN '重要发展客户' WHEN a.R值<3.02 AND b.F值<1.19 THEN '重要挽留客户' END ) AS '客户分类' FROM R等级划分 a, F等级划分 b WHERE a.user_id=b.user_id; -- 客户分类频数分布 select 客户分类, count(客户分类) as '频数' from RFM group by 客户分类 ;
分析:
**重要高价值客户:**近期交易的高频率用户占比9.73%,该类用户极有可能发展为忠实用户,留存率高;对这部分高质量高粘性客户,应该加强维持呵护,可以提供VIP服务以及定向优惠活动,对于他们所购买的商品种类,可以进行精准营销。
**重要保持客户:**无近期交易的高频率用户占比4.52%,近期没有消费过,有可能发展为流失的重要客户,有可能被竞争对手拉过去了,针对这部分客户采取赠送、奖励、红包等方式唤回,通过PUSH,短信,站内信等方式促进用户活跃度,刺激消费,增加粘性,提高他们的付费转化率。
**重要发展客户:**近期交易的低频率用户占比44.12%,具有巨大的潜力;根据这部分用户可以根据以往的消费记录,个性化推荐,增加优惠券刺激消费,增加粘性。
**重要挽留客户:**无近期交易的低频率用户占比41.63%,这部分客户很有可能是已经或者即将流失的客户,针对这部分客户找到流失原因,并根据联系方式,尝试联系问其不满意的地方,对有相似特征的群体进行预警,分析这部分用户流失的原因,弄清楚这部分用户的需求,购物体验为什么没有达到用户预期,针对其原因进行改善。
分析总结:
建议:
思路总结:
本次分析内容数据选取阿里天池淘宝用户行为数据,分析步骤:导入数据,数据清洗,数据分析,提出建议。
数据分析从以下三个方面入手:用户行为分析,用户偏好分析以及用户价值分析。
基于数据源的数据,搭建相关数据指标体系可以将数据归纳为指标:
基于上述三个层面的指标,也会出现一些基于公式的衍生指标,比如PV/UV(日人均浏览次数)。该分析报告中,运用了数据分析中几个常用的模型,基于用户行为的AARRR模型、购买路径分析转化率的漏斗模型以及体现用户价值的RFM模型。
参考:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。