电商在线订单分析与可视化

目录

一、项目描述

二、需求分析

三、数据采集与清洗

1. 重复值处理

2.缺失值处理

3. 异常值处理

四、数据分析以及可视化

1.从商品角度

        1.1 大卖商品TOP20

        1.2退货最多商品TOP20

        1.3商品的价位分布、各价位区间的销量

        1.4该网站各个在售商品具体的价位分布情况

        1.5不同价位商品的销量情况

         1.6退货商品按不同价格区间进行分组

         1.7 对比不同价位的退货商品数和退货商品所属种类数分布

2.从用户角度

        2.1 购买金额最多、购买频率最高的TOP20顾客

         2.2 按订单分组,查看各个订单中购买的商品种类数量

        2.3退货商品的情况

        2.4 不同国家顾客消费占比

        2.5 不同国家顾客数量占比

        2.6 各个国家的顾客的平均消费情况

3.RFM模型客户细分

        3.1 RFM模型了解:

        3.2 建模

        3.3 R、F、M 值打分、客户的价值分类和汇总

        3.4 分别给 R、F、M 三个值进行分级并为 RFM 打分表格

        3.5 更改 R、F、M 值类型并求出各自均值,并进行打分 

         3.6 根据 R、F、M 评级对用户进行价值细分

         3.7 用户汇总

4. 时间维度

        4.1不同月份的退货、未退货商品数量和金额

        4.2不同月份的销售金额、订单数、订单均额情况

        4.3不同时间段的销售金额、订单数、订单均额情况


一、项目描述

随着电商的不断发展,网上购物变得越来越流行。更多电商平台崛起,对于电商卖家来说增加的不只是人们越来越高的需求,还要面对更多强大的竞争对手。面对这些挑战,就需要能够及时发现店铺经营中的问题,并且能够有效解决这些实际的问题,从而提升自身的竞争力。

根据已有数据对店铺整体运营情况进行分析,了解运营状况,对未来进行预测,已经成为电商运营必不可少的技能。

二、需求分析

为了更好地了解平台的经营状况,对销售数据进行分析,提出优化平台运营的策略,从而为平台创造更多价值。

对订单、客户、商品、地区和时间序列进行详细的分析以及可视化,从而得出这些方面对于平台销售额的影响,随之进行改善。

技术支持:利用jupyter实现

三、数据采集与清洗

导入包和数据集

import pandas as pd
import numpy as np
# 导入数据
mydata = pd.read_csv(r'Excel电商在线订单数据集.csv')
mydata.head()

显示效果:

1. 重复值处理

整个数据集有541909条数据,其中完全重复的数据有5268条,剔除后剩下536641条交易数据。

# 去除重复值,只有当两行数据完全相同时才算是重复值
before_delete=mydata.shape[0]
mydata.drop_duplicates(inplace = True)
after_delete = mydata.shape[0]
print("删除前行数",before_delete,'删除后行数:',after_delete,'重复行数:',before_delete-after_delete)

实现效果:

2.缺失值处理

        Description和CustomerID两个字段即商品描述和客户ID有缺失值,其中Descriptio缺失1454条,占总数据量的0.27%;CustomerID缺失135037行,占总数据量的25.2%。

        因为商品描述是文本类型数据、对于本分析的结果不重要且缺失值占比非常小,所以不对其进行充填。

# 商品的描述特性是没办法进行缺失值处理的
# 处理缺失值
# 根据结果发现Description和CustomerID两个是有缺失值的
# 考虑到商品的描述特性是没办法进行缺失值处理的
mydata.info()

实现效果:

         对于CustomerID,缺失量占到了总数居的四分之一且其本身对分析结果有重要意义,必须对其填充。在已验证当前CustomerID中没有0值的前提下,充填方式选择为用0代替缺失的CustomerID值。

mydata['CustomerID'].nunique()

显示效果:

# 对于缺失值的处理一般有中位数、众数、前值填充、后值填充、定值填充等方法
# 本次考虑FFill填充可能会造成较大偏差,因此采用定值填充考虑定值为0
# 首先,观察有无id==0的商品
# 注意:商品的id是数值型,不是字符串类型,结果出现的是一行字段名,说明没有商品id为0的商品
mydata[mydata['CustomerID']==0]

实现效果:

mydata['CustomerID'].fillna(0,inplace = True)  #用0填充缺失值
mydata['CustomerID'].isnull().sum()   #结果为0表是商品id已无缺失值
#对空值计数
mydata.isnull().sum()

 实现效果:

 至此,缺失值处理完毕。

3. 数据转换

基于业务常识,数据形式应以合适的形式存储

mydata['Date'] = pd.to_datetime(mydata['Date'])
mydata.dtypes # 查看字段类型

# 将商品的id转换为整型
mydata['CustomerID'] = mydata['CustomerID'].astype('int64')
# 增加一列求每次消费的消费总额
mydata['SumCost'] = mydata['Quantity'] * mydata['UnitPrice']
# 描述性统计
mydata.describe()

3. 异常值处理

        基于业务常识,商品单价和商品数量应为正数,查看数据时发现这两种类型的异常值。

筛选出数量小于0、价格小于0的值

# 根据结果可以知道,有负值出现,这不是正常现象。所以可以想到是订单取消或者订单失败
# 筛选出数量小于0、价格小于0的值
# 根据输出结果可以发现订单的编码都是以C开头的
mydata[(mydata['Quantity'] <=0) | (mydata['UnitPrice']<=0)]

实现效果:

取出来查看后,发现由两种原因造成:

        订单被取消即发票号以C开头的记录(共11761条);坏账数据即发票号以A开头的记录(共2条)。对于被取消的订单:由于没有发生实质交易,对平台的交易数据不存在影响故直接删除,但后续可以针对这部分数据可以尝试分析挖掘取消背后的原因;

        对于坏账:数据量极小,且坏账金额也极其微小,在此也选择直接删除。

        创建新表格,只包含取消订单的表格

query_c = mydata['InvoiceNo'].str.contains('C')   #找订单编码包含C
# 创建新表格,只包含取消订单的表格
mydata_cannel = mydata.loc[query_c == True,:].copy()
# 创建新表格,不包含取消的订单
mydata_success = mydata.loc[-(query_c==True),:].copy()
mydata_cannel.head()

取消的订单显示结果:

 创建新表格,不包含取消订单的表格


mydata_success.head()

 处理完取消订单后在看一下价格为0的订单

# 处理完取消订单后在看一下价格为0的订单
query_free = mydata_success['UnitPrice'] == 0
mydata_free = mydata_success.loc[query_free == True,:].copy()
mydata_not_free = mydata_success.loc[-(query_free == True),:].copy()
mydata_not_free.describe()

 发现仍存在价格为负的订单:

发现订单编号是A开头的,表示坏账,应该删除:

# 根据结果发现仍然存在价格为负的订单:
query_mzero =mydata_not_free['UnitPrice'] <0
mydata_mzero = mydata_not_free.loc[query_mzero==True,:]
mydata_mzero

# 发现订单编号是以A开头的,表示坏账,应该删除
# 最终显示结果
mydata_finall = mydata_not_free.loc[-(query_mzero) == True,:]
mydata_finall

 

将产生的数据存储到新的csv文件:

mydata_finall.to_csv(r'new_OnlineRetail.csv')

四、数据分析以及可视化

        从不同角度对数据进行分析,其中包括从商品角度、从用户角度等进行分析,将数据背后的价值挖掘出来。

1.从商品角度

        1.1 大卖商品TOP20


#商品角度 热卖商品TOP20
quantity_sort=mydata["Quantity"].groupby(mydata["StockCode"]).sum().sort_values(ascending=False)
quantity_sort[:20]

实现效果:

1.2退货最多商品TOP20

#退货商品TOP20
quantity_sort[-20:]

 

1.3商品的价位分布、各价位区间的销量

#商品的价位分布、各价位区间的销量
mydata_unique_stock=mydata.drop_duplicates(["StockCode"])	# 统计商品的种类数
mydata_unique_stock['UnitPrice'].describe()	# 进行价格描述

        描述统计中看出,商品均价 6.9 > 商品价格的中位数 2.51,属于右偏分布,说明该网站大多售卖低价商品,少部分商品价格昂贵,少数高价商品将均值拉大,商品价格的标准差较大。

1.4该网站各个在售商品具体的价位分布情况

import matplotlib.pyplot as plt
import os

该网站各个在售商品具体的价位分布情况

# 根据均值和中位数对单价UnitPrice进行分组
web_price_cut=pd.cut(mydata_unique_stock['UnitPrice'],bins=[0,1,2,3,4,5,6,7,10,15,20,25,30,50,100,10000]).value_counts().sort_index()
web_p_per=web_price_cut/web_price_cut.sum()
web_p_cumper=web_price_cut.cumsum()/
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值