ABC分析法及在电商分析中的应用

一、什么是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数,对于新增的商品我们也会增加在其中。对于平销款,我们将其作为快抢和疯抢处理。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342