0 项目背景
1 项目明细
1.1 数据的来源及明细1.2 项目目的1.3 项目思路 2、数据预处理
2.1 数据导入2.2 数据预处理2.3 日期与时间格式化2.4 删除异常值 3、数据分析
3.1 数据整体情况3.2 用户行为转化3.3 用户复购率和跳失率3.4 用户时间习惯
3.4.1 日期维度用户行为习惯3.4.2 时间维度用户行为习惯 3.5 用户商品偏好类别3.6 用户价值层度
3.6.1 R维度评分3.6.2 F维度评分3.6.3 RF 维度综合评分进行用户价值分层 4、结论及应对方法
0 项目背景练手项目: 当今电商行业的运营模式需要针对用户的喜好程度或用户习惯进行相应的策略性改变,而策略的来源则是通过对用户的显式反馈或是隐式反馈进行用户行为分析,进一步为用户提供个性化、差异化的的服务,最终达到营收率提升的目的。
1 项目明细 1.1 数据的来源及明细UserBehavior是阿里巴巴提供的一个淘宝用户行为数据集。数据来源请戳
UserBehavior.csv
本数据集包含了2017年11月25日至2017年12月3日之间,有行为的约一百万随机用户的所有行为(行为包括点击、购买、加购、喜欢)。数据集的组织形式和MovieLens-20M类似,即数据集的每一行表示一条用户行为,由用户ID、商品ID、商品类目ID、行为类型和时间戳组成,并以逗号分隔。关于数据集中每一列的详细描述如下:
注意到,用户行为类型共有四种,它们分别是:
关于数据集大小的一些说明如下:
选取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:tianchiUserBehavior.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;
没有缺失值,太好了 ^ _ ^
# 时间格式转化 # 添加日期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( ) 函数的使用,戳这~
# 查看日期的最大值与最小值,看是否有异常值 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.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,用户对于淘宝的体验普遍很好
# 用户时间习惯 # 日期维度分析用户行为 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活动的预热引起了用户活跃度的上升
提出假设: 用户在一天中晚上休息时间点击量会上升
# 时间维度分析用户行为 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时 活跃度都呈下降趋势直至最小值(注意点)
用户的活跃度还是跟日常生活作息规律息息相关的
# 用户商品偏好类 # 浏览行TOP25 SELECt itemID '商品ID',count(behaviour) '浏览次数',ROW_NUMBER() over(ORDER BY count(behaviour) DESC) '排名' from userbehaviour WHERe behaviour = 'pv' GROUP BY itemID ORDER BY count(behaviour) DESC LIMIT 25; # 购买行TOP25 SELECt itemID '商品ID',count(behaviour) '浏览次数',ROW_NUMBER() over(ORDER BY count(behaviour) DESC) '排名' from userbehaviour WHERe behaviour = 'buy' GROUP BY itemID ORDER BY count(behaviour) DESC LIMIT 25; # 加购行TOP25 SELECt itemID '商品ID',count(behaviour) '浏览次数',ROW_NUMBER() over(ORDER BY count(behaviour) DESC) '排名' from userbehaviour WHERe behaviour = 'cart' GROUP BY itemID ORDER BY count(behaviour) DESC LIMIT 25; # 收藏行TOP25 SELECt itemID '商品ID',count(behaviour) '浏览次数',ROW_NUMBER() over(ORDER BY count(behaviour) DESC) '排名' from userbehaviour WHERe behaviour = 'fav' GROUP BY itemID ORDER BY count(behaviour) DESC LIMIT 25;
商品浏览TOP25
商品加购TOP25
商品收藏TOP25
商品购买TOP25
RFM 模型介绍:RFM是3个指标的缩写,最近一次消费时间间隔(Recency),消费频率(Frequency),消费金额(Monetary)。通过这3个指标对用户分类。详细介绍
由于源数据并没有设计金额量的维度,所以此处无法对M维度进行具体分析,由此针对RF维度对用户行为进行分析
3.6.1 R维度评分# R 维度评分
# 创建R维度视图
CREATE VIEW r_value AS
SELECt userID,min(gap) R
from (
SELECt userID,DATEDIFF('2017-12-04',date) gap
FROM userbehaviour
WHERe behaviour = 'buy'
) as a
GROUP BY userID;
# 进行R维度打分
SELECt userID '用户ID',R '最近消费时间间隔',
(case when R BETWEEN 0 and 2 then 3
WHEN R BETWEEN 3 and 5 then 2
ELSE 1 END) as 'R维度评分'
FROM r_value;
DATEDIFF()函数的用法,戳这~
R维度评分占比饼图:
# F维度分析
# 创建F维度视图
CREATE VIEW f_value AS
SELECt userID,count(behaviour) as F
FROM userbehaviour
WHERe behaviour = 'buy'
GROUP BY userID;
# 进行F维度打分
SELECt userID,F,(case when F BETWEEN 1 and 9 then 1
WHEN F BETWEEN 10 AND 19 THEN 2
WHEN F BETWEEN 20 AND 29 THEN 3
WHEN F BETWEEN 30 AND 39 THEN 4
WHEN F BETWEEN 40 AND 49 THEN 5
WHEN F BETWEEN 50 AND 59 THEN 6
ELSE 7 END) 'F维度评分'
FROM f_value;
F维度评分占比饼图:
# RF综合打分视图
# 进行R维度打分
CREATE VIEW r_score AS
SELECt userID ,R ,
(case when R BETWEEN 0 and 2 then 3
WHEN R BETWEEN 3 and 5 then 2
ELSE 1 END) as R_Score
FROM r_value;
# 进行F维度打分
CREATE VIEW f_score AS
SELECt userID,F,(case when F BETWEEN 1 and 9 then 1
WHEN F BETWEEN 10 AND 19 THEN 2
WHEN F BETWEEN 20 AND 29 THEN 3
WHEN F BETWEEN 30 AND 39 THEN 4
WHEN F BETWEEN 40 AND 49 THEN 5
WHEN F BETWEEN 50 AND 59 THEN 6
ELSE 7 END) F_Score
FROM f_value;
# RF综合打分
CREATE VIEW rf_score AS
SELECt a.userID '用户ID',a.R_Score 'R维度评分',b.F_Score 'F维度评分', a.R_Score + b.F_Score 'RF维度综合评分'
FROM r_score a JOIN f_score b ON a.userID = b.userID;
RF维度综合用户评分:
# RF维度综合用户评分 SELECt (CASE when RF维度综合评分 BETWEEN 2 AND 3 then '易流失用户' when RF维度综合评分 BETWEEN 4 AND 5 then '挽留用户' when RF维度综合评分 BETWEEN 6 AND 7 then '发展用户' ELSE '忠诚用户' END ) '用户分层',count(*) '用户数量' FROM rf_score GROUP BY 用户分层;
分析:
1、将R维度评分+F维度评分=RF综合评分的指标,
| 客户分类 | 评分 |
|---|---|
| 易流失用户 | 2-3分 |
| 挽留用户 | 4-5分 |
| 发展用户 | 6-7分 |
| 忠诚用户 | 7分以上 |
2、大部分用户集中在易流失用户和挽留用户上
对措:
| 客户分类 | 表现 | 措施 |
|---|---|---|
| 易流失用户 | 消费时间距离近,消费频率低 | 提高消费频率 |
| 挽留用户 | 消费时间距离远,消费频率低 | 联系用户,调查挽回 |
| 发展用户 | 消费时间距离远,消费频率高 | 邮箱推送,app提醒,促销 |
| 忠诚用户 | 消费时间距离近,消费频率高 | 提高vip服务 |
结论:
1、 流量高的商品并不是购买量高的商品,高流量的商品购买量低导致了整体的流量转化率低,也就是推荐展示的逻辑并没有以销售为导向。
2、从用户行为路径中发现,用户浏览后直接购买的转化率较低,而通过加购,收藏等行为后购买的转化率会提升,故需要引导顾客积极加购或者收藏,且对比转化率后发现加购物车所带来的转化是最好的。
3、用户主要集中在易流失用户和挽留用户,两者加总占用户数的99.61%
建议:
1、建议算法部门优先展示购买量TOP10的商品类给顾客,例如3122135、3237415、2124040等,如果说浏览量高的商品是新品或者近期主推的商品,是否可以考虑和TOP10购买的商品按照类目合理搭配销售,提升转化率和连带率。
2、需积极引导顾客加购物车或者收藏宝贝,对于界面设计部门是考虑如何交互能够让顾客更愿意点击,对于运营部门,可以设置机制引导,例如加购联系客服送5元无门槛优惠券,加购送小样赠品等的机制来引导。
3、淘宝的用户搜寻商品的时间段主要在下午6点至晚上11点,也就是大多数人下班后休息的时间。建议运营部门在这个时间段多策划一些营销活动,提高转换率,比如商家可以进行直播带货。
4、对于重要发展用户,其消费频率低,但最近消费距离现在时间较短,因此要想办法提高他的消费频率,通过CRM的红包发放、会员权益奖励、短信提醒优惠等方式提升消费频率。
5、对于重要挽留用户,最近消费时间距离现在较远、消费频率低。这种用户有即将流失的危险。建议通过APP推送、短信和邮件等形式发放有偿问卷主动联系用户,调查清楚哪里出了问题,制定相应的挽回策略。
参考博文:[1]https://blog.csdn.net/Kobe123brant/article/details/116863804
[2]https://blog.csdn.net/weixin_40244969/article/details/109908414
[3]https://zhuanlan.zhihu.com/p/121530969



