一、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()
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"]
# 創建同期
DataFramesales_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數","庫存量","備貨值","折扣率","售賣比",'轉換率']]
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
- 在折扣率小于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數,對于新增的商品我們也會增加在其中。對于平銷款,我們將其作為快搶和瘋搶處理。