分析目标:描述该平台在用户以及用户在产品消费上的现状定位,找到该平台目前的核心优势或是亟待解决的核心问题,提供下一步发展最核心有效的方向和相应建议
分析对象:国外某中型to c 化妆品在线商店
数据来源:https://www.kaggle.com/mkechinov/ecommerce-events-history-in-cosmetics-shop
数据描述:数据包括该中型化妆品在线商店的5个月(2019年10月至2020年2月)共2000万条用户行为数据,包括浏览、加购、移出购物车、购买下单行为分类,以及行为发生时间、对象产品、产品分类、品牌等
分析方法:AARRR海盗模型,RFM用户分层模型,对比与时间序列分析、漏斗与流程分析
数据处理使用工具:
考虑总体数据数据量极大,总体数据的清洗及部分分析在python3平台上完成
提取典型性数据(12月数据)至MySQL平台提取所需分析数据
PowerBI及Tableau产出可视化图表
分析结构:
分析结论概览:
平台新用户占比巨大却未有效转化,新用户留存策略亟待提高
平台用户结构不稳定,受短期流量用户影响大,需采取针对性策略留存新用户、稳定和提升价值
用户加购及购物车存留商品基本代表用户消费倾向
平台推荐浏览流量与下单品牌有部分错位,需优化产品推荐机制基于加购商品关联推荐,吸引用户浏览和加购
加购商品 存留时长在1日左右下单概率最高,时长增加下单频次减低,应尽量缩短1日 购物车商品留存时间间隔,提高加购-购买转化率
一、数据情况和预处理
1、字段含义
event_time |
事件发生的时间(以 标准世界时 UTC 为单位) |
event_type |
|
product_id |
产品ID标识 |
category_id |
商品类别 ID |
category_code |
产品的类别分类(代号)。通常用于有意义的类别,而对于不同类型的配件则跳过。 |
brand |
品牌名称的缩写字符串。可以错过。 |
price |
浮动价格,产品的当前价格 |
user_id |
永久用户 ID。 |
** user_session** |
用户的临时会话 ID。每个用户的会话相同。每次用户从长时间的暂停中返回在线商店时都会更改。 |
2、处理数据
1、读取转换:python读取5个月csv表的数据并进行拼接,最终合成为 20692840行, 9个字段的数据,数据量非常庞大。
2、列名重命名:将字段名按字段解释改为对应中文名
3、整体去重:删除各列都重复的数据,去重后数据量是19583742条
4、缺失值:统计数据缺失情况,产品类别分类、品牌、临时用户会话id存在缺失值。
-
产品类别 ID基本代表了产品类别,产品类别分类的缺失并不影响分类定义
-
品牌缺失不影响用户部分分析,在后续分出产品表时进行填充和去重处理
临时会话id对数据并无影响,可以忽略。
5、异常值:通过Matplotlib箱线图查看数据总体是否有异常值,结果基本无异常。
单独查看价格情况,购买行为中价格记录存在负值(统计共124条),应为退款情况,将此部分记录筛选去除
6、时间类型处理:时间字段类型读取后为字符串类型,去除结尾'UTC',将之转换为时间对象
import time
transform_date = data['时间'].apply(lambda x:x.split('UTC')[0])
data['时间'] = transform_date.apply(lambda x:x.strip(' '))
data['时间'] = pd.to_datetime(data['时间'])
提取年月、日、周、小时等数据方便后续进行分析
data['年月'] = data['时间'].dt.strftime('%Y-%m')
data['日'] = data['时间'].dt.day
data['周'] = data['时间'].dt.weekday
data['日期'] = data['时间'].dt.date
data['小时'] = data['时间'].dt.hour
# 按日期升序排列
data = data.sort_values(by = ['时间'])
data.head()
7、重排索引:清洗完成后按时间排序重建data数据索引
3、分表分库:
事件类型表:数据的四种事件类型:浏览、加入购物车、移出购物车、购买,主表对应修改为类型编号:1、2 、3、4
导入MySQL中event_type表
#类别文本转数值,文本转为字符串再替换为数值
data['事件类型'] = data['事件类型'].astype('str')
data['事件类型'].replace({'view':1,'cart':2,'remove_from_cart':3,'purchase':4},inplace=True)
产品表:提取产品相关的字段形成产品表数据,主表保留产品Id字段与产品表相连
product = data[['产品编号','产品类别id','产品类别分类','品牌']] product.drop_duplicates(inplace=True) product.shape
产品表简单去重后,共56085行,4个字段,统计产品编号去重数量54571,因此其中包含有部分字段重复的数据,需去重。产品表数据量相对不大,因此导入MySQL提取去重
提取产品表中仅因品牌字段缺失而产生多条记录的数据,共12263条
创建中间表去除品牌缺失重复数据
CREATE TABLE product1 AS
SELECT *
FROM product
WHERE `index` NOT IN (
SELECT a.`index`
FROM product1 a,product1 b
WHERE a.`品牌` is null
AND a.`产品编号`= b.`产品编号`
AND a.`产品类别id`=b.`产品类别id`
AND a.index<>b.index)
中间表仍有43822条数据,为同一产品id但分类id有不同情况的,以产品id分组,创建新表,得到完全去重后的产品表
主表:提取分析相关字段:时间、事件类型、产品编号、价格、用户id、年月、日、周、日期、小时,作为主表
支付表和浏览表:提取对应事件类型和相应字段的数据
导出12月主表到SQL具体分析
二、总体指标
通过支付表和浏览表,计算5个月的月UV、PV、GMV、购买用户以及客单价
在平台5个月近半年的数据中:
销售量:
GMV与购买用户数变化趋势一致,12月明显下降,11月及次年1月均有抬升,月平均GMV达125万美元,购买用户25万
客单价稳定,平均客单价4.95美元
访问量:
PV(访问量)变化趋势与销售趋势一致,UV(访客数)趋势稳定,月平均PV约为190万次,UV为37万用户访问
异常趋势:
在浏览流量和销售情况中都可以明显看到12月成为一个低谷,但12月中节日集中,有元旦、圣诞等重大节日,对平台主营品类化妆品来说,赠礼及自用需求预期都该是比其他月高的,因此12月PV,UV,GMV都出现低谷情况显得比较异常,因此提取该月数据具体分析
三、用户运营
1、用户跳失率、付费率、复购率
跳失率=只点击一次浏览的用户数量/总访问用户量
付费率=购买下单的用户数量/总用户量
复购率=有购买行为天数为2天以上的用户数量/购买用户数
SELECT COUNT(`用户id`) as '仅浏览一次用户量'
FROM (
SELECT `用户id`
FROM `order_nev`
WHERE `事件类型`=1
GROUP BY `用户id`
HAVING COUNT(*)=1
) T1
SELECT COUNT(*) as '复购用户'
FROM (
SELECT `用户id`,COUNT(`日`) as buy_days
FROM (
SELECT `用户id`,`日`,COUNT(*)
FROM `order_nev`
WHERE `事件类型`=4
GROUP BY `用户id`,`日`
) T1
GROUP BY `用户id`
HAVING buy_days>1
) T2
结论:
跳失率高达51.13%,说明半数用户是仅浏览了一次的用户, 平台的用户留存问题非常严重。
平台用户付费率仅接近7%,比例较小,相当于15个用户中仅有1个下单购买
购买用户的复购率8.69%,也相对偏低。
平台对新用户留存、浏览用户转化购买用户、购买用户复购环节的强度都较低,在商品推荐、信息推送等可能存在较大问题
2、独立访客漏斗模型计算
CREATE TABLE analysis_total_userdata AS
SELECT `事件类型`,COUNT(DISTINCT `用户id`) as 用户量
FROM `order_nev`
GROUP BY `事件类型`
图中百分比为行为用户数占总用户数的比例
3、用户各行为转化率
转化率:整体转化率可以由行为发生次数计算或者行为人数计算。计算行为发生次数的话,可能存在同一个用户单日登录后有大量浏览行为,只有一次购买行为的情况发生,要计算全月整体转化率,浏览行为数量是庞大的,在月度的尺度下转化比率会非常大,并不利于情况分析参考。因此使用人数计算转化率,看平台用户群在浏览-加购(购买意向)-购买环节中的转化情况。
结论:
根据转化率漏斗图,浏览-加入购物车的转化率偏低,只有23.3%,说明当月大于四分之三的用户在浏览商品后并没有加入购物车,没有产生购买意愿。在浏览-加入购物车过程中,环节可能产生错位的有:
平台引流推荐的商品不够吸引用户,与用户偏好拟合度不够
商品详情页等未能成功使用户产生消费
需要进一步查看在浏览-加入购物车过程中,到底在哪一部分使得用户放弃了加入购物车。
根据用户行为独立用户图,用户移除/购买的占比基本接近加入购物车的占比,可以看到大部分用户是习惯了将留存在购物车中的商品下单的,购物车最终留存商品可能直接体现用户的下单对象。
加购-下单的转化率是30.7%,加入购物车用户与移出购物车用户比率为1: 0.54,用户在这一步移出购物车的原因是什么?是因为价格敏感还是距离加入时时间过长忘记而购买意愿失效?此过程转化率如能针对性提高,将达到四两拨千斤的效果
4、RFM 用户分层
取全部5个月数据在python上计算RFM分层
R-最近购买时间
# 计算最大交易日期得出最后交易日期
last_date = max(pay['时间'])
# 计算最后交易日期和当前交易日期之间的差异
pay['diff'] = last_date - pay['时间']
# 计算最后交易距离天数
RFM_R = pay.groupby('用户id')['diff'].min().reset_index()
RFM_R['diff'] = RFM_R['diff'].dt.days
F-消费频率
RFM_F = pay.groupby('用户id')['时间'].count().reset_index()
F-消费总金额
RFM_M = pay.groupby('用户id')['价格'].sum().reset_index()
组合为用户RFM数据集
用StandardScaler方法对数据标准化,转化为均值为0,方差为1的正态分布
train = RFM[['R','F','M']]
s = StandardScaler()
train = s.fit_transform(train)
train = pd.DataFrame(train)
train.columns = ['R','F','M']
尝试通过KMeans聚类,k=8分层后实际汇聚数群类型为四类,不能满足RFM的八个分层,因此将标准化模型直接比对对应维度均值,得到对应分层
def rfm_func(x):
level = x.apply(lambda x:"1" if x > 0 else '0')
label = level.R + level.F + level.M
d = {
'111': '重要价值客户',
'110': '潜力客户',
'101': '重要发展客户',
'100': '新进客户',
'011': '重要保持客户',
'010': '一般保持客户',
'001': '重要挽留客户',
'000': '一般挽留客户'
}
result = d[label]
return result train['label'] = train[['R','F','M']].apply(lambda x:x-x.mean()).apply(rfm_func,axis=1)
将分层标签连接到用户RFM数据,得到用户-RFM分层表,方便后续运营参考指定不同客户对应策略。统计得到各层客户量,到Tableau制分层占比图
结论:
可以看到平台新进用户占比最大,超过三分之一的客户都是流失客户,都是RFM都低的用户,这部分用户激活难度和成本高,继续投入成本激活性价比不大。这样的用户占比如此高,是对平台运营的严重预警,说明平台在该半年中用户留存策略存在严重问题
占比第二,接近十分之三的用户都是仅最近登录,但消费频率和金额都不高的群体,这也符合前面跳失率等的分析。这意味着极大占比的用户是仅引流进来但未得到消费开发的,平台必须在新客转化上下功课(试用、前三单优惠等),将这部分庞大的用户量转变为价值用户
后续占比较高的是重要价值用户、重要保持用户、一般保持用户,都是消费频率都较高的用户群体,总计占比25.32%,相当于四分之一的用户量,说明平台在已留存用户上是存在优势的,需要根据用户分层采取对应策略,保持或提升该部分用户价值
四、产品
1、不同销售频率商品的数量
CREATE OR REPLACE VIEW product_sale AS
SELECT times, COUNT(`产品编号`) as num
FROM (
SELECT `产品编号`, COUNT(*) as times
FROM `order_nev`
WHERE `事件类型`=4 GROUP BY `产品编号`
) T1
GROUP BY times
ORDER BY num DESC
结论:
商品中总计88.2%的商品购买频率在1-5次,说明平台商品销售主要依靠长尾商品的累积效应,而非爆款商品的带动。
2、用户浏览、加购与用户实际下单品牌对比
分别取出用户对品牌的浏览量、加购量、下单量
CREATE OR REPLACE VIEW brand_view AS
SELECT `品牌`,COUNT(*) as 浏览量
FROM order_nev
LEFT JOIN product USING(`产品编号`)
WHERE `事件类型`=1 AND `品牌` is NOT NULL
GROUP BY `品牌`
ORDER BY `浏览量` DESC
以品牌浏览量做树形图,图块大小为品牌的浏览量占比,将下单购买量作为颜色区分,标签为:品牌名、浏览量排名、购买量排名。品牌加购-购买量图同理
结论:
品牌加购图中能看出颜色与大小基本均匀一致,加购排序与购买排序基本一致,说明加购基本能够体现消费者下单倾向,后续对消费者的产品推荐基于加购商品准确率的性价比是比较高的
相比之下,品牌浏览图中颜色相对大小分布不均匀,浏览排序与购买排序有较多错位,说明品牌浏览与下单购买出现了错位,电商平台浏览量一般代表着平台推荐和流量位的分布,与用户购买下单出现了错位,说明部分平台流量推荐位没有很好的转化为实际销量
3.加购-购买时间间隔频次
统计同用户同一商品,加入购物车到下单购买时间间隔,按间隔进行计数
CREATE TABLE cart_pay_day AS
SELECT *,
CASE
WHEN diff<60 THEN '1小时内'
WHEN diff<180 THEN '3小时内'
WHEN diff<1440 THEN '1日内'
WHEN diff<4320 THEN '3日内'
WHEN diff<10080 THEN '1周内'
ELSE
'1周以上'
END as time_interval
FROM (
SELECT *,TIMESTAMPDIFF(MINUTE,cart_time,pay_time) as diff
FROM user_cart INNER JOIN user_pay USING(`用户id`,`产品编号`)
WHERE TIMESTAMPDIFF(MINUTE,cart_time,pay_time)>0
ORDER BY `用户id`,`产品编号`,diff
) AS cart_pay;
SELECT time_interval,COUNT(*) as pay_num
FROM `cart_drop_day`
GROUP BY time_interval
ORDER BY pay_num DESC
结论:
时间间隔长度与成单的频次基本成反比,时间间隔平均数为24.2小时,就是约一天,用户将商品加入购物车后,一天内下单的频次占比是最高的,共计81.5%,后续会逐渐减小
应重视购物车商品留存时间,尽量缩短时间间隔,提高加购-购买转化率。建议通过运营策略,如对加入购物车1~3日内商品给予优惠福利并及时推送用户,对购物车留存1日以上商品及时推送优惠变动给用户,提醒用户
五、结论与策略建议
平台新用户占比巨大却未有效转化,新用户留存策略亟待提高
平台接近十分之三的用户是新用户,全部浏览用户有51%的跳失率,大量的新用户来了即走,浏览频率和购买的转化率都非常低,新用户流量没有得到有效转化
需要优化新用户体验,结合平台主营品类,通过化妆品小样免费试用、实力品牌场前三单优惠折扣、连续签到领取抽取正装试用等运营策略,转化新用户为留存用户
平台用户结构不稳定,受短期流量用户影响大,需采取针对性策略留存新用户、稳定和提升价值用户
51%的跳失率下是占比较高的流失用户和新用户,都是消费频率和金额都很低的短期流量用户,没有有效转化用户价值,极大影响了平台用户结构
根据RFM分层表策略建议对不同阶段用户采取针对性的运营策略,增加平台存量价值用户占比,稳固用户结构,保证健康发展
存量用户结构稳定,价值高,需保持和进一步提高,如完善的会员和积分体系等
低价值已流失用户(RFM值均低的),建议不再投入过多成本激活
用户加购及购物车存留商品基本代表用户消费倾向
在独立行为数据中可以看到购物车留存商品基本等同最终购买商品,
产品推荐机制应优化,吸引用户浏览和购买
整体浏览流量与销售趋势是一致的,但浏览到加购转化率较低,浏览品牌与下单品牌产生错位,加购品牌基本反映用户下单品牌
平台推荐商品或品牌应基于用户加购商品关联推荐,精准推荐,吸引用户浏览和加购
应尽量缩短1日后购物车商品留存时间间隔,提高加购-购买转化率
加购商品存留时长在1日左右下单概率最高,时长增加下单频次减低
建议通过运营策略,对购物车留存1日以上商品及时推送优惠变动给用户,提醒用户。对加入购物车1日左右商品投入较多运营成本给予优惠福利