淘宝是中国深受欢迎的网购零售平台,一年一度的双十二更是集聚了海量的用户行为数据,在这个数字经济的时代,拥有数据且能够有效运用数据是推动产品高效运营的关键。
本次项目的数据集来源于2014年双十二期间,淘宝平台上真实的用户商品行为数据,通过对数据集的指标进行结构分析拆解,探索淘宝用户行为模式的同时进行活动复盘,为下一次活动的更好举办提供数据决策基础。
基于人、货、场三个维度进行分析,使用AARRR漏斗模型、RFM模型、商品四象限分析(矩阵分析方法)等方法进行探究。
数据链接: 淘宝用户购物行为数据可视化分析
本次分析数据为阿里天池公开数据集user_action.csv,数据包含了抽样出来的1W用户在一个月时间(11.18-12.18)之内的移动端行为数据。
字段 | 字段说明 | 提取说明 |
---|---|---|
user_id | 用户标识 | 抽样&字段脱敏 |
item_id | 商品标识 | 字段脱敏 |
behavior_type | 用户对商品的行为类型 | 包括浏览、收藏、加购物车、购买,对应取值分别是1、2、3、4。 |
item_category | 商品分类标识 | 字段脱敏 |
time | 行为时间 | 精确到小时级别 |
数据包含5个字段,前4个字段应为数值型,最后一个time字段应转换为时间。
select * from user_action
limit 10;
观察前10行数据,发现要将时间转换为日期和小时方便后续分析
# 添加字段名,日期dates和小时hours,用substring(字符串,开始位置,截取长度)函数
alter table user_action add dates char(10) null;
alter table user_action add hours char(2) null;
update user_action set dates = substring(time,1,10),
hours = substring(time,12,2);
select count(*)
,count(user_id)
,count(item_id)
,count(behavior_type)
,count(item_category)
,count(time)
from user_action;
发现无空值
为后期调用不改变原数据且方便,建临时表temp_user,同时去除重复值:
#创建临时表,存放去重后的数据
create table temp_user like user_action;
insert into temp_user select distinct * from user_action;
# 去重后还有6213379行数据
本数据集有时间范围,2014-11-18到2014-12-18,若时间不在此范围,应剔除:
select min(dates), max(dates) from temp_user;
发现无异常值
按天分组
# 基于天
select dates,
count(user_id) pv,
count(distinct user_id) uv,
round(count(user_id) / count(distinct user_id),2) 'pv/uv'
from temp_user
group by dates;
得到基于天的用户PV、UV、访问深度(PV / UV),并借助Tableau进行可视化:
采用双轴进行展示,结果展示PV、UV大体趋势一致,均在双十二当天出现峰值,且附近日期数值明显高于其他日期,由此可知:
按小时分组
# 基于小时
select hours,
count(user_id) pv,
count(distinct user_id) uv,
round(count(user_id) / count(distinct user_id),2) 'pv/uv'
from temp_user
group by hours;
# 特定日期(12-12)
select hours,
count(user_id) pv,
count(distinct user_id) uv,
round(count(user_id) / count(distinct user_id),2) 'pv/uv'
from temp_user
where dates = '2014-12-12'
group by hours;
得到基于小时的用户PV、UV、访问深度(PV / UV)并与双十二当天的数据进行对比,借助Tableau进行可视化:
可以看出:
留存率
# 将表关联,筛选出b表的日期大于a表的日期
select * from
(select user_id, dates from temp_user group by user_id, dates) a
left join
(select user_id, dates from temp_user group by user_id, dates) b
on a.user_id = b.user_id
where a.dates <= b.dates;
使用datediff()函数计算次日留存率、7日留存率、月留存率:
select a.dates,
count(distinct a.user_id) theday, -- 当天计数
count(if(datediff(b.dates,a.dates)=1,b.user_id,null)) / count(distinct a.user_id) remain1, -- 次日留存率
count(if(datediff(b.dates,a.dates)=7,b.user_id,null)) / count(distinct a.user_id) remain7, -- 七日留存率
count(if(datediff(b.dates,a.dates)=30,b.user_id,null)) / count(distinct a.user_id) remain30 -- 月留存率
from
(select user_id, dates from temp_user group by user_id, dates) a
left join
(select user_id, dates from temp_user group by user_id, dates) b
on a.user_id = b.user_id
where a.dates <= b.dates
group by a.dates;
可以看到留存率均在70%-80%之间,说明用户忠诚度高,双十二活动的效果好。
跳失率
每日只访问了一个页面就离开的访问人数占该页面总访问人数的比例。跳失率可以反映用户对APP\网站内容的认可程度,或者说网站\APP是否对用户有吸引力,基于天进行计算:
select dates, count(*) '每日跳失数'
from (
select dates, user_id
from temp_user
where behavior_type = 1
group by dates, user_id
having count(behavior_type) = 1
) a
group by dates; -- 存入daily_jump表
# 将表daily_jump与day_pv_uv联结,计算流失率
select dj.dates, 每日跳失数, uv
,round(每日跳失数 / uv,4) '跳失率'
from daily_jump dj join day_pv_uv dpu
on dj.dates = dpu.dates;
可视化结果看出:每日跳失率很低,仅占当天访问人数的9%左右,说明用户粘性高,商品吸引力强。
结合留存率和跳失率来看,淘宝用户的忠诚度较高,用户粘性强,并且淘宝的内容质量好,吸引用户深入浏览,所以在获取新用户的同时,也要关注老客的忠诚度,要重视用户关系管理,不断维系新老用户,进一步培养用户忠诚度。
时间序列分析
# 基于日期-小时的用户行为
select dates, hours,
count(if(behavior_type=1,1,null)) pv,
count(if(behavior_type=2,1,null)) fav,
count(if(behavior_type=3,1,null)) cart,
count(if(behavior_type=4,1,null)) buy
from temp_user
group by dates, hours
order by dates, hours;
用户转化率
数据集中用户行为包括浏览、收藏、加购、购买,是单向的用户行为流程,非常适合使用漏斗模型进行分析。
由于收藏和加购同属于购买前置行为,本研究中将数据简化成浏览-收藏加购-购买的漏斗模型。
select behavior_type, count(*) num from temp_user
group by behavior_type;
# +-------------+--------+
# behavior_type |num |
# +-------------+--------+
# |1 |5535879|
# |2 |239472 |
# |3 |331350 |
# |4 |106678 |
# +-------------+--------+
select (239472+331350) / 5535879, 106678 / 5535879;
-- 0.1031;0.0193
# 双十二当天的漏斗模型
select behavior_type, count(behavior_type) num from temp_user
where dates = '2014-12-12'
group by behavior_type;
# +-------------+--------+
# behavior_type |num |
# +-------------+--------+
# |1 |298410 |
# |2 |10309 |
# |3 |23879 |
# |4 |13866 |
# +-------------+--------+
select (23879+10309) / 298410, 13866 / 298410;
-- 0.1146;0.0465
由结果看到,整月的浏览-收藏加购的转化率为10.31%,收藏加购-购买的转化率仅为1.93%;双十二当天的浏览-收藏加购的转化率为11.46%,收藏加购-购买的转化率为4.65%,较整月整体有上升趋势,但是依旧偏低。
但是用户并非一定收藏加购后再购买,因此收藏加购-支付转化率并不准确。我们在此继续细分用户行为:
# 用户行为
create view user_behavior_view as
select user_id
,item_id
,count(if(behavior_type = 1,1,null)) pv
,count(if(behavior_type = 2,1,null)) fav
,count(if(behavior_type = 3,1,null)) cart
,count(if(behavior_type = 4,1,null)) buy
from temp_user
group by user_id, item_id;
# 用户行为标准化
create view user_behavior_standard as
select user_id
,item_id
,(case when pv>0 then 1 else 0 end) '浏览了'
,(case when fav>0 then 1 else 0 end) '收藏了'
,(case when cart>0 then 1 else 0 end) '加购了'
,(case when buy>0 then 1 else 0 end) '购买了'
from user_behavior_view
group by user_id, item_id;
# 购买路径类型
# 将行为连接,以此作为字段计数分析:
create view user_behavior_path as
select *
, concat(浏览了,收藏了,加购了,购买了) '购买路径类型'
from user_behavior_standard ubs
where ubs.购买了>0;
# 统计各购买路径数量
select 购买路径类型
, count(*) '数量'
from user_behavior_path
group by 购买路径类型
order by 数量 desc;
一般来说,通过分析用户在电商平台上的消费金额、购买频次、及最近一次购买的日期,可以发现哪些用户是高价值用户,哪些用户是低价值用户。但由于数据集中不包含消费金额,因此我们可以通过分析用户的近期一次消费(R)和购买频次(F),来粗略评估用户的价值。可以将用户分为以下几类(1代表高,0代表低):
价值用户(11):最近消费时间近、消费频次都高,是电商平台的主要贡献者。
保持用户(01):最近消费时间较远,但消费频次高,说明这是个一段时间没来的忠诚客户,是电商平台的中坚力量,也是潜在的高价值用户,需要主动和他保持联系。
发展用户(10):最近消费时间较近,但频次不高,忠诚度不高,是很有潜力的用户,可考虑重点发展。
挽留用户(00):最近消费时间较远、消费频次不高,可能是将要流失或者已经要流失的用户,是电商平台的边缘用户,需要进一步开发和引导并给予挽留措施。
# 计算最近购买日期和购买次数
select user_id
, max(dates) '最近购买日期'
, count(user_id) '购买次数'
from temp_user
where behavior_type = 4
group by user_id
order by 2 desc, 3 desc;
## 建立rfm_model表,并添加f_score列
update rfm_model
set f_score= case
when(购买次数 between 0 and 10) then 1
when(购买次数 between 10 and 50) then 2
when(购买次数 between 50 and 100) then 3
when(购买次数 between 100 and 200) then 4
else 5 end;
# 添加r_score列
alter table rfm_model add column r_score int;
update rfm_model
set r_score= case
when 最近购买日期 in ('2014-11-18','2014-11-24') then 1
when 最近购买日期 in ('2014-11-24','2014-11-30') then 2
when 最近购买日期 in ('2014-11-30','2014-12-06') then 3
when 最近购买日期 in ('2014-12-06','2014-12-12') then 4
else 5 end;
再对用户进行分层:
# 对用户分层
set @f_avg = null;
set @r_avg = null; -- 定义用户变量存储平均值,加@以区分列名
select avg(f_score) into @f_avg from rfm_model;
select avg(r_score) into @r_avg from rfm_model;
alter table rfm_model add column class char(4);
update rfm_model set class = case
when f_score > @f_avg and r_score > @r_avg then '价值客户'
when f_score > @f_avg and r_score < @r_avg then '保持客户'
when f_score < @f_avg and r_score > @r_avg then '发展客户'
when f_score < @f_avg and r_score < @r_avg then '挽留客户'
end;
可视化结果如图
各类用户特性:
1)价值用户占比超30%,说明优质用户较多,应继续重点关注,既要保持其粘性,又要继续引导消费,可为这类用户提供vip服务;
2)发展用户的特点是近期有消费但频次不高,占比近50%,要提高这类用户群体的消费频次,具体措施有促销活动提醒和优惠券活动等;
3)保持用户的特点是消费频次高但有一段时间没有消费,此类群体数量相对较少,也符合常理,可能用户在一段活动期间多次购买,囤积商品够长期使用,策略是重新唤醒,应通过APP消息推送,以及站外广告营销吸引其注意力,促进复购;
4)挽留用户近期没有消费且频次不高,若不加以挽留,会有流失的可能, 对于这类用户一方面需要保持曝光量,持续推送活动和优惠信息;另一方面需要进一步研究其兴趣和需求,才能采取有效的运营策略。
复购率
复购率可以直观看出用户的忠诚度,由此可为本次活动举办成功与否提供依据,并且可以推动活动运营的优化。
select count(if(购买总数>1,a.user_id,null)) 复购人数
, count(if(购买总数>0,a.user_id,null)) 购买总人数
, concat(round(count(if(购买总数>1,1,null)) * 100 / count(if(购买总数>0,1,null)),2),'%') 复购率
from(
select user_id
, count(if(behavior_type = 4,1,null)) 购买总数
from temp_user
group by user_id) a; -- 8117,8886,91.35%
复购率高达90%以上,可以看出淘宝用户忠诚度非常高,淘宝商品对用户的吸引力高,因此更要抓住这点推出更多吸引用户的商品,提高用户粘性,进而刺激用户消费。
查询浏览量、购买量前十的商品品类,并进行对比:
#查询品类浏览量前十
select *
,rank()over(order by 品类浏览量 desc) rk
from
(select item_category
, count(if(behavior_type = 1,1,null)) '品类浏览量'
from temp_user
group by item_category
order by 2 desc) a
where a.品类浏览量>0
limit 10; -- 创建表category_pv_rank记录数据
#查询品类购买量前十
select *
,rank()over(order by 品类购买量 desc) rk
from
(select item_category
, count(if(behavior_type = 4,1,null)) '品类购买量'
from temp_user
group by item_category
order by 2 desc) a
where a.品类购买量>0
limit 10; -- 创建表category_buy_rank记录数据
通过创建category_pv_rank表和category_buy_rank表分别记录品类浏览量前十和购买量前十,将两表连接,对比浏览量前十和购买量前十品类:
#连接category_pv_rank和category_buy_rank表
select *
from category_pv_rank p join category_buy_rank b
on p.item_category = b.item_category
order by p.rk;
共有2876947种商品,活动复盘一个关键就是找出转化好的商品继续保持,找出转化差的商品进行下架。
查询浏览量、购买量前十的商品,并进行对比:
# 浏览量前十的商品
select *
,rank()over(order by 商品浏览量 desc) rk
from
(select item_id
, count(if(behavior_type = 1,1,null)) '商品浏览量'
from temp_user
group by item_id
order by 2 desc) a
where a.商品浏览量>0
limit 10;
# 购买量前十的商品
select *
,rank()over(order by 商品购买量 desc) rk
from
(select item_id
, count(if(behavior_type = 4,1,null)) '商品购买量'
from temp_user
group by item_id
order by 2 desc) a
where a.商品购买量>0
limit 10;
通过创建item_pv_rank表和item_buy_rank表分别记录商品浏览量前十和购买量前十,将两表连接,对比浏览量前十和购买量前十商品:
select *
from item_pv_rank p join item_buy_rank b
on p.item_id = b.item_id
order by p.rk;
由于对商品笼统的浏览量、销售量排名难以明确,因此对商品从浏览量和销售量两个维度进行商品四象限分析(矩阵分析方法),类似上文RF模型。
# 将商品浏览量表和购买量表连接
select p.item_id, 商品浏览量, 商品购买量
from item_pv_rank p join item_buy_rank b
on p.item_id = b.item_id;
# 添加分数字段
alter table 商品四象限分析 add column pv_score int;
alter table 商品四象限分析 add column buy_score int;
由于人眼不好分组,所以将数据导入Tableau进行群集分组,得到每一组的区间范围:
# 放入tableau可视化,进行群集分组
# 商品浏览量
update 商品四象限分析 set pv_score=case
when 商品浏览量 between 280 and 550 then 5
when 商品浏览量 between 100 and 280 then 4
when 商品浏览量 between 50 and 100 then 3
when 商品浏览量 between 20 and 50 then 2
else 1 end;
# 商品购买量
update 商品四象限分析 set buy_score=case
when 商品购买量 between 12 and 28 then 5
when 商品购买量 between 7 and 12 then 4
when 商品购买量 between 4 and 7 then 3
when 商品购买量 between 2 and 4 then 2
else 1 end;
设置变量存储分数的平均值:
# 对商品分层
set @pv_avg = null;
set @buy_avg = null; -- 定义商品变量存储平均值,加@以区分列名
select avg(pv_score) into @pv_avg from 商品四象限分析;
select avg(buy_score) into @buy_avg from 商品四象限分析;
对四类商品进行命名:
pv、buy均大于平均值,高价值商品;
pv大于平均值,buy小于平均值,高性价商品;
pv小于平均值,buy大于平均值,高发展商品;
pv、buy均小于平均值,高潜力商品。
alter table 商品四象限分析 add column class char(5);
update 商品四象限分析 set class = case
when pv_score > @pv_avg and buy_score > @buy_avg then '高价值商品'
when pv_score > @pv_avg and buy_score < @buy_avg then '高性价商品'
when pv_score < @pv_avg and buy_score > @buy_avg then '高发展商品'
when pv_score < @pv_avg and buy_score < @buy_avg then '高潜力商品'
end;
针对第二象限:高发展商品
针对第三象限:高潜力商品
针对第四象限:高性价商品
淘宝是中国深受欢迎的网购零售平台,每时每刻都有海量用户数据,数据中显示高发展商品(浏览量较少,购买量较高)、高性价商品(浏览量较高,购买量较少)占比较高,应优化平台推荐机制,对特定群体投放资源从而避免资源浪费,增加用户了解信息的沟通渠道,提高商品曝光量,增加用户触及商品的可能性;同时针对商品特性和用户群体画像精准推荐,选取合适的商品关键词,使其更加符合用户画像。
从用户购买路径分析看出,绝大多数用户选择浏览加购后购买以及浏览后购买进行购买,两者占比超80%,造成收藏加购使用率不高,应加大力度引导用户使用收藏加购功能,可在商品详情页或商品点击页面显示收藏加购的优惠之处,并紧密结合淘宝平台的优惠活动,以优惠为突破点吸引顾客。重点提升点击进入详情页的用户的收藏加购使用率。
本分析从人、货、场三个维度分析了来自淘宝用户行为的千万级数据,进行双十二活动复盘,得到结论如下:
参考资料:
【MySQL实战】基于100万真实电商用户的1亿条行为数据分析
浅析淘宝用户购物行为数据可视化分析
淘宝用户行为分析项目——MySQL数据分析+Tableau可视化