什么是调拨
关于门店商品调拨的一点思考。商品运营过程中,门店商品铺货,补货,调拨是很重要的商品运营管理环节,调拨的过程可以平衡门店的库存结构,加速商品的流通效率;精准的铺货、补货可以减少商品的调拨需求,但是因为不同的商品在不同地区商圈会产生销售差异,那我们就需要通过调拨,调整门店库存结构,让各门店库存结构好,即保证销售的前提下,拥有最小库存,让商品流转效率最高。
门店间商品调拨是一种常见的业务行为,一般由商品运营部门负责,调拨即将商品从一家门店调往另外一家门店。
- 是否需要调拨
- 如何合理高效完成调拨
是否需要调拨
如果我们能精准预测周期内销量,再根据预测销量给门店补货,那么门店间将不需要调拨,每家门店的库存结构都是完美状态,但是显然我们不可能做到百分百精准。首先门店商品销售情况不具备普适性,也就是说 A 门店最好销售的商品不一定在 B 门店销售最佳,极端情况甚至 0 销售记录。当然,我们做这个设定前需要排除销售人员带来的销售影响,即销售人员偏好导致的商品销售差异。既然门店商品销售情况存在差异,我们暂且不论门店商品销售差异的原因,导致各门店商品库存情况必然存在结构化差异,销售情况较好的门店商品库存结构[1]显著优于销售较差门店。长此以往,门店逐渐陷入恶性循环,库存结构越来越差,销售越来越差。
如果我们想要提高 Top 商品流转效率,那我们必然需要将全国 Top 商品从流通效率低的门店调拨到高流转的门店。如下情况:
门店 | 商品 | 近一周销售 | 近一月销售 | 门店库存 |
---|---|---|---|---|
A | 商品A | 0 | 2 | 7 |
B | 商品A | 1 | 4 | 8 |
C | 商品A | 3 | 11 | 5 |
D | 商品A | 5 | 19 | 6 |
E | 商品A | 8 | 30 | 10 |
F | 商品A | 10 | 41 | 10 |
显然 D,E,F 等门店对商品 A 的流转效率高于 A、B 门店,那我们是否需要将 A,B 门店的商品A 的库存调拨到 D、E、F ?
关于调拨的必要性,从以下角度思考:
- 优化门店 A、B 的库存结构
- 保证门店 E、F的商品销售
- 优化城市整体库存结构,提高流转效率,避免呆滞库存
货品总仓充足情况下:门店间商品调拨是对门店铺货、补货后的一种纠错机制,是保证商品高效流转的必要措施。
货品总仓库存紧张时:门店间商品调拨是对高产门店的货品补给,加速货品的售罄;
在思考调拨问题时应结合补货情况统一考虑。
现实情况中,公司总部出具的补货建议无论是直营或加盟客户,出于各种考虑,补货方不一定完全按照补货建议补货 。
如何合理调拨
调拨本质是『补货』的一种方式。调拨的动作很简单,即将商品从没有需求的门店 A 调往有需求的门店 B。商品调拨需要全局思维,往往需要公司总部做调拨建议,因为总部统一的调拨,往往是全局最优解。
调拨范围
在设计调拨管理运行机制时,需要根据公司业务形态,门店分布情况决定调拨最小范围:比如,以城市为最小单位进行城市内门店调拨,以公司划分的”管理区域“为最小单位调拨,我们接下来以城市为最小单位调拨。
关于物流调拨费用的最优解:就是减少门店调拨的交叉线和选择就近的门店调拨;
由于眼镜的体积较小以及重量较轻,非常适合店长集中开会时实施商品调拨(可以有效减少快递费用)。
调拨周期
调拨是补货的一种,那何时调拨呢?先调拨再补货,补货再调拨?其实我们无论是补货还是调拨,都是期望将门店库存保持合理区间,所以无论是补货还是调拨,根据当前的门店销售以及库存实施门店最佳库存补货或调拨即可。理论上,先调拨再补货是最优解。
那补货、调拨间隔周期应该如何确定?实际上,公司补货周期大概率已经确定,无论是什么形式决定的补货周期(以门店现有库存结构确定的补货周期,还是公司历史经验遗留)。补货周期如果已经确定,那调拨环节无论是安排在补货前或补货后都可以,相对每个补货周期来说,调拨动作存在补货前和补货后。
当然根据公司具体业务,调拨的周期不一定和补货同频,可以两个补货或多个补货周期后再调拨。
调拨逻辑
那应该基于什么逻辑实施商品调拨?商品调拨是将商品从低需求门店调往高需求门店,那基础的逻辑便是测算某门店某商品的销售需求,和门店补货的基础逻辑相同,这也从侧面说明了调拨是补货的一种。
周期销售预测
我们如何简单测算门店商品销售?这是一个销售预测问题,但是我们并不需要上复杂的模型精确测算门店的销量,事实上也没有这样的数学模型能预测门店销量,我们仅需要从门店最近商品销量预测某个”周期内”商品销量的上下限,即保证门店内有一定量库存,通过门店实际库存和应有库存的差距完成门店间商品调拨,商品库存过剩的门店调往库存不足门店。
合理库存测算
合理库存测算,理论上跟门店补货的最佳库存范围测算原理一致。通过
本公式处的 2 代表倍数 ,可以根据公司补货周期,商品销量情况,门店特性,商品特性决定,如下所示商品销量排名带来的倍数差异:
top1-10: 4
top11-30: 3
top30以上: 2
拿商品特性来说,由于不同商品的生产周期不同,从下采购订单到最终成品入库的时间千差万别。不同公司采购流程,生成效率,供应链水平导致门店商品存销比[2]存在较大差异。所以计算门店商品合理库存时,应该结合实际情况变换【合理库存】计算公式。
关于【合理库存】的测算请参考门店商品补货里的销量预测部分。
调拨策略
某商品在某城市内门店间调拨,基础数据结构包含门店,商品,销量,门店当前库存,预估的合理库存等字段,依据库存差距字段排序,如下所示:
门店 211406 商品合理库存与门店可用库存的差距数 4 ,是否全部调入门店 211411?我们是均匀分配还是集中分配疑惑是其他分配规则?不同的调拨策略导致商品分布不一样。
情况 1
合理库存不是一个区间范围,而是一个值时,我们可能的调拨策略如下所示:
- 最小可调拨
每次调拨商品最小单位 1 ,从库存剩余最多的门店调往库存最紧缺的门店,完成一轮调拨后,重新根据最新库存计算库存差距,按照库存差距排序后计算调拨最小单位商品 1。保证紧缺商品的门店依据差距量都能均匀调拨到商品。 (这种调拨会有个弊端单门店的单sku会和几个门店发生调拨关系,调拨次数多,调拨成本比较高,不建议) 最大可调拨
每次调拨商品最大可掉单位,从最大库存差距和最小库存差距的分别绝对值中取小值。如下公式所示:可调拨最大单位为 4
%2Cabs(-8))%0A#card=math&code=min%28abs%284%29%2Cabs%28-8%29%29%0A&id=i151F)
根据门店间可用库存和合理库存之间的差距,完成一轮调拨后,重复上述步骤开始新一轮调拨。这种方式,能有效减小调拨次数
- 需求匹配调拨
根据门店库存差距匹配门店,比如上述的 211406(盈余4) 调往门店211398(欠缺4)。 - 门店距离调拨
即使同城市,门店间距离也可能比较远,增加调拨成本。比如依据城市内的“区”概念,先在区内调拨,后城市内调拨,调拨的主要依据是根据门店间距离。关于门店间距离,可以根据实际情况人为指定可调门店,如门店 A 仅接受门店B、C、D 三个门店的调拨,并且优先级顺序是B、C、D;或者根据经纬度计算距离后依据距离远近调拨(如果能从地图)。 - 待定
情况 2
合理库存是一个区间范围,存在最小值、最大值,那我们在调拨时针对可调出的门店的商品数的计算是:
商品紧缺的门店的需求量计算,分两步,首先考虑合理库存范围的最小值是否满足,如果可调出门店的商品库存足够多则可考虑继续调往商品紧缺门店。剩余步骤按照情形 1 进行。
情况 3
以上两种情形不区分商品情况,无论是Top商品[3]还是畅销款都会按照门店实际库存和合理库存差距调拨,但是我们是不是可以考虑针对部门地区部分门店Top商品不参与调出(合理库存范围内),就是相信门店一定能够消耗的产品。之所以会形成滞销的情况,是经营过程中某些原因导致,而不是产品本身问题,后期可以通过提高销售技巧、产品培训等措施提高单品成交率。
情况 4
限制调拨商品范围,实际操作中往往需要结合店群,即不同类型门店调拨商品范围不同。但是要做到如此细颗粒度的商品管控是有比较高的管理成本,需要做好门店分类,商品分类。详见门店商品补货里门店分类、商品分类。
实际中,以上调拨情形都是交叉使用,每种情形并不是单独存在,我们在调拨的时候也需要根据实际情况确定调拨策略。个人觉得大部分场景下,情形 1 的情景已经足够使用。在情形 1 中结合一两种调拨调拨策略即可满足绝大部分场景,即使单一调拨策略也够用,毕竟在一定程度上促进了商品流转效率。
调拨过程演示
最小单位调拨,每次调拨 1 个单位
最大可调拨,每次调拨最大可掉单位
调拨实现
调拨策略的选择,可从实施难度以及成本两个维度平衡选择。实施难度可以分为技术上,以及可操作性上。可操作性上,将商品补货调拨数据嵌入到公司的 erp 系统中,方便终端人员使用,比如店长。毕竟只有方便他人才能利己,整个商品补货调拨系统足够有效,对销售确实有提升,并且使用足够方便才是补货调拨能真正落实的基础。当然,这是需要持续教育的,是需要让业务人员接受整个补货调拨逻辑。在商品运营过程中一部分职责是让终端业务人员(店长)接受门店进销存管理的相关理念以及指标标准,这是一个长期过程。
技术上,相比补货,门店见商品调拨显得更加有难度一些,门店商品补货不借助公司 IT 的力量,通过 SQL 或者 Excel 等工具也能批量实现,但是调拨涉及到循环,尤其有上千家门店以及上千商品 SKU 时,我们大部分的商品运营人员很难通过自身搞定。那公司的 IT 部门是否有资源供商品运营部门搭建商品补货调拨系统就是我们首要问题。假如在不能借助公司 IT 部门力量的时候,我们需要掌握一点数据编程语言来实现调拨,比如 R 或 Python。
SQL 也能实现调拨,相比 R 或 Python,个人觉得难度更高
R 调拨
确定调拨策略后,通过编程语言实现,难点在于不断循环函数的编写。
sku_transfer <- function(dt){
# 调拨是否继续阈值 设定调拨停止的条件
# 根据业务实际情况做相应调整修改 本处是多 1 个单位 且缺 大于 1 个单位
min_stock_chaju <- min(dt$库存差距)
max_stock_chaju <- max(dt$库存差距)
output <- data.table()
# 核心部分
while( max_stock_chaju > 1 & min_stock_chaju < -1){
#每次库存转移量
num <- min(abs(min_stock_chaju),abs(max_stock_chaju))
#num <- 1
#排序
setorderv(dt,cols = '库存差距')
n <- nrow(dt)
# 开始调拨
dt <- dt[1,可用库存:=可用库存 - num]
dt <- dt[n,可用库存:=可用库存 + num]
# 重新计算库存差距
dt[,库存差距:= 可用库存 - 应有库存]
# 重新排序
setorderv(dt,cols = '库存差距')
min_stock_chaju <- min(dt$库存差距)
max_stock_chaju <- max(dt$库存差距)
}
}
Python 调拨
def sku_transfer (df):
df=df.sort_values(by='库存差距',ascending=False)
n_row = df.shape[0]
df.index = range(0, n_row)
max_stock_gap=df['库存差距'].max()
min_stock_gap=df['库存差距'].min()
num = min(abs(max_stock_gap),abs(min_stock_gap))
while (max_stock_gap > 1) and (min_stock_gap < 1):
df.loc[0, '可用库存'] = df.loc[0, '可用库存'] + num
df.loc[n_row-1, '可用库存'] = df.loc[n_row-1, '可用库存'] - num
df.eval('库存差距=可用库存-应有库存', inplace=True)
df = df.sort_values(by='库存差距',ascending=False)
df.index = range(0, n_row)
max_stock_gap = df['库存差距'].max()
min_stock_gap = df['库存差距'].min()
num = min(abs(max_stock_gap),abs(min_stock_gap))
return df