巴西电商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中EXISTS与IN用法使用与对比分析

《MySQL中EXISTS与IN用法使用与对比分析》在MySQL中,EXISTS和IN都用于子查询中根据另一个查询的结果来过滤主查询的记录,本文将基于工作原理、效率和应用场景进行全面对比... 目录一、基本用法详解1. IN 运算符2. EXISTS 运算符二、EXISTS 与 IN 的选择策略三、性能对比

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1

SQL Server跟踪自动统计信息更新实战指南

《SQLServer跟踪自动统计信息更新实战指南》本文详解SQLServer自动统计信息更新的跟踪方法,推荐使用扩展事件实时捕获更新操作及详细信息,同时结合系统视图快速检查统计信息状态,重点强调修... 目录SQL Server 如何跟踪自动统计信息更新:深入解析与实战指南 核心跟踪方法1️⃣ 利用系统目录

MySQL 内存使用率常用分析语句

《MySQL内存使用率常用分析语句》用户整理了MySQL内存占用过高的分析方法,涵盖操作系统层确认及数据库层bufferpool、内存模块差值、线程状态、performance_schema性能数据... 目录一、 OS层二、 DB层1. 全局情况2. 内存占js用详情最近连续遇到mysql内存占用过高导致

Mysql中设计数据表的过程解析

《Mysql中设计数据表的过程解析》数据库约束通过NOTNULL、UNIQUE、DEFAULT、主键和外键等规则保障数据完整性,自动校验数据,减少人工错误,提升数据一致性和业务逻辑严谨性,本文介绍My... 目录1.引言2.NOT NULL——制定某列不可以存储NULL值2.UNIQUE——保证某一列的每一

解密SQL查询语句执行的过程

《解密SQL查询语句执行的过程》文章讲解了SQL语句的执行流程,涵盖解析、优化、执行三个核心阶段,并介绍执行计划查看方法EXPLAIN,同时提出性能优化技巧如合理使用索引、避免SELECT*、JOIN... 目录1. SQL语句的基本结构2. SQL语句的执行过程3. SQL语句的执行计划4. 常见的性能优

SQL Server 中的 WITH (NOLOCK) 示例详解

《SQLServer中的WITH(NOLOCK)示例详解》SQLServer中的WITH(NOLOCK)是一种表提示,等同于READUNCOMMITTED隔离级别,允许查询在不获取共享锁的情... 目录SQL Server 中的 WITH (NOLOCK) 详解一、WITH (NOLOCK) 的本质二、工作

MySQL 强制使用特定索引的操作

《MySQL强制使用特定索引的操作》MySQL可通过FORCEINDEX、USEINDEX等语法强制查询使用特定索引,但优化器可能不采纳,需结合EXPLAIN分析执行计划,避免性能下降,注意版本差异... 目录1. 使用FORCE INDEX语法2. 使用USE INDEX语法3. 使用IGNORE IND

SQL Server安装时候没有中文选项的解决方法

《SQLServer安装时候没有中文选项的解决方法》用户安装SQLServer时界面全英文,无中文选项,通过修改安装设置中的国家或地区为中文中国,重启安装程序后界面恢复中文,解决了问题,对SQLSe... 你是不是在安装SQL Server时候发现安装界面和别人不同,并且无论如何都没有中文选项?这个问题也

2025版mysql8.0.41 winx64 手动安装详细教程

《2025版mysql8.0.41winx64手动安装详细教程》本文指导Windows系统下MySQL安装配置,包含解压、设置环境变量、my.ini配置、初始化密码获取、服务安装与手动启动等步骤,... 目录一、下载安装包二、配置环境变量三、安装配置四、启动 mysql 服务,修改密码一、下载安装包安装地