“天池”淘宝用户消费行为分析——sql
Posted Limei.
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了“天池”淘宝用户消费行为分析——sql相关的知识,希望对你有一定的参考价值。
文章目录
0 项目背景
练手项目: 当今电商行业的运营模式需要针对用户的喜好程度或用户习惯进行相应的策略性改变,而策略的来源则是通过对用户的显式反馈或是隐式反馈进行用户行为分析,进一步为用户提供个性化、差异化的的服务,最终达到营收率提升的目的。
1 项目明细
1.1 数据的来源及明细
UserBehavior是阿里巴巴提供的一个淘宝用户行为数据集。数据来源请戳
UserBehavior.csv
本数据集包含了2017年11月25日至2017年12月3日之间,有行为的约一百万随机用户的所有行为(行为包括点击、购买、加购、喜欢)。数据集的组织形式和MovieLens-20M类似,即数据集的每一行表示一条用户行为,由用户ID、商品ID、商品类目ID、行为类型和时间戳组成,并以逗号分隔。关于数据集中每一列的详细描述如下:
注意到,用户行为类型共有四种,它们分别是:
关于数据集大小的一些说明如下:
1.2 项目目的
选取1000000(100w)个隐式反馈数据集中找到用户行为的一些“规律”。并通过这些“规律”进行漏斗模型,RFM模型分析得到对用户有针对性的电商营销方式。
1.3 项目思路
2、数据预处理
此次项目使用的是 Navicat Premium数据库管理工具连接mysql 8.0,进行对UserBehavior.csv 数据集的处理
2.1 数据导入
方法一:在Navicat里面根据指示直接导入数据表,点这里~
方法二:代码导入
# 创建一个表userbehaviour用来存放数据,数据类型根据官方文档设置
create table userbehaviour(
userID int,
itemID int,
categoryID int,
bahaviortype text,
timestamp int
);
# 写入文件路径
load data infile "D:\\tianchi\\UserBehavior.csv"
into table userbehavior
fields terminated by ','
lines terminated by '\\n';
导入csv文件数据执行提示错误(ERROR 1290),如果你也出现这个问题,这里贴上解决方案噢(通俗易懂)
数据量太大,这里只截取前100w的数据用作分析啦:
# 查看前10行数据
SELECT * FROM `userbehaviour` limit 10;
# 查看数据集的大小
SELECT
count( DISTINCT u.userID ) '用户数量',
count( u.itemID ) '商品数量',
count( u.categoryID ) '商品类目数量',
count( u.behaviour ) '所有行为数量'
FROM
userbehaviour u;
2.2 数据预处理
数据查重及处理
# 展示重复数据
SELECT * FROM userbehaviour as u
WHERE (u.userID,u.itemID,u.categoryID,u.behaviour,u.TIMESTAMP)
IN
(SELECT * FROM userbehaviour
GROUP BY userID,itemID,categoryID,behaviour,TIMESTAMP
HAVING count(*) > 1);
# 数据量过大,要运行很久
缺失值查找与处理
# 查看数据的缺失值
SELECT
count( userID ),
count( itemID ),
count( categoryID ),
count( behaviour ),
count( TIMESTAMP )
FROM
userbehaviour;
没有缺失值,太好了 ^ _ ^
2.3 日期与时间格式化
# 时间格式转化
# 添加日期date | 时间hour 字段
ALTER TABLE userbehaviour
ADD hour VARCHAR ( 2 ),
ADD date VARCHAR ( 10 );
# 往字段date、hour中导入数据,调整time时间戳格式
UPDATE userbehaviour set date = FROM_UNIXTIME(TIMESTAMP,"%Y-%m-%d");
UPDATE userbehaviour set hour = FROM_UNIXTIME(TIMESTAMP,"%H");
函数:FROM_UNIXTIME
作用:将MYSQL中以INT(11)存储的时间以"YYYY-MM-DD"格式来显示。
语法:FROM_UNIXTIME(unix_timestamp,format)函数,具体戳这~
# 修改TIMESTAMP字段的存储空间
ALTER TABLE userbehaviour
MODIFY COLUMN TIMESTAMP VARCHAR(255);
# 转变时间戳的格式
UPDATE userbehaviour set TIMESTAMP = FROM_UNIXTIME(TIMESTAMP);
UPDATE userbehaviour set TIMESTAMP = SUBSTRING_INDEX(TIMESTAMP,'.',1);
修改后:
SUBSTRING_INDEX( ) 函数的使用,戳这~
2.4 删除异常值
# 查看日期的最大值与最小值,看是否有异常值
select max(date), min(date) from userbehaviour;
没有异常值哈哈,如果有异常值,可以通过执行以下代码删除异常值噢
# 筛选出日期在2017年11月25日 ——— 2017年12月3日之外的数据
SELECT count(*) FROM
userbehaviour
WHERE date < '2017-11-25'
or date > '2017-12-03';
# 剔除不在日期区间的数据
DELETE FROM userbehaviour
WHERE date < '2017-11-25'
OR date > '2017-12-03';
经过预处理后,数据集还剩…
#查看还剩多少
SELECT
count( DISTINCT u.userID ) '用户数量',
count( u.itemID ) '商品数量',
count( u.categoryID ) '商品类目数量',
count( u.behaviour ) '所有行为数量'
FROM
userbehaviour u;
//是的,经过预处理后数据量没有变…因为,源数据已经很干净了T_T(偷笑),当作练习啦!
3、数据分析
数据预处理终于搞定了!!接下来我们进入正式的分析吧!
3.1 数据整体情况
# 总体UV(Unique visitor)、PV(Page View)、人均浏览数、成交量
SELECT
count( DISTINCT userID ) 'UV 独立访客量',
SUM( CASE WHEN behaviour = 'pv' THEN 1 ELSE 0 END ) 'PV 页面浏览量',
SUM( CASE WHEN behaviour = 'pv' THEN 1 ELSE 0 END ) / count( DISTINCT userID ) 'PV 人均浏览量',
SUM( CASE WHEN behaviour = 'buy' THEN 1 ELSE 0 END ) 'BY成交量'
FROM
userbehaviour;
总体UV、PV、人均浏览次数、成交量
# 日均UV(Unique visitor)、PV(Page View)、人均浏览数、成交量
SELECT
date,
count( DISTINCT userID ) 'UV 独立访客量',
SUM( CASE WHEN behaviour = 'pv' THEN 1 ELSE 0 END ) 'PV 页面浏览量',
SUM( CASE WHEN behaviour = 'pv' THEN 1 ELSE 0 END ) / count( DISTINCT userID ) 'PV 人均浏览量',
SUM( CASE WHEN behaviour = 'buy' THEN 1 ELSE 0 END ) 'BY成交量'
FROM
userbehaviour
GROUP BY
date;
日均UV、PV、人均浏览次数、成交量
3.2 用户行为转化
# 总用户行为转化
# 漏斗模型
SELECT
behaviour '行为类型',
count(*) '行为数量'
FROM
userbehaviour
GROUP BY
behaviour
ORDER BY
行为数量 DESC;
总用户行为漏斗图,浏览行为转化为加购、收藏、购买的转化率逐级降低。
计算转化率:
# 分析每种情况下的转化率
CREATE VIEW user_p AS
SELECT userID,itemID,
sum( CASE WHEN behaviour = 'pv' THEN 1 ELSE 0 END ) AS click,
sum( CASE WHEN behaviour = 'fav' THEN 1 ELSE 0 END ) AS favor,
sum( CASE WHEN behaviour = 'buy' THEN 1 ELSE 0 END ) AS buy,
sum( CASE WHEN behaviour = 'cart' THEN 1 ELSE 0 END ) AS buycar
FROM
userbehaviour
GROUP BY
userID,
itemID;
下面我就不贴运行结果图啦,直接将得出的结果写在备注了。
# 总的点击(浏览)量 : 896106
SELECT sum(click) 点击量 FROM user_p;
# 有浏览+购买的数量 :9845
SELECT sum( buy ) '浏览+购买'
FROM user_p
WHERE
click > 0
AND buy > 0
AND favor = 0
AND buycar = 0;
# 有浏览+加购的数量 : 23999
SELECT sum( buycar ) '浏览+加购'
FROM user_p
WHERE
click > 0
AND buy = 0
AND favor = 0
AND buycar > 0;
# 有浏览+收藏的数量 : 9973
SELECT sum( favor ) '浏览+收藏'
FROM user_p
WHERE
click > 0
AND buy = 0
AND favor > 0
AND buycar = 0;
# 有浏览+流失的数量 : 789133
SELECT sum( click ) '浏览+流失'
FROM user_p
WHERE
click > 0
AND buy = 0
AND favor = 0
AND buycar = 0;
# 有浏览+加购+购买的数量 : 2876
SELECT sum( buy ) '浏览+加购+购买'
FROM user_p
WHERE
click > 0
AND buy > 0
AND favor = 0
AND buycar > 0;
# 有浏览+收藏+购买的数量 : 942
SELECT sum( buy ) '浏览+收藏+购买'
FROM user_p
WHERE
click > 0
AND buy > 0
AND favor > 0
AND buycar = 0;
# 有浏览+加购+收藏的数量 : 678
SELECT sum( favor )+ sum( buy )
FROM user_p
WHERE
click > 0
AND buy = 0
AND favor > 0
AND buycar > 0;
# 有浏览+加购+收藏+购买的数量 : 289
SELECT sum( favor )+ sum( buy ) '浏览+加购+收藏+购买'
FROM user_p
WHERE
click > 0
AND buy > 0
AND favor > 0
AND buycar > 0;
总点击(浏览)量:896106
转换类型 | 转换量 | 转换率 |
---|---|---|
浏览–>加购 | 23999 | 2.68% |
浏览–>收藏 | 9973 | 1.11% |
浏览–>购买 | 9845 | 1.10% |
浏览–>流失 | 789133 | 88.06% |
浏览+加购 :23999
转换类型 | 转换量 | 转换率 |
---|---|---|
浏览+加购–>购买 | 2876 | 11.98% |
浏览+收藏 :9973
转换类型 | 转换量 | 转换率 |
---|---|---|
浏览+收藏–>购买 | 942 | 9.44% |
浏览+收藏+加购 :678
转换类型 | 转换量 | 转换率 |
---|---|---|
浏览+收藏+加购–>购买 | 289 | 42.63% |
从以上结果说明:
1、用户从浏览到购买的转化率只有1.10%
2、用户从浏览后加入购物车再购买的转化率有9.44%
3、用户从浏览后收藏再购买的转化率有11.98%
4、用户从浏览后加入购物车和收藏再购买的转化率高达42.63%
5、用户浏览页面后什么也没干即用户流失率有88.06%
进一步分析:
1、从用户浏览后加购以及收藏的行为后转化率提升了约10倍,以及同时有收藏加购行为的转化率更是直接提升了高达42倍可以看出,加购或收藏以及加购收藏的行为会提升交易成交量。因此我们可以从产品的交互界面、营销机制等方面提高用户收藏、加购的行为,进而提升交易量。
2、用户的流失率太高,有88.06%。即用户花了很多时间去浏览商品,却没有加购、收藏、购买的行为。猜测可能是推荐的商品并不符合用户的需求。因为如果推荐的商品是用户喜欢的,自然会下单。因此我们做一个假设检验,看看是否是推荐系统的“锅”。
提出假设: 推荐系统不给力,推荐的商品不是用户想要的
分析思路: 通过查看点击(浏览)量前20的商品ID以及购买量前20的商品ID,看重复值的概率有多大(即查看浏览量多的是不是下单多的,如果是,说明推荐的是用户需要的,如果不是,说明推荐系统不给力)
1、点击(浏览)量前20的商品类别
# 浏览点击量前20的商品ID及点击次数
CREATE VIEW click AS
SELECT categoryID,count( categoryID ) AS 点击量
FROM userbehaviour
WHERE behaviour = 'pv'
GROUP BY categoryID
ORDER BY
点击量 DESC
LIMIT 20;
2、购买量前20的商品类别
# 购买量前20的商品类别ID及购买量
CREATE VIEW buy AS
SELECT categoryID,count( categoryID ) AS 购买量
FROM userbehaviour
WHERE behaviour = 'buy'
GROUP BY categoryID
ORDER BY
购买量 DESC
LIMIT 20;
3、查看点击量前20的商品类别ID与购买量前20的商品类别ID的重复值
# 查看点击量前20的商品类别ID 以及购买量前20的商品类别ID 是相同的商品类别ID
SELECT buy.categoryID
FROM buy JOIN click ON click.categoryID = buy.categoryID;
很明显,我们似乎错怪了推荐系统!购买量前20的商品类别中有12种商品都是点击量前20里面的,说明我们推荐系统展示的商品是和我们用户的需求相关的
(不要怀疑淘宝的推荐系统了,不然我怎么每次打开淘宝推荐的都是我想要的,然后疯狂“剁手”…T^T)
番外: 那是不是商家砸多点钱提升产品的曝光率,他们的商品就会卖得越好呢!?(兴奋)
(思考状…应该不是绝对的。你曝光的再多不是我要的我也不会点?
4、既然点击量和购买量前20的商品类别有如此高的重合性,还会是什么原因导致用户流失率这么高呢?
接下来我们对每个商品进行细分,看下曝光的具体商品和购买的商品是否有相关性
4.1 计算点击量前10的商品的购买量
# 浏览量前10的商品
CREATE VIEW dianji AS
SELECT itemID,count( itemID ) 点击次数
FROM userbehaviour
WHERE behaviour = 'pv'
GROUP BY itemID
ORDER BY
点击次数 DESC
LIMIT 10;
# 计算点击量前10的商品的购买量
select * from
(SELECT itemID,count(behaviour) as 购买量
from userbehaviour
where behaviour = 'buy'
group by itemID ) as a
where itemID in (SELECT itemID FROM dianji);
4.2 计算购买量前10的商品的点击量
# 购买量前10的商品
CREATE VIEW goumai AS
SELECT itemID,count( itemID ) 购买次数
FROM userbehaviour
WHERE behaviour = 'buy'
GROUP BY itemID
ORDER BY
购买次数 DESC
LIMIT 10;
# 计算购买量前10的商品的点击量
select * from
(SELECT itemID,count(behaviour) as 点击量
from userbehaviour
where behaviour = 'pv'
group by itemID ) as a
where itemID in (SELECT itemID FROM goumai);
4.3 查看点击量前10与购买量前100的商品ID 是否有重复值
# 查看点击量前10与购买量前100的商品ID 是否有重复值
SELECT goumai.itemID
FROM goumai JOIN dianji ON goumai.itemID = dianji.itemID;
分析:
1、浏览量Top10的商品的购买量很少,有些甚至没有。也就是说,平台给与的流量顾客的点击是高的,但是产品所产生的销售没有。由于电商业务是以销售为导向的,所以这些商品并不适合冲量销售,不应当给予过多的流量支持。
2、反观购买量这边,浏览量都是比较低的,并且和前面浏览量TOP10里没有一个重复的商品ID,也就是说高浏览和高购买是两类不同的商品。
4.4 结论
1、推荐的商品顾客并不喜欢购买,由于高浏览量并没有带来购买,所以转化率低。
2、我们发现3122135、3237415、2124040这三类商品购买量比较高,在高需求量的基础上我们考虑淘宝调整推送机制,增加对这几类商品的推送,以满足用户需求。
4.5 对措
1.优化推荐机制,把更多流量给到顾客愿意购买的商品
2.通过更好的商品推荐,页面交互,积分会员等功能等降低流失率
3.引导加购,可以加强营销机制引导顾客加购,比如加购物车联系客服领优惠券
3.3 用户复购率和跳失率
1、复购率
# 复购率
SELECT SUM(case when buy_amount > 1 THEN 1 ELSE 0 END) '复购人数',
COUNT(userID) '已购人数',
SUM(case when buy_amount > 1 THEN 1 ELSE 0 END) / COUNT(userID) '复购率'
FROM
(SELECT userID,count(behaviour) buy_amount
FROM userbehaviour
WHERE behaviour = 'buy'
GROUP BY userID) as a;
复购率在0.6621,淘宝用户粘性较高
2、跳失人数
# 跳失人数
SELECT count(*) '跳失人数'
FROM userbehaviour
GROUP BY userID
HAVING count(behaviour) = 1;
跳失人数为0,用户对于淘宝的体验普遍很好
3.4 用户时间习惯
3.4.1 日期维度用户行为习惯
# 用户时间习惯
# 日期维度分析用户行为
SELECT date,count(DISTINCT userID) '用户数',
SUM(case when behaviour = 'pv' then 1 else 0 end) '浏览数',
SUM(case when behaviour = 'cart' then 1 else 0 end) '加购数',
SUM(case when behaviour = 'fav' then 1 else 0 end) '收藏数',
SUM(case when behaviour = 'buy' then 1 else 0 end) '成交数'
FROM userbehaviour
GROUP BY date
ORDER BY date;
11月25日、11月26日和12月2日、12月3日分别都为周六、日,从图中可以看出周末期间和工作日期间用户活跃度没有太大起伏,对于12月2日和12月3日的猜想:
双12活动的预热引起了用户活跃度的上升
3.4.2 时间维度用户行为习惯
提出假设: 用户在一天中晚上休息时间点击量会上升
# 时间维度分析用户行为
SELECT hour,count(DISTINCT userID) '用户数',
SUM(case when behaviour = 'pv' then 1 else 0 end) '浏览数',
SUM(case when behaviour = 'cart' then 1 else 0 end) '加购数',
SUM(case when behaviour = 'fav' then 1 else 0 end) '收藏数',
SUM(case when behaviour = 'buy' then 1 else 0 end) '成交数'
FROM userbehaviour
GROUP BY hour
ORDER BY hour;
4时-10时 活跃度上升至稳定值
10时-19时 活跃度趋于稳定
19时-23时 活跃度上升至最高值(重点)
23时-次日4时 活跃度都呈下降趋势直至最小值(注意点)
用户的活跃度还是跟日常生活作息规律息息相关的
3.5 用户商品偏好类别
# 用户商品偏好类
# 浏览行TOP25
SELECT itemID '商品ID',count(behaviour) '浏览次数',ROW_NUMBER() over(ORDER BY count(behaviour) DESC) '排名'
from userbehaviour
WHERE behaviour = 'pv'以上是关于“天池”淘宝用户消费行为分析——sql的主要内容,如果未能解决你的问题,请参考以下文章