本章介绍一下python中用来实现可视化的工具matplotlib和seaborn。
seaborn和matplotlib的区别在于,seaborn很多可视化都是设置好的,只需要用简单的代码就可以实现好看的输出,缺点是seaborn的可视化输出结果有时可能不能满足要求,而matplotlib则可以高度定制化绘图实现符合心意的输出,但是相应的matplotlib的参数更复杂一些。
下面分享一个用matplotlib和seaborn完成优衣库销售数据分析可视化案例
背景:根据提供的数据回答如下三个问题
1.整体销售情况随着时间的变化是怎样的?
2.不同产品的销售情况是怎样的?顾客偏爱哪一种购买方式?
3.销售额和产品成本之间的关系怎么样?
我是用Anaconda中自带的Jupyter Notebook练习编程的
-----------------------------------------------------------------------------------------------
进入正题
首先我们把需要的包调进来,然后导入数据
pandas和numpy是两个常用的数据分析包,matplotlib和seaborn是用来实现可视化的,我这里导入数据用的是绝对路径,利用pandas包中的read_csv命令把csv文件导入进来。
通过info()命令查看数据集长什么样子
info()命令可以查看表中有哪些列别和其对应的数据类型,还可以方便查看有无缺失值,这里可以看到每列都是22293行,看上去好像没有缺失值。
再利用head()函数查看前5列,head()默认前5列,当然也可以用head(10)查看前10列,与head()相对的tail()命令是查看文件的最后5行。
product(产品类别),customer(顾客人数),revenue(销售额),order(订单数量),quant(销售数量),unit_cost(单件产品成本)为产品类数据也是分析着重围绕的重点数据。
然后我们用describe()查看一下数据有没有异常值
describe()命令可以查看数据的行数(count),平均数(mean),标准差(std),最大最小值以及四分位数。发现有个明显的异常值是revenue的最小值是负值,而且revenue的最大值比上四分位数大了许多,可以看一下revenue极值的数量,如果比较少可以删除清晰分析结果。
这里根据revenue的值利用‘cut’函数建一个数据桶对renvenue进行分类,right=False表示分类区间为左闭右开。
结果发现renvenue大于2000的值只有62个,以及一个小于0的负值,数量不多可以删除。
这里用‘&’运算符,表示逻辑‘与’,下图为运算符作用表。
表中gender_group和age_group里存在Unkown值(应是Unknown数据源写错了),先将其转换成null值,再确认缺失值占比,如果占比很少,则可以删除而对接下来的分析几乎无影响,这里要用到numpy中的np.nan命令
loc[unq.age_group=='Unkown','age_group']=np.nan表示取‘age_group’列中所有age_group值为‘Unkown’的行赋值为np.nan也就是null值。
python中 ==为筛选条件,=为赋值
发现缺失值占比很少,可以删除
直接用dropna删除为空值的行,inplace=True表示直接对原始对象修改,不创建返回新的改变对象。
数据清洗结束
1.整体销售情况随着时间的变化是怎样的?
时间上的列是wkd_ind(只分了工作日和周末),销售情况可以看customer(顾客人数),revenue(销售额),order(订单数量),quant(销售数量),这里我们选销售额。
通过柱状图对比工作日和周末的销售额情况。
通过seaborn中的barplot画柱状图,这里barplot对比的是revenue的平均值,如果要看其他值可以引入‘estimator’参数,从describe()中发现工作日的销售额度均高于周末的。
2.不同产品的销售情况是怎样的?顾客偏爱哪一种购买方式?
同样的通过柱状图分析不同产品类别对应的销售额比较。
出现了很多warning,并且柱状图下方类别显示不出来,font说明这是由于字体显示的问题,换一种可以显示的字体
可以把柱状图按照从大到小的顺序排列吗?当然可以。
可以先做一个索引排序
按照revenue的平均值进行从大到小(ascending=False)的排序,然后输出index
sort_values()是python中常用来排序的函数,具体使用可以参考上图。
将索引序列给到order,这样柱状图就可以按照从大到小展示。
发现毛衣,配件的平均销售额最高,短裤和袜子的平均销售额最低。
顾客偏爱哪一种购买方式?
这个问题可以通过分析不同类别的客户线上线下的购买方式占比。
上图为通过分析不同城市的客户在线上线下购买商品的总额的柱状对比图,图上没有深圳,杭州北京南京等城市的线上数据,可能数据源不是很可靠,上海,重庆,西安的客户更偏向于线下购物;因为数据源有点问题,从总量上就不对比了。
通过分析不同性别的客户:
这边性别有未知的,前面数据清洗没有做到位。
无论男女,都更偏好线下交易。
但是如果看平均值的话会发现线上交易的销售平均额度都高于线下。
这个也许是因为优衣库只有满200才能免运费,或者线上优惠券比较多从而消费比较多
通过分析不同年龄的客户:
从年龄上分析,这个比较明显,都是线下的总额高于线上。
3.销售额和产品成本之间的关系怎么样?
通过销售额和产品成本可以看出商品的利润,我们可以看下不同产品的利润如何。
我们新建一列['margin']来记录利润,利润=单件销售额-单件成本
发现毛衣,裙子,配件的利润均值最高
平均的利润是正的,那是否有个别产品的利润是负的呢?利用箱线图可以观察
这里我们用到SNS总的‘boxplot’
发现毛衣虽然平均利润高但是有许多产品是负利润的,T恤有很多高利润的产品,这可能说明优衣库经常进行毛衣的促销活动,从总体角度来看活动可能带动了毛衣的销量提升了产品的总利润。
如果我们要来看销售额和成本是否有相关性,该怎么看呢?可以用热力图分析
我们可以分析‘利润’,‘单件销售额’,‘单件成本’三个变量的相关性,用corr()函数分析,可以发现‘利润’和‘单件销售额’有很高的正相关性。
可以调用seaborn中的heatmap()画热力图,颜色越浅表示相关性越高,从图中可以清晰地看出margin和unit_revenue的相关性很高,销售额和单件成本也是正相关,说明产品成本越高,销售额越高,业务上可以多引入高端商品。