P paper2skillsPlaybook
AI 路线图 →

供需缺口分析与优先级分配决策 — 供给不足时的SKU优先级量化与分配算法

Skill-Demand-Supply-Matching-Gap-Analysis · 04-供应链

causalexperimentforecastingoptimizationfraud_detection广告与投放供应链与补货定价与利润风控与合规WF-A 智能补货WF-B 广告优化WF-J DTC 独立站增长WF-K 全域风险防御WF-L 内容营销增长
年化 ROI15-25万元
实现难度⭐⭐⭐☆☆
业务视角
适用角色供应链负责人 · 采购负责人 · CEO / 运营 VP
适用平台Amazon FBA · 海外仓 · 多国仓位(美/欧/日)
什么情况下用库存周转率低,资金压在海外仓出不来;SKU 断货紧急空运,物流成本吃掉毛利;多仓库存分布不均
成功是什么样的库存周转天数从 90 天降到 60 天,断货率 <3%,海外仓综合成本降低 15-25%
业务痛点
库存周转天数太长资金压死了断货了只能空运救急成本爆了多市场库存分配不均

1. 解决的问题

S&OP面临"供给不足时靠直觉分配库存"——多维优先级评分模型将AB类大促满足率从80%提升至95%,年化增量销售15-25万元

2. 核心算法逻辑

供需缺口分析 是S&OP中最关键但最缺乏量化工具的决策场景:当供给不足以满足所有需求时,如何分配有限库存?

3. 业务应用场景

场景A:大促前供需缺口紧急分配 - 业务问题:Black Friday前2周发现总备货量比需求计划少30%,无法全部满足,需要决定哪些SKU/渠道先保证 - 数据要求:各SKU需求计划 + 可供应量 + 毛利率 + 平台重要性权重 - 预期产出: - 供需缺口:总缺口15,000件(-30%) - 优先保证:A类旗舰款(最高优先级,全量满足) - 压缩供给:C类配件(优先级低,削减50%) - 行动:旗舰款紧急空运500件补缺,配件申请暂停部分广告 - 业务价值:精准分配避免旗舰款断货(GMV损失约20万),同时控制总缺口影响

**场景B:多平台供需冲突下的渠道优先级决策** - **业务问题**:同款吸奶器在Amazon/TikTok Shop/独立站都有备货需求,但总库存不足,三个渠道应该如何分配 - **数据要求**:各渠道预计销量 + 渠道毛利率 + 各平台战略权重 - **预期产出**:Amazon优先(Buy Box排名影响最大)→ TikTok Shop次之 → 独立站最后 - **业务价值**:系统化决策代替拍脑袋,保护最重要渠道的排名和口碑

4. 输入数据要求

请查看原始代码模板获取输入规格。

5. 输出结果

请查看原始代码模板获取输出规格。

6. 业务价值 / ROI

  • ROI预估:供需缺口精确分配使AB类旗舰款满足率从80%提升至95%,大促期间年化增量销售约15-25万元;同时避免CD类过度分配导致的积压
  • 实施难度:⭐⭐⭐☆☆(需要建立优先级评分体系和跨部门共识,核心难点是权重设定)
  • 优先级评分:⭐⭐⭐⭐⭐(陈凤霞:"供给不足时的分配决策是S&OP的核心价值,拍脑袋分配每次都是错的")
  • 评估依据:大促期间供给短缺是常态(需求难精确预测),系统化分配决策比直觉判断提升约30%的GMV效率

7. 代码模板

代码块数量:1 · 路径:未检测到

"""
供需缺口分析与优先级分配决策
功能:供需缺口量化 / 多维度优先级评分 / 分配方案生成 / 行动建议
输入:需求计划 + 可供应量 + SKU属性
输出:分配方案 + 优先级排名 + 缺口行动计划
"""
import numpy as np
import pandas as pd
import warnings
warnings.filterwarnings('ignore')


def generate_supply_demand_data(n_skus=25, seed=42):
    """生成供需数据"""
    np.random.seed(seed)
    
    abc_classes = np.random.choice(['A', 'B', 'C', 'D'], n_skus,
                                   p=[0.08, 0.24, 0.40, 0.28])
    channels = np.random.choice(['Amazon-US', 'TikTok', 'Shopify', 'Amazon-DE'],
                                n_skus, p=[0.50, 0.20, 0.20, 0.10])
    
    records = []
    for i in range(n_skus):
        abc = abc_classes[i]
        demand = {'A': 1500, 'B': 600, 'C': 200, 'D': 50}[abc] * np.random.uniform(0.6, 1.4)
        
        # 供应短缺场景:总体供应=需求的70%
        supply_ratio = np.random.uniform(0.55, 0.95)  # 有的SKU缺更多
        supply = demand * supply_ratio
        
        gross_margin = {'A': 0.45, 'B': 0.38, 'C': 0.30, 'D': 0.22}[abc]
        gross_margin *= np.random.uniform(0.85, 1.15)
        
        # 战略重要性(平台+品类)
        strategic = {
            'Amazon-US': 0.90, 'Amazon-DE': 0.75, 'TikTok': 0.70, 'Shopify': 0.65
        }[channels[i]] * {'A': 1.0, 'B': 0.85, 'C': 0.70, 'D': 0.50}[abc]
        
        # 缺货惩罚(断货会导致排名/流量损失)
        stockout_penalty = {'A': 0.95, 'B': 0.75, 'C': 0.50, 'D': 0.25}[abc]
        
        # 库存风险(过度分配的风险,滞销品风险高)
        inventory_risk = {'A': 0.10, 'B': 0.20, 'C': 0.40, 'D': 0.60}[abc]
        
        records.append({
            'sku_id': f'SKU-{i+1:03d}',
            'abc_class': abc,
            'channel': channels[i],
            'demand_qty': round(demand),
            'supply_qty': round(supply),
            'gap_qty': round(demand - supply),
            'gap_pct': round((demand - supply) / demand * 100, 1),
            'gross_margin': round(gross_margin, 3),
            'strategic_score': round(strategic, 3),
            'stockout_penalty': round(stockout_penalty, 3),
            'inventory_risk': round(inventory_risk, 3),
        })
    
    return pd.DataFrame(records)

8. 论文来源

  • 2311.06782