基于MySQL的电商零售订单数据分析
目录
1.提出问题
1.1.电子零售商面对的挑战和问题
1.2.本次分析的业务问题及适用指标
2.理解数据
2.1. 数据来源
2.2.本次分析选取的数据样本
2.3.字段含义
3.数据清洗/处理
3.1.选择字段
3.2.删除重复值
3.3.缺失值处理
3.4.异常值处理
3.5.格式一致化处理
4.数据分析——建立RFM模型
4.1. R:最近一次消费时间
4.2. F:消费频率(F)等级划分
4.3. M:消费金额(M)等级划分
4.4. RFM评分
4.5. 确定RFM值
4.6. 确定客户类别
1.提出问题
1.1.电子零售商面对的挑战和问题
近年来全球网民渗透率逐步提高,欧美地区网民渗透率远高于亚非地区。得益于互联网及全球网民规模的不断发展,全球零售总体规模保持增长,2019年全球零售总额为25万亿美元,其中网络零售额为3.5万亿美元,占比14%。
在2020年发布的《世界电子商务报告》中,全球有7个国家网购用户数量过亿,从市场规模来看,中国是全球最大、最活跃的互联网互用市场,英国是欧洲最大的电子商务市场,互联网普及达93%,而拉丁美洲是最受欢迎的电子商务新兴市场。全球使用移动端进行消费的用户占12%,中国使用移动段进行网购的消费者占88%,全球排名第一。
传统零售商争相往电子商务转型,因为有互联网的依托,网络消费者的消费行为变得有迹可循,产生了大量消费数据,如何利用这些数据挖掘出有用的商业信息是所有电子零售商都需要面对的挑战。
电子零售商面对的问题可能有:
(1)哪些产品最受欢迎,也即被访问的次数最多,购买的次数最多?
(2)哪些用户是最有价值的用户?也即在特定的时间范围内消费总额最高,这些高价值用户有什么样的用户特征?
(3)哪些用户是最忠诚的用户?也即复购率最高用户,如何提高这些用户的消费体验,增加消费额度?
(4)用户的消费习惯是什么?哪些产品是用户们喜欢一起购买的?或者有特定的购买时间顺序?
(5)促销对于哪些用户最有效?也即用户反应最活跃?促销策略能够考虑这些因素?
1.2.本次分析的业务问题及适用指标
本次分析要解决的核心业务问题是:从大量的电子零售交易数据中分析并找到价值用户,针对价值用户提供以消费者为中心的智能商业模式。
适用的指标有:
本次电子零售数据分析主要分为了两大方面:
(1)了解电子零售商的整体运营情况,通过分析计算运营的各项指标来了解目前经营的效率和经营趋势。
(2)使用RFM模型对用户进行分级,找出价值用户,从而进行经营策略管理,比如进一步挖掘最高价值用户的消费模式,提出个性化的销售服务提高价值用户体验,从而提高经营效率和利润。
2.理解数据
2.1. 数据来源
kaggle数据平台数据:https://link.zhihu.com/?target=https%3A//www.kaggle.com/jihyeseo/online-retail-data-set-from-uci-ml-repo
数据集来自一个在英国注册的在线电子零售公司,在2010年12月1日到2011年12月9日期间发生的网络交易数据。
2.2.本次分析选取的数据样本
本次分析选取一整年的交易数据,即从2010年12月1日到2011年12月1日期间的数据。原数据集储存在.csv格式的文件中,总共有541909条数据,8个字段。整个文件导入mysql,在清洗过程中才进行节选样本。
2.3.字段含义
字段含义:
- InvoiceNo:发票编号。为每笔订单唯一分配的6位整数。若以字母'C'开头,则表示该订单被取消。
- StockCode:产品代码。为每个产品唯一分配的编码。
- Description:产品描述。
- Quantity:数量。每笔订单中各产品分别的数量。
- InvoiceDate:发票日期和时间。每笔订单发生的日期和时间。
- UnitPrice:单价。单位产品价格,单位为英镑。
- CustomerID:客户编号。为每个客户唯一分配的5位整数。
- Country:国家。客户所在国家/地区的名称
3.数据清洗/处理
3.1.选择字段
根据分析目的选择字段,数据集共8个字段,在这里根据分析目选取 InvoiceNo、StockCode、Quantity、InvoiceDate、UnitPrice、CustomerID、Country等七个字段。
3.2.删除重复值
#创建表来存放不重复的数据
create table sales_facts like data;
insert into sales_facts select distinct * from data;
结果如下:
原有数据541909条, 去重后数据536641条,删除重复值5268条。
3.3.缺失值处理
查询每个字段的数据数量,具体代码如下:
SELECT count(InvoiceNo),count(StockCode),count(Quantity)
,count(InvoiceDate),count(UnitPrice),count(CustomerID),count(Country),count(Description)
FROM sales_facts;
查询结果如下:
可以看出CustomerID存在缺失值135037条,Description出现缺失值1454条。数据都很大,不可能全部删除。由于字段Description是产品描述不是我们要分析的,故不予处理。对于字段CustomerID存在的缺失值,由于无法确定实际的情况,这里暂且把处于缺失状态的值替换为0,代码如下:
UPDATE sales_facts
set CustomerID=0
where CustomerID is null;
3.4.异常值处理
观察数据集字段,可能出现的异常值的字段有InvoiceDate(订单日期)、Quantity(销量)、UnitPrice(单价)等三个字段。
1.查看字段Quantity(销量)是否存在异常
SELECT MAX(UnitPrice)AS'最高价格',MIN(UnitPrice)AS'最低价格',MAX(Quantity)AS'最高销量',MIN(Quantity)AS'最低销量'
FROM sales_facts;
很明显可以发现销量和价格存在异常值。
由于最低销量为-1,我们并不清楚具体的含义,这里对于销量我们做一个初步的假设,销量为0 或负值的表示这一个订单已被取消。进一步来观察数据,找出销量为0或负值的数据,代码如下:
select * from sales_facts where Quantity<=0;
观察以上结果可以看出,交易数量为负值的发票编号都是以"C”开头的。在前面字段中已经说明,以“C”开头的订单号是取消订单,共有10587条取消订单数据。这里我们分析的目的为提高销售额,所以选择删除这些取消的订单。具体代码如下:
delete from sales_facts where Quantity<=0;
2.查看字段UnitPrice(单价)是否存在异常
通过前面的查询可以看出最高价格为正常值,最低价格为负值,所以单价的异常主要是零值和负值。这里我们可以分析,单价为零的可能是赠品,与我们分析分销售额无关,所以选择删除,具体代码如下:
#查看价格为0的数据
select * from sales_facts where UnitPrice=0;
#删除价格为0的数据
delete from sales_facts where UnitPrice=0;
查看价格为负值的数据,代码如下:
select * from sales_facts where UnitPrice<0;
结果如下:
只有两条数据,这里选择删除,代码如下:
delete from sales_facts where UnitPrice<0;
3.5.格式一致化处理
需要一致化处理的字段只有InvoiceDate(订单日期),由于导入数据时导入的是字符串类型的,所以需要把InvoiceDate转换成可以处理的日期。具体代码如下:
alter table sales_facts add column order_date varchar(255) not null;
update sales_facts set order_date=str_to_date(Invoicedate,'%m/%d/%Y %H:%i');
update sales_facts set order_date=DATE_FORMAT(order_date, '%Y-%m-%d');
4.数据分析——建立RFM模型
根据分析目的,本次分析采用RFM模型分析客户。RFM模型需要知道每位客户最近的一次消费时间(这里以2011/12/09为参考时间),时间范围内的消费频率和总交易金额。
创建一个临时表RFM来存放时间间隔、交易次数、交易金额。代码如下:
CREATE TEMPORARY TABLE RFM AS
select CustomerID,InvoiceNo,Country,datediff('2011-12-09',MAX(order_date))as '最近一次时间间隔',
count(distinct InvoiceNo)as'交易次数',
sum(Quantity*UnitPrice)as'交易金额'
from sales_facts
group by CustomerID
order by 最近一次时间间隔 desc,交易金额 desc ,交易次数 desc;
结果如下:
4.1. R:最近一次消费时间
最近一次消费到2011/12/09的间隔)等级划分
select a.`天数差`,count(CustomerID) as '人数'
from
(select distinct CustomerID,datediff('2011-12-09',MAX(ORDER_date))as '天数差',count(distinct CustomerID)
from sales_facts
GROUP BY CustomerID) a
GROUP BY a.`天数差`
order by a.`天数差` ;
最近一次消费间隔的人数分布:
由上图可以看出,消费时间间隔最长的是373天,最短0天;80%的客户在180天内都有交易记录,说明客户忠诚度不错。
以如下区间给R进行分级:
- 间隔在270~373天设为1
- 间隔在180~270天设为2
- 间隔在90~180天设为3
- 间隔在30~90天设为4
- 间隔在0-30天设为5
4.2. F:消费频率(F)等级划分
#这段代码是用from后面创建一个新表a,as省略
select a.交易次数,count(CustomerID) as '人数'
from
(select CustomerID,count(distinct InvoiceNo) '交易次数'
from sales_facts
GROUP BY CustomerID) a
GROUP BY a.交易次数
order by a.交易次数;
分析显示,只有一次交易记录的客户有1499位,说明65.37%的客户是有复购行为,说明这些客户是很认可产品和服务等的。
由分布可知交易次数主要集中在10次以下,对F的等级划分如下所示:
- 交易次数为1次设为1
- 交易次数在2~3次设为2
- 交易次数在4~5次设为3
- 交易次数在6~8次设为4
- 交易次数在9次以上的设为5
4.3. M:消费金额(M)等级划分
查看消费金额大概的分布,代码如下:
SELECT CustomerID,SUM(Quantity*UnitPrice) as 消费金额
FROM sales_facts
GROUP BY CustomerID;
由上表可以看出,在2010年12月1日到2011年12月9日期间,消费金额主要集中在 0-4000英镑和4000-8000英镑这两个范围内,占到总顾客数的97%。对M的等级划分如下所示:
- 消费金额在1000英镑以下的设为1
- 消费金额在1000~2000英镑的设为2
- 消费金额在2000~4000英镑的设为3
- 消费金额在4000~8000英镑的设为4
- 消费金额在8000英镑以上的设为5
4.4. RFM评分
#创建临时表存放RFM评分
#用case,end创建一个案例,用when,and,then进行切分
CREATE TEMPORARY TABLE RFM评分 AS
select *,
(case when 最近一次时间间隔 <=30 then 5
when 最近一次时间间隔 >30 and 最近一次时间间隔 <=90 then 4
when 最近一次时间间隔 >90 and 最近一次时间间隔<=180 then 3
when 最近一次时间间隔 >180 and 最近一次时间间隔<=270 then 2 else 1 END)as 'R评分',
(case when 交易次数<=1 then 1
when 交易次数 >1 and 交易次数 <=3 then 2
when 交易次数>3 and 交易次数<=5 then 3
when 交易次数>5 and 交易次数<=8 then 4 else 5 END)as 'F评分',
(case when 交易金额<=1000 then 1
when 交易金额 >1000 and 交易金额 <=2000 then 2
when 交易金额>2000 and 交易金额<=4000 then 3
when 交易金额>4000 and 交易金额<=8000 then 4 else 5 END)as 'M评分'
from RFM;
select * from RFM评分
结果如下:
4.5. 确定RFM值
给RFM评分完成,求得各自的平均值,把平均值做为客户划分的阈值,将RFM的值分别与阈值比较,确定RFM值。代码如下:
#计算平均值
select ROUND(avg(R评分),1)as 'R平均值',ROUND(avg(F评分),1)as 'F平均值',ROUND(avg(M评分),1)as 'M平均值'
from RFM评分;
#创建临时表RFM值
CREATE TEMPORARY TABLE RFM值 AS
select *,case when R评分>3.8 then 1 else 0 end as 'R值',
case when F评分>2.3 then 1 else 0 end as 'F值',
case when M评分>1.7 then 1 else 0 end as 'M值'
from RFM评分;select * from RFM值;
4.6. 确定客户类别
具体代码如下:
#创建临时表 客户分类 ,把所有顾客分类
CREATE TEMPORARY TABLE 客户分类 AS
select CustomerID,InvoiceNo,Country,
case when R值=1 and F值=1 and M值=1 then '重要价值客户'when R值=0 and F值=1 and M值=1 then '重要发展客户'when R值=1 and F值=0 and M值=1 then '重要保持客户' when R值=0 and F值=0 and M值=1 then '重要挽留客户'when R值=1 and F值=1 and M值=0 then '一般价值客户'when R值=1 and F值=0 and M值=0 then '一般发展客户'when R值=0 and F值=1 and M值=0 then '一般保持客户'else '一般挽留客户' end as '客户类别'
from RFM值;
# 查看客户分类表
select * from 客户分类;
结果如下:
现在已经做完客户分类,RFM模型基本完成。现在可以导出数据,对数据进行分析。
基于MySQL的电商零售订单数据分析相关推荐
- 电商零售交易数据分析
1.项目背景 以英国的在线电子零售公司的跨国交易数据集作为分析样本,通过对该公司的运营指标统计分析以及构建RMF模型.K-Means机器学习算法从大量的电子零售交易数据中分析并找出价值用户,针对价值用 ...
- 基于 flink 的电商用户行为数据分析【9】| 电商常见指标汇总 + 项目总结
本文已收录github:https://github.com/BigDataScholar/TheKingOfBigData,里面有大数据高频考点,Java一线大厂面试题资源,上百本免费电子书籍,作者 ...
- Java 电商订单管理设计,基于Java的电商网站的设计与实现
基于Java的电商网站的设计与实现 (获取作品请联系在线客服) 温馨提示:已经在本站下定的(原创)毕业设计(毕业论文)将不会再次出售!请你放心购买! 拟定毕业论文(设计)题目基于Java的电商网站的 ...
- 通过一个简单的电商零售数据集,了解数据分析流程
目录 数据分析流程 1.数据分析真实项目流程 2.数据分析方法 3.零售消费数据数据集介绍 4.分析内容 明确分析的目的 案例分析实战 1理解数据 2数据清洗 3数据分析和可视化 1.购买商品前十的国 ...
- 电商运营:数据分析的5大思维和8个指标
最近看到后台留言,发现很多刚入行电商的朋友不会处理数据,今天达妹来详细讲解一下,希望对你有所帮助. 数据分析的五大思维方式. 首先,我们要知道,什么叫数据分析.其实从数据到信息的这个过程,就是数据分析 ...
- 大数据分析实战之项目实践:使用DLI Flink SQL进行电商实时业务数据分析
使用 DLI Flink SQL 进行电商实时业务数据分析 业务场景介绍 场景描述 场景方案 场景任务 数据说明 数据源表:电商业务订单详情宽表 结果表:各渠道的销售总额实时统计表 操作过程 实操过程 ...
- 基于Hadoop的电商广告点击数的分析与可视化(Shell脚本执行与大屏可视化设计)
目录 摘要 大屏可视化预览 如何安装Hadoop集群 数据集介绍 项目部署流程 一键化配置环境和参数 一键化建立hive数据表 Flume配置及自动加载数据到hive中 数据分析 mysql接收数据表 ...
- Gavin老师Transformer直播课感悟 - Rasa项目实战之电商零售智能业务对话机器人业务功能微服务解析与调试演示(八十二)
本文继续围绕工业级业务对话平台和框架Rasa,对Rasa项目实战之电商零售Customer Service智能业务对话机器人主要业务功能所使用的微服务进行解析,并通过Rasa Interactive的 ...
- Gavin老师Transformer直播课感悟 - Rasa项目实战之电商零售智能业务对话机器人业务功能微服务解析与调试演示(八十三)
本文继续围绕工业级业务对话平台和框架Rasa,对Rasa项目实战之电商零售Customer Service智能业务对话机器人业务功能的微服务如何结合数据库使用进行解析,并通过Rasa Interact ...
最新文章
- 数字集成电路的层次关系
- [Java拾遗四]JavaWeb基础之Servlet_RequestResponse
- 读书笔记 effective c++ Item 18 使接口容易被正确使用,不容易被误用
- php 数组到字符串的转换,php – 数组到字符串到数组的转换
- OpenGL equirectangular等矩形环境图的实例
- gerber文件怎么导贴片坐标_PCBA贴片加工厂家的上机贴片编程
- 整合Struts2、Spring、Hibernate构建J2EE应用
- Design Compiler指南——预综合过程
- knex 单表查询_knex.js
- 网络请求数据解析时,判断数据是否为空
- 河北省高校计算机大赛,河北省教育厅关于举办2016年华北五省(市、自治区)及港澳台大学生计算机应用大赛河北赛区竞赛的通知...
- java程序包不存在_idea Error:(3, 32) java: 程序包***不存在的问题
- Ubuntu火狐浏览器无法输入简体中文的解决方案
- 如何禁用Web表单字段/输入标签上的浏览器自动完成功能?
- [转载] python中将str转成数字_python如何将字符转换为数字
- 做工作流时候 Mybatis 在 insert 之后想获取自增的主键 id,但却总是返回1
- OpenCV_cv::Mat的深拷贝 浅拷贝问题
- php微信转发无法显示标题图片,完美解决:微信分享为什么不显示图片呢? - 老牛博客...
- HTML动漫设计公司响应式网站模板期末大作业0023
- 计算机笔记--【Netty网络编程③】
热门文章
- 32 64 peb结构体
- HTML CSS JS简易画板(含知识点温习)
- 11兔子生小孩问题练习
- aws搭建包含服务器和网络的虚拟基础设施(2)
- SourceInsight4.0暗色主题配置
- caffe for windows的matlab接口(四):权重和特征图可视化的一个例子
- 启动http报错AH00558:Could not reliably determine the server‘s fully qualified domain name using解决办法
- mysql user分销查询_荐查询无限级/三级分销的简单易用SQL...
- huawei AC+AP无线网络配置
- “二手回收”是门好生意?