一、什么是ABC分析法?
1. ABC分析法
ABC分类法(Activity Based Classification)是根据事物的主要特征做分类排列,从而实现区别对待、区别管理的一种方法。ABC法则是由帕累托二八法则衍生出来的一种法则。不同的是,二八法则强调的是抓住关键,ABC法则强调的是分清主次,并将管理对象划分为A、B、C三类。
在ABC分析法中,先将目标数据列倒序排序,然后做累积百分比统计,最后将得到的累积百分比按照下面的比例值划分为A、B、C三类。
- A类因素:发生累计频率为0%~80%,是主要影响因素
- B类因素:发生累计频率为80%~90%,是次要影响因素
- C类因素:发生累计频率为90%~100%,是一般影响因素
ABC分析法常用于电商运营活动分析中,商品ABC分级的关键指标是“支付转化率”“商品库存”, 根据这两个指标所制定的分级逻辑,以判定商品是属于哪一级的。
商品的ABC分级法需要将分析颗粒精细到每个款式,分析相对繁杂,所以一般只有在店铺进行大型促销活动时才会用到。也是因为只有店铺在大型促销活动时,每个单款商品所承载的流量与成交数据才足够大,ABC分级才更有意义。
2. ABC分析法的逻辑
商品ABC分级的重点在于“ABC的分级逻辑”。
1)A级商品:
高库存且有高转化率的商品,标记为A类商品。
因为这类商品既畅销,又有较深的库存作为保障,因此可以作为活动中的主推商品。需要注意的是,在挑选A类商品时,还应注意此款商品的访客不能太低,否则,没有经过“充分”流量测试的商品,其高转化率可能是“伪高转化率”。
2)B级商品:
转化率中等,且经过流量测试的商品,标记为B类商品。
由于这类商品经过流量测试,被证明对访客有一定吸引力,但却不如A类商品转化明显,所以可以继续保持当前的销售定位。
B级商品中有两类商品需要特别注意:
一是库存告急的,这类商品需要特别注意避免超卖;
二是占用了主推款陈列位置的,在大促中,宝贵的陈列位置是有限的,这类优质陈列位置需要留给A类商品使用,因此需要将其阵列位置往后移动。
3)C级商品:
转化率低且经过流量测试的商品,标记为C类商品。
C类商品应处于店铺阵列页面的底端,基本是属于被放弃的一类商品。但是,C类商品中有一类需要特别注意,就是有高库存的,可以尝试主动改变原定策略,譬如换主图、降价等。
二、ABC分析法怎么用?
以某电商平台的一次双十一促销运营活动为例,用ABC分析法评估促销活动的结果,并根据情况优化商品结构,以便更好地对不同款型商品采取不同手段,分配不同流量入口。
分析流程:
- 总体运营指标
- 从价格区间找出表现不好的产品,优化商品结构
- 从折扣区间来找出表现不好的产品,优化商品结构
1.数据加载
# 导入模块
import pandas as pd
import numpy as np
import warnings # 忽略不影响程序运行的警告信息
warnings.filterwarnings('ignore')
1.1 读取各部分数据集
# 读取数据 - 商品明细表
dt1 = pd.read_excel(r"唯品会销售数据.xlsx",sheetname = 0)
dt1.head()
# 读取数据 - 商品热度情况
dt2 = pd.read_excel(r"唯品会销售数据.xlsx",sheetname = 1)
dt2.head()
# 读取数据 - 用户销售明细表
dt3 = pd.read_excel(r"唯品会销售数据.xlsx",sheetname = 2)
# 将“是否退货”的值“是”、“否”替换为“1”、“0”,便于统计计算
dt3['是否退货'] = dt3["是否退货"].map({"是":1,"否":0})
dt3.head()
1.2 合并商品明细表和商品热度表数据
把商品信息加上该商品的热度信息,得到基础的商品信息,以及商品的一些热度信息:加购物车数量,收藏数量、uv数。
dt_product = dt1.merge(dt2,how = "left",on = "商品名")
dt_product.head()
1.3 合并商品明细表和商品热度表数据和用户销售明细表
# 统计每个商品的销售情况
product_sales = dt3.groupby("商品名").agg({"购买数量":"sum","购买金额":"sum","退货件数":"sum","退货金额":"sum",
"购买单价":"mean","用户id":pd.Series.nunique}).reset_index()
# 重命名
product_sales.rename(columns = {"购买数量":"商品销售数量","购买金额":"商品销售金额","是否退货":"商品退货数量","退货金额":"商品退货金额",
"购买单价":"商品销售单价","用户id":"购买用户数量"},inplace = True)
# 合并商品信息
dt_product_sales = dt_product.merge(product_sales,how = "left",on = "商品名")
dt_product_sales.head()
2.总体运营情况评价
总体运营部分,主要关注销售额、售卖比、UV、转化率等指标,其他指标作为辅助指标。销售额用来和预期目标做对比,售卖比用来看商品流转情况。
- GMV:销售额,在唯品会里称为到手价。
- 实销:GMV – 拒退金额。
- 销量:累计销售量(含拒退)。
- 客单价:GMV / 客户数,客单价与毛利率息息相关,一般客单价越高,毛利率越高。
- UV:商品所在页面的独立访问数。
- 转化率:客户数 / UV。
- 折扣率:GMV / 吊牌总额(吊牌总额 = 吊牌价 * 销量),在日常工作中,吊牌额是必不可少的。
- 备货值:吊牌价 * 库存数。
- 售卖比:又称售罄率,GMV / 备货值。
- 收藏数:收藏某款商品的用户数量。
- 加购数:加购物车人数。
- SKU数:促销活动中的SKU计数(一般指货号)。
- SPU数:促销活动中的SPU计数(一般指款号)。
- 拒退量:拒收和退货的总数量。
- 拒退额:拒收和退货的总金额。
# GMV = 商品销售金额(包含商品退货金额)
gmv = dt_product_sales["商品销售金额"].sum()
gmv
Out:3747167
# 实际销售额 = GMV - 商品退货金额
return_sales = dt_product_sales["商品退货金额"].sum()
return_money = gmv - return_sales
return_money
Out:2607587
# 销量 = 商品销售数量(包含拒退)
all_sales = dt_product_sales["商品销售数量"].sum()
all_sales
Out:12017
# 客单价 = GMV / 客户数(客单价与毛利率息息相关,一般客单价越高,毛利率越高)
custom_price = gmv / dt_product_sales["购买用户数量"].sum()
custom_price
# dt3.user_id.unique().count()
Out:493.56783456269756
# UV:商品所在页面的独立访问数
uv_cons = dt_product_sales["UV数"].sum()
uv_cons
Out:1176103
# 转化率 = 客户数 / UV
uv_rate = dt_product_sales["购买用户数量"].sum() / uv_cons
uv_rate
Out:0.006455216932530569
# 折扣率 = GMV / 吊牌总额(吊牌总额 = 吊牌价 * 销量)(在日常工作中,吊牌额是必不可少的)
tags_sales = (dt_product_sales["吊牌价"] * dt_product_sales["商品销售数量"]).sum() # 注意:这里是先求和再累加,顺序不可颠倒
# tags_sales = np.sum(dt_product_sales["吊牌价"] * dt_product_sales["商品销售数量"])
discount_rate = gmv / tags_sales
discount_rate
Out:0.4179229541452886
# 备货值 = 货值 = 吊牌价 * 库存量
goods_value = dt_product_sales["货值"].sum()
goods_value
Out:18916395
# 售卖比:又称售罄率 = GMV / 备货值
sales_rate = gmv / goods_value
sales_rate
Out:0.19809096817866195
# 收藏数:收藏某款商品的用户数量
coll_cons = dt_product_sales["收藏数"].sum()
coll_cons
Out:6224
# 加购数:加购物车人数
add_shop_cons = dt_product_sales["加购物车数"].sum()
add_shop_cons
Out:18690
# SKU数:促销活动中的最小品类单元(一般指货号)
sku_cons = dt_product_sales["SKU"].sum()
sku_cons
Out:125
# SPU数:促销活动中的SPU计数(一般指款号)
spu_cons = len(dt_product_sales["商品名"].unique())
spu_cons
Out:80
# 拒退量:拒收和退货的总数量
reject_cons = dt_product_sales["退货件数"].sum()
reject_cons
Out:3643
# 拒退额:拒收和退货的总金额
reject_money = dt_product_sales["商品退货金额"].sum()
reject_money
Out:1139580
汇总基本指标数据,加入同期数据,与当期数据进行对比。
# 创建当期DataFrame
sales_state_dangqi = pd.DataFrame({"GMV":[gmv],"实际销售额":[return_money],"销量":[all_sales],"客单价":[custom_price],
"UV数":[uv_cons],"UV转化率":[uv_rate],"折扣率":[discount_rate],"货值":[goods_value],
"售卖比":[sales_rate],"收藏数":[coll_cons],"加购数":[add_shop_cons],"sku数":[sku_cons],
"spu数":[spu_cons],"拒退量":[reject_cons],"拒退额":[reject_money]}) # index = ["今年双11"]
# 创建同期DataFrame
sales_state_tongqi = pd.DataFrame({"GMV":[2261093],"实际销售额":[1464936.517],"销量":[7654],"客单价":[609.34567],
"UV数":[904694],"UV转化率":[0.0053366],"折扣率":[0.46],"货值":[12610930],
"售卖比":[0.1161],"收藏数":[4263],"加购数":[15838],"sku数":[82],
"spu数":[67],"拒退量":[2000],"拒退额":[651188.57]}) #index=["去年双11"]
# 用stack函数将“sales_state_dangqi”行变为列,得到一个层次化索引的Series,转化为DataFrame后重置索引,再进行切片(1,2列的所有行)
sales_state_dangqi_s = pd.DataFrame(sales_state_dangqi.stack()).reset_index().iloc[:,[1,2]]
# 对列重命名
sales_state_dangqi_s.columns = ["指标","今年双11"]
sales_state_tongqi_s = pd.DataFrame(sales_state_tongqi.stack()).reset_index().iloc[:,[1,2]]
sales_state_tongqi_s.columns = ["指标","去年双11"]
# 数据表合并
sales_state = pd.merge(sales_state_dangqi_s, sales_state_tongqi_s,on="指标")
# 新增“同比”一列,同比 = (当期 - 同期)/ 同期
sales_state["同比"] = (sales_state["今年双11"] - sales_state["去年双11"]) / sales_state["去年双11"]
sales_state
结果显示:
- 相比于去年双11,今年双11,在基本指标方面,除“客单价”和“折扣率”有所下降,其他都有所增长,总体运营活动效果良好。
3. 从价格区间来优化商品结构
我们需要做的是,深入探究不同区间的数据,以此来优化后期的促销结构。
第一步:找到在本次促销中此区间的销售源数据,源数据要求显示具体的款号、销售额、销量等信息;
第二步:计算出每个款的转化率、折扣率等数据。
3.1 划分价格区间段
将价格划分为“1-200'”,“200-500”,“400及以上”三个区间。
# 设置切分区域
listBins = [0,200,400,100000]
# 设置切分后对应标签
listLabels = ['1_200','200_500','400及以上']
# 利用pd.cut函数进行数据离散化切分,注意分组标签和分组数要一致
# 增加“价格分组”列,对“售卖价”进行分组
dt_product_sales['价格分组'] = pd.cut(dt_product_sales['售卖价'], bins = listBins, labels = listLabels, include_lowest = True)
dt_product_sales.head()
3.2 确定指标
对每个价格区间的运营活动表现就以下指标进行分析:价格区间、货值、货值占比、销售额、售卖比、销售占比、销量、客单价、UV、收藏数、加购数、转化率
# 货值、销售额、销量、UV、销量、收藏数、加购数
dt_product_sales_info = dt_product_sales.groupby("价格分组").agg({"货值":"sum","商品销售金额":"sum","商品销售数量":"sum","UV数":"sum",
"购买用户数量":"sum","收藏数":"sum","加购物车数":"sum"}).reset_index()
# 货值占比、销售占比、客单价、转化率
dt_product_sales_info["货值占比"] = dt_product_sales_info["货值"]/dt_product_sales_info["货值"].sum()
dt_product_sales_info["销售占比"] = dt_product_sales_info["商品销售金额"]/dt_product_sales_info["商品销售金额"].sum()
dt_product_sales_info["客单价"] = dt_product_sales_info["商品销售金额"]/dt_product_sales_info["购买用户数量"]
dt_product_sales_info["转化率"] = dt_product_sales_info["购买用户数量"]/dt_product_sales_info["UV数"]
dt_product_sales_info
3.3 区间选择
由各价格区间商品销售表现可以,三个区间段的商品转化率大致相同,200-500价格区间的商品销量最高,400+商品的销售金额最高,但是销量最少,货值最高。为了避免货物积压,就这一区间进行分析。
# 取出400及以上价格区间的数据内容
product_400 = dt_product_sales[dt_product_sales["价格分组"]=='400及以上']
product_400.head()
3.4 确定商品指标
就这一价格区间商品着重比较以下指标:销售额,销量,件单价,客户数,UV,转换率,库存,备货值,售卖比
# 转换率 = 客户数 / UV
product_400['转换率'] = product_400["购买用户数量"] / product_400["UV数"]
# 备货值 = 吊牌价 * 库存数
product_400["备货值"] = product_400["吊牌价"] * product_400["商品销售数量"]
# 售卖比,又称售罄率 = GMV / 备货值
product_400["售卖比"] = product_400["商品销售金额"] / product_400["备货值"]
# 提取出需要评估的指标
product_400[["商品名","商品销售金额","商品销售数量","商品销售单价","购买用户数量","UV数",'转换率',"库存量","备货值","售卖比"]].head()
3.5 确定优化方案
- 转化率大于 0.7% 的商品,暂时保留,用于下次促销活动;
- 转化率小于 0.7% 的商品,但是售卖比大于 36% 的商品予以保留参加下次促销活动;
- 转化率小于 0.7% 的商品,并且售卖比小于 36% 的商品进行清仓处理。
3.6 商品筛选
找出转化率大于 0.7% 的商品予以保留。
stay_stocks571 = product_400[product_400["转换率"] > 0.007]
stay_stocks571.head()
找出转化率小于 0.7% 但是 售卖比大于 36% 的商品予以保留。
stay_stocks573 = product_400[(product_400["售卖比"] >= 0.36)&(product_400["转换率"] < 0.007)]
stay_stocks573
找出转化率小于0.7%并且售卖比小于36%的商品进行清仓处理。
stay_stocks574 = product_400[(product_400["售卖比"] < 0.36)&(product_400["转换率"] < 0.007)]
stay_stocks574
4. 从折扣区间来优化商品结构
4.1 划分折扣区间段
# 设置切分区域
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_1']
# 利用pd.cut进行数据离散化切分,注意分组标签和分组数要一致
dt_product_sales['折扣区间'] = pd.cut(dt_product['折扣率'], bins=listBins, labels=listLabels, include_lowest = True)
dt_product_sales.head()
4.2 确定指标
对每个折扣区间的运营活动表现就以下指标进行分析:折扣区间、货值、货值占比、销售额、售卖比、销售占比、销量、客单价、UV、收藏数、加购数、转化率
# 货值占比、销售占比、客单价、转化率
dt_product_discount_info = dt_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["购买用户数量"]
dt_product_discount_info["转化率"] = dt_product_discount_info["购买用户数量"] / dt_product_discount_info["UV数"]
dt_product_discount_info
4.3 区间选择
由各区间的销售数据表现可得,折扣区间在0.35-0.4的商品的货值、销售金额等各项数据指标都是最高的,所以我们选择 0.35-0.4 折扣区间进行深入探究。
# 取出 0.35-0.4 折扣区间的数据内容
product_354 = dt_product_sales[dt_product_sales["折扣区间"] == '0.35_0.4']
product_354.head()
4.4 确定商品指标
着重观察这一折扣区间内商品的销售额、销量、件单价、客户数、UV、转换率、库存、货值、售卖比
# 转换率 = 客户数 / UV
product_354['转换率'] = product_354["购买用户数量"]/product_354["UV数"]
# 备货值 = 吊牌价 * 库存数
product_354["备货值"] = product_354["吊牌价"]*product_354["商品销售数量"]
# 售卖比,又称售罄率 = GMV / 备货值
product_354["售卖比"] = product_354["商品销售金额"]/product_354["备货值"]
# 提取出需要评估的指标
product_354[["商品名","商品销售金额","商品销售数量","商品销售单价","购买用户数量","UV数","库存量","备货值","折扣率","售卖比",'转换率']]
Out:
4.5 优化方案
折扣率**大于 37% **的部分找出售卖比大于 36.5% 且转化率大于 0.7% 的商品予以保留,其余进行清仓处理;
折扣率**小于 37% **的部分找出售卖比大于 36.5% 且转化率大于 0.7% 的部分予以保留,其余进行清仓处理。
4.6 商品筛选
在折扣率大于37%的部分找出售卖比大于36.5%且转化率大于0.7%的商品予以保留。
stay_stocks1 = product_354[(product_354["折扣率"] > 0.37)&(product_354["售卖比"] > 0.365)&(product_354["转换率"] > 0.007)]
stay_stocks1
在折扣率大于37%的部分找出售卖比小于36.5%或转化率小于0.7%的商品进行清仓处理。
stay_stocks2 = product_354[(product_354["折扣率"] >= 0.37)&((product_354["售卖比"] <= 0.365)|(product_354["转换率"] <= 0.007))]
stay_stocks2
Out:
在折扣率小于37%的部分找出售卖比大于36.5%且转化率大于0.7%的部分予以保留。
stay_stocks3 = product_354[(product_354["折扣率"] <= 0.37)&(product_354["转换率"] > 0.007)&(product_354["售卖比"] > 0.365)]
stay_stocks3
在折扣率小于37%的部分找出售卖比小于36.5%或转化率小于0.7%的部分进行清仓处理。
stay_stocks4 = product_354[((product_354["折扣率"] < 0.37) & ((product_354["售卖比"] < 0.365)|(product_354["转换率"] < 0.007)))]
stay_stocks4
5. 结果应用
结合价格区间和折扣区间,商品销售表现数据,就不同款型商品分配不同的流量入口。
在一级入口中,首页的流量占比最高,我们可以将畅销款布局在首页档期流。在唯品会中,我们需要不断的增加商品来保证我们的SKU数,对于新增的商品我们也会增加在其中。对于平销款,我们将其作为快抢和疯抢处理。