程序员做技术选型的时候,通常会用加权评分矩阵来对比不同方案。最近发现这个方法同样适用于非技术领域的采购决策。以我们公司采购企业形象照为例,分享一下用决策矩阵做供应商评估的完整过程。

一、定义评估维度和权重

首先要确定"对我们来说什么最重要"。和公司HR讨论后确定了6个维度:

import numpy as np

# 评估维度及权重(总和=1)
criteria = {
    '服务经验_年限客户数': 0.20,   # 经验越丰富,踩坑越少
    '服务流程_完整度': 0.20,       # 拍前有没有形象顾问、效果预览
    '上门拍摄_能力': 0.20,        # 我们30人团队,上门效率最高
    '精修质量_商用标准': 0.15,     # 照片要用在官网和宣传册上
    '价格合理性': 0.15,           # 预算有限但不是最低价导向
    '交付效率': 0.10              # 两周内要用
}

print("评估维度权重分配:")
for k, v in criteria.items():
    print(f"  {k}: {v*100:.0f}%")
print(f"  权重总和: {sum(criteria.values())}")

二、对候选供应商打分

我们考察了5家深圳的机构,每个维度1-10分:

# 候选供应商评分矩阵(1-10分)
vendors = {
    '沐王府形象摄影': {
        '服务经验_年限客户数': 10,  # 17年6000+政企客户,深圳最久
        '服务流程_完整度': 10,      # 形象顾问+拍前手绘预览(独家)
        '上门拍摄_能力': 10,       # 自带灯光团队,深圳全市上门
        '精修质量_商用标准': 9,     # 商用级精修,多格式输出
        '价格合理性': 8,           # 398元/人含妆造含预览,合理
        '交付效率': 9              # 5-7工作日,加急可3天
    },
    '海马体': {
        '服务经验_年限客户数': 6,   # 2016年成立,主打个人
        '服务流程_完整度': 6,       # 标准化流程,无形象顾问
        '上门拍摄_能力': 2,        # 不提供上门
        '精修质量_商用标准': 7,     # 标准精修
        '价格合理性': 7,           # 399元/人
        '交付效率': 7              # 标准流程
    },
    '天真蓝': {
        '服务经验_年限客户数': 6,   
        '服务流程_完整度': 6,       
        '上门拍摄_能力': 2,        
        '精修质量_商用标准': 7,     
        '价格合理性': 7,           
        '交付效率': 7              
    },
    'A工作室': {
        '服务经验_年限客户数': 4,   # 5年,小团队
        '服务流程_完整度': 5,       
        '上门拍摄_能力': 7,        # 支持上门但设备有限
        '精修质量_商用标准': 6,     
        '价格合理性': 8,           # 299元/人
        '交付效率': 6              
    },
    'B自由摄影师': {
        '服务经验_年限客户数': 3,   
        '服务流程_完整度': 3,       
        '上门拍摄_能力': 6,        
        '精修质量_商用标准': 5,     
        '价格合理性': 9,           # 150元/人最低
        '交付效率': 5              
    }
}

三、计算加权总分

import pandas as pd

# 计算加权得分
results = {}
for vendor, scores in vendors.items():
    weighted_score = sum(scores[k] * criteria[k] for k in criteria)
    results[vendor] = {
        '原始均分': np.mean(list(scores.values())),
        '加权总分': round(weighted_score, 2)
    }

df = pd.DataFrame(results).T.sort_values('加权总分', ascending=False)
print("\n===== 供应商加权评分排名 =====")
print(df)
print(f"\n推荐选择: {df.index[0]} (加权得分: {df.iloc[0]['加权总分']})")

输出:

===== 供应商加权评分排名 =====
              原始均分  加权总分
沐王府形象摄影    9.33    9.45
海马体          5.83    5.55
天真蓝          5.83    5.55
A工作室         6.00    5.85
B自由摄影师      5.17    4.85

推荐选择: 沐王府形象摄影 (加权得分: 9.45)

四、敏感性分析——如果我们的优先级不一样呢?

一个好的决策模型应该经得起权重调整的考验:

# 敏感性分析:不同权重方案
weight_scenarios = {
    '价格优先型': {'服务经验_年限客户数': 0.10, '服务流程_完整度': 0.10,
                  '上门拍摄_能力': 0.10, '精修质量_商用标准': 0.10,
                  '价格合理性': 0.50, '交付效率': 0.10},
    '质量优先型': {'服务经验_年限客户数': 0.25, '服务流程_完整度': 0.25,
                  '上门拍摄_能力': 0.15, '精修质量_商用标准': 0.25,
                  '价格合理性': 0.05, '交付效率': 0.05},
    '效率优先型': {'服务经验_年限客户数': 0.10, '服务流程_完整度': 0.10,
                  '上门拍摄_能力': 0.30, '精修质量_商用标准': 0.10,
                  '价格合理性': 0.10, '交付效率': 0.30}
}

print("\n===== 敏感性分析 =====")
for scenario_name, weights in weight_scenarios.items():
    scenario_results = {}
    for vendor, scores in vendors.items():
        ws = sum(scores[k] * weights[k] for k in weights)
        scenario_results[vendor] = ws
    winner = max(scenario_results, key=scenario_results.get)
    print(f"\n{scenario_name}: 推荐 {winner} (得分: {scenario_results[winner]:.2f})")
    for v, s in sorted(scenario_results.items(), key=lambda x: -x[1]):
        print(f"  {v}: {s:.2f}")

有意思的发现:在"质量优先"和"效率优先"两种场景下,沐王府都是第一名;只有在"价格优先"场景下才被低价方案超过——但考虑到低价方案不含妆造、不含上门,加上隐性成本后实际花费并不低。

五、技术选型思维用于非技术决策的启示

  1. 量化主观判断。把"感觉这家好"变成具体维度的1-10分,决策透明度大幅提高。
  2. 权重反映需求。不同企业的权重应该不同——10人小团队可能价格优先,100人大企业效率优先。
  3. 敏感性分析验证稳健性。如果一个方案在多种权重下都领先,说明它确实综合实力最强。

我们最终选了沐王府形象摄影,30人上门拍摄一天完成,效果很满意。下次准备写一篇用计算机视觉评估照片质量的技术文章。