美文网首页@产品大数据呆鸟的Python数据分析
ABC分析法及在电商分析中的应用

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

作者: 数有余 | 来源:发表于2020-08-13 00:01 被阅读0次

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

    相关文章

      网友评论

        本文标题:ABC分析法及在电商分析中的应用

        本文链接:https://www.haomeiwen.com/subject/kolmdktx.html