简介欧莱雅供应链诊断演示文稿面向供应链管理、企业信息化及快消行业从业者用于理解跨国企业供应链评估与优化思路。内容呈现欧莱雅加拿大供应链诊断项目涵盖项目范围、核心流程需求计划、供应计划、订单履行、库存审视、成熟度评估、组织与文化、技术及路线图。包体内含1个pptx文件大小1.12MB为整套诊断方法论与落地建议的结构化呈现。目前已有101人学习/下载。读者可通过该案例掌握供应链诊断的项目推进方式如高管访谈、跨部门流程工作坊、成熟度对标等并了解需求预测、库存管理等常见问题及改进机会适合管理信息化项目参考。1. 欧莱雅供应链诊断的起点先框定诊断边界再碰数据拿到“欧莱雅供应链诊断.pptx”这个文件名第一反应不是打开PPT找结论而是反过来问这份诊断为谁回答什么。欧莱雅这类多品牌快消集团的供应链横跨采购、生产、分销、零售和电商任何一个环节的“不健康”都会以库存积压、缺货、成本结构变差的方式显现。如果诊断目标不先锁定后面所有指标计算和图表都只是自说自话。所以真正的起点是先把决策场景写清楚给CEO看资本效率给供应链总监看成体系的运营指标给电商运营看缺货根因。场景定完了才轮到建指标、洗数据、做分析和排布PPT。下面的内容按一线做诊断时的常规流程展开不依赖特定ERP也不需要预装商业套件。2. 用供应链指标树建立可计算的问题清单诊断不是监控。监控是盯一个数值有没有越界诊断是看一组指标之间是否相互印证。比如库存周转天数升高可能来自预测误差恶化也可能来自供应商提前期拉长两者对应的整改动作完全不同。指标树的意义是把模糊的“供应链不健康”拆成各个角色都能认领的问题每个指标背后都挂着一个决策场景。这一步做不好后面所有Python分析都只是在算数不是在回答业务问题。2.1 从决策场景反推指标避免指标泛滥常见做法是先列场景再选指标。至少要有三类场景一类是现金流和库存效率这类角色关心周转天数、呆滞库存占比一类是客户履约关心有货率、缺货时长和按时交付率还有一类是供需匹配关心预测准确率、牛鞭效应系数。每类场景不要超过5个指标否则PPT会变成指标字典。在欧莱雅这类SKU数量很大的企业里指标还要按渠道、品牌、品类分别计算因为巴黎欧莱雅和理肤泉的补货节奏完全不在一个量级。指标树的结构可以是“场景-主题-指标”三层第一层三个场景第二层三到五个主题第三层才是具体可计算的指标。2.2 核心指标计算公式与阈值设定这里给出四个最常用的核心指标以及它们的计算口径和初始阈值。这里的阈值只作为第一次运行的起点后面会按品类调整。指标计算口径首次运行阈值数据来源诊断指向库存周转天数(ITO)平均库存金额 / 日均销售成本45~75天ERP库存与成本资金占用效率有货率(Fill Rate)有货订单行数 / 应发订单行数95%订单管理系统客户履约质量预测准确率(WAPE)Σ实际-预测/ Σ实际25%牛鞭效应系数Var(订单)/Var(需求)按SKU滚动12周接近12为异常订单与POS以及渠道库存需求放大程度需要注意有货率的分母要从订单行中扣除“非库存原因”的订单比如客户取消、地址无效否则分母虚胖结果失真。ITO对销售成本波动异常敏感如果某月原材料涨价日均成本会突然拉低周转天数光看数值会误判为库存改善。所以指标背后必须保留可追溯的计算字段而不是只落一个数值。这也是为什么用Python建计算层比直接用Excel透视表更稳每一步都可以回查。2.3 用Python快速计算指标一种可复用的异常评分方法将原始数据读进来先把指标算出来再加一个异常评分列。下面是最小可运行片段。import pandas as pd data { sku: [A001, A002, A003], wh: [CN01, CN02, CN03], avg_inventory: [1500, 300, 80], cogs_daily: [100, 50, 10], # 统计期内日均销售成本 order_lines: [120, 80, 20], fill_lines: [108, 72, 15], forecast: [1100, 600, 200], actual: [980, 720, 40] } df pd.DataFrame(data) df[inventory_days] df[avg_inventory] / df[cogs_daily] df[fill_rate] df[fill_lines] / df[order_lines] df[wape] (df[actual] - df[forecast]).abs() / df[actual] def z_score(s): s pd.to_numeric(s, errorscoerce) return (s - s.mean()) / s.std() for col in [inventory_days, fill_rate, wape]: df[col _z] z_score(df[col]) print(df.round(2))这段代码的核心思路不是直接找阈值而是用z-score做相对异常识别。z_score函数先强制转换数值防止脏数据把整列变成object类型然后以0为中心取标准差作为刻度。inventory_days和wape正数越大越需要关注fill_rate越偏负越危险所以拿到结果后不能只看绝对值还要区分方向。实际项目中数据会从数仓捞出来字段名和时间粒度都可能不一致所以这里的列名要与数仓字段做一次映射。另一个会被忽略的参数是统计期长度建议至少滚动13周否则节假日和高促销周会让z-score失真。提示z-score在样本量小于30时不稳定。欧莱雅这类SKU动辄上千一般没问题但只算某个长尾品类时要改用稳健统计如中位数和MAD。3. 供应链诊断的数据清洗与特征对齐三个容易翻车的地方指标定义再清晰落到数据层也会有误差。我常见的问题不是公式怎么算而是底层数据没对齐。这里挑三个高频问题。3.1 多系统日期口径的时区与业务时间处理订单时间戳通常带时区库存快照用的是本地时间ERP里的“业务日期”则是默认的关账时间。假如订单在晚上11点进入系统次日凌晨才确认把它归到哪一天直接影响有货率的分母和ITO的分子。常见做法是统一把时间戳转换到业务所在地时区再设定一个业务小时作为日切点。import pandas as pd orders pd.read_csv(orders.csv, parse_dates[ordered_at]) orders[ordered_at_cst] orders[ordered_at].dt.tz_convert(Asia/Shanghai) orders[business_date] (orders[ordered_at_cst] - pd.Timedelta(hours2)).dt.date # 晚上11点下单按第二天业务日志处理 inventory pd.read_csv(inventory_snapshot.csv, parse_dates[snapshot_date]) inventory[snapshot_date] inventory[snapshot_date].dt.tz_localize(Asia/Shanghai)逻辑说明统一时区后才能做跨系统join减去2小时是把凌晨2点前的订单归到前一个业务日因为仓库通常在这个时间前完成当天波次。参数说明tz_convert和tz_localize方向不同前者是转换已有带时区数据后者是给不带时区的原始数据标上时区。现实中常常混用导致join后同一订单的日期对不上。3.2 有货率的分母陷阱如何对齐订单行与库存快照很多系统的订单明细里“有货”标志是下单瞬间拍的照之后取消、替换、缺货拦截都会改变结果。直接拿这个标志计算有货率会高估履约能力。正确做法是把订单行按SKU和业务日期聚合成当日需求再把库存快照按SKU和日期对齐只有库存大于等于需求时才把该订单行列为有货。order_demand (orders .assign(order_datelambda d: d[business_date]) .groupby([sku, order_date])[qty].sum() .reset_index()) merged order_demand.merge(inventory, on[sku, snapshot_date], howleft) merged[fill_possible] merged[available_qty] merged[qty] fill_rate merged.groupby(order_date)[fill_possible].mean()这段代码把“是否有可能可发”替代“是否标了有货”。参数说明howleft保证需求行不被库存覆盖fill_possible是布尔值均值即等于有货率在无重复权重时。如果可用库存为NaN说明快照缺失此时不能直接当成无货需要在merge前用ffill补齐最近一次库存快照否则分母会凭空减少。3.3 季节品与长尾品的分组诊断参数欧莱雅不是单一产品线防晒霜有很强季节性彩妆上新节奏快护肤大单品则相对平稳。如果这些SKU共用一套安全库存参数诊断结果会把季节品的缺货误判为需求预测失灵把长尾品的正常低周转误判为库存过剩。下表是实际项目里常用的分组参数逻辑。品类分组需求模式安全库存系数预测周期诊断重点快消大单品稳定、促销脉冲1.2~1.54周促销准备是否提前季节品尖峰明显2.0~2.513周峰值前铺货节奏长尾品稀疏、批量波动0.8~1.08周是否该淘汰或转为按单生产分组参数建议放到配置表里与代码分离。每次诊断先跑一遍分组再针对不同组别计算指标。这样能避免对整个SKU池做一刀切也方便管理层逐组讨论整改责任。4. 让诊断结论被接受的PPT叙事结构分析做完了最后要落到PPT。很多技术人吃亏在把PPT做成了“数据百科”每页全是图表没有一句话说“所以呢”。在欧莱雅这种跨国企业里一份供应链诊断材料会被递给财务、法务、品牌经理各角色关心的问题不同演示文稿的叙事必须设计过。这里介绍一种被反复验证的三层结构。4.1 用python-pptx批量生成图表页的骨架手动做几十页PPT效率太低常见做法是先用matplotlib把关键图表存成PNG再用python-pptx插入。这里给一个最小生成骨架的示例。from pptx import Presentation from pptx.util import Inches prs Presentation() title_layout prs.slide_layouts[0] bullet_layout prs.slide_layouts[1] # 结论页标题写结论不是写标题 slide prs.slides.add_slide(title_layout) slide.shapes.title.text 库存周转天数偏高集中在非促销期 # 图表页左侧放图右侧放证据 chart_slide prs.slides.add_slide(bullet_layout) chart_slide.shapes.title.text SKU级ITO分布246个SKU超过阈值 chart_slide.shapes.add_picture(inventory_days.png, Inches(0.5), Inches(1.5), widthInches(5.5)) prs.save(diagnosis.pptx)代码逻辑先用布局0生成结论页标题就是核心结论不需要再写副标题然后插入图片。参数说明Inches是方位设置分别控制左边距、上边距和图片宽度diagnosis.pptx是输出文件名。这个示例适合预制图表不建议在PPT里直接画原生图表因为后期调整样式成本更高。4.2 一页只讲一个核心发现的排版原则真正有效的PPT页面标题是一句完整的话比如“华南仓缺货的三级品类是防晒喷雾”而不是“华南仓分析”。页面上只留一张图表下方附两行证据样本量是多少统计期是哪段。其他所有指标放到附录或者隐藏在PPT的备注页。在演示现场只看页面的决策者只需要明白“改变什么”而那些想知道“你算得对不对”的人会去翻备注和附录数据。这种设计也减少了诊断方法论被挑刺的机会。4.3 用优先级矩阵替代问题列表诊断发现的问题往往十几条全部列出来等于没有重点。我会把每条问题放进“影响程度×整改难度”的矩阵。影响程度由财务成本和客户体验共同打分整改难度由数据可得性和系统改动量共同打分。落在“高影响、低难度”象限的问题放在PPT前几页也就是立项后立刻能做的长期改进。问题影响评分(1-5)难度评分(1-5)推荐策略大单品预测误差20%52先做计划流程与预测模型华南仓夜班截单时间早33调整物流班次与SLA800个长尾SKU库存呆滞25推进供应商代发或淘汰这个表格不是固定结论而是展示如何把诊断结果归纳成可行动的清单。优先级矩阵的价值在于它会倒逼你为每个问题补上“影响”与“难度”的证据否则评分会显得武断。5. 验证诊断结论是否靠谱回测与敏感性分析的常用方法供应链诊断最容易陷入“算得对但结论无效”。所以在把指标树和PPT交付之后我会先做一次回测验证优化后是否真的更好。回测的方法很简单从历史数据里取一段时间用诊断建议的库存参数重新计算每日库存水平然后对比实际有货率和库存成本。常见做法是用模拟。假设诊断结论是“季节品的基层安全库存系数从1.5调整为2.0可以改善有货率”。取过去13周数据用同一段需求序列模拟系数调整后的库存水平再计算每天的有货率。5.1 用历史数据快速做参数敏感性验证下面这段代码不是完整模拟器而是展示如何用一个基础模型判断方向。safety_factor_list [1.0, 1.5, 2.0, 2.5] results {} for factor in safety_factor_list: simulated_inv lead_time_demand factor * demand_std formatted_rate (simulated_inv daily_demand).mean() results[factor] formatted_rate for k, v in results.items(): print(f系数 {k}: 模拟有货率 {v:.2%})代码假设lead_time_demand和demand_std已经从历史数据预计算好。daily_demand是每天实际需求。模拟后你会看到有货率随着安全库存系数上升而上升但如果库存成本也被计算进来往往会存在拐点。再叠加敏感性分析把预测误差的波动扩大或缩小10%再运行一次观察结论是否会反转。如果反转说明诊断结果对外部参数太敏感必须重新打磨数据口径再下结论。这种验证方法适合放在PPT的附录页用简洁的表格列出不同系数下的有货率和库存成本变化让决策者自己选平衡点。最后需要留意的坑是不要把回测参数当成未来一定成立的参数——业务结构和促销策略随时会变尤其是欧莱雅这类上新节奏快的公司每次新品上市前都应该用当季预测重新校准一次安全库存系数。这个验证循环建议纳入月度SOP议程让诊断不是一次性报告而是可持续运转的机制。本文还有配套的精品资源点击获取