文章目录
概要
素材:链接:https://pan.baidu.com/s/1FVOArEQD2v2JzwNi730mZg?pwd=1234
提取码:1234
--来自百度网盘超级会员V6的分享
某企业销售的6种商品所对应的送货及用户反馈数据
解决问题
1、配送服务是否存在问题
2、是否存在尚有潜力的销售区域
3、商品是否存在质量问题
结论:
1、货品4→西北,货品2→马来西亚两条线路存在较大问题,急需提升时效
2、货品2在华东地区还有较大市场空间,适合加大投入,同时货品2在西北配送时效长,用户拒收率高,从成本角度考虑,应该减少投入
3、货品1、2、4质量存在问题,建议扩大抽检范围,增大质检力度
分析过程
一:数据清洗:
① 重复值、缺失值、格式调整¶
② 异常值处理(比如:销售金额存在等于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')
# 删除重复行inplace表示在原数据上进行删除
data.drop_duplicates(keep='first',inplace=True)
"""删除空值(axis=0表示按行删除,hou有两个值any和all,any表示只要有一个空值就删除
all表示这一行所有为空的时候才能删除)inplace表示在原数据上进行删除"""
data.dropna(axis=0,how='any',inplace=True)
# drop删除某一行,inplace表示在原数据上进行删除
data.drop(columns=['订单行'],inplace=True,axis=1)
"""!!!注意,这里有一个坑,当我们第一次删除某一行之后因为我们是在原数据上
删除,当我们第二次运行的时候原数据上的【订单号行】已经不再了,会报错。%%bash们要先
重新一下导入数据在运行"""
# print(data.info())
# 运行完上面的操作后行的索引会乱,我们要跟新一下数据索引
data.reset_index(drop=True,inplace=True)
data
二:销售金额格式不对(万元|元,逗号问题),数据类型需要转换成int|float。#取出销售金额列,对每一个数据进行清洗,编写自定义过滤函数:删除逗号,转成float,如果是万元则*10000,否则,删除元
def data_deal(number):
if number.find('万元')!=-1: #查看数据是万元还元,是万元就去除万元和逗号在转成float类型乘1000
number_new=float(number[:number.find('万元')].replace(',',''))*10000
else:
number_new=float(number.replace('元','').replace(',',''))
return number_new
# 这里运行第二次会报错,和上面的注意点一样
data['销售金额']=data['销售金额'].map(data_deal)
销售金额==0,采用删除方法,因为数据量很小
data=data[data['销售金额']!=0]
data.describe()
# 对于数据很大的情况也就是数据右偏,这电商行业中很正常2/8分布,无需处理。
将销售时间列的日期格式转成时间格式,再新建一列来保存当前订单的月份
data['销售时间']=pd.to_datetime(data['销售时间'])
data['月份']=data['销售时间'].apply(lambda x:x.month)
data
三、数据分析并可视化
1、配送服务是否存在问题
unstack的作用:unstack() 则为stack的逆函数,即把一维表转化成二维表的过程
stack:stack()就是把二维表转化成一维表(stack为堆叠的意思,就是把所有的index都堆在行上)
data['货品交货状况'] = data['货品交货状况'].str.strip() # 去除可能存在的多余空格
data1 = data.groupby(['月份','货品交货状况']).size().unstack() # 按照月份和交货状况分组
data1['按时交货率'] = data1['按时交货']/(data1['按时交货']+data1['晚交货']) # 新建一列来计算按时交货率
data1
#从按时交货率来看,第四季度低于第三季度,猜测可能是气候原因造成
地区维度:分析各个地区的交货情况
data1 = data.groupby(['销售区域','货品交货状况']).size().unstack() # 按照销售区域和货品交货状况分组,分析各个地区是否按时交货
data1['按时交货率'] = data1['按时交货']/(data1['按时交货']+data1['晚交货']) # 判断各个地区的交货情况
print(data1.sort_values(by='按时交货率',ascending=False)) # 排序更容易观察
#西北地区存在突出的延时交货问题,急需解決
货品维度:分析各个货品的交货情况
data1 = data.groupby(['货品','货品交货状况']).size().unstack()
data1['按时交货率'] = data1['按时交货']/(data1['按时交货']+data1['晚交货'])
print(data1.sort_values(by='按时交货率',ascending=False))
#货品4晚交货情况非常严重,其余货品相对交货
货品和销售区维度:对货品,销售区域,货品交货状况分组,分析各个货品在各个地区的交货情况:
data1 = data.groupby(['货品','销售区域','货品交货状况']).size().unstack()
data1['按时交货率'] = data1['按时交货']/(data1['按时交货']+data1['晚交货'])
print(data1.sort_values(by='按时交货率',ascending=False))
#销售区域:最差在西北地区,货品有1和4,主要是货品4送过较晚导致
#货品:最差的货品2,主要送往华东和马来西亚,主要是马来西亚的送货较晚导致。
2、是否存在尚有潜力的销售区域
月份维度:按照月份和货品分组后对数量求和,分析各个月份的货品销售情况,绘制折线图更容易观察
data1 = data.groupby(['月份','货品'])['数量'].sum().unstack()
data1.plot(kind='line')
# 货品2在10月和12月份,销量猛增,原因猜测有二:1.公司加大营销力度 2.开发了新的市场(后续有结论)
区域维度:将销售区域和货品分组后对数量求和,分析各个区域的货品销售情况
data1 = data.groupby(['销售区域','货品'])['数量'].sum().unstack()
data1
# 从销售区域看,每种货品销售区域为1~3个,货品1有三个销售区域,货品2有两个销售区域,其余货品均有1个销售区域
月份和区域维度:将月份,销售区域,货品分组后对数量求和,分析各个月份中各个销售区域的货品销售情况
data1 = data.groupby(['月份','销售区域','货品'])['数量'].sum().unstack()
data1['货品2']
#货品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主要在华东地区销售量大,可以考虑增大在华东的投资,适当较小马来西亚的投入。