本文是对唯品会特卖商品数据分析案例的一个总结,主要是根据商品促销活动的销售数据,分析商品售卖情况,使用ABC分析法进行商品结构优化。
ABC分析法
简述:
ABC分类法又称帕雷托分析法,也叫主次因素分析法,是项目管理中常用的一种方法。它是根据事物在技术或经济方面的主要特征,进行分类排队,分清重点和一般,从而有区别地确定管理方式的一种分析方法。由于它把被分析的对象分成A、B、C三类,所以又称为ABC分析法。
在ABC分析法的分析图中,有两个纵坐标,一个横坐标,几个长方形,一条曲线,左边纵坐标表示频数,右边纵坐标表示频率,以百分数表示。横坐标表示影响质量的各项因素,按影响大小从左向右排列,曲线表示各种影响因素大小的累计百分数。一般地,是将曲线的累计频率分为三级,与之相对应的因素分为三类:
- A类因素:发生累计频率为0%~80%,是主要影响因素,需要严格控制、准确记录,。
- B类因素:发生累计频率为80%~90%,是次要影响因素,需要稍松空值、良好记录。
- C类因素:发生累计频率为90%~100%,是一般影响因素,需要简单控制、最少记录。
电商中的ABC分析法
在电商运营活动中,商品ABC分级主要指标有“支付转化率”“商品库存”,根据此区分商品属于哪一类。商品ABC分级法需将分析颗粒精细到每个款式,相对复杂,所以只有在店铺进行大型促销活动才会用到,也因为此时数据量足够大,使用ABC分析法才更有意义。
A级商品:
- 拥有高库存、高转化率的商品;
- 因为这类商品既畅销,又有较深的库存作为保障,因此可以作为活动中的主推商品。需要注意的是,在挑选A类商品时,还应注意此款商品的访客不能太低,则,没有经过“充分"流量测试的商品,其高转化率可能是"伪高转化率”。
B级商品:
- 经过流量测试的中等转化率商品;
- 此类商品对访客有一定吸引力,但不如A类商品的转化率,可以继续保持当前的销售定为。但需要注意库存告急,以及错误占用了A类商品陈列位置(B类商品陈列位置需要A类之后)。
C级商品:
- 转化率低的商品;
- C类商品应放置于店铺陈列底端,基本属于被放弃的一类商品。但是,如果C类商品中高库存的,可尝试降价,更换营销方式等办法。
一、项目背景
唯品会专门做特卖的网站,在特定的时间段里,以优惠的价格出售指定商品。
二、分析目标
评估每次促销活动的结果,根据转换率、售卖比指标构建ABC模型优化商品结构,压缩总库存,使库存结构合理化节约管理力量。
三、分析过程
- 准备工作(导入数据及处理观察);
- 总体运营指标分析 —— 计算商品销售额、销量、客单价、UV等指数进行同比、环比分析;
- 从价格区间分析商品 —— 将商品按价格分为多个区间,对每个区间的商品进行统计分析,针对指定区间计算转换率、售卖比,分级ABC类商品优化商品结构;
- 从折扣区间分析商品 —— 将商品按折扣区间分为多个区间,对每个区间的商品进行统计分析,针对指定区间计算转换率、售卖比,分级ABC类商品优化商品结构。
1.准备工作
(1) 导入模块
import pandas as pd
pd.set_option('max_columns', 25)
# 保留4位小数
pd.set_option('display.float_format',lambda x : '%.4f' % x)
import numpy as np
import warnings
warnings.filterwarnings('ignore')
import sqlalchemy
import seaborn as sns
import matplotlib.pyplot as plt
(2) 导入数据
数据文件存放在sql数据库,使用sqlalchemy模块导入
# 商品信息表
sql = "select * from sales_info1"
df1 = pd.read_sql(sql,engine)
# 商品热度表
sql = "select * from sales_info2"
df2 = pd.read_sql(sql,engine)
# 用户订单表
sql = 'select * from sales_info3'
df3 = pd.read_sql(sql,engine)
(3)处理表格得到商品信息表
- 对用户订单表中的商品进行聚合得到表1
- 合并商品信息表和热度表得到表2
- 合并表1和表2的到总体商品销售明细
# 对用户订单表中的商品进行聚合
product_sales = df3.groupby('商品名').agg({'用户id': pd.Series.nunique,
'购买金额':'sum',
'购买数量':'sum',
'购买单价':'mean',
'退货件数':'sum',
'退货金额':'sum'}).reset_index().rename(columns = {'用户id':'商品购买用户数', '购买数量':'商品销售数量','购买金额':'商品销售金额','购买单价':'商品销售单价','是否退货':'商品退货数量','退货金额':'商品退货金额'})
# 合并商品信息表和热度表
dt_product = pd.merge(df1,df2,how = 'left',on='商品名')
# 合并
df_product_sales = pd.merge(product_sales,dt_product,on = '商品名')
# 商品总体描述统计
df_product_sales.describe()
- 共有80件商品,每件商品平均销售额在46839元,平均单价为317元,平均销量为150件退货数为45件,退货率较高达到1/3左右,平均折扣率在4折左右。
2.总体运营指标分析
- 分别计算商品GMV(销售额)、实际销售额(销售额-退款金额)、销量、客单价、UV(商品页面独立访问数)、转化率(客户数/UV)、折扣率(GMV/吊牌总额)、备货值(吊牌价*库存数)、售卖比(GMV/备货值)、收藏数、加入购物车数、SKU(最小品类单元)、SPU(款号)、退货量、退款总额
- 输入去年同期指标值
- 环比分析
sales_state = pd.concat([sales_state_dangqi,sales_state_tongqi], axis = 0).T.reset_index().rename(columns = {"index":"指标",1:"今年双11",0:"去年双11"})
sales_state["同比"] = (sales_state["今年双11"] - sales_state["去年双11"])/sales_state["去年双11"]
- 总体运营情况上,今年总销售额为3747167比去年同比上涨65%,销量同比上涨57%;
- 大多数指标均有上涨,平均涨幅40%左右,抛开折扣率的下降,客单价下降了20%左右。
3.从价格区间优化商品结构
3.1 价格区间划分
- 统计全部商品销售单价
- 划分价格区间,进行销售统计
# 商品单价统计
df_product_sales["商品销售单价"].describe()
# 划分0-200,201-400,400+ 商品区间
listbins = [0, 200, 400, 1000000]
listlabel = ["200元及以下", "201-400元", "400元以上"]
# cut,左开右闭,include_lowest:包含左端点
df_product_sales["价格分组"] = pd.cut(df_product_sales["商品销售单价"], bins = listbins, labels= listlabel, include_lowest=True)
# 进行统计
dt_product_sales_info = df_product_sales.groupby('价格分组').agg({'货值':'sum',
'商品销售金额':'sum',
'商品销售数量':'sum',
'UV数':'sum',
'商品购买用户数':'sum',
'收藏数':'sum',
'加购物车数':'sum'}).reset_index()
# 增加占比及转化率
dt_product_sales_info['货值占比'] = dt_product_sales_info['货值'].div(dt_product_sales_info['货值'].sum())
dt_product_sales_info['销售占比'] = dt_product_sales_info['商品销售金额'].div(dt_product_sales_info['商品销售金额'].sum())
dt_product_sales_info['售卖比'] = dt_product_sales_info.apply(lambda x:x[2]/x[1],axis = 1)
dt_product_sales_info['客单价'] = dt_product_sales_info.apply(lambda x:x[2]/x[5],axis = 1)
dt_product_sales_info['转换率'] = dt_product_sales_info.apply(lambda x:x[5]/x[4],axis = 1)
3.2 区间选择
- 由于个价格区间商品销售表现都相近,转化率大致相同,400+商品的销售金额最高,但是销量最低,货值最高,为避免货物积压,就这一区间进行商品结构优化。
product_400 = df_product_sales.query("价格分组 == '400元以上'")
product_400['转换率'] = product_400['商品购买用户数'] / product_400['UV数']
product_400['备货值'] = product_400['吊牌价'] * product_400['库存量']
product_400['售卖比'] = product_400['商品销售金额'] / product_400['备货值']
product_400 = product_400[['商品名','商品销售金额','商品销售数量','商品销售单价','商品购买用户数','UV数','转换率','库存量','备货值','售卖比']].reset_index(drop = True)
# 划分A、B、C
def label(x):
if x[0] > 0.007:
return "A"
elif x[0] <= 0.007 and x[1]>0.3:
return "B"
else:
return "C"
product_400['label'] = product_400[["转换率","售卖比"]].apply(lambda x:label(x),axis = 1)
product_400['color'] = product_400[["转换率","售卖比"]].apply(lambda x:color(x),axis = 1)
- A、B、C类产品分别有12,10,1件
3.3 优化方案
- A:转化率大于0.7%的商品,暂时保留,用于下次促销活动;
- B:转化率小于等于0.7%的商品,但是售卖比大于30%的商品予以保留参加下次促销活动,
- C:转化率小于0.7%的商品,并且售卖比小于36%的商品进行清仓处理。
4.从折扣区间优化商品结构
4.1 折扣区间划分
将产品折扣率划分'0.15-0.2','0.2-0.25','0.25-0.3','0.3-0.35','0.35-0.4','0.4-0.45','0.45-0.5','0.5-0.55','0.55-0.6','0.6-0.65','0.65-0.7','0.7+'多个区间进行分析统计
listbins = [0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 1]
listlabels = ['0.15-0.2','0.2-0.25','0.25-0.3','0.3-0.35','0.35-0.4','0.4-0.45','0.45-0.5','0.5-0.55','0.55-0.6','0.6-0.65','0.65-0.7','0.7+']
df_product_sales['折扣区间'] = pd.cut(df_product_sales['折扣率'],bins = listbins,labels = listlabels,include_lowest=True)
df_product_sales
4.2 指标计算
计算每个折扣区间的货值、销售额、销售数量、UV数、转化率、货值占比等指标
pd.set_option('display.float_format',lambda x : '%.6f' % x)
dt_product_discount_info = df_product_sales.groupby('折扣区间').agg({'货值':'sum',
'商品销售金额':'sum',
'商品销售数量':'sum',
'UV数':'sum',
'收藏数':'sum',
'加购物车数':'sum',
'商品购买用户数':'sum'
}).reset_index()
dt_product_discount_info['货值占比'] = dt_product_discount_info['货值'] / dt_product_discount_info['货值'].sum()
dt_product_discount_info['销售占比'] = dt_product_discount_info['商品销售金额'] / dt_product_discount_info['商品销售金额'].sum()
dt_product_discount_info['客单价'] = dt_product_discount_info['商品销售金额'] / dt_product_discount_info['商品购买用户数'].sum()
dt_product_discount_info['转化率'] = dt_product_discount_info['商品购买用户数'] / dt_product_discount_info['UV数'].sum()
4.3 区间选择
折扣率在0.35-0.4之间的产品销售额最高,针对以上区间进行具体分析优化产品
def label2(x):
if x[0] > 0.365 and x[1]>0.007:
return "A"
else:
return "C"
product_354['label'] = product_354[['售卖比','转换率']].apply(lambda x:label2(x),axis = 1)
- A类产品有5件、C类产品有20件,对A类产品保留继续下次促销,清仓处理C类产品。
4.4 优化方案
- 在折扣区间商品销量均较好,只对商品进行了A、C类划分。
- 转化率大于0.7%,售卖比大于36.5%的商品划分为A类商品,保留用于下次促销活动。
- 其余商品划分为C类商品,用于清仓处理。
四、总结
- 1.从整体运营情况来看,今年促销活动销售额为3747167元,实际销售额为2607587元,同比去年增涨65%以上,销量为12017件同比增涨57%。
- 2.根据ABC分析法
- 从价格区间优化结果来看,400元以上价位产品一共23件,其中A类产品12件、B类1件、C类10件,下次活动可以对A类产品采取宣传措施带动其他产品销量,C类产品进行清仓处理为下次活动节省空间资源。
- 在折扣区间方面,整体折扣率在0.38左右,销售额贡献最高的为0.35-0.4之间的产品,在这一类产品中,A类5件,C类有20件,我们选择保留A类产品,清仓处理C类产品。