巴西电商Olist订单数据分析(MySQL+Tableau)

2023-10-13 22:20

本文主要是介绍巴西电商Olist订单数据分析(MySQL+Tableau),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、项目背景

Olist电商是巴西的一个电商平台,巴西各地小型企业可通过Olist商店销售产品,并使用Olist物流合作伙伴将产品直接运送给客户。本文从用户维度对Olist商店2016.9-2018.8的订单数据进行分析,目的是发现平台存在的问题,分析原因,并给出平台运营及用户运营方面的建议。

二、数据信息

数据来源:Brazilian E-Commerce Public Dataset by Olist | Kaggle

数据说明:数据集为巴西电商Olist的交易订单数据,涵盖该平台2016年9月-2018年8月近10万条订单交易记录,数据集包含9张数据表。 本次分析只用到其中5张表:

  • olist_orders_dataset:包含订单id,顾客id,订单状态,购买时间等信息

  • olist_order_items_dataset:包含订单id,物品数量,商品id,商品价格和运费等信息

  • olist_products_dataset:包含商品id,商品品类等商品信息

  • olist_customers_dataset:包含顾客id,顾客唯一id,顾客地域等信息

  • product_category_name_translation:包含商品品类和商品品类的英文翻译

三、分析框架

流量指标:活跃用户数(DAU、MAU、时段)

运营指标:GMV(季度、月)、ARPU(季度、月)、订单数(天、月、时段)

RFM用户价值分层:各层次用户的热销品类

四、结论先行

结论总结

一、平台运营建议综合订单数、MAU和GMV指标来看,平台遇到发展瓶颈,典型表现为用户平均收入水平维持,指标增速放缓,甚至出现回落的趋势。

  • 针对用户规模,需评估国内市场流量是否见顶进入存量竞争阶段。 如果是,可以考虑发展海外市场,同时做好用户运营,减少用户流失; 如果否,则可能与平台自身运营不佳有关或竞争对手抢占市场导致,一方面需要对内调整运营策略,优化用户体验,减少流失,对外及时跟进竞争对手动态,持续拓展站外流量。

  • 针对成交额,在保证用户规模健康增长的同时,一方面有效利用10-22点的用户活跃时段进行运营,提高各环节的转化率,另一方面做好用户运营,培养优质用户,提升用户复购率及活跃度,提高用户平均收入。

  • 继续利用“黑色星期五”的节日优势, 创新销售策略和活动玩法。

二、用户运营建议结合用户特点、商品喜好、巴西节假日采取精细化运营措施。

  • 用户普遍消费频率低且最近消费时间较远,需要对于RFM模型中不同类别用户进行差异化精准营销:对于重要发展用户和重要挽留用户,应主动联系,给予复购优惠,降低二次消费门槛,提高复购率,同时采取会员积分制度或会员卡充值制度,引导用户长期消费,增强粘性;对于一般发展用户和一般挽留用户,应增加免费试用提升用户兴趣,提高新用户留存率,同时开展用户满意度调查,分析用户流失原因,有针对性地唤回;对于重要价值用户和重要保持用户,应提供个性化服务,根据用户的需求和兴趣给予个性化的产品推荐和优惠方案;对于一般价值用户和一般保持用户,应优化关联销售,提高客单价。

  • 健康美容、家居用品、运动休闲是大众热门品类,适合结合特定节假日对各类用户做推广和促销,吸引用户关注,增加曝光量;手表、家具、电脑配件则属于小众热门品类,向特定的用户群体进行推荐效果更好。

数据可视化

一、流量指标:活跃用户数(DAU、MAU、时段)、订单数(天、月、时段)

(因几乎每位用户对应1个订单,所以这里订单数放在流量指标处一起分析)

  

发现

1)DAU整体缓慢增长。 DAU的趋势是逐渐递增的,尤其2017年11月24日当天DAU增长至1166,较前一日增长420%,这是因为2017年11月24日为“黑色星期五”,该日为巴西的购物狂欢节,平台会进行打折促销活动,可以看出活动效果很好。

2)MAU由快速增长后趋于平稳。 2017年11月前,MAU及订单数呈现整体快速增长的趋势,并在17年11月下旬出现明显峰值,由此带动当月MAU和订单数达到两年以来的最高值,也说明2017年11月24日“黑色星期五”的活动效果显著,18年后月活跃用户数增长势头放缓。

3)各时段活跃用户数高峰值集中在10 am-10 pm。 10 am-10 pm的用户数和订单数明显高于平均水平,是用户活跃时段,其中12点和18点推测由于饭点时间导致活跃度略有下滑。22点-次日5点是用户的睡眠时间,活跃用户数处于低点,之后5-10点开始回升,直到10点后恢复到活跃水平。 运营人员可以根据活跃用户的时间段,采取促销措施。

二、运营指标:GMV(季度、月)、ARPU(季度、月)

发现

1)GMV快速增长后,进入瓶颈期,并有负增长的苗头。 16-17年间,平台GMV快速增长,平均季度增幅近50%,但在进入18年后增速放缓,甚至在18年Q3出现负增长。 18年Q3的GMV出现负增长的原因一方面是缺少18年9月的数据,但同时也可以看到18年7-8月的GMV整体是不及3-5月的水平,一定程度上可以说明出现了负增长的苗头。

2)各月GMV环比增幅呈现节日性波动。 细化到各月情况来看,平台的快速发展期其实是在16年的Q4和17年的Q1,随后增速整体趋缓,仅靠个别月的小峰值维持整体增速。 环比涨幅随时间变化易看出月GMV呈节日性波动。2-3月狂欢节、5月母亲节、6月巴西情人节、8月父亲节、11月黑五、12月圣诞节等,节日期间或前夕销量会上升,由于消费者选择集中在节日消费,故与节日相关的前一个月与后一个月的销售额均有下降。

 

发现

1)平台ARPU长期未实现突破。 平台的季度ARPU在16年Q4处于最高水平,之后在相对较长的一段时间里比较平稳,但平台需要注意到:ARPU长期没有有效突破,且2018年开始出现下降趋势。

2)细化到各月的情况来看,16年Q4ARPU达到最高值,随后的ARPU均未有突破。18年Q3的各月ARPU下滑原因跟GMV类似,跟数据缺失有一定关系,但ARPU值无法突破的问题值得平台重视。

三、RFM用户价值分层:各层次用户的热销品类

发现

1)平台30%的用户贡献60%的销售额,符合电商行业的二八原则。 从用户数量来看:重要发展用户、重要挽留用户、重要价值用户的比例不到30%,明显低于一般发展用户和一般挽留用户的70%比例; 从消费金额来看:重要发展用户和重要挽留用户的消费金额占全体用户的58.85%,一般发展用户和一般挽留用户的消费金额占全体用户的35.45%。这说明:

1、重要型用户仍是运营维护的主要关注群体;

2、平台用户大多数为新用户,普遍消费频率低且最近消费时间较远,客户流失情况严重。平台应加强客户价值管理,特别是要努力提高重要价值客户占比。 对于重要发展用户和重要挽留用户,应主动联系,给予优惠,提高复购率,并分析用户流失原因,通过针对性的运营手段唤回; 对于一般发展用户和一般挽留用户,应增加免费试用提升用户兴趣,提高新用户留存率,同时分析用户流失原因,有针对性地唤回。

2)大众热门品类集中在健康美容、家居用品、运动休闲。 主要用户的热门商品品类中,健康美容、家居用品、运动休闲等品类均出现在热门排名前列,说明这类商品是大众热门品类,适合对各类用户做推广和促销; 手表、家具、电脑配件则属于小众热门商品,对特定类型用户来说更受欢迎,可选择合适的用户群体进行推荐。

五、数据分析具体过程(代码部分)

/*
分析框架:
1.流量指标:活跃用户数(DAU、MAU、时段)
2.运营指标:GMV(季度、月)、ARPU(季度、月)、订单数(天、月、时段)
3.RFM用户价值分层:各层次用户品类
*/ 
#数据清洗
#重命名表
RENAME TABLE olist_customers_dataset TO customers;
RENAME TABLE olist_orders_dataset TO orders;
RENAME TABLE olist_order_items_dataset TO items;
RENAME TABLE olist_products_dataset TO products;
RENAME TABLE product_category_name_translation TO category;#将空值替换为0
UPDATE orders SET order_approved_at = 0 WHERE order_approved_at IS NULL;
UPDATE orders SET order_delivered_carrier_date = 0 WHERE order_delivered_carrier_date IS NULL;
UPDATE orders SET order_delivered_customer_date = 0 WHERE order_delivered_customer_date IS NULL;#查看是否有重复值
SELECT order_id FROM orders GROUP BY order_id HAVING count(*)> 1;
SELECT order_id FROM items GROUP BY	order_id,order_item_id HAVING count(*)> 1;
SELECT product_id FROM products GROUP BY product_id HAVING count(*)> 1;
SELECT product_category_name_english FROM category GROUP BY	product_category_name_english HAVING	COUNT(*)> 1;
SELECT customer_id FROM customers GROUP BY	customer_id HAVING COUNT(*)> 1;
#结果显示该5份数据表均没有重复值#提取orders表里的时间,建立订单时间表,辅助后续的分析
CREATE TABLE order_time AS 
SELECT order_id,a.customer_id,customer_unique_id,
YEAR ( order_purchase_timestamp ) AS y,
QUARTER ( order_purchase_timestamp ) AS q,
MONTH ( order_purchase_timestamp ) AS m,
DATE ( order_purchase_timestamp ) AS d,
HOUR ( order_purchase_timestamp ) AS h 
FROM orders a
LEFT JOIN customers b ON a.customer_id = b.customer_id 
WHERE order_purchase_timestamp NOT LIKE '2016-09-%' 
AND order_purchase_timestamp NOT LIKE '2016-12-%' 
AND order_purchase_timestamp NOT LIKE '2018-09-%' 
AND order_purchase_timestamp NOT LIKE '2018-10-%';
#2016年9、12月,2018年9、10月数据量过少,需要过滤掉这些数据量异常的月份#计算每笔订单的金额
CREATE TABLE total_order_value AS 
SELECT order_id,product_id,seller_id,price,freight_value,(price * count(*)+ freight_value * count(*)) AS order_value 
FROM items 
GROUP BY order_id, product_id,	seller_id, price, freight_value;#整合每笔订单的时间和金额,便于后续计算GMV等指标
CREATE TABLE order_detail AS 
SELECT a.order_id,product_id,seller_id,customer_id,customer_unique_id,cast(order_value AS DECIMAL (8,2)) AS order_value,y,q,m,d,h 
FROM total_order_value AS a
INNER JOIN order_time AS b ON a.order_id = b.order_id;#数据分析
#一、流量指标:活跃用户数(DAU、MAU、时段)及订单数分析
#日活跃用户数及订单数
CREATE TABLE day_user_order AS 
SELECT a.日期,DAU,订单数 
FROM (SELECT d '日期', count(DISTINCT customer_unique_id) DAU FROM order_detail GROUP BY d ORDER BY d) a
LEFT JOIN (SELECT d '日期', count(DISTINCT order_id) '订单数' FROM order_detail GROUP BY d ORDER BY d) b 
ON a.日期 = b.日期 
ORDER BY a.日期;#月活跃用户数及订单数
CREATE TABLE month_user_order AS 
select concat(年,'-',月) as 月份, MAU, 订单数
from (SELECT a.y '年',a.m '月',MAU,订单数 
FROM (SELECT y,m,count(DISTINCT customer_unique_id) MAU FROM order_detail GROUP BY y,m ORDER BY y,m) a
LEFT JOIN (SELECT y,m,count( DISTINCT order_id ) '订单数' FROM order_detail GROUP BY y,m ORDER BY y,m) b 
ON a.y = b.y AND a.m = b.m 
ORDER BY 年,月) c;#时活跃用户数及订单数
CREATE TABLE hour_user_order AS 
SELECT a.h, 各时段活跃用户数, 订单数 
FROM (SELECT h,count(DISTINCT customer_unique_id) '各时段活跃用户数' FROM order_detail GROUP BY h ORDER BY h) a
LEFT JOIN ( SELECT h, count( DISTINCT order_id ) '订单数' FROM order_detail GROUP BY h ORDER BY h ) b 
ON a.h = b.h 
ORDER BY h;#二、GMV分析
#季度GMV
CREATE TABLE q_gmv AS 
SELECT y 年份,q 季度,round( sum( order_value ), 0 ) AS 季度 GMV 
FROM order_detail 
GROUP BY y,	q 
ORDER BY y,	q;#月度GMV及环比涨幅
CREATE TABLE month_gmv AS
SELECT concat(b.年,'-',b.月)'月份',b.月度GMV,concat(round((b.月度GMV/b.lag_gmv-1),2)*100,'%') AS '涨幅' 
FROM (SELECT a.*, lag(月度GMV, 1 ) over (ORDER BY 年,月) AS lag_gmv 
FROM (SELECT y年,m月,round(sum(order_value),0) AS 月度GMV FROM order_detail GROUP BY y,m ORDER BY y,m) a 
) b;#三、ARPU分析
#(每用户平均收入,Average Revenue Per User)
#各季度ARPU值(季度GMV/季度活跃用户数)
CREATE TABLE q_arpu AS
SELECT y '年份', q '季度',round(sum(order_value)/count(DISTINCT customer_unique_id),0) AS '季度ARPU' 
FROM order_detail 
GROUP BY y,	q 
ORDER BY y,	q;#各月ARPU值及环比涨幅
CREATE TABLE month_arpu AS 
SELECT concat(b.年,'-',b.月)'月份',b.月度ARPU,concat(round((b.月度arpu/b.lag_arpu-1),2)*100,'%') AS '涨幅' 
FROM (SELECT a.*,lag(月度ARPU, 1 ) over (ORDER BY 年,月) AS lag_arpu 
FROM (SELECT y 年, m 月, round( sum( order_value )/ count( DISTINCT customer_id ), 0 ) AS '月度ARPU' 
FROM order_detail GROUP BY y,m ORDER BY y,m ) a ) b;#四、RFM模型用户分层
#构造R值
create view recency as 
select customer_unique_id, case 
when datediff(max(d), (select max(d) from order_detail))> (select avg(datediff(d,(select max(d) from order_detail))) from order_detail) then 1
else 0 
end as r
from order_detail 
group by customer_unique_id; #构造F值
CREATE VIEW frequency AS
SELECT customer_unique_id, CASE
WHEN num > ( SELECT avg( num ) FROM ( SELECT customer_unique_id, count( DISTINCT order_id ) num FROM order_detail GROUP BY customer_unique_id ) a ) THEN 1 
ELSE 0 
END AS f 
FROM 
(SELECT customer_unique_id, count( DISTINCT order_id ) num FROM order_detail GROUP BY customer_unique_id ) a;#构造M值
create view monetary as 
select customer_unique_id, case  
when money > (select avg(money) from (select customer_unique_id, sum(order_value) money from order_detail group by customer_unique_id) a ) then 1
else 0 
end as m 
from 
(select customer_unique_id, sum(order_value) money from order_detail group by customer_unique_id) a;#构造rfm用户分层
CREATE view rfm AS 
SELECT r.customer_unique_id, CASE
WHEN concat( r, f, m ) = '111' THEN '重要价值客户' 
WHEN concat( r, f, m ) = '011' THEN '重要保持客户' 
WHEN concat( r, f, m ) = '101' THEN '重要发展客户' 
WHEN concat( r, f, m ) = '001' THEN '重要挽留客户' 
WHEN concat( r, f, m ) = '110' THEN '一般价值客户' 
WHEN concat( r, f, m ) = '010' THEN '一般保持客户' 
WHEN concat( r, f, m ) = '100' THEN	'一般发展客户' 
WHEN concat( r, f, m ) = '000' THEN '一般挽留客户' 
END AS label 
from recency r left join frequency f on r.customer_unique_id = f.customer_unique_id 
left join monetary m on r.customer_unique_id = m.customer_unique_id;#计算RFM各用户分层对应的客户数  
CREATE table rfm_data AS select label, count(label) num  from rfm group by label;#各用户分层的热门商品类型及消费金额汇总表
create view hot_sales as 
select 
a.customer_unique_id, b.label, d.product_category_name_english, sum(a. order_value) value_sum
from order_detail a
left join rfm b
using (customer_unique_id) 
left join products c
using (product_id) 
left join category d
using (product_category_name)
group by a.customer_unique_id, b.label, d.product_category_name_english;#各用户分层消费金额占比情况
create table user_consumption as 
select label, round(sum(value_sum),0) as amount from hot_sales group by label;#整体用户的热门商品类型排行
create table total_hot_sales as 
select 
product_category_name_english 商品品类,
round(sum(value_sum),0) 消费金额,
row_number()over(order by round(sum(value_sum),0) desc) as rk
from hot_sales 
group by product_category_name_english;
UPDATE total_hot_sales SET 商品品类 = 'others' WHERE 商品品类 IS NULL; 
select * from total_hot_sales;#一般发展客户、一般挽留客户、重要挽留客户、重要发展客户、重要价值客户的热门商品品类
create table 一般发展客户 as 
select product_category_name_english 商品品类, round(sum(value_sum),0) 消费金额, 
row_number()over(order by round(sum(value_sum),0) desc) as rk
from hot_sales 
where label = '一般发展客户'
group by product_category_name_english;create table 一般挽留客户 as 
select product_category_name_english 商品品类, round(sum(value_sum),0) 消费金额, 
row_number()over(order by round(sum(value_sum),0) desc) as rk
from hot_sales 
where label = '一般挽留客户'
group by product_category_name_english;create table 重要挽留客户 as 
select product_category_name_english 商品品类, round(sum(value_sum),0) 消费金额, 
row_number()over(order by round(sum(value_sum),0) desc) as rk
from hot_sales 
where label = '重要挽留客户'
group by product_category_name_english;create table 重要发展客户 as 
select product_category_name_english 商品品类, round(sum(value_sum),0) 消费金额, 
row_number()over(order by round(sum(value_sum),0) desc) as rk
from hot_sales 
where label = '重要发展客户'
group by product_category_name_english;create table 重要价值客户 as 
select product_category_name_english 商品品类, round(sum(value_sum),0) 消费金额, 
row_number()over(order by round(sum(value_sum),0) desc) as rk
from hot_sales 
where label = '重要价值客户'
group by product_category_name_english;

 (PS:如有不足,请指正,感谢)

这篇关于巴西电商Olist订单数据分析(MySQL+Tableau)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/206225

相关文章

MySQL主从同步延迟问题的全面解决方案

《MySQL主从同步延迟问题的全面解决方案》MySQL主从同步延迟是分布式数据库系统中的常见问题,会导致从库读取到过期数据,影响业务一致性,下面我将深入分析延迟原因并提供多层次的解决方案,需要的朋友可... 目录一、同步延迟原因深度分析1.1 主从复制原理回顾1.2 延迟产生的关键环节二、实时监控与诊断方案

慢sql提前分析预警和动态sql替换-Mybatis-SQL

《慢sql提前分析预警和动态sql替换-Mybatis-SQL》为防止慢SQL问题而开发的MyBatis组件,该组件能够在开发、测试阶段自动分析SQL语句,并在出现慢SQL问题时通过Ducc配置实现动... 目录背景解决思路开源方案调研设计方案详细设计使用方法1、引入依赖jar包2、配置组件XML3、核心配

MySQL数据库约束深入详解

《MySQL数据库约束深入详解》:本文主要介绍MySQL数据库约束,在MySQL数据库中,约束是用来限制进入表中的数据类型的一种技术,通过使用约束,可以确保数据的准确性、完整性和可靠性,需要的朋友... 目录一、数据库约束的概念二、约束类型三、NOT NULL 非空约束四、DEFAULT 默认值约束五、UN

MySQL 多表连接操作方法(INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL OUTER JOIN)

《MySQL多表连接操作方法(INNERJOIN、LEFTJOIN、RIGHTJOIN、FULLOUTERJOIN)》多表连接是一种将两个或多个表中的数据组合在一起的SQL操作,通过连接,... 目录一、 什么是多表连接?二、 mysql 支持的连接类型三、 多表连接的语法四、实战示例 数据准备五、连接的性

MySQL中的分组和多表连接详解

《MySQL中的分组和多表连接详解》:本文主要介绍MySQL中的分组和多表连接的相关操作,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录mysql中的分组和多表连接一、MySQL的分组(group javascriptby )二、多表连接(表连接会产生大量的数据垃圾)MySQL中的

MySQL 中的 JSON 查询案例详解

《MySQL中的JSON查询案例详解》:本文主要介绍MySQL的JSON查询的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 的 jsON 路径格式基本结构路径组件详解特殊语法元素实际示例简单路径复杂路径简写操作符注意MySQL 的 J

Windows 上如果忘记了 MySQL 密码 重置密码的两种方法

《Windows上如果忘记了MySQL密码重置密码的两种方法》:本文主要介绍Windows上如果忘记了MySQL密码重置密码的两种方法,本文通过两种方法结合实例代码给大家介绍的非常详细,感... 目录方法 1:以跳过权限验证模式启动 mysql 并重置密码方法 2:使用 my.ini 文件的临时配置在 Wi

MySQL重复数据处理的七种高效方法

《MySQL重复数据处理的七种高效方法》你是不是也曾遇到过这样的烦恼:明明系统测试时一切正常,上线后却频频出现重复数据,大批量导数据时,总有那么几条不听话的记录导致整个事务莫名回滚,今天,我就跟大家分... 目录1. 重复数据插入问题分析1.1 问题本质1.2 常见场景图2. 基础解决方案:使用异常捕获3.

SQL中redo log 刷⼊磁盘的常见方法

《SQL中redolog刷⼊磁盘的常见方法》本文主要介绍了SQL中redolog刷⼊磁盘的常见方法,将redolog刷入磁盘的方法确保了数据的持久性和一致性,下面就来具体介绍一下,感兴趣的可以了解... 目录Redo Log 刷入磁盘的方法Redo Log 刷入磁盘的过程代码示例(伪代码)在数据库系统中,r

mysql中的group by高级用法

《mysql中的groupby高级用法》MySQL中的GROUPBY是数据聚合分析的核心功能,主要用于将结果集按指定列分组,并结合聚合函数进行统计计算,下面给大家介绍mysql中的groupby用法... 目录一、基本语法与核心功能二、基础用法示例1. 单列分组统计2. 多列组合分组3. 与WHERE结合使