python项目--物流行业项目分析

  1. 数据清洗
  2. 数据规整
  3. 数据分析并可视化

准备工作

  • 首先导入包和数据,将编码设置为gbk,若用utf-8会报错。然后查看数据的整体信息,观察以下结果
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei'  # 设置中文显示
data = pd.read_csv('E:\下载\数据分析实战项目资料\物流\资料\data_wuliu.csv', encoding='gbk')
print(data.info())
  • 输出结果为:
    在这里插入图片描述
    结果运行出来后,进行数据清洗。

数据清洗

  • 主要是进行重复值,缺失值,格式调整

  • 首先对数据表进行观察,观察数据要进行哪些操作
    请添加图片描述

  • 通过观察可以得出以下结论:

  1. 订单号,商品交货情况,数量:存在缺失值,但是缺失量不大,可以删除
  2. 订单行:对分析无关紧要,可以考虑删除
  3. 销售金额格式不对(万元|元,逗号问题),数据类型需要转换成int|float
  • 删除重复记录、除缺失值、订单行,由于删除了重复记录,索引不连续了,所以我们要将索引更新。
data.drop_duplicates(keep='first', inplace=True)
data.dropna(axis=0, how='any', inplace=True)
data.drop(columns=['订单行'], inplace=True, axis=1)
print(data.head())
# 更新索引(drop=True:把原来的索引index列删除,重置index)
data.reset_index(drop=True, inplace=True)
print(data.head())
  • 更新索引前后对比
    在这里插入图片描述
  • 对销售金额列进行处理
  1. 取出销售金额列,对每一个数据进行清洗
  2. 编写自定义过滤函数,删除逗号,转成float
  3. 若是万元则*10000,否则删除元
def data_deal(number):
    if number.find('万元') != -1:
        new_number = float(number[:number.find('万元')].replace(',', '')) * 10000
        pass
    else:
        new_number = float(number.replace('元', '').replace(',', ''))
        pass
    return new_number

data['销售金额'] = data['销售金额'].map(data_deal)
  • 对异常值进行处理
    首先输出对数据的描述性统计,进行观察,可以发现数量、销售金额字段值均右偏,在电商领域右偏2/8很正常,无需处理;销售金额还有0的值,因为数据量很小,所以删除这个值没有影响。
print(data.describe())
data = data[data['销售金额'] != 0]
print(data.describe())
  • 处理对比如下:
    在这里插入图片描述

数据规整

  1. 将销售时间转化为时间序列,并进行查看
  2. 取出时间中的月份存到月份字段中
data['销售时间'] = pd.to_datetime(data['销售时间'])
print(data.info())
data['月份'] = data['销售时间'].apply(lambda x: x.month)
print(data)

结果:
在这里插入图片描述在这里插入图片描述

数据分析并可视化

  1. 配送服务是否存在问题:从四个角度来分析,分别是月份维度、销售区域维度、货品维度和货品和销售区域结合
  • 月份维度
data['货品交货状况'] = data['货品交货状况'].str.strip()
data1 = data.groupby(['月份', '货品交货状况']).size().unstack()
data1['按时交货率'] = data1['按时交货'] / (data1['按时交货'] + data1['晚交货'])
print(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))

结果:
在这里插入图片描述
分析:销售区域:最差在西北递去,货品有14,主要是货品4送货较晚导致;货品:最差的是货品2,主要送往华东和马来西亚,主要是马来西亚的送货较晚导致

  1. 是否存在尚有潜力的销售区域,从三个维度进行分析,分别是月份维度、区域维度和月份和区域维度
  • 月份维度
data1 = data.groupby(['月份', '货品'])['数量'].sum().unstack()
data1.plot(kind='line')
plt.show()

结果:
在这里插入图片描述

分析:货品210月12月份,销量猛增。原因猜测有:1.公司加大营销力度,2.开发了新的市场(后续有结论)

  • 区域维度
data1 = data.groupby(['销售区域', '货品'])['数量'].sum().unstack()
print(data1)

结果:
在这里插入图片描述
分析:从销售区域看,每种货品销售区域为1-3个,货品1有三个销售区域,货品2有两个销售区域,其余货品均有1个销售区域

  • 月份和区域维度
data1 = data.groupby(['月份', '销售区域', '货品'])['数量'].sum().unstack()
print(data1['货品2'].unstack())

结果:
在这里插入图片描述

分析:货品210月12月份销量猛增,原因主要发生在原有销售区(华东);同样,分析出78911月份销售数量还有很大提升空间,可以适当加大营销力度

  1. 商品是否存在质量问题
  • 对货品用户反馈字段取出首位空格,求出反馈总数,再依次求出拒货率、返修率、合格率,对这三个值汇总排序
data['货品用户反馈'] = data['货品用户反馈'].str.strip()
data1 = data.groupby(['货品', '销售区域'])['货品用户反馈'].value_counts().unstack()
print(data1)
data1['拒货率'] = data1['拒货'] / data1.sum(axis=1)
data1['返修率'] = data1['返修'] / data1.sum(axis=1)
data1['合格率'] = data1['质量合格'] / data1.sum(axis=1)
print(data1.sort_values(['合格率', '返修率', '拒货率'], ascending=False))

结果:
在这里插入图片描述在这里插入图片描述
分析:货品365,合格率均较高,返修率比较低,说明质量还可以;货品124,合格率较低,返修量较高,质量存在一定的问题,需要改善;货品2在马来西亚的拒货率最高,同时,货品2在马来西亚的按时交货率也非常低,猜测:马来西亚人对送货的时效性要求较高;如果达不到,则往往考虑拒收;考虑到货品2主要在华东地区销售量大,可以考虑增大在华中的投入,适当减小马来西亚的投入

总结

  1. 货品4-西北,货品2-马来西亚两条线路存在较大问题,急需提升时效
  2. 货品2华东地区还有较大市场空间,适合加大投入,同时货品2在西北配送失效长,用户拒收率高,从成本角度考虑,应该减少投入
  3. 货品124,存在质量问题,简易扩大抽检范围,加大之间力度
  • 扩展:unstack 列转行展示;stack 行转列展示;data1.sum(axis=1):按行进行汇总求和;data.dropna(axis=0, how='any', inplace=True):有一个为空则删除;how='all':该行全为空则删除
  • 4
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值