P paper2skillsPlaybook
AI 路线图 →

在途ETA准确率与到货履约率KPI — 过程数据vs结果数据的全链路在途管理体系

Skill-Inbound-ETA-Accuracy-KPI · 04-供应链

causalexperimentrecommendation供应链与补货推荐与搜索WF-A 智能补货
实现难度⭐⭐⭐☆☆
业务优先级⭐⭐⭐⭐⭐
业务视角
适用角色供应链负责人 · 采购负责人 · CEO / 运营 VP
适用平台Amazon FBA · 海外仓 · 多国仓位(美/欧/日)
什么情况下用库存周转率低,资金压在海外仓出不来;SKU 断货紧急空运,物流成本吃掉毛利;多仓库存分布不均
成功是什么样的库存周转天数从 90 天降到 60 天,断货率 <3%,海外仓综合成本降低 15-25%
业务痛点
库存周转天数太长资金压死了断货了只能空运救急成本爆了多市场库存分配不均

1. 解决的问题

在途数据有但从不用形成数据孤岛——区分在途过程数据(ETA准确率/异常率)vs结果数据(到货率),量化书中四大落地障碍,缺货归因中在途延误占比是在途管理价值的终极量化

2. 核心算法逻辑

书籍核心洞察(陈凤霞):书中第五章专节揭示了在途库存管理最容易被忽视的区分:过程数据(异常跟进)vs 结果数据(履约达成)。书中还系统分析了在途数据"无法落地"的四大根因——这是多数卖家的痛点所在。

3. 业务应用场景

场景A:ETA准确率与安全库存动态调整联动

- 业务问题:某卖家每次海运延误都是"突然"发现的,当ETA变化通知到运营团队时库存已经告急 - 过程KPI应用: 1. 建立ETA准确率基线:某航线历史P80延迟=6天(80%批次延误≤6天) 2. 安全库存=提前期内日均销售×延误天数缓冲(按P80设定) 3. 当ETA变化触发"延误预警"(>3天),自动计算影响的SKU缺货风险 4. 缺货风险SKU→触发空运补货评估(空运成本 vs 缺货损失) - 预期产出:提前3-5天预警,应急处理时间足够,断货率从12%降至3%

- **业务问题**:团队有在途数据但从不用(典型的"数据富,洞察穷") - **落地路径**:障碍1→统一货代数据格式标准;障碍2→要求货代ETA变化6小时内推送;障碍3→建立"ETA变化N天→启动X动作"规则手册;障碍4→将在途KPI纳入运营团队周会必检项

4. 输入数据要求

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

5. 输出结果

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

6. 业务价值 / ROI

  • ROI 预估:在途延误导致的缺货占总缺货的40-60%,提前3-5天预警使应急处理成本降低50%;以月缺货损失$5万计算,减少40%≈$2万/月;系统$2万,ROI>1000%
  • 实施难度:⭐⭐⭐☆☆(需要货代API或人工录入ETA更新数据;四大障碍中数据障碍最难克服)
  • 优先级:⭐⭐⭐⭐⭐(书中专节讲解,且明确量化了"缺货归因率"这个被低估的指标)
  • 适用规模:月均在途批次>5个的卖家,批次越多价值越高
  • 数据依赖:货代提供的ETA更新记录、实际到港时间、SKU与批次的对应关系

7. 代码模板

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

"""
在途ETA准确率与到货履约率KPI体系
基于《全链路管理》陈凤霞 第五章第五节
过程数据(异常跟进) vs 结果数据(履约达成)
"""
import numpy as np
import pandas as pd
from dataclasses import dataclass, field
from typing import Dict, List, Optional
from datetime import datetime, timedelta
import warnings
warnings.filterwarnings('ignore')


@dataclass
class TransitBatchRecord:
    """在途批次记录"""
    batch_id: str
    sku_id: str
    route: str                      # 如 '上海→洛杉矶'
    planned_units: int
    actual_units: int
    planned_eta: datetime           # 计划到货日
    actual_arrival: Optional[datetime]  # 实际到货日(None=未到)
    transit_days_planned: int       # 计划在途天数
    eta_updates: List[datetime] = field(default_factory=list)  # ETA历史更新记录
    delay_cause: Optional[str] = None  # 延误原因


class InboundETAKPIAnalyzer:
    """在途ETA准确率与到货KPI分析器"""

    @staticmethod
    def compute_eta_accuracy(batch: TransitBatchRecord) -> Optional[float]:
        """计算单批次ETA准确率"""
        if batch.actual_arrival is None:
            return None
        delay_days = (batch.actual_arrival - batch.planned_eta).days
        accuracy = 1 - abs(delay_days) / max(batch.transit_days_planned, 1)
        return max(accuracy, 0.0)

    @staticmethod
    def delay_days(batch: TransitBatchRecord) -> Optional[int]:
        """计算延迟天数(正=延迟,负=提前)"""
        if batch.actual_arrival is None:
            return None
        return (batch.actual_arrival - batch.planned_eta).days

    def route_analytics(self, batches: List[TransitBatchRecord]) -> pd.DataFrame:
        """按航线分析ETA准确率分布"""
        route_data = {}
        for b in batches:
            if b.actual_arrival is None:
                continue
            dd = self.delay_days(b)
            ea = self.compute_eta_accuracy(b)
            if b.route not in route_data:
                route_data[b.route] = {'delays': [], 'accuracies': [], 'units': []}
            route_data[b.route]['delays'].append(dd)
            route_data[b.route]['accuracies'].append(ea)

8. 论文来源

未自动抽取;请查看原始 Skill 卡片。