- 数据来源:某企业销售的6种商品所对应的送货及用户反馈数据;数据链接: 物流行业项目分析数据.
- 分析过程为:
- 数据清洗
- 数据规整
- 数据分析并可视化
准备工作
- 首先导入包和数据,将编码设置为
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())
- 输出结果为:
结果运行出来后,进行数据清洗。
数据清洗
-
主要是进行重复值,缺失值,格式调整
-
首先对数据表进行观察,观察数据要进行哪些操作
-
通过观察可以得出以下结论:
- 订单号,商品交货情况,数量:存在缺失值,但是缺失量不大,可以删除
- 订单行:对分析无关紧要,可以考虑删除
- 销售金额格式不对(
万元|元,逗号问题
),数据类型需要转换成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())
- 更新索引前后对比
- 对销售金额列进行处理
- 取出销售金额列,对每一个数据进行清洗
- 编写自定义过滤函数,删除逗号,转成
float
- 若是万元则
*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())
- 处理对比如下:
数据规整
- 将销售时间转化为时间序列,并进行查看
- 取出时间中的月份存到月份字段中
data['销售时间'] = pd.to_datetime(data['销售时间'])
print(data.info())
data['月份'] = data['销售时间'].apply(lambda x: x.month)
print(data)
结果:
数据分析并可视化
- 配送服务是否存在问题:从四个角度来分析,分别是月份维度、销售区域维度、货品维度和货品和销售区域结合
- 月份维度
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))
结果:
分析:销售区域:最差在西北递去,货品有1
和4
,主要是货品4
送货较晚导致;货品:最差的是货品2
,主要送往华东和马来西亚,主要是马来西亚的送货较晚导致
- 是否存在尚有潜力的销售区域,从三个维度进行分析,分别是月份维度、区域维度和月份和区域维度
- 月份维度
data1 = data.groupby(['月份', '货品'])['数量'].sum().unstack()
data1.plot(kind='line')
plt.show()
结果:
分析:货品2
在10月
和12月份
,销量猛增。原因猜测有:1.公司加大营销力度,2.开发了新的市场(后续有结论)
- 区域维度
data1 = data.groupby(['销售区域', '货品'])['数量'].sum().unstack()
print(data1)
结果:
分析:从销售区域看,每种货品销售区域为1-3
个,货品1
有三个销售区域,货品2
有两个销售区域,其余货品均有1
个销售区域
- 月份和区域维度
data1 = data.groupby(['月份', '销售区域', '货品'])['数量'].sum().unstack()
print(data1['货品2'].unstack())
结果:
分析:货品2
在10月
和12月
份销量猛增,原因主要发生在原有销售区(华东);同样,分析出7
,8
,9
,11
月份销售数量还有很大提升空间,可以适当加大营销力度
- 商品是否存在质量问题
- 对货品用户反馈字段取出首位空格,求出反馈总数,再依次求出拒货率、返修率、合格率,对这三个值汇总排序
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))
结果:
分析:货品3
,6
,5
,合格率均较高,返修率比较低,说明质量还可以;货品1
,2
,4
,合格率较低,返修量较高,质量存在一定的问题,需要改善;货品2
在马来西亚的拒货率最高,同时,货品2
在马来西亚的按时交货率也非常低,猜测:马来西亚人对送货的时效性要求较高;如果达不到,则往往考虑拒收;考虑到货品2
主要在华东地区销售量大,可以考虑增大在华中的投入,适当减小马来西亚的投入
总结
- 货品
4
-西北
,货品2
-马来西亚
两条线路存在较大问题,急需提升时效 - 货品
2
在华东地区
还有较大市场空间,适合加大投入,同时货品2在西北配送失效长,用户拒收率高,从成本角度考虑,应该减少投入 - 货品
1
,2
,4
,存在质量问题,简易扩大抽检范围,加大之间力度
- 扩展:
unstack
列转行展示;stack
行转列展示;data1.sum(axis=1)
:按行进行汇总求和;data.dropna(axis=0, how='any', inplace=True)
:有一个为空则删除;how='all'
:该行全为空则删除