1. ABC分类法基础
1.1 起源:从帕累托观察到库存管理
ABC分类法的思想根源可以追溯到19世纪末意大利经济学家维尔弗雷多·帕累托(Vilfredo Pareto)的观察。帕累托在研究英国财富分配时发现:约20%的人口掌握了约80%的财富。这一“关键少数与次要多数”的统计规律后来被广泛应用于质量管理、经济学和运营管理领域。
1951年,美国通用电气公司的工程师H. Ford Dickie在库存管理中首次系统化应用了这一原则,提出了“ABC库存分类法”。其核心洞察是:库存中的物料在价值贡献上存在显著的不均衡性——少数高价值物料占据了总库存价值的大部分,而大量低价值物料只贡献了很小一部分价值。
关键里程碑: 帕累托原则(80/20法则)→ 质量管理(朱兰博士)→ 库存管理(Dickie, 1951)→ 现代供应链ABC分类体系。
1.2 核心原理:帕累托原则在库存中的映射
ABC分类法将库存物料按年度消耗金额(年需求量 × 单位成本)从高到低排序,然后划分为三个类别:
| 类别 | 物料数量占比 | 年度消耗金额占比 | 管理策略 |
|---|---|---|---|
| A类 | 5% – 15% | 70% – 80% | 严格管控、高频盘点、精准预测、安全库存低 |
| B类 | 15% – 25% | 15% – 25% | 适度管控、定期盘点、常规预测 |
| C类 | 60% – 80% | 5% – 10% | 简化管理、低频率盘点、高安全库存、批量订购 |
分类的数学基础是累计价值占比曲线(又称帕累托曲线)。设物料按价值降序排列,第 \( i \) 个物料的累计价值占比为:
累计价值占比(i) = Σ(第1到第i个物料的价值) / 总库存价值 × 100%
通常的划分阈值:
- A类:累计价值占比达到 70% – 80% 的前几个物料。
- B类:累计价值占比从 80% 到 95% 之间的物料。
- C类:累计价值占比最后 5% – 10% 的剩余物料。
实践提示: 阈值并非固定不变。在工程实践中,A类物料数量占比通常控制在 5%–15% 之间,具体取决于企业的库存结构和管理精细度要求。阈值调整正是本课程后续“参数调优”的核心内容。
1.3 在库存管理中的核心价值
ABC分类法不是简单的“贴标签”工具,而是资源分配决策框架。其核心价值体现在以下四个维度:
- 管理精力聚焦:将有限的管理资源(人力、系统算力、盘点频次)集中在A类物料上,避免“平均用力”。
- 库存成本优化:对A类物料设置较低的安全库存、高频次小批量补货,降低资金占用;对C类物料设置较高安全库存、大批量补货,降低订购成本。
- 服务水平差异化:A类物料采用更精准的需求预测和更短的补货提前期,保障关键物料不缺货;C类物料允许适度缺货风险。
- 数据驱动决策基础:ABC分类是后续库存参数调优(安全库存、再订货点、经济订购批量)的输入前提。
常见误区: 仅按单价分类,忽略年需求量;分类后不动态更新;将ABC分类等同于“重要性排序”而忽略物料可替代性和供应风险。这些误区会导致分类失效,本课程后续章节将逐一给出工程化解决方案。
1.4 适用场景与边界条件
ABC分类法并非万能,其适用性取决于库存特征和企业运营环境:
| 适用场景 | 特征描述 | 典型行业 |
|---|---|---|
| 高适用 | 物料种类多(>500 SKU)、价值分布高度不均衡、需求相对稳定 | 制造业原材料、备品备件、零售快消品 |
| 中等适用 | 物料种类中等、价值分布较均匀、需求有一定波动 | 医疗器械、电子元器件、化工原料 |
| 低适用 | 物料种类少、价值分布均匀、需求极度不稳定或项目型 | 定制设备、工程项目、一次性采购 |
在低适用场景中,建议引入多维分类(如ABC-XYZ矩阵,结合需求波动性)或聚类分析等更精细的方法,这些内容将在本课程后续章节展开。
1.5 工程实践中的分类流程
在Python工程实现中,ABC分类的标准流程包含以下步骤:
- 数据准备:获取物料清单(SKU)、年需求量、单位成本。
- 计算年度消耗金额:年需求量 × 单位成本。
- 降序排序:按年度消耗金额从高到低排列。
- 计算累计占比:累计金额 / 总金额 × 100%。
- 阈值划分:根据预设阈值(如A: 0–80%, B: 80–95%, C: 95–100%)分配类别。
- 结果验证:检查A类物料数量占比是否在合理范围(5%–15%),必要时调整阈值。
import pandas as pd
def abc_classify(df, value_col='annual_value', a_threshold=0.8, b_threshold=0.95):
"""
标准ABC分类函数
Parameters:
df: DataFrame,包含物料ID和年度消耗金额
value_col: 年度消耗金额列名
a_threshold: A类累计价值占比阈值(默认80%)
b_threshold: B类累计价值占比阈值(默认95%)
Returns:
df: 添加了ABC分类标签的DataFrame
"""
df_sorted = df.sort_values(value_col, ascending=False).reset_index(drop=True)
total_value = df_sorted[value_col].sum()
df_sorted['cum_pct'] = df_sorted[value_col].cumsum() / total_value
conditions = [
df_sorted['cum_pct'] <= a_threshold,
df_sorted['cum_pct'] <= b_threshold,
df_sorted['cum_pct'] > b_threshold
]
choices = ['A', 'B', 'C']
df_sorted['abc_class'] = pd.np.select(conditions, choices, default='C')
return df_sorted