需要解决的问题:
1)配送服务是否存在问题
2)是否存在尚有潜力的销售区域
3)商品是否存在质量问题
数据:物流数据,含订单号,订单行,销售时间,交货时间,货品交货状况,货品,货品用户反馈,销售区域数量,销售金额10个字段信息
实现路径:描述性分析,多维度分析,指标分析
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.head()
订单号 | 订单行 | 销售时间 | 交货时间 | 货品交货状况 | 货品 | 货品用户反馈 | 销售区域 | 数量 | 销售金额 | |
---|---|---|---|---|---|---|---|---|---|---|
0 | P096311 | 10 | 2016-7-30 | 2016-9-30 | 晚交货 | 货品3 | 质量合格 | 华北 | 2.0 | 1052,75元 |
1 | P096826 | 10 | 2016-8-30 | 2016-10-30 | 按时交货 | 货品3 | 质量合格 | 华北 | 10.0 | 11,50万元 |
2 | NaN | 20 | 2016-8-30 | 2016-10-30 | 按时交货 | 货品3 | 质量合格 | 华北 | 10.0 | 11,50万元 |
3 | P097435 | 10 | 2016-7-30 | 2016-9-30 | 按时交货 | 货品1 | 返修 | 华南 | 2.0 | 6858,77元 |
4 | P097446 | 60 | 2016-11-26 | 2017-1-26 | 晚交货 | 货品3 | 质量合格 | 华北 | 15.0 | 129,58元 |
data.info()
#从inf可以看出数据存在缺失值及销售金额不是数值
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1161 entries, 0 to 1160
Data columns (total 10 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 订单号 1159 non-null object
1 订单行 1161 non-null int64
2 销售时间 1161 non-null object
3 交货时间 1161 non-null object
4 货品交货状况 1159 non-null object
5 货品 1161 non-null object
6 货品用户反馈 1161 non-null object
7 销售区域 1161 non-null object
8 数量 1157 non-null float64
9 销售金额 1161 non-null object
dtypes: float64(1), int64(1), object(8)
memory usage: 90.8+ KB
#数据预处理
data.columns=data.columns.str.strip()
#删除重复值
data.drop_duplicates(keep='first',inplace =True)
#删除缺失值与没用的列数据
data.dropna(axis=0,how='any',inplace=True)
data.drop(columns='订单行',inplace=True,axis=1)
data.reset_index(drop=True,inplace=True)
#'销售金额'单位统一等格式转换
#定义函数
def data_deal(num):
if num.find('万元')!=-1:
new_num=float(num[:num.find('万元')].replace(',',''))*10000
pass
else:
new_num=float(num[:num.find('元')].replace(',',''))
return new_num
data['销售金额']=data['销售金额'].map(data_deal)
data.head()
订单号 | 销售时间 | 交货时间 | 货品交货状况 | 货品 | 货品用户反馈 | 销售区域 | 数量 | 销售金额 | |
---|---|---|---|---|---|---|---|---|---|
0 | P096311 | 2016-7-30 | 2016-9-30 | 晚交货 | 货品3 | 质量合格 | 华北 | 2.0 | 105275.0 |
1 | P096826 | 2016-8-30 | 2016-10-30 | 按时交货 | 货品3 | 质量合格 | 华北 | 10.0 | 11500000.0 |
2 | P097435 | 2016-7-30 | 2016-9-30 | 按时交货 | 货品1 | 返修 | 华南 | 2.0 | 685877.0 |
3 | P097446 | 2016-11-26 | 2017-1-26 | 晚交货 | 货品3 | 质量合格 | 华北 | 15.0 | 12958.0 |
4 | P097446 | 2016-11-26 | 2017-1-26 | 晚交货 | 货品3 | 拒货 | 华北 | 15.0 | 3239.0 |
#剔除异常值<=0的数据
data =data[data['销售金额'] > 0]
data.describe() #数值型特征的描述性统计
#可以看出销售金额的均值远远大于其中位数,相差了两个数据级 可能存在异常的极大值或数据严重右偏
数量 | 销售金额 | |
---|---|---|
count | 1145.000000 | 1.145000e+03 |
mean | 76.134934 | 1.224557e+05 |
std | 589.669861 | 1.115081e+06 |
min | 1.000000 | 5.100000e+01 |
25% | 1.000000 | 2.946000e+03 |
50% | 1.000000 | 9.486000e+03 |
75% | 4.000000 | 3.577300e+04 |
max | 11500.000000 | 3.270000e+07 |
data['销售时间']=pd.to_datetime(data['销售时间'])
#新增列:销售月份
data['销售月份']=data['销售时间'].apply(lambda x : x.month)
数据分析及可视化
# 一.配送服务是否存在问题
data['货品交货状况']=data['货品交货状况'].str.strip()
# a.月份维度
data1 =data.groupby(['销售月份','货品交货状况']).size().unstack() #unstack转换成表格形式显示
data1['按时交货率']=data1['按时交货']/(data1['按时交货']+data1['晚交货'])
# 从按时交货率来看第四季度普遍低于第三季度 猜测可能跟季节气候有关
# b.销售区域维度
data1 =data.groupby(['销售区域','货品交货状况']).size().unstack() #unstack转换成表格形式显示
data1['按时交货率']=data1['按时交货']/(data1['按时交货']+data1['晚交货'])
data1.sort_values(by='按时交货率',ascending=False)
# 以下可以看出西北地区存在严重延迟交货的问题,需要引起重点关注 急需解决
货品交货状况 | 按时交货 | 晚交货 | 按时交货率 |
---|---|---|---|
销售区域 | |||
泰国 | 183 | 4 | 0.978610 |
马来西亚 | 310 | 16 | 0.950920 |
华南 | 10 | 1 | 0.909091 |
华北 | 226 | 27 | 0.893281 |
华东 | 268 | 39 | 0.872964 |
西北 | 17 | 44 | 0.278689 |
# c.货品维度
data1 =data.groupby(['货品','货品交货状况']).size().unstack() #unstack转换成表格形式显示
data1['按时交货率']=data1['按时交货']/(data1['按时交货']+data1['晚交货'])
data1.sort_values(by='按时交货率',ascending=False)
# 货品4晚交货情况非常严重,其余货品交货情况相对较好
货品交货状况 | 按时交货 | 晚交货 | 按时交货率 |
---|---|---|---|
货品 | |||
货品5 | 183 | 4 | 0.978610 |
货品6 | 309 | 7 | 0.977848 |
货品1 | 27 | 2 | 0.931034 |
货品3 | 212 | 26 | 0.890756 |
货品2 | 269 | 48 | 0.848580 |
货品4 | 14 | 44 | 0.241379 |
# d.货品和销售区域相结合的维度
data1 =data.groupby(['货品','销售区域','货品交货状况']).size().unstack() #unstack转换成表格形式显示
data1['按时交货率']=data1['按时交货']/(data1['按时交货']+data1['晚交货'])
data1.sort_values(by='按时交货率',ascending=False)
# 如下可以看出货品4晚交货情况主要的销售区域是西北地区;而货品2销往马来西亚的按时交货率最低,拉低了其在总区域的按时交货率
货品交货状况 | 按时交货 | 晚交货 | 按时交货率 | |
---|---|---|---|---|
货品 | 销售区域 | |||
货品5 | 泰国 | 183.0 | 4.0 | 0.978610 |
货品6 | 马来西亚 | 309.0 | 7.0 | 0.977848 |
货品1 | 华北 | 14.0 | 1.0 | 0.933333 |
华南 | 10.0 | 1.0 | 0.909091 | |
货品3 | 华北 | 212.0 | 26.0 | 0.890756 |
货品2 | 华东 | 268.0 | 39.0 | 0.872964 |
货品4 | 西北 | 14.0 | 44.0 | 0.241379 |
货品2 | 马来西亚 | 1.0 | 9.0 | 0.100000 |
货品1 | 西北 | 3.0 | NaN | NaN |
# 二.是否存在尚有潜力的销售区域
# a.月份维度
data1 =data.groupby(['销售月份','货品'])['数量'].sum().unstack()
data1.plot(kind='line')
# 如下可以看出货品2在10月 12月销量猛增,猜测跟公司举办营销活动或公司开发新的市场有关
<AxesSubplot: xlabel='销售月份'>
# b.不同区域
data1 =data.groupby(['销售区域','货品'])['数量'].sum().unstack()
data1
# 从销售区域可以看出每一种货品的销售区域介于1~3之间,其中货品3、4、5、6皆只销往一个区域
货品 | 货品1 | 货品2 | 货品3 | 货品4 | 货品5 | 货品6 |
---|---|---|---|---|---|---|
销售区域 | ||||||
华东 | NaN | 53811.0 | NaN | NaN | NaN | NaN |
华北 | 2827.0 | NaN | 9073.5 | NaN | NaN | NaN |
华南 | 579.0 | NaN | NaN | NaN | NaN | NaN |
泰国 | NaN | NaN | NaN | NaN | 5733.0 | NaN |
西北 | 11.0 | NaN | NaN | 5229.0 | NaN | NaN |
马来西亚 | NaN | 1510.0 | NaN | NaN | NaN | 8401.0 |
# c.月份和区域维度
data1 =data.groupby(['销售月份','销售区域','货品'])['数量'].sum().unstack()
data1
# 可以看出货品1、2在7-12月集中销往的区域不同,
# 及货品2在10、12月销量猛增主要集中销售到华东地区,公司并未开发出新的市场,而是加大了在华东的营销力度
# 另外,那么货品2在其他地区是否也可以加大营销投入?
货品 | 货品1 | 货品2 | 货品3 | 货品4 | 货品5 | 货品6 | |
---|---|---|---|---|---|---|---|
销售月份 | 销售区域 | ||||||
7 | 华东 | NaN | 489.0 | NaN | NaN | NaN | NaN |
华北 | 1.0 | NaN | 2041.5 | NaN | NaN | NaN | |
华南 | 282.0 | NaN | NaN | NaN | NaN | NaN | |
泰国 | NaN | NaN | NaN | NaN | 733.0 | NaN | |
西北 | NaN | NaN | NaN | 414.0 | NaN | NaN | |
马来西亚 | NaN | 2.0 | NaN | NaN | NaN | 1649.0 | |
8 | 华东 | NaN | 1640.0 | NaN | NaN | NaN | NaN |
华北 | 1410.0 | NaN | 1045.0 | NaN | NaN | NaN | |
华南 | 3.0 | NaN | NaN | NaN | NaN | NaN | |
泰国 | NaN | NaN | NaN | NaN | 2381.0 | NaN | |
西北 | NaN | NaN | NaN | 1188.0 | NaN | NaN | |
马来西亚 | NaN | 1503.0 | NaN | NaN | NaN | 1181.0 | |
9 | 华东 | NaN | 3019.0 | NaN | NaN | NaN | NaN |
华北 | 1409.0 | NaN | 2031.0 | NaN | NaN | NaN | |
华南 | 283.0 | NaN | NaN | NaN | NaN | NaN | |
泰国 | NaN | NaN | NaN | NaN | 271.0 | NaN | |
西北 | 1.0 | NaN | NaN | NaN | NaN | NaN | |
马来西亚 | NaN | 1.0 | NaN | NaN | NaN | 343.0 | |
10 | 华东 | NaN | 28420.0 | NaN | NaN | NaN | NaN |
华北 | 3.0 | NaN | 1684.0 | NaN | NaN | NaN | |
泰国 | NaN | NaN | NaN | NaN | 1984.0 | NaN | |
西北 | 1.0 | NaN | NaN | 2542.0 | NaN | NaN | |
马来西亚 | NaN | NaN | NaN | NaN | NaN | 2358.0 | |
11 | 华东 | NaN | 2041.0 | NaN | NaN | NaN | NaN |
华北 | 2.0 | NaN | 100.0 | NaN | NaN | NaN | |
华南 | 9.0 | NaN | NaN | NaN | NaN | NaN | |
泰国 | NaN | NaN | NaN | NaN | 14.0 | NaN | |
西北 | 9.0 | NaN | NaN | 3.0 | NaN | NaN | |
马来西亚 | NaN | 1.0 | NaN | NaN | NaN | 383.0 | |
12 | 华东 | NaN | 18202.0 | NaN | NaN | NaN | NaN |
华北 | 2.0 | NaN | 2172.0 | NaN | NaN | NaN | |
华南 | 2.0 | NaN | NaN | NaN | NaN | NaN | |
泰国 | NaN | NaN | NaN | NaN | 350.0 | NaN | |
西北 | NaN | NaN | NaN | 1082.0 | NaN | NaN | |
马来西亚 | NaN | 3.0 | NaN | NaN | NaN | 2487.0 |
# 三.商品是否存在质量问题
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)
# 可以看到货品2、1、4的合格率较低,对应的返修率也比较高,说明其质量需要改善
# 货品2在马来西亚的拒货率最高,结合之前的分析其按时交货率也很低,猜测马来西亚客户对货品配送的时效性要求较高。
# 结合之前的分析货品2的主要销向地是华东地区,马来西亚的销量占比很低,且其拒货率很高,是否应该考虑降低该地区的投入?
货品用户反馈 | 拒货 | 质量合格 | 返修 | 合格率 | 返修率 | 拒货率 | |
---|---|---|---|---|---|---|---|
货品 | 销售区域 | ||||||
货品3 | 华北 | 31.0 | 188.0 | 19.0 | 0.789916 | 0.079568 | 0.129778 |
货品6 | 马来西亚 | 56.0 | 246.0 | 14.0 | 0.778481 | 0.044195 | 0.176755 |
货品5 | 泰国 | 14.0 | 144.0 | 29.0 | 0.770053 | 0.154444 | 0.074498 |
货品2 | 华东 | 72.0 | 184.0 | 51.0 | 0.599349 | 0.165800 | 0.233945 |
货品1 | 华南 | 5.0 | 4.0 | 2.0 | 0.363636 | 0.176000 | 0.433289 |
西北 | NaN | 1.0 | 2.0 | 0.333333 | 0.600000 | NaN | |
华北 | NaN | 3.0 | 12.0 | 0.200000 | 0.789474 | NaN | |
货品4 | 西北 | NaN | 9.0 | 49.0 | 0.155172 | 0.842573 | NaN |
货品2 | 马来西亚 | 6.0 | 1.0 | 3.0 | 0.100000 | 0.297030 | 0.577088 |
分析结论
1.货品4销往西北,货品2销往马来西亚这条路线存在较大问题,急需提升时效 2.货品2在华东地区还有较大市场空间,适合较大投入,同时货品2在西北配送时效长,用户拒收率高,是否应结合投入产出的比较重新考量是否减少投入? 3.货品1、2、4货品质量存在问题,建议扩大抽检力度,增大质检力度