分析背景#
采购部门提出需求:
我们和 50+ 家供应商合作,但不知道哪些供应商的价格偏高,哪些有议价空间。
目标:
- 识别价格异常的供应商
- 发现同品类不同供应商的价格差异
- 分析价格随时间的变化趋势
口径定义#
数据来源#
- 数据源:ERP 采购订单表
- 时间范围:2023-01-01 至 2023-12-31
- 筛选条件:
- 订单状态 = 已完成
- 金额 > 0
- 排除退货订单
核心指标#
| 指标 | 定义 | 计算公式 |
|---|---|---|
| 单价变动率 | 同一物料的价格波动程度 | (最高价 - 最低价) / 平均价 |
| 供应商集中度 | 采购金额在供应商间的分布 | 前5供应商金额 / 总金额 |
| 价格离散度 | 同品类不同供应商的价格差异 | 标准差 / 平均值 |
数据范围#
# 数据筛选逻辑
df = df[
(df['订单状态'] == '已完成') &
(df['金额'] > 0) &
(df['订单类型'] != '退货')
]数据处理#
数据清洗#
import pandas as pd
# 读取数据
df = pd.read_excel("采购订单.xlsx")
# 数据清洗
df['单价'] = df['金额'] / df['数量']
df['月份'] = pd.to_datetime(df['订单日期']).dt.to_period('M')
# 剔除异常值(单价为0或负数)
df = df[df['单价'] > 0]
# 物料名称标准化
df['物料名称'] = df['物料名称'].str.strip().str.upper()处理逻辑#
# 1. 计算每个物料的价格统计
price_stats = df.groupby('物料编码').agg({
'单价': ['mean', 'std', 'min', 'max', 'count']
}).round(2)
price_stats.columns = ['平均价', '标准差', '最低价', '最高价', '采购次数']
price_stats['变动率'] = (price_stats['最高价'] - price_stats['最低价']) / price_stats['平均价']
# 2. 识别高变动物料
high_variance = price_stats[
(price_stats['变动率'] > 0.2) & # 变动超过20%
(price_stats['采购次数'] >= 3) # 至少采购3次
]
# 3. 供应商价格对比
supplier_compare = df.groupby(['物料编码', '供应商']).agg({
'单价': 'mean',
'数量': 'sum'
}).reset_index()分析结果#
主要发现#
-
价格波动大的物料:共发现 23 种物料价格变动超过 20%,主要集中在 LED 模组类
-
供应商价格差异:
- 同一型号 LED 模组,供应商 A 比供应商 B 贵 15%
- 但供应商 A 的交货准时率更高
-
价格趋势:
- Q2-Q3 芯片类物料价格上涨约 8%
- Q4 有所回落
可视化#
主要图表(略,实际项目中用 Plotly 生成):
- 物料价格波动 Top 10 柱状图
- 供应商采购金额分布饼图
- 关键物料价格趋势折线图
结论与建议#
- 议价重点:对 LED 模组类物料重新询价,预计可节省 5-8%
- 供应商整合:部分小额供应商可考虑整合
- 价格监控:建立月度价格监控机制,异常波动及时预警
局限性#
- 数据局限:只有采购订单数据,缺少市场价格对比
- 方法局限:未考虑质量差异、账期差异等因素
- 时效性:分析基于历史数据,市场情况可能已变化