数据来源:
某企业销售的6种商品所对应的送货及用户反馈数据
解决问题:
1.配送服务是否存在问题
2.是否存在尚有潜力的销售区域
- 商品是否存在质量回题
先放结论:
- 货品4一西北,货品2一马来西亚两条线路存在较大问题,急需提升时效
2.货品2在华东地区还有较大市场空间,适合加大投入,同时货品2在西北配送时效长,用户拒收率高,应该减少投入
3.货品1、2、4质量存在问题,建议扩大抽检范围,增大质检力度
分析过程如下:
一、数据淸洗
<1>重复值、缺失值、格式调整
<2>异常值处理(比如:销售金额存在等于0的,属于异常等)
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from IPython.core.interactiveshell import InteractiveShell
import openpyxl
InteractiveShell.ast_node_interactivity = "all"
pd.options.display.max_columns = 1000
pd.options.display.max_rows = 30
pd.set_option('display.float_format', lambda x: '%5f' % x)
%matplotlib inline
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
%config Inlinebackend.config_format = 'svg'
"""
通过info()可以看出,包括10列数据,名字,数据量,格式等,可以得出:
1.订单号,货品交货情况,数量:存在缺失值,但是确实量不大,可以删除
2.订单行,对分析无关紧要,可以考虑删除
3.销售金额格式不对(万元|元,逗号问题),数据类型需要转换成intlfloat
"""
#删除重复记录
data.drop_duplicates(keep='first',inplace=True)
print(data.info())
#删除缺失值(na,删除带有na的整行数据,axis=0,how='any'默认值)
data.dropna(axis=0,how='any',inplace=True)
print(data.info())
#删除订单行
data.drop(columns=['订单行'],inplace=True,axis=1)
print(data.info())
#更新索引
data = data.reset_index(drop=True,inplace=True)
#取出销售金额列,对每一个数据进行清洗
#编写自定义过滤函数:删除逗号,转成float,如果是万元则*10000,否则,删除元
def data_deal(number):
if number.find('万元') != -1: #找到带有万元的,取出数字,去掉逗号,转成float,*10000,find()!=-1即找到带有万元的意思
number_new = float(number[:number.find('万元')].replace(',', '')) * 10000
pass
else: #找到带有元的,删除元,删除逗号,转成float
number_new = 0
pass
return number_new
data['销售金额']=data['销售金额'].map(data_deal)
data
#2.异常值处理
data.describe() #数据描述
data=data[data['销售金额']!=0]
#1.销售金额==0,采用删除方法,因为数量很小
data.describe()
#2.销售金额和数量存在严重右偏现象,在电商领域2/8很正常,无需处理
二、数据规整
比如:增加一项辅助列:月份
data['销售时间']=pd.to_datetime(data['销售时间'])
data['月份']=data['销售时间'].apply(lambda x:x.month)
#用apply()会对销售时间列里每个数据执行lambda函数,lambda取出month,储存到‘月份’列
三.数据分析:
1.配送服务是否存在问题“
a.月份维度
data['货品交货状况']=data['货品交货状况'].str.strip()#用strip函数去除内容中出现的首位空格现象
data1=data.groupby(['月份','货品交货状况']).size().unstack()#size(),分组后的数据进行一个梳数量的统计.unstack()可以用列的形式显示
data1
#各月份按时交货率的计算
data1['按时交货率']=data1['按时交货']/(data1['按时交货']+data1['晚交货'])
data1
#根据区域查看按时交货率
data2=data.groupby(['销售区域','货品交货状况']).size().unstack()#size(),分组后的数据进行一个梳数量的统计.unstack()可以用列的形式显示
data2['按时交货率']=data2['按时交货']/(data2['按时交货']+data2['晚交货'])
print(data2.sort_values(by='按时交货率',ascending=False))
#货品维度
data2=data.groupby(['货品','货品交货状况']).size().unstack()#size(),分组后的数据进行一个梳数量的统计.unstack()可以用列的形式显示
data2['按时交货率']=data2['按时交货']/(data2['按时交货']+data2['晚交货'])
print(data2.sort_values(by='按时交货率',ascending=False))
#货品和销售区域结合
data2=data.groupby(['货品','销售区域','货品交货状况']).size().unstack()#size(),分组后的数据进行一个梳数量的统计.unstack()可以用列的形式显示
data2['按时交货率']=data2['按时交货']/(data2['按时交货']+data2['晚交货'])
print(data2.sort_values(by='按时交货率',ascending=False))
#月份下,各货品销售的情况
data1=data.groupby(['月份','货品'])['数量'].sum().unstack()
data1.plot(kind='line')
t='(货品2)11月份销售量猛增'
plt.text(9.5,-9000,t,ha='center',fontsize=16,color='r')
#b.不同区域
data1=data.groupby(['销售区域','货品'])['数量'].sum().unstack()
data1
#c不同的月份,区域的货品销量
data1=data.groupby(['月份','销售区域','货品'])['数量'].sum().unstack()
data1
#商品是否存在质量问题
#销售区域,货品用户反馈情况
data['货品用户反馈']=data['货品用户反馈'].str.strip()#先取出'用户反馈'字符串,再进行首位空格删除
data1=data.groupby(['货品','销售区域'])['货品用户反馈'].value_counts().unstack()
data1['质量合格率']=data1['质量合格']/data1.sum(axis=1)
#data1['质量合格率']=data1['质量合格']/(data1['拒货']+data1['质量合格']+data1['返修'])
data1.sort_values(['质量合格率'],ascending=False)
data1['质量合格率'].plot(kind='bar')
t='货品3,6,5合格率较高,返修率较低;货品1,2,4合格率较低,返修率较高'
plt.text(4.5,-0.45,t,ha='center',fontsize=12,color='r')#总结
网友评论