01_行业背景
在传统零售或电商领域,关键产品的缺货会对销售和营销成本产生巨大的负面影响!
在流量为王、付费成本逐渐走高的当下,我们真金白银换来的用户访问,却因缺货导致订单流失向竞店以及客户丢失,作为运营来说是一件即可耻有不道德的事情!
虽然我们可以通过保持一个过量库存的方式避免缺货情况,但是这会导致库存周转率较低,带来更大的资金和仓储成本,甚至由轻资本状态转向重资产运作,因此为了避免重资产模式拖累业务增速,我们可以通过一套库存管理方法将库存量控制在合理的水平,实现不伤害用户体验,保证日常正常经营的前提下压缩备货带来的资金和仓储成本。保持企业的良好竞争力以及提升利润空间的基础。
02_商品管理的思考
ABC 管理法是管理库存的经典方法。通过计算每个商品的销售收入在所有商品产生的总收入中的累积百分比贡献进行排名,来对商品进行分类,它基于帕累托原则(80/20 规则):
- A类商品贡献了80%的销售收入,这些商品需要严格控制库存,避免缺货
- B类商品贡献了接下来的10%的销售收入,对于这类商品,库存控制可以适当放松
- 剩下的10%收入由C类商品贡献,但C类商品种类最多,分配到的进货成本和仓储资源优先级最低。
ABC库存管理虽然有效,但是有自身局限性,它只从销售收入单一维度来衡量商品的重要性。但实际情况确更加复杂,如:
- 某些商品周期性较强
- 某些商品会受季节影响
- 还有些商品的销量受售价的影响比较敏感,竞争对手做活动搞促销都会营销到销量
- 除此之外经济因素,政策影响都会对销量造成影响从而给库存管理带来更大挑战
因为在企业经营中基于ABC分类标准过于单一,它没有考虑到销售的不确定性(即:在一段时间内销售量的变化),很有可能一些销售金额很高的物料需求只是一次性的或者短期比较大的,而另一部分销售额很高的物料有稳定的销售量的。因此,这个时候我们就引入了一个新的概念叫“XYZ分析”。
03_XYZ库存管理方法
通过 XYZ 库存管理,在很长一段时间内测量每个商品的销售需求,以捕捉需求的季节性变化,然后计算每个SKU的方差,并根据其变化对分数进行排名。
X 类:需求变化最小的产品。 这些产品的销售比较稳定,这意味着采购经理更容易预测它们,很容易避免缺货。
Y 类:比X类中的产品变化更大。由于季节性等因素,需求会随时间变化,因此更难准确预测
Z 类:需求波动起伏较大,比较难预测,除非有冗余较大的备货,否则很难避免缺货
04_ABC与XYZ组合使用
AX:高出库量,稳定
AY:高出库量,小幅波动,不太稳定
AZ:高出库量,大幅波动,非常不稳定
BX:出库量平均,稳定
BY:出库量平均,小幅波动,不太稳定
BZ:出库量平均,大幅波动,非常不稳定
CX:低出库量,稳定
CY:低出库量,小幅波动,不太稳定
CZ:低出库量,大幅波动,非常不稳定
- ABC法和XYZ法是从不同的角度来处理库存管理的问题,而且对运营和采购人员都很有用,所以可以将它们结合起来。
- 将ABC与XYZ组合起来的用法很简单,对于每个SKU我们组成 AX、AY、AZ、BX、BY、BZ、CX、CY 和 CZ九个类别,通过这九个类别,我们可以帮助运营和采购人员了解两者对收入的重要性以及需求的变化。
- 在这个项目中,我们将使用电子商务交易数据的 12 个月快照来创建一个 ABC-XYZ 库存管理模型,该模型对每个商品进行分类,并为其管理提出一些建议,以帮助零售商避免出现代价高昂的缺货。
05_方法的实现
from faker import Faker
from datetime import date,datetime,timedelta
import pandas as pd
fake = Faker('zh_CN')
class PtDataGen:
def __init__(self):
self.data_dict = {}
def fake_data(self):
pt_profile = fake.profile()
self.data_dict['商品类']=fake.pyint(15,50)
self.data_dict['1月']=fake.pyint(23,50000)
self.data_dict['2月']=fake.pyint(23,50000)
self.data_dict['3月']=fake.pyint(23,50000)
self.data_dict['4月']=fake.pyint(23,50000)
self.data_dict['5月']=fake.pyint(23,50000)
self.data_dict['6月']=fake.pyint(23,50000)
self.data_dict['7月']=fake.pyint(23,50000)
self.data_dict['8月']=fake.pyint(23,50000)
self.data_dict['9月']=fake.pyint(23,50000)
self.data_dict['10月']=fake.pyint(23,50000)
self.data_dict['11月']=fake.pyint(23,50000)
self.data_dict['12月']=fake.pyint(23,50000)
def get_data_series(self):
return pd.Series(self.data_dict)
def get_data_dict(self):
return self.data_dict
rst_list = []
for _ in range(200):
pt_data = PtDataGen()
pt_data.fake_data()
rst_list.append(pt_data.get_data_dict())
df_pt_list = pd.DataFrame(rst_list)
df_pt_list
首先通过脚本构建一个数据集,分别为每个商品过去一年中个月的销售数据(如上图)
df_pt_list_copy = df_pt_list
df_pt_list_copy['小计'] = df_pt_list_copy.iloc[:,1:].sum(axis=1) # 对1-12月求和,生成新列
df_pt_list_copy = df_pt_list_copy.sort_values(by='小计', ascending=False ,axis=0) # 根据销量倒序
df_pt_list_copy['销量占比'] = (df_pt_list_copy['小计']/df_pt_list_copy['小计'].sum()).apply(lambda x: format(x, '.2%'))
df_pt_list_copy['累计百分比'] = (df_pt_list_copy['小计'].cumsum() / df_pt_list_copy['小计'].sum())
# df_pt_list_copy
def abc_classify_product(cov):
if cov <= 0.4:
return 'A'
elif cov > 0.4 and cov <= 0.8:
return 'B'
else:
return 'C'
df_pt_list_copy['ABC'] = df_pt_list_copy['累计百分比'].apply(abc_classify_product)
df_pt_list_copy.sample(5)
ABC分类统计出每个商品占销售量的百分比,并进行从大到小的排序后,前40%的我们定义为A类型,剩下的前40%-80%的定义为B类型,剩余20%左右的定义C类型。
df_pt_list_copy['变异系数'] = df_pt_list_copy[['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月',
'11月', '12月']].std(axis=1)/(df_pt_list_copy['小计']/12) # CV = 标准差/平均值
def xyz_classify_product(cov):
if cov <= 0.11:
return 'X'
elif cov > 0.11 and cov <= 0.134:
return 'Y'
else:
return 'Z'
df_pt_list_copy['XYZ'] = df_pt_list_copy['变异系数'].apply(xyz_classify_product)
df_pt_list_copy.sample(5)
import seaborn as sns
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings('ignore')
plt.subplots(figsize=(15, 6))
sns.distplot(df_pt_list_copy['变异系数']).set_title("CV分布",fontsize=15)
df_pt_list_copy['变异系数'].describe()
1、XYZ分类根据统计出的每个商品在一定周期内的销售量波动情况,根据统计时段内销售量的方差(方差=标准偏差/平均值)进行计算,得出的结果即为不确定性值,为方便演示,这里根据变异系数的四分数作为划分依据(具体可以结合业务实际情况划分)
2、按照如上方式就可以根据系统的历史数据对商品的ABC XYZ分类进行明确的标识了,最后组合起来就形成了上面所说的AX,AY,AZ,BX,BY,BZ,CX,CY,CZ 9个类型。
06_如何在库存管理中应用ABC XYZ分类
- 如果根据分析结果产品被定义为AX或BX,他们的销售量是非常稳定的,就不需要备大量的库存,只需要一个低的安全库存即可,因为需求稳定,频繁采购,所以短缺风险是很低的。
- 如果产品被定义为AY或BY,就需要根据日常的平均库存设置安全库存,因为风险是可控的。如果产品被定义为AZ或BZ,需求将非常不确定,由于销售额比较高,数量很大,为了避免短缺的风险,需要设置一个较高的安全库存以保证销售利润。
而对于CX,CY的商品,由于销售量很低,只需要要很小的库存即可,CZ的商品,由于销售量很低,并且不确定性有非常高,所以设置低库存或者0库存,避免由于高库存造成的库存积压和过剩,浪费资金。
所以ABC XYZ分析能很好的解决库存策略的制定,帮助企业制定合理的安全库存,避免货物短缺或库存过剩。
07_ABC XYZ分类的扩展应用
