Python实战项目——物流行业数据分析(二)

简介: Python实战项目——物流行业数据分析(二)

今天我们对物流行业数据进行简单分析,数据来源:某企业销售的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主要在华东地区销售量大,可以考虑增大在华东的投资,适当较小马来西亚的投入。
相关文章
|
7天前
|
存储 机器学习/深度学习 数据处理
NumPy:从初识到实战,探索Python科学计算的无限可能
NumPy:从初识到实战,探索Python科学计算的无限可能
32 0
|
9天前
|
中间件 数据库连接 API
Python面试:FastAPI框架原理与实战
【4月更文挑战第18天】FastAPI是受欢迎的高性能Python Web框架,以其简洁的API设计、强大的类型提示和优秀的文档生成能力著称。本文将探讨FastAPI面试中的常见问题,包括路由、响应对象、Pydantic模型、数据库操作、中间件和错误处理。同时,还会指出一些易错点,如类型提示不准确、依赖注入误解,并提供实战代码示例。通过理解和实践FastAPI,可以在面试中展示出色的Web开发技能。
23 1
|
9天前
|
API 数据库 数据安全/隐私保护
Flask框架在Python面试中的应用与实战
【4月更文挑战第18天】Django REST framework (DRF) 是用于构建Web API的强力工具,尤其适合Django应用。本文深入讨论DRF面试常见问题,包括视图、序列化、路由、权限控制、分页过滤排序及错误处理。同时,强调了易错点如序列化器验证、权限认证配置、API版本管理、性能优化和响应格式统一,并提供实战代码示例。了解这些知识点有助于在Python面试中展现优秀的Web服务开发能力。
24 1
|
1天前
|
机器学习/深度学习 数据采集 算法
Python用逻辑回归、决策树、SVM、XGBoost 算法机器学习预测用户信贷行为数据分析报告
Python用逻辑回归、决策树、SVM、XGBoost 算法机器学习预测用户信贷行为数据分析报告
|
4天前
|
人工智能 安全 Java
Python 多线程编程实战:threading 模块的最佳实践
Python 多线程编程实战:threading 模块的最佳实践
119 5
|
5天前
|
数据采集 数据可视化 数据挖掘
R语言与Python:比较两种数据分析工具
【4月更文挑战第25天】R语言和Python是目前最流行的两种数据分析工具。本文将对这两种工具进行比较,包括它们的历史、特点、应用场景、社区支持、学习资源、性能等方面,以帮助读者更好地了解和选择适合自己的数据分析工具。
|
6天前
|
人工智能 Python
【AI大模型应用开发】【LangChain系列】实战案例1:用LangChain写Python代码并执行来生成答案
【AI大模型应用开发】【LangChain系列】实战案例1:用LangChain写Python代码并执行来生成答案
13 0
|
9天前
|
SQL 中间件 API
Flask框架在Python面试中的应用与实战
【4月更文挑战第18天】**Flask是Python的轻量级Web框架,以其简洁API和强大扩展性受欢迎。本文深入探讨了面试中关于Flask的常见问题,包括路由、Jinja2模板、数据库操作、中间件和错误处理。同时,提到了易错点,如路由冲突、模板安全、SQL注入,以及请求上下文管理。通过实例代码展示了如何创建和管理数据库、使用表单以及处理请求。掌握这些知识将有助于在面试中展现Flask技能。**
14 1
Flask框架在Python面试中的应用与实战
|
10天前
|
SQL 关系型数据库 MySQL
Python与MySQL数据库交互:面试实战
【4月更文挑战第16天】本文介绍了Python与MySQL交互的面试重点,包括使用`mysql-connector-python`或`pymysql`连接数据库、执行SQL查询、异常处理、防止SQL注入、事务管理和ORM框架。易错点包括忘记关闭连接、忽视异常处理、硬编码SQL、忽略事务及过度依赖低效查询。通过理解这些问题和提供策略,可提升面试表现。
30 6
|
11天前
|
机器学习/深度学习 数据挖掘 计算机视觉
python数据分析工具SciPy
【4月更文挑战第15天】SciPy是Python的开源库,用于数学、科学和工程计算,基于NumPy扩展了优化、线性代数、积分、插值、特殊函数、信号处理、图像处理和常微分方程求解等功能。它包含优化、线性代数、积分、信号和图像处理等多个模块。通过SciPy,可以方便地执行各种科学计算任务。例如,计算高斯分布的PDF,需要结合NumPy使用。要安装SciPy,可以使用`pip install scipy`命令。这个库极大地丰富了Python在科学计算领域的应用。
13 1