原数据:
需求分析:
数据来源:某企业销售的6种商品所对应的送货及用户反馈数据
解决问题:
1、配送服务是否存在问题
2、是否存在尚有潜力的销售区域
3、商品是否存在质量问题
数据预处理:
import matplotlib.pyplot as plot
plot.rcParams['font.sans-serif'] = 'SimHei' # 绘图显示设置中文显示
# 一、数据清洗 # ① 重复值、缺失值、格式调整
#读取csv文件
data = pd.read_csv('data_wuliu.csv',encoding='gbk')# encoding='gbk'将编码定义为中文形式
#查看数据信息和基本格式
data.info()
通过info()可以看出,包括10列数据,名字,数据量,格式等,可以得出:
1.订单号,货品交货情况,数量:存在缺失值,但是确实量不大,可以删除。
2.订单行,对分析无关紧要,可以考虑删除。
3.销售金额格式不对(万元 | 元,逗号问题), 数据类型需要转换成int | float
#删除重复行
data.drop_duplicates(keep='first', inplace=True)
data.info()
数据数变少,已经删除了重复行。
在Pandas的drop_duplicates方法中,keep参数可以设置为以下几个选项: 1. 'first': 保留第一个出现的重复行,删除后续重复行。 2. 'last': 保留最后一个出现的重复行,删除前面的重复行。 3. False: 删除所有重复行。这里inplace=True的作用是在原来的数据基础上改变数据。
# na,删除带有na的整行数据,axis=0,how='any'默认值 data.dropna(axis=0, how='any', inplace=True) #数据量全部变成了1146,说明缺失值已经处理完毕。 在 Pandas 的 dropna 方法中,how 参数可以设置为以下几个选项: 1. 'any': 如果存在任何缺失值,则删除该行或列。 2. 'all': 只有当整行或整列都是缺失值时才删除,axis=0表示按照行来操作,axis=1表示按照列来操作。 # 删除订单行(重复运行会报错,因为第一次已经删除了订单行这一列) data.drop(columns=['订单行'], inplace=True, axis=1) # 更新索引(drop=True:把原来的索引index列删除,重置index) data = data.reset_index(drop=True, inplace=True) # 修改金额列,取出金额列,对每个数据进行清洗 # 编写自定义函数,删除逗号,转成float,如果是万元则*10000然后,否则,删除元 def data_deal(number): if number.find('万元')!=-1: number_new = float(number[:number.find('万元')].replace(',', '')) * 10000 else: number_new = float(number.replace('元', '').replace(',', '')) return number_new data['销售金额']=data['销售金额'].map(data_deal)#此处data_deal后面不要加括号 #map函数会逐个对'销售金额'列中的每个元素调用 data_deal函数 data.describe() describe() 是Pandas DataFrame 提供的一个函数,用于生成关于 DataFrame 中数值列的统计摘要信息,调用 describe() 函数会计算出每个数值列的基本统计信息,包括计数、均值、标准差、最小值、25% 分位数、中位数、75% 分位数和最大值。 # 1.销售金额为0的情况,删除 # 2.产生严重的数据左偏情况(电商领域的2/8法则很正常。)无需处理 data = data[data['销售金额']!= 0]
通常情况下我们会使用布尔条件来筛选数据,例如 data[data['column'] > 10] 表示选择DataFrame中'column'列中大于10的行
# 数据规整 data['销售时间'] = pd.to_datetime(data['销售时间']) #新增'月份'字列 data['月份']=data['销售时间'].apply(lambda x:x.month) 至此,数据预处理完毕 在Pandas中, apply 函数用于对DataFrame或Series中的每个元素应用自定义的函数。在上面的代码中, data['销售时间'].apply(lambda x: x.month) 的作用是对'销售时间'列中的每个日期时间元素应用一个lambda函数,提取出每个日期时间元素对应的月份信息。具体来说, apply 函数会遍历Series中的每个元素,将每个元素作为参数传递给指定的函数(这里是lambda函数),并将函数的返回值存储起来。在这个例子中,lambda函数 lambda x: x.month 接收一个日期时间元素 x ,然后提取出该日期时间元素的月份信息,并将月份信息作为返回值。最终, apply 函数将所有处理后的结果组合成一个新的Series,并将其赋值给新创建的'月份'列。
问题一:
# 1、配送服务是否存在问题
# 月份维度 data['货品交货状况'] = data['货品交货状况'].str.strip()#将本列数据转换成字符串类型,去除空格 data1=data.groupby(['月份','货品交货状况']).size().unstack()#unstack()函数将数据行转列 size()统计按组统计个数
# 按时交货率 data1['按时交货率'] = data1['按时交货']/(data1['按时交货']+data1['晚交货'])
#从按时交货率来看,第四季度低于第三季度,猜测可能是气候原因造成
# 销售区域维度 data2=data.groupby(['销售区域','货品交货状况']).size().unstack() data2['按时交货率'] = data2['按时交货']/(data2['按时交货']+data2['晚交货']) data2['按时交货率'] = data2['按时交货']/(data2['按时交货']+data2['晚交货']) print(data2.sort_values(by='按时交货率',ascending=False)) # 西北存在突出的延时交货问题,急需解决
# 货品维度分析配送服务问题 data3=data.groupby(['货品','货品交货状况']).size().unstack() data3['按时交货率'] = data3['按时交货']/(data3['按时交货']+data3['晚交货']) print(data3.sort_values(by='按时交货率',ascending=False)) # 货品4晚交货情况非常严重,其余相对交货率高
# 货品和销售区域结合 data4=data.groupby(['货品','销售区域','货品交货状况']).size().unstack() data4['按时交货率'] = data4['按时交货']/(data4['按时交货']+data4['晚交货']) print(data4.sort_values(by='按时交货率',ascending=False)) # 销售区域:最差在西北地区,货品有1和4,主要是货品4送过较晚导致 # 货品:最差的货品2,主要送往华东和马来西亚,主要是马来西亚的送货较晚导致
# 2、是否存在尚有潜力的销售区域 # 月份维度 data5=data.groupby(['月份','货品'])['数量'].sum().unstack() # unstack()行转列方式 # stack()列转行 print(data5)
# 货品2在10月和12月份,销量猛增 # 原因猜测有二:1.公司加大营销力度 2.开发了新的市场(后续有结论)
# 不同的区域 data6 = data.groupby(['销售区域','货品'])['数量'].sum().unstack() print(data6)
#月份和区域的销售情况 data7 = data.groupby(['月份','销售区域','货品'])['数量'].sum().unstack() print(data7['货品2']) # 货品2在10,12月份销量猛增,原因主要发生在原有销售区域(华东) # 同样,分析出在7,8,9,11月份销售数量还有很大提升空间,可以适当加大营销力度
# 3、商品是否存在质量问题 data['货品用户反馈'] = data['货品用户反馈'].str.strip() data8 = data.groupby(['货品','销售区域'])['货品用户反馈'].value_counts().unstack() data8['拒货率'] = data8['拒货']/data8.sum(axis = 1) #按行求和 data8['返修率'] = data8['返修']/data8.sum(axis = 1) data8['合格率'] = data8['质量合格']/data8.sum(axis = 1) data8.sort_values(['合格率','返修率','合格率'],ascending=False) print(data8) # 货品3.6.5合格率均较高,返修率比较低,说明质量还可以, # 货品1.2.4合格率较低,返修率较高,质量存在一定的问题,需要改善, # 货品2在马拉西亚的拒货率最高,同时,在货品2在马拉西亚的按时交货率也非常低。猜测:马来西亚人对送货的时效性要求较高 # 如果达不到,则往往考虑拒货。, # 考虑到货品2主要在华东地区销售量大,可以考虑增大在华东的投资,适当较小马来西亚的投入。 先放结论: 1、货品4→西北,货品2→马来西亚两条线路存在较大问题,急需提升时效 2、货品2在华东地区还有较大市场空间,适合加大投入,同时货品2在西北配送时效长,用户拒收率高,从成本角度考虑,应该减少投入 3、货品1、2、4质量存在问题,建议扩大抽检范围,增大质检力度 分析过程如下 一、数据清洗 ① 重复值、缺失值、格式调整 ② 异常值处理(比如:销售金额存在等于0的,数量和销售金额的标准差都在均值的8倍以上等) 二、数据规整 比如:增加一项辅助列:月份 三、数据分析并可视化