淘宝美妆双十一数据可视化(下)
淘宝美妆双十一数据可视化(下)
01
import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['font.sans-serif'] = [u'SimHei'] ##显示中文,设置字体
plt.rcParams['axes.unicode_minus'] = False ##显示符号
plt.figure(figsize = (12,10))
# 各店铺的商品数量
plt.subplot(2,2,1) # 创建一个2*2的矩阵图,位置在第一个
plt.tick_params(labelsize=15)# 标签字体的大小
# 对店名计数后,排序(默认升序)
data['店名'].value_counts().sort_values().plot.bar()
# 柱状图的标题
plt.title('各品牌商品数',fontsize = 20)
# y轴代表商品数量
plt.ylabel('商品数量',fontsize = 15)
# x轴代表店名
plt.xlabel('店名')
# 各店铺的销量
plt.subplot(2,2,2)
# 标签的大小
plt.tick_params(labelsize=15)
# 根据店名,对sale_count 求和,排序,生成柱状图
data.groupby('店名').sale_count.sum().sort_values().plot.bar()
plt.title('各品牌所有商品的销量',fontsize = 20 )
plt.ylabel('商品总销量',fontsize = 15)
#各店铺总销售额
plt.subplot(2,2,3)
# 标签的大小
plt.tick_params(labelsize=15)
# 根据店名对销售额求和,排序,生成柱状图
data.groupby('店名')['销售额'].sum().sort_values().plot.bar()
plt.title('各品牌总销售额', fontsize = 20)
plt.ylabel('商品总销售额' , fontsize = 15)
#旋转显示plt.xticks(rotation=45)
##补充绘图,挖掘数据,各品牌的平均每单单价,三个销量为0的品牌暂时不考虑
plt.subplot(2,2,4)
plt.tick_params(labelsize = 15)
# 对每个店名的销售额进行分组求和/每个店的销量,求出平均价格
avg_price=data.groupby('店名')['销售额'].sum()/data.groupby('店名').sale_count.sum()
# 对每个商品的平均价格排序,绘制图表
avg_price.sort_values().plot.bar()
plt.title('各品牌平均每单单价', fontsize = 20)
plt.ylabel('售出商品的平均单价' , fontsize = 15)
##自适应调整子图间距
plt.tight_layout()
通过图表不难看出以下几点:
-
悦诗风吟的商品数量遥遥领先,然而其商品销量只排在第三位,总销售额只排在第五位。
-
SKII,玉兰油,植村秀商品数量大概都在500-1500的范围,而销量为0。
-
相宜本草商品数量也只属于中游,但其销量销售额均排在第一位,由于其销量是第二名的大约两倍,而销售额远不到两倍,所以销售额/销量,也就是每一单的均价也是一个值得研究的新指标。
通过加入平均每单单价之后,观察销售额较高的几个品牌相宜本草,欧莱雅,佰草集,悦诗风吟,雅诗兰黛。其中相宜本草,悦诗风吟,欧莱雅都是平均单价200元以下的,佰草集为200-300元区间,雅诗兰黛为大于500元区间。是否能够判断价格亲民的品牌的销售额会相对来说更高?下面根据这里的数据先把平均单价分为几个区间,其中0-100元记为A类,100-200元记为B类,200-300元记为C类,300元及以上记为D类。
02
# 1-100之间的平均价格为A
A=avg_price[(avg_price <= 100) & (avg_price > 0) ].index
B=avg_price[(avg_price <= 200) & (avg_price > 100) ].index
C=avg_price[(avg_price <= 300) & (avg_price > 200) ].index
D=avg_price[avg_price > 300 ].index
#四类ABCD分别代表0-100,100-200,200-300,300以上平均单价区间的各品牌
# 计算出每家店的销售额的总和
sum_sale=data.groupby('店名')['销售额'].sum()
plt.figure(figsize = (16,8))
plt.tick_params(labelsize=10)
###各类、各品牌的销售额占比
plt.subplot(1,2,1)
sum_sale_byprice=sum_sale[A].sort_values().append(sum_sale[B].sort_values()).append(sum_sale[C].sort_values()).append(sum_sale[D].sort_values())
plt.pie(x=sum_sale_byprice,labels =sum_sale_byprice.index ,colors = ['grey']*len(A)+['g']*len(B)+['y']*len(C)+['m']*len(D),autopct='%0f%%',pctdistance=0.9)
###各类的平均每个店销售额
plt.subplot(1,2,2)
plt.tick_params(labelsize = 15)
plt.bar('均价0-100元',np.mean(sum_sale[A]),color = 'grey')
plt.bar('均价100-200元',np.mean(sum_sale[B]),color = 'g')
plt.bar('均价200-300元',np.mean(sum_sale[C]),color = 'y')
plt.bar('均价300元以上',np.mean(sum_sale[D]),color = 'm')
plt.title('不同类别的平均每个店销售额',fontsize = 20)
plt.ylabel('平均销售额',fontsize = 20)
plt.tight_layout()
观察饼图,不难发现A类平均单价的品牌所占的销售额比例最高,D类最少,并且D类中的一半以上收入都来自于雅诗兰黛品牌,而最受欢迎的相宜本草由于其价格便宜,销售额也最高。综合分析来说,在价格方面,价格越高的一般来说销量就会越低,反之亦有所相似之处。销量前四的品牌都属于A类,而属于D类的五个品牌销量都在最后七名之中。但
收益来说也有很大的区别。从每个类中每个店的平均销售额也能看出,定价越低则平均销售额越高。
比如A类中的美加净,销售额很低,观察分析其是平均单价最低的品牌,而且销量也并不算高,所以可以考虑几点:1.商品质量问题,虽然便宜但是是否产品质量过低降低了用户使用体验?2.知名度问题,是否需要提高知名度获取更多点击率以提高销量?3.定价问题,在质量过关的前提下,是否因为定价过低而降低了收益?能否在不大幅影响销量的情况下涨价?
事实上,D类中,也就是高端商品中,雅诗兰黛占据了主要份额,一方面可能由于品牌效应,就个人主观的分析,雅诗兰黛为人熟知,在推广营销方面做的很好,所以销量尚可。另一方面,可能雅诗兰黛虽然相对价格较高,但是给使用者带来的使用体验非常好,所以很多消费者宁愿多花钱也要选择雅诗兰黛。这也可能是雅诗兰黛平均单价最高,然而销量却在D类中也最高的原因。
03 对各个类别的销售情况进行分析
#大类销售量、销售额的占比
plt.figure(figsize = (12,12))
#销售量
plt.subplot(2,2,1)
data.groupby('main_type').sale_count.sum().plot.pie(autopct = '%0f%%',title = '各大类销售量占比')
#销售额
plt.subplot(2,2,2)
data.groupby('main_type')['销售额'].sum().plot.pie(autopct = '%0f%%',title = '各大类销售额占比')
#小类销售量、销售额的占比
plt.subplot(2,2,3)
data.groupby('sub_type').sale_count.sum().plot.pie(autopct = '%0f%%',title = '各小类销售量占比')
plt.subplot(2,2,4)
data.groupby('sub_type')['销售额'].sum().plot.pie(autopct = '%0f%%',title = '各小类销售额占比')
plt.tight_layout()
- 通过观察比较各个类销售量与销售额占比的关系,基本可以判断他们是正相关的。这也是符合常识的。
- 在大类中,护肤品的销量远胜化妆品以及其他商品。而在小类之中,清洁类的护肤品销量最高,其次是补水类的护肤品。
接下来用seaborn包给出每个店铺各个大类以及各个小类的销量销售额
##为了减少图形复杂度,先去掉总销量为0的店铺,分别为SKII,植村秀,玉兰油
data1 = data.drop(index = data[data['店名'].isin(data.groupby('店名').sale_count.sum()[data.groupby('店名').sale_count.sum() == 0].index)].index)
data1['店名'].value_counts()
import seaborn as sns
plt.figure(figsize = (16,12))
plt.subplot(2,1,1)
plt.tick_params(labelsize = 10)
sns.barplot(x = '店名', y = 'sale_count', hue = 'main_type' ,estimator=np.sum, data = data1 , ci = 0) ####estimator参数表示取该列的什么值
plt.title('各店铺中各大类的销售量',fontsize = 20)
plt.ylabel('销量',fontsize = 15)
plt.subplot(2,1,2)
plt.tick_params(labelsize = 10)
sns.barplot(x = '店名', y = '销售额', hue = 'main_type' ,estimator=np.sum, data = data1 , ci = 0)
plt.title('各店铺中各大类的销售额',fontsize = 20)
plt.ylabel('销售额',fontsize = 15)
plt.tight_layout()
plt.figure(figsize = (16,12))
plt.subplot(2,1,1)
plt.tick_params(labelsize = 10)
sns.barplot(x = '店名', y = 'sale_count', hue = 'sub_type' ,estimator=np.sum, data = data1 , ci = 0)####estimator参数取该列的什么值
plt.title('各店铺中各小类的销售量',fontsize = 20)
plt.ylabel('销量',fontsize = 15)
plt.subplot(2,1,2)
plt.tick_params(labelsize = 10)
sns.barplot(x = '店名', y = '销售额', hue = 'sub_type' ,estimator=np.sum, data = data1 , ci = 0)
plt.title('各店铺中各小类的销售额',fontsize = 20)
plt.ylabel('销售额',fontsize = 15)
plt.tight_layout()
先观察销量,各店小类中销量最高的是相宜本草的补水类商品以及妮维雅的清洁类商品,这两类销量很接近。而销售额上,相宜本草的补水类商品比妮维雅的清洁类商品要高得多,这显然是商品平均单价不同所导致的。由于不同的类别使用量也不同,销量自然也会有所区别,所以相对于比较每个店铺的不同类别的销售量,比较每个不同类别的各店铺的销售量应该更有价值。