今天我们对物流行业数据进行简单分析,数据来源:某企业销售的6种商品所对应的送货及用户反馈数据
解决问题:
1、配送服务是否存在问题
2、是否存在尚有潜力的销售区域
3、商品是否存在质量问题
分析过程:
依旧先进行数据处理
一、数据清洗
① 重复值、缺失值、格式调
② 异常值处理(比如:销售金额存在等于0的,数量和销售金额的标准差都在均值的8倍以上等)
二、数据规整
比如:增加一项辅助列:月份
三、数据分析并可视化
接下来我们按上面一步步开始。
导入库和数据
import os import pandas as pd import numpy as np import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = 'SimHei' ## 设置中文显示 data = pd.read_csv('data_wuliu.csv',encoding='gbk') data.info()
数据清洗
重复值、缺失值、格式调整
data = pd.read_csv('data_wuliu.csv',encoding='gbk') data.info()
通过info()可以看出,包括10列数据,名字,数据量,格式等,可以得出:
1.订单号,货品交货情况,数量:存在缺失值,但是确实量不大,可以删除
2.订单行,对分析无关紧要,可以考虑删除
3.销售金额格式不对(万元|元,逗号问题),数据类型需要转换成int|float
#删除重复记录 data.drop_duplicates(keep='first',inplace=True) #删除缺失值(na,删除待有na的整行数据,axis=0,how='any'默认值) data.dropna(axis=0,how='any',inplace=True) #删除订单行(重复运行会报错,因为第一次已经删除了订单行这一列) data.drop(columns=['订单行'],inplace=True,axis=1) print(data.info()) #更新索引(drop=True:把原来的索引index列删除,重置index) data.reset_index(drop=True,inplace=True)
处理后结果如下图所示。
取出销售金额列,对每一个数据进行清洗
编写自定义过滤函数:删除逗号,转成float,如果是万元则*10000,否则,删除元
def data_deal(number): if number.find('万元')!= -1:#找到带有万元的,取出数字,去掉逗号,转成float,*10000 number_new = float(number[:number.find('万元')].replace(',',''))*10000 pass else: #找到带有元的,删除元,删除逗号,转成float number_new = float(number.replace('元','').replace(',','')) pass return number_new data['销售金额'] = data['销售金额'].map(data_deal) data
异常值处理
由结果可得
1.销售金额为0的情况,删除
2.产生严重的数据左偏情况(电商领域的2/8法则很正常。)
data = data[data['销售金额']!=0] data
数据规整
增加一项辅助列:月份
data['销售时间'] = pd.to_datetime(data['销售时间']) data['月份'] = data['销售时间'].apply(lambda x:x.month) data
数据分析并可视化
我们回到一开始的问题,现在开始解决
问题1、配送服务是否存在问题
我们分别从月份维度,销售区域维度,货品维度,货品和销售区域结合四个角度来开始探讨。
a.月份维度
data['货品交货状况'] = data['货品交货状况'].str.strip() data1 = data.groupby(['月份','货品交货状况']).size().unstack() data1['按时交货率'] = data1['按时交货']/(data1['按时交货']+data1['晚交货']) data1
从按时交货率来看,第四季度低于第三季度,猜测可能是气候原因造成
b.销售区域维度
data1 = data.groupby(['销售区域','货品交货状况']).size().unstack() data1['按时交货率'] = data1['按时交货']/(data1['按时交货']+data1['晚交货']) print(data1.sort_values(by='按时交货率',ascending=False))
西北地区存在突出的延时交货问题,急需解決
c.货品维度
data1 = data.groupby(['货品','货品交货状况']).size().unstack() data1['按时交货率'] = data1['按时交货']/(data1['按时交货']+data1['晚交货']) print(data1.sort_values(by='按时交货率',ascending=False))
货品4晚交货情况非常严重,其余货品相对交货
d.货品和销售区域结合
data1 = data.groupby(['货品','销售区域','货品交货状况']).size().unstack() data1['按时交货率'] = data1['按时交货']/(data1['按时交货']+data1['晚交货']) print(data1.sort_values(by='按时交货率',ascending=False))
销售区域:最差在西北地区,货品有1和4,主要是货品4送过较晚导致
货品:最差的货品2,主要送往华东和马来西亚,主要是马来西亚的送货较晚导致。
问题2、是否存在尚有潜力的销售区域
a.月份维度
data1 = data.groupby(['月份','货品'])['数量'].sum().unstack() data1.plot(kind='line')
货品2在10月和12月份,销量猛增,原因猜测有二:1.公司加大营销力度 2.开发了新的市场(后续有结论)
b.不同区域
data1 = data.groupby(['销售区域','货品'])['数量'].sum().unstack() data1
从销售区域看,每种货品销售区域为1~3个,货品1有三个销售区域,货品2有两个销售区域,其余货品均有1个销售区域
c.月份和区域
data1 = data.groupby(['月份','销售区域','货品'])['数量'].sum().unstack() data1['货品2']
月份 | 销售区域 |
7 | 华东 489.0 |
7 | 华北 NaN |
7 | 华南 NaN |
7 | 泰国 NaN |
7 | 西北 NaN |
7 | 马来西亚 2.0 |
8 | 华东 1640.0 |
8 | 华北 NaN |
8 | 华南 NaN |
8 | 泰国 NaN |
8 | 西北 NaN |
8 | 马来西亚 1503.0 |
9 | 华东 3019.0 |
9 | 华北 NaN |
9 | 华南 NaN |
9 | 泰国 NaN |
9 | 西北 NaN |
9 | 马来西亚 1.0 |
10 | 华东 28420.0 |
10 | 华北 NaN |
10 | 泰国 NaN |
10 | 西北 NaN |
10 | 马来西亚 NaN |
11 | 华东 2041.0 |
11 | 华北 NaN |
111 | 华南 NaN |
11 | 泰国 NaN |
111 | 西北 NaN |
11 | 马来西亚 1.0 |
12 | 华东 18202.0 |
12 | 华北 NaN |
12 | 华南 NaN |
12 | 泰国 NaN |
12 | 西北 NaN |
12 | 马来西亚 3.0 |
Name: | 货品2, dtype: float64 |
货品2在10,12月份销量猛增,原因主要发生在原有销售区域(华东)
同样,分析出在7,8,9,11月份销售数量还有很大提升空间,可以适当加大营销力度
问题3.商品是否存在质量问题
分析这个问题,我们需要依次算出拒货率,返修率,合格率。
data['货品用户反馈'] = data['货品用户反馈'].str.strip() #取出首位空格 data1 = data.groupby(['货品','销售区域'])['货品用户反馈'].value_counts().unstack() data1['拒货率'] = data1['拒货'] /data1.sum(axis=1) #按行进行求和汇总 data1['返修率'] = data1['返修'] /data1.sum(axis=1) data1['合格率'] = data1['质量合格'] /data1.sum(axis=1) data1.sort_values(['合格率','返修率','拒货率'],ascending=False)
- 货品3.6.5合格率均较高,返修率比较低,说明质量还可以
- 货品1.2.4合格率较低,返修率较高,质量存在一定的问题,需要改善
- 货品2在马拉西亚的拒货率最高,同时,在货品2在马拉西亚的按时交货率也非常低。猜测:马来西亚人对送货的时效性要求较高, 如果达不到,则往往考虑拒货。
- -考虑到货品2主要在华东地区销售量大,可以考虑增大在华东的投资,适当较小马来西亚的投入。