文章目录
1. 数据概述
-
数据来源:阿里巴巴
-
介绍
UserBehavior是阿里巴巴提供的一个淘宝用户行为数据集,用于隐式反馈推荐问题的研究。 -
数据集
本数据集包含了2017年11月25日至2017年12月3日之间,有行为的约一百万随机用户的所有行为(行为包括点击pv、购买buy、加购cart、喜欢fav)。数据集的组织形式和MovieLens-20M类似,即数据集的每一行表示一条用户行为,由用户ID、商品ID、商品类目ID、行为类型和时间戳组成,并以逗号分隔。关于数据集中每一列的详细描述如下: -
补充说明
用户行为类型共有四种,它们分别是:
数据集大小的一些说明如下
2. 分析思路
数据分析的本质是解决销售问题,分析思路如下,分为三步:
- 提出问题
- 提出假设
- 数据分析
提出问题
使用多维度拆解的分析方法,从以下三个角度进行多维度分析:
多维度拆解:问题 = 维度1 + 维度2 + …
1、 产品角度:
- 哪些是热搜产品?
- 哪些是畅销产品?
- 热搜产品是否就是畅销产品
2、用户角度
- 用户行为各类型的占比是多少?
- 行为之间的转化率是多少?
- 哪个环节用户流失比较严重?
3、时间角度
- 特定时期(比如周末、节假日)对用户行为的影响?
- 不同时间段对用户行为的影响?
其中,用户角度是重点,可以使用漏斗分析对用户的四种行为分析(转化率),使用FRM分析对用户进行分层分析(消费情况)。
在这其中,转化率是重中之重!
漏斗分析
FRM分析
提出假设
(后文)
数据分析
(后文)
3. 数据预处理
注:表格类数据 + Python(pandas库)预处理
像这种单纯表格类数据分析大致有以下过程:
选择子集
进行列过滤,从原数据中选择出相关的列;
如果数据量很大,是否也可以考虑同时进行行过滤;
补全表格
处理以下原数据可能存在的问题:
- 没有列名
- 没有主键
- …
相应解决即可。
删除重复值
无需太多解释,将相等的记录合并为一条记录。
处理缺失值
处理缺失值的方法:替代法
即,使用平均值、最大值、最小值或者更为复杂的概率估计对缺失值进行替代
处理日期时间(数据一致性)
表格数据中的日期和时间一般是以时间戳的形式出现,其是数据类型是字符串。
Why:
将字符串格式的时间戳,转换为数值形式的年、月、日、和小时等。在做到数据格式统一的同时,为数据增加了新的可用的特征(借用机器学习中feature
的概念)。
How:
时间戳转换有两个过程:
①
时间戳字符串 ——> 日期时间字符串
②
日期时间字符串 ——> 年、月、日、小时等数值
具体操作:
可以使用pandas
中的to_datetime
函数
df['datetime'] = pd.to_datetime(df['timestamp'], unit='s')
print(df)
完成第一步时间戳(timestamp)
到日期时间(datetime)
的转换
user_id item_id category_id behavior_type timestamp \
0 1 2333346 2520771 pv 1511561733
1 1 2576651 149192 pv 1511572885
2 1 3830808 4181361 pv 1511593493
3 1 4365585 2520377 pv 1511596146
4 1 4606018 2735466 pv 1511616481
... ... ... ... ... ...
99995 1004381 4637603 3392099 pv 1511884729
99996 1004381 3833739 3392099 pv 1511884775
99997 1004381 33879 869231 pv 1511885059
99998 1004381 3504989 869231 pv 1511885089
99999 1004381 885333 4756105 pv 1511885130
datetime
0 2017-11-24 22:15:33
1 2017-11-25 01:21:25
2 2017-11-25 07:04:53
3 2017-11-25 07:49:06
4 2017-11-25 13:28:01
... ...
99995 2017-11-28 15:58:49
99996 2017-11-28 15:59:35
99997 2017-11-28 16:04:19
99998 2017-11-28 16:04:49
99999 2017-11-28 16:05:30
[100000 rows x 6 columns]
然后使用dt.year
、dt.month
等属性获取分离后的年、月、日、小时等特征:
df['year'] = df['datetime'].dt.year
df['month'] = df['datetime'].dt.month
df['day'] = df['datetime'].dt.day
df['hour'] = df['datetime'].dt.hour
print(df)
结果如下:
user_id item_id category_id behavior_type timestamp \
0 1 2333346 2520771 pv 1511561733
1 1 2576651 149192 pv 1511572885
2 1 3830808 4181361 pv 1511593493
3 1 4365585 2520377 pv 1511596146
4 1 4606018 2735466 pv 1511616481
... ... ... ... ... ...
99995 1004381 4637603 3392099 pv 1511884729
99996 1004381 3833739 3392099 pv 1511884775
99997 1004381 33879 869231 pv 1511885059
99998 1004381 3504989 869231 pv 1511885089
99999 1004381 885333 4756105 pv 1511885130
datetime year month day hour
0 2017-11-24 22:15:33 2017 11 24 22
1 2017-11-25 01:21:25 2017 11 25 1
2 2017-11-25 07:04:53 2017 11 25 7
3 2017-11-25 07:49:06 2017 11 25 7
4 2017-11-25 13:28:01 2017 11 25 13
... ... ... ... ... ...
99995 2017-11-28 15:58:49 2017 11 28 15
99996 2017-11-28 15:59:35 2017 11 28 15
99997 2017-11-28 16:04:19 2017 11 28 16
99998 2017-11-28 16:04:49 2017 11 28 16
99999 2017-11-28 16:05:30 2017 11 28 16
[100000 rows x 10 columns]
异常值处理
数据中的异常值是很可能影响数据分析结果的噪声,应该进行筛选并去除。
可以通过数据排序、箱线图等的简单方式,再结合简单的规则(常识性规则、业务特定规则等)来对异常的错误值进行排除;
也可以使用偏差分析、数据分布等统计方法来进行筛选。
表格预览
最后的表格长这样:
(注意是有问题的,表格的字段为varchar
而非数数值类型)
4. 数据分析
分析目的:
通过对2017年11月25日至2017年12月3日之间的用户行为数据分析,为客户提供更精准的隐式反馈推荐,提高用户忠诚度,提高商家的成交转化率。
数据中主要记录了用户的浏览、收藏、加购和购买四种行为,使用漏斗模型进行数据分析。
具体来说,可以分为用户行为总占比和不同路径行为留存分析两个方面来进行用户行为转化分析。
4.1 行为分析
4.1.1 查看各种行为的整体情况
整体上,可以从用户各种行为的占比以及整体转化率来分析。
(1)各种行为的占比
方法一:直接用原表暴力统计
很自然地根据 behavior_type
分组后统计各种行为的总数。
SELECT behavior_type, COUNT(*) # 这个方法舍弃,没有行转列
FROM sub_UserBehavior
GROUP BY behavior_type
-- pv 89709
-- buy 2101
-- fav 2744
-- cart 5446
然后再进行数据占比:
pv = 89709 / (四项总和)
…
方法二:进行行转列,构造新表
DROP VIEW IF EXISTS user_behavior_cnt; # (若已存在)先删除视图
CREATE VIEW user_behavior_cnt AS # 创建各行为总数的视图(便于后续计算转化率使用),注意使用条件语句将行转为列
SELECT SUM(IF(behavior_type = 'pv', 1, 0)) pv_cnt_total,
SUM(IF(behavior_type = 'fav', 1, 0)) fav_cnt_total,
SUM(IF(behavior_type = 'cart', 1, 0)) cart_cnt_total,
SUM(IF(behavior_type = 'buy', 1, 0)) buy_cnt_total,
COUNT(*) cnt_total
FROM sub_UserBehavior;
SELECT * FROM user_behavior_cnt; # 显示视图
结果如下:
然后进行占比计算:
### 四种行为所占比例
SELECT pv_cnt_total/cnt_total '浏览行为数占比',
fav_cnt_total/cnt_total '收藏行为数量占比',
cart_cnt_total/cnt_total '加购行为数量占比',
buy_cnt_total/cnt_total '购买行为数量占比'
FROM user_behavior_cnt;
-- 0.8971 0.0274 0.0545 0.0210
结果如下:
几点说明:
① 行转列:使用聚合语句+条件语句的结合实现表格行转列,便于后续取值
② 视图的常规用法
③ 使用视图时,先使用DROP VIEW
防止多次运行报错:已存在视图
④ 显示视图,直接使用 普通查询语句
(2)行为整体转化率
这里,将收藏和加购放在一起,毕竟没有先后关系。
### 总的行为转化率
SELECT cnt_total '行为总数',
pv_cnt_total '浏览总数',
fav_cnt_total + cart_cnt_total '收藏和加购总数',
buy_cnt_total '购买总数',
pv_cnt_total/cnt_total '用户浏览的转化率',
(fav_cnt_total + cart_cnt_total) /pv_cnt_total '浏览到收藏和加购的转化率',
buy_cnt_total/(fav_cnt_total + cart_cnt_total) '收藏和加购到购买的转化率'
FROM user_behavior_cnt;
-- 100000 89709 8190 2101 0.8971 0.0913 0.2565
4.1.2 不同路径行为转化率
(1)分析
先理清所有可能路径,再搞清楚要研究的路径
流失部分不考虑即可。
关于转化率的计算:
(2)代码部分
这里也是对原表先行转列,先构造一个新表,便于后续取值计算。
需要注意的是,根据分析的目标,这里需要对用户和商品进行分组,统计每一个人对每件商品的(四种)行为表现。
## 统计每一个人对每件商品的(四种)行为表现
DROP VIEW IF EXISTS user_behavior_cnt_grouping;
CREATE VIEW user_behavior_cnt_grouping AS
SELECT user_id, item_id,
SUM(IF(behavior_type = 'pv',1, 0)) pv_grouping,
SUM(IF(behavior_type = 'fav',1, 0)) fav_grouping,
SUM(IF(behavior_type = 'cart',1, 0)) cart_grouping,
SUM(IF(behavior_type = 'buy',1, 0)) buy_grouping,
COUNT(*) cnt_grouping
FROM sub_UserBehavior
GROUP BY user_id, item_id; # 注意对 user_id 和 item_id 同时进行分组,统计每一个人对每件商品的(四种)行为表现
SELECT * FROM user_behavior_cnt_grouping;
结果:
然后根据上面的表和不同路径的分析图,分为四种情况来进行分别计算。
(下面是采用WITH AS临时表
的方式)
1、路径:浏览-购买(pv-buy)
### pv-buy
WITH pv AS
(
SELECT SUM(pv_grouping)
FROM user_behavior_cnt_grouping
WHERE pv_grouping > 0
),
pv_buy AS
(
SELECT SUM(buy_grouping)
FROM user_behavior_cnt_grouping
WHERE pv_grouping > 0 AND buy_grouping > 0 AND fav_grouping = 0 AND cart_grouping = 0 # 后面两个排除条件别忘记!
)
SELECT (SELECT * FROM pv) '浏览用户的数量',
(SELECT * FROM pv_buy) '浏览用户进行购买的数量',
(SELECT * FROM pv_buy) / (SELECT * FROM pv) '浏览用户直接购买的转化率';
-- 89709 1088 0.0121
2、路径:浏览-收藏-购买(pv-fav-buy)
### pv-fav-buy
WITH pv AS
(
SELECT SUM(pv_grouping)
FROM user_behavior_cnt_grouping
WHERE pv_grouping > 0
),
pv_fav AS
(
SELECT SUM(fav_grouping)
FROM user_behavior_cnt_grouping
WHERE pv_grouping > 0 AND fav_grouping > 0
),
pv_fav_buy AS
(
SELECT SUM(fav_grouping)
FROM user_behavior_cnt_grouping
WHERE pv_grouping > 0 AND fav_grouping > 0 AND buy_grouping > 0
)
SELECT (SELECT * FROM pv) '浏览用户数量',
(SELECT * FROM pv_fav) '浏览用户进行收藏的数量',
(SELECT * FROM pv_fav_buy) '浏览并收藏的用户进行购买的数量',
(SELECT * FROM pv_fav) / (SELECT * FROM pv) '浏览用户到收藏用户的转化率',
(SELECT * FROM pv_fav_buy) / (SELECT * FROM pv_fav) '浏览且收藏的用户到成功购买的转化率';
-- 89709 944 99 0.0105 0.1049
3、浏览-加购-购买(pv-cart-buy)
### pv-cart-buy
WITH pv AS
(
SELECT SUM(pv_grouping)
FROM user_behavior_cnt_grouping
WHERE pv_grouping > 0
),
pv_cart AS
(
SELECT SUM(cart_grouping)
FROM user_behavior_cnt_grouping
WHERE pv_grouping > 0 AND cart_grouping > 0
),
pv_cart_buy AS
(
SELECT SUM(cart_grouping)
FROM user_behavior_cnt_grouping
WHERE pv_grouping > 0 AND cart_grouping > 0 AND buy_grouping > 0
)
SELECT (SELECT * FROM pv) '浏览用户数量',
(SELECT * FROM pv_cart) '浏览用户到加购的数量',
(SELECT * FROM pv_cart_buy) '浏览并加购的用户进行购买的数量',
(SELECT * FROM pv_cart) / (SELECT * FROM pv) '浏览用户到加购用户的转化率',
(SELECT * FROM pv_cart_buy) / (SELECT * FROM pv_cart) '浏览且加购的用户到成功购买的转化率';
-- 89709 2762 279 0.0308 0.1010
4、浏览-收藏和加购-购买(pv-fav+cart-buy)
### pv-fav&cart-buy
WITH pv AS
(SELECT SUM(pv_grouping)
FROM user_behavior_cnt_grouping
WHERE pv_grouping > 0
),
pv_favcart AS
(SELECT SUM(fav_grouping) + SUM(cart_grouping)
FROM user_behavior_cnt_grouping
WHERE pv_grouping > 0 AND fav_grouping > 0 AND cart_grouping > 0
),
pv_favcart_buy AS
(SELECT SUM(fav_grouping) + SUM(cart_grouping) # 这里将收藏和加购两项相加
FROM user_behavior_cnt_grouping
WHERE pv_grouping > 0 AND fav_grouping > 0 AND cart_grouping > 0 AND buy_grouping > 0 # 注意 fav 与 cart 用 AND 连接
)
SELECT (SELECT * FROM pv) '浏览用户',
(SELECT * FROM pv_favcart) '从浏览到收藏和加购用户数量',
(SELECT * FROM pv_favcart_buy) '从浏览到收藏和加购再到购买的用户数量',
(SELECT * FROM pv_favcart) / (SELECT * FROM pv) '浏览用户到收藏或加购的转化率',
(SELECT * FROM pv_favcart_buy) / (SELECT * FROM pv_favcart) '浏览并收藏或加购的用户到成功购买的转化率';
-- 89709 158 39 0.0018 0.2468
最终结果汇总如下:
4.1.3 对结果的分析
(1)整体转化率结果的分析
(2)不同路径转化率的结果分析
用户直接购买的转化率最高,达到了12.1%
,第二是先收藏后购买,转换率有10.49%
4.1.4 提出假设
分析可能的问题和原因,提出假设并进行验证。
4.2 消费分析
(暂略)
其他角度的分析(已经舍弃)
提出问题:
(1)用户访问分析
1、总访问量有多少?
2、总访客数有多少?
3、人均访问量有多少?
(2)用户消费分析
1、消费率(人均购买次数)是多少?
2、复购率是多少?
(3)日期
用户行为和日期的关系?
(4)时间
用户行为和时间的关系?
(5)用户价值分析/用户分层分析
5. 总结
参考:
(前三个已经够用)