电商用户行为分析(一)
一、项目背景介绍:
2014年是阿里巴巴集团移动电商业务快速发展的一年,例如2014双11大促中移动端成交占比达到42.6%,超过240亿元。相比PC时代,移动端网络的访问是随时随地的,具有更丰富的场景数据,比如用户的位置信息、用户访问的时间规律等。
通过数据分析,能够挖掘数据背后丰富的内涵,为移动用户在合适的时间、合适的地点精准推荐合适的内容。
本案例的目标是从该数据进行随机抽样,并用mysql进行分析,提高自己对电商指标体系的认识。
二、数据说明
1、字段说明
字段说明
三、分析思路
1、提出问题:
1)分析用户购物过程中的常见监控指标,了解运营现状,查看各环节的漏斗转化情况,并找到需要改进的节点;
2)研究用户在不同维度下的行为规律,了解用户行为特征,优化运营策略;
3)利用RFM模型对用户进行分类,指导运营针对不同价值用户进行精细化运营;
4)了解用户生命周期,针对不同周期的用户采取不同的运营策略。
2、指标和字段解读
通过用户和用户行为路径可以分析PV、UV、PV/UV、跳失率、总订单量等运营指标;
通过用户行为和时间可以分析用户的购物行为特征;
通过用户和商品、商品类别可以分析用户的购买商品偏好;用户和时间可以分析用户的购买时间偏好,便于对不同商品和时间偏好的用户采取个性化时间推荐(push、短信等推送);
通过商品类别和用户行为可以分析不同商品类别受欢迎程度,指导运营进行商品的上新或下架;
通过商品类别和时间可以分析不同商品类别的热销时间段,便于做活动的推广;
结合AARRR模型,可以分析用户的生命周期,划分不同用户所处的周期阶段,采用差异化运营;
通过时间和用户的生命周期字段,结合RFM模型可以给用户做价值分类,对客户进行差异化管理。
四、数据清洗
(查看数据清洗流程:https://www.jianshu.com/p/adb82624df14)
将csv导入mysql的方法:
切换命令行菜单:https://jingyan.baidu.com/article/f00622280752dbfbd3f0c815.html
导入数据:https://blog.csdn.net/qq_25504271/article/details/78911151
1)选择子集
导入之前已选择好
2)列名重命名
无需更改列名
3)数据类型转换
可以在设计表菜单栏更好数据类型
4)数据去重
查询重复值:
select *,count(1)
from user1
group by user_id,item_id,behavior_type,item_id,time
having COUNT(user_id)>1;
存在重复值
存在重复值,但由于同一用户同一个行为在一小时内是可能存在多次的,因此这里不做去重处理。
5)缺失值处理
查询缺失值:
SELECT
COUNT(user_id)/(SELECT COUNT(*) FROM USER1) AS '用户ID字段的非空比例'
,COUNT(item_id)/(SELECT COUNT(1) FROM USER1) AS '商品ID字段的非空比例'
,COUNT(behavior_type)/(SELECT COUNT(1) FROM USER1) AS '行为路径字段的非空比例'
,COUNT(item_category)/(SELECT COUNT(1) FROM USER1) AS '品类字段的非空比例'
,COUNT(time)/(SELECT COUNT(1) FROM USER1) AS '时间字段的非空比例'
FROM USER1
WHERE user_id IS NOT NULL;
无缺失值
经查询,无缺失值
6)关联数据
由于只有一个表格,无需做表关联(如果需要关联,可以到分析过程中有需要时进行关联,这样会提高MySQL的性能。
7)异常值处理
检查时间是否异常
SELECT MIN(time), MAX(time)
FROM USER1;
检查用户行为类别是否异常
SELECT DISTINCT behavior_type
FROM USER1;
时间数据
行为数据
无需处理异常值
8)数据标准化整理
日期数据整理:
为方便后续的分析,将日期数据分为日期和时间两个维度
1、新增一列date,用于储存日期值
-- 新增列:alter table 表名 add column 列名 varchar(20);
alter table user1 add column date varchar(20) NOT NULL AFTER time;
2、复制time列的数据到date列
-- 更新列:UPDATE table_name SET field1=new-value1, field2=new-value2 [WHERE Clause]
UPDATE user1
SET date=time
3、将date转化为年月日
UPDATE USER1
SET date = DATE_FORMAT(date, '%Y-%m-%d');
4、将time转化为小时
alter table user1 add column hour varchar(20) NOT NULL AFTER date;(增加列)
方法一:
UPDATE user1
SET hour=time (赋值)
UPDATE USER1
SET hour = DATE_FORMAT(hour,'%H');(截取时间)
方法二:
UPDATE USER1
SET time = left(SUBSTRING_INDEX(time,' ',-1),2);
有多种方法可以实现数据截取操作(时间函数和字符串函数都可以操作,使用时间函数的时候需要注意截取后的数据格式类型需要转化,否则会报错,截取时间后的格式不能是datetime)
时间数据整理
行为数据整理:
将用户行为数据进行替换: 1:pv 2:fav 3:cart 4:buy
将behavior_type列进行更改:
UPDATE user1
SET behavior_type=(case when behavior_type=1 then' PV'
when behavior_type=2 then 'fav'
when behavior_type=3 then 'cart'
when behavior_type=4 then 'buy'
end)
需要注意字符串要加引号
整理后数据
以上就完成了数据的整理工作。
五、指标的构建
1、总体运营指标:
1)流量指标:
计算页面访客数(pv)、独立访客数(uv)、人均点击数(uv/pv)
1)计算页面访客数(pv)、独立访客数(uv)、人均点击数(uv/pv)
SELECT
COUNT(*) AS 'pv'
,COUNT(DISTINCT user_id) AS 'uv'
,COUNT(*)/COUNT(DISTINCT user_id) AS '月uv/pv'
,COUNT(*)/COUNT(DISTINCT user_id)/30 AS '日uv/pv'
FROM user1
WHERE behavior_type="PV"
访客数据
页面访客:987911次、独立访客数:8474位、人均点击次数116.58次。
95/30≈3.89次,日人均点击次数大概为3.89次/人/天
2)每日流量指标变化趋势
日流量数据通过Navicat导出数据进行可视化处理:
pv、uv 趋势图 pv/uv 趋势图
pv、uv指标呈正相关性;
三个指标在大部分时间走势平稳,由于双十二的影响,从2014-12-11开始上升,到2014-12-12达到峰值,2014-12-13结束回到正常水平。
2、AARRR漏斗转化率
1)按照页面访客计算漏斗转化率
1)按照页面访客计算漏斗转化率
SELECT
behavior_type
,count(*)
FROM user1
GROUP BY behavior_type
用户行为漏斗
由于在购物环节中,收藏和加入购物车行为没有严格的先后之分,可将两个个步骤作为同一步,最终得到用户购物行为各环节转化率,如下:
给环节转化率 转化率
从整体转化率来看:浏览- 收藏/加购转化率仅为5%,总体购买转化率为1%,说明有大部分的用户在浏览后未进行下一步操作,平时“逛街看看”成为一种习惯;
从节点转化率来看:浏览-加购/收藏环节转化率很低,收藏/加购-购买的转化率也只有20%,说明有相当一部分用户是喜欢“囤货”,可能是为了等节假日购买?由于整体的节点并不是最细的不可分割节点,整体的数据比较粗糙,如果需要进一步的深入分析,需要有更细的转化率数据(由于操作路径每个环节都会损失一部分,因此如果能近量的较少客户购买时所需要的操作步骤,对提升整体转化率应该会有很好的提高)。
2)独立访客计算漏斗转化率
用户行为的uv
SELECT behavior_type, COUNT(DISTINCT user_id) as behavior_count
FROM USER1
GROUP BY behavior_type
ORDER BY behavior_count DESC;
fav和cart去重:
SELECT
DISTINCT user_id
FROM USER1
WHERE behavior_type='fav' or behavior_type='cart'
独立访客转化率
用户每个环节的转化率差不多,需要更多数据才能发现用户流失原因。
3)、跳失率
浏览页跳失率: = 只访问一次就离开的人数/总用户数
只浏览用户
SELECT
count(DISTINCT user_id) 只浏览用户
FROM user1
WHERE user_id in (
SELECT DISTINCT user_id
FROM user1
WHERE behavior_type='pv')
AND user_id not in (
SELECT DISTINCT user_id
FROM user1
WHERE behavior_type='fav')
AND user_id not in (
SELECT DISTINCT user_id
FROM user1
WHERE behavior_type='cart')
AND user_id not in (
SELECT DISTINCT user_id
FROM user1
WHERE behavior_type='buy')
浏览页面流失人数
只加收藏、购物车人数
只加收藏、购物车
SELECT
count(DISTINCT user_id) 只加收藏、购物车用户数
FROM user1
WHERE user_id in (
SELECT DISTINCT user_id
FROM user1
WHERE behavior_type='fav')
OR user_id in (
SELECT DISTINCT user_id
FROM user1
WHERE behavior_type='cart')
AND user_id not in (
SELECT DISTINCT user_id
FROM user1
WHERE behavior_type='buy')
只加收藏、购物车人数
(3)、订单指标:
1)总成交量和人均购买次数:
总成交量和人均购买次数:
SELECT
count(behavior_type)总成交量
,count(DISTINCT user_id)总购买用户数
,count(behavior_type)/count(DISTINCT user_id)人均购买次数
FROM user1
WHERE behavior_type='buy'
总成交量
2)每日总成交和人均成交情况:
每日总成交和人均成交情况
SELECT
date
,count(behavior_type)总成交量
,count(DISTINCT user_id)总购买用户数
,count(behavior_type)/count(DISTINCT user_id)人均购买次数
FROM user1
WHERE behavior_type='buy'
GROUP BY date
ORDER BY date;
每日成交情况
每日成交量
(4)复购率:
1)总体复购率
1)总体复购率
购买人数
SELECT
count(DISTINCT user_id) as 成交人数
FROM user1
WHERE behavior_type='buy'
购买次数大于1
SELECT
user_id
,count(behavior_type) as 购买次数
FROM user1
WHERE behavior_type='buy'
GROUP BY user_id
HAVING count(behavior_type)>1
复购人数
SELECT
count(DISTINCT user_id)
FROM
(SELECT
user_id
,count(behavior_type) as 购买次数
FROM user1
WHERE behavior_type='buy'
GROUP BY user_id
HAVING count(behavior_type)>1
) as a
复购率=复购人数/购买人数=2295/4330=53%
2)商品品类销量排名(商品复购率)
2)商品销售排名
SELECT
item_category
,COUNT(behavior_type)购买次数
FROM USER1
WHERE behavior_type='BUY'
GROUP BY item_category
ORDER BY COUNT(behavior_type) DESC
LIMIT 10;
商品销售排名
商品排名
如果有更多数据,可根据商品品类属性进行研究和下钻,优化商品结果,但这里因为数据脱敏无法进行下钻分析
3)用户复购排名
3)用户复购排名
SELECT
user_id
,count(behavior_type)购买次数
FROM user1
WHERE behavior_type='BUY'
GROUP BY user_id
ORDER BY count(behavior_type) DESC
LIMIT 10;
购买次数
以上用户对平台的忠诚度比较高,对平台的销售贡献度也高(利润贡献情况还需要具体分析),对不同的客户可以收集相应的用户画像,并对用户进行分层管理和营销,从而达到精细化运营
2、用户行为特征分析
(1)、用户行为时间的特征
1)、按日期维度
1)、按日期维度
SELECT
date
,count(1)点击次数
,SUM(CASE WHEN behavior_type='PV' THEN 1 ELSE 0 END)浏览次数
,SUM(CASE WHEN behavior_type='fav' THEN 1 ELSE 0 END)收藏次数
,SUM(CASE WHEN behavior_type='cart' THEN 1 ELSE 0 END)加购次数
,SUM(CASE WHEN behavior_type='buy' THEN 1 ELSE 0 END)购买次数
,COUNT(DISTINCT USER_ID)每日用户数
,count(*)/count(DISTINCT user_id)人均行为次数
,concat(ROUND(SUM(CASE WHEN behavior_type='PV' THEN 1 ELSE 0 END)/count(1)*100,2),'%')浏览数占比
,concat(ROUND(SUM(CASE WHEN behavior_type='BUY' THEN 1 ELSE 0 END)/count(1)*100,2),'%')购买数占比
FROM user1
-- where date != '2014-12-12'
GROUP BY date
ORDER BY date;
日期维度
日维度
用户活跃度与总体点击数是正相关的,走势平稳,不过在双十二电商大促这天各项指标暴增,且当天点击数占比有所下降(用户的点击更有针对性,前期已经选好商品,就等双十二当天直接购买的客户数量比较多?), 成交数占比大幅上升。
2)、周维度
2)、周维度
查询数据发现2014-11-18到2014-11-23,2014-12-15到2014-12-18均不满一周,因此,只取完整的三周进行分析:
SELECT
DATE_FORMAT(date,'%W')星期
,count(1)点击次数
,SUM(CASE WHEN behavior_type='PV' THEN 1 ELSE 0 END)浏览次数
,SUM(CASE WHEN behavior_type='fav' THEN 1 ELSE 0 END)收藏次数
,SUM(CASE WHEN behavior_type='cart' THEN 1 ELSE 0 END)加购次数
,SUM(CASE WHEN behavior_type='buy' THEN 1 ELSE 0 END)购买次数
,COUNT(DISTINCT USER_ID)每日用户数
,count(*)/count(DISTINCT user_id)人均行为次数
,concat(ROUND(SUM(CASE WHEN behavior_type='PV' THEN 1 ELSE 0 END)/count(1)*100,2),'%')浏览数占比
,concat(ROUND(SUM(CASE WHEN behavior_type='BUY' THEN 1 ELSE 0 END)/count(1)*100,2),'%')购买数占比
FROM user1
-- where date != '2014-12-12'
WHERE (date BETWEEN '2014-11-24' AND '2014-12-14')
-- and date !='2014-12-12'
GROUP BY DATE_FORMAT(date,'%W')
ORDER BY DATE_FORMAT(date,'%W');
周维度
周维度
一周中的大部分时间用户活跃度都比较平稳,周五比较特殊,出现了增长( 查看数据发现双十二正好是周五,属于特殊活动日,如果进行详细分析时应该将双十二的日期排除分析有更有意义)。
3)、小时维度
3)、小时维度
SELECT
hour
,count(1)点击次数
,SUM(CASE WHEN behavior_type='PV' THEN 1 ELSE 0 END)浏览次数
,SUM(CASE WHEN behavior_type='fav' THEN 1 ELSE 0 END)收藏次数
,SUM(CASE WHEN behavior_type='cart' THEN 1 ELSE 0 END)加购次数
,SUM(CASE WHEN behavior_type='buy' THEN 1 ELSE 0 END)购买次数
,COUNT(DISTINCT USER_ID)每日用户数
,count(*)/count(DISTINCT user_id)人均行为次数
,concat(ROUND(SUM(CASE WHEN behavior_type='PV' THEN 1 ELSE 0 END)/count(1)*100,2),'%')浏览数占比
,concat(ROUND(SUM(CASE WHEN behavior_type='BUY' THEN 1 ELSE 0 END)/count(1)*100,2),'%')购买数占比
FROM user1
-- where date != '2014-12-12'
GROUP BY hour
ORDER BY hour;
小时维度
小时维度
晚间用户较为活跃,但用户行为倾向于浏览;白天尤其是中午左右的时段,购买行为的比率相对一天中最高,此时购买的目的性最强(浏览数占比与购买数占比进行关联分析得出结论)。
(2)用户商品偏好特征:
(2)用户商品偏好特征:
SELECT
item_category
,COUNT(*)点击次数
,SUM(CASE WHEN behavior_type='PV' THEN 1 ELSE 0 END)浏览次数
,SUM(CASE WHEN behavior_type='fav' THEN 1 ELSE 0 END)收藏次数
,SUM(CASE WHEN behavior_type='cart' THEN 1 ELSE 0 END)加购次数
,SUM(CASE WHEN behavior_type='buy' THEN 1 ELSE 0 END)购买次数
,concat(ROUND(SUM(CASE WHEN behavior_type='PV' THEN 1 ELSE 0 END)/count(behavior_type)*100,2),'%')浏览数占比
,concat(ROUND(SUM(CASE WHEN behavior_type='BUY' THEN 1 ELSE 0 END)/count(1)*100,2),'%')购买数占比
FROM user1
-- where date != '2014-12-12'
GROUP BY item_category
ORDER BY 浏览次数 DESC
商品维度
按照商品品类区分(矩阵分析),根据点击次数和购买次数两个维度将所有商品划分到四个象限:
浏览与购买分布散点图点击数高,购买数高。说明此类产品刚需比较强,品牌多且种类丰富,用户在较高的需求下有很多的选择;
点击数低购买数高。用户的购买决策十分果断,且对于该类产品的需求量也是很大的,说明该类产品选择性比较小,可能形成几个品牌垄断的情况,或者产品的差异性较小,用户不愿花费过多的精力去挑选。
点击数低购买数低,绝大多数产品都集中在这个象限,这种产品存在很多的替代品,用户很难集中在某个子类进行大量购买,而是跳跃式选购。
点击数高购买数低,这类产品的需求弹性较大,用户购买存在随机性。
(3)、用户购买路径特征:
用户购买商品分为以下几类过程:
直接购买
浏览后购买
加购物车购买
浏览加购物车购买
收藏购买
浏览收藏购买
(3)、用户购买路径特征:
1)创建用户行为路径表视图(对用户、商品、日期进行分组,表结构:user_id,pv,fav,cart,buy)
CREATE VIEW 用户行为 as
SELECT user_id
,SUM(CASE WHEN behavior_type='PV' THEN 1 ELSE 0 END)浏览
,SUM(CASE WHEN behavior_type='fav' THEN 1 ELSE 0 END)收藏
,SUM(CASE WHEN behavior_type='cart' THEN 1 ELSE 0 END)加购物车
,SUM(CASE WHEN behavior_type='buy' THEN 1 ELSE 0 END)购买
FROM user1
GROUP BY user_id,item_id,date;
2)将用户行为标准化(存在该类行为则标记为1,否则为0)
CREATE VIEW 用户行为标准化表 AS
SELECT user_id
,(CASE WHEN 浏览>0 THEN 1 ELSE 0 END)浏览
,(CASE WHEN 收藏>0 THEN 1 ELSE 0 END)收藏
,(CASE WHEN 加购物车>0 THEN 1 ELSE 0 END)加购物车
,(CASE WHEN 购买>0 THEN 1 ELSE 0 END)购买
FROM 用户行为
3)建立标准化指标表(user_id,购买路径类型)
--选取user_i作为分组依据,不会出现user_id重复的情况,但是会导致存在多种路径的用户数据的缺失(需要跟业务统一好计算口径)
CREATE VIEW 标准化指标表1 AS
SELECT user_id
,concat(浏览,收藏,加购物车,购买) as 购买路径类型
FROM 用户行为标准化表 as a
WHERE a.购买>0
GROUP BY user_id;
4)统计各指标用户数
SELECT 购买路径类型
,COUNT(DISTINCT user_id)用户数
FROM 标准化指标表
GROUP BY 购买路径类型;
3.2)
选取user_id和路径作为分组依据,因此会出现user_id重复的情况(需要统一计算口径,跟前面的只把user_id作为分组的结果进行对比)
CREATE VIEW 标准化指标表 AS
SELECT user_id
,concat(浏览,收藏,加购物车,购买) as 购买路径类型
FROM 用户行为标准化表 as a
WHERE a.购买>0
GROUP BY user_id,concat(浏览,收藏,加购物车,购买)
4.2)统计各指标用户数
SELECT 购买路径类型
,COUNT(DISTINCT user_id)用户数
FROM 标准化指标表1
GROUP BY 购买路径类型
计算结果
计算结果
结果显示,直接够买的用户远远多于浏览后加购或者收藏再购买的用户,说明大部分购买者都是喜欢直接购买商品的,这个跟周围朋友的习惯也是符合的,基本上都是在浏览的阶段都不会马上购买,而是等到过段时间想买的时候就直接下单,几个步骤之间相当于是分开的。
(4)、用户复购率特征:
(4)、用户复购率特征:
客户购买次数
SELECT
DISTINCT user_id
,COUNT(user_id)'购买次数'
FROM user1
WHERE behavior_type='BUY'
GROUP BY user_id
ORDER BY COUNT(user_id) DESC
不同购买次数的客户分布
SELECT
a.购买次数
,count(DISTINCT user_id)用户数
FROM
(SELECT
DISTINCT user_id
,COUNT(user_id)购买次数
FROM user1
WHERE behavior_type='BUY'
GROUP BY user_id
ORDER BY COUNT(user_id) DESC
) as a
GROUP BY a.购买次数
ORDER BY a.购买次数
客户购买次数分布
购买次数分布
购买次数分布
用户的购买次数大部分集中在5次以内,购买频率都还挺高的