目录
3.4 分别给 R、F、M 三个值进行分级并为 RFM 打分表格
一、项目描述
随着电商的不断发展,网上购物变得越来越流行。更多电商平台崛起,对于电商卖家来说增加的不只是人们越来越高的需求,还要面对更多强大的竞争对手。面对这些挑战,就需要能够及时发现店铺经营中的问题,并且能够有效解决这些实际的问题,从而提升自身的竞争力。
根据已有数据对店铺整体运营情况进行分析,了解运营状况,对未来进行预测,已经成为电商运营必不可少的技能。
二、需求分析
为了更好地了解平台的经营状况,对销售数据进行分析,提出优化平台运营的策略,从而为平台创造更多价值。
对订单、客户、商品、地区和时间序列进行详细的分析以及可视化,从而得出这些方面对于平台销售额的影响,随之进行改善。
技术支持:利用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()/