PYTHON实战项目之物流信息

原数据:

需求分析:

数据来源:某企业销售的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倍以上等)
 二、数据规整
 比如:增加一项辅助列:月份
 三、数据分析并可视化
  • 7
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值