效率评估模型全解析:从基础DEA到超效率SBM的进阶指南
当我们需要评估不同决策单元(如企业、医院或学校)的相对效率时,数据包络分析(DEA)及其衍生模型成为了不可或缺的工具。然而,面对CCR、BCC、SBM、超效率SBM等众多变体,初学者往往感到困惑:这些模型究竟有何区别?我的研究问题应该选择哪种模型?本文将系统梳理这些模型的核心差异、适用场景,并通过Python代码示例展示实际操作中的关键点。
1. 效率评估模型演进史:从基础到前沿
效率评估模型的演变反映了研究者对现实问题复杂性的逐步认识。1978年,Charnes、Cooper和Rhodes提出的CCR模型开创了数据包络分析的先河,它假设规模报酬不变(CRS),通过线性规划方法计算决策单元的相对效率。这个基础模型虽然简单直接,但存在明显局限——它无法处理规模报酬可变(VRS)的情况。
1984年,Banker、Charnes和Cooper提出的BCC模型解决了这一问题,通过引入凸性约束,允许效率评估在规模报酬可变的假设下进行。这两个径向模型(CCR和BCC)构成了传统DEA的核心,但它们都面临一个共同问题:忽略了投入和产出的"松弛"(即未充分利用或过度产出的部分)。
2001年,Tone提出的SBM(Slacks-Based Measure)模型彻底改变了这一局面。SBM直接将松弛变量纳入目标函数,采用非径向、非角度的测量方式,能够更准确地捕捉效率损失。随后,为处理环境效率评估中的"坏产出"(如污染),考虑非期望产出的SBM模型应运而生。
模型演进的最后一步是超效率SBM的提出。传统DEA模型(包括普通SBM)的效率值被限制在0到1之间,导致所有有效单元(效率值为1)无法进一步区分。超效率技术突破了这一限制,允许效率值大于1,从而实现了对高效决策单元的精细排序。
关键演进节点对比表:
| 模型特性 | CCR (1978) | BCC (1984) | SBM (2001) | 超效率SBM |
|---|---|---|---|---|
| 规模报酬假设 | 不变(CRS) | 可变(VRS) | 可选 | 可选 |
| 测量方式 | 径向 | 径向 | 非径向 | 非径向 |
| 处理松弛 | 否 | 否 | 是 | 是 |
| 考虑坏产出 | 否 | 否 | 可选 | 可选 |
| 效率值范围 | [0,1] | [0,1] | [0,1] | ≥0 |
| 排序有效单元 | 不能 | 不能 | 不能 | 能 |
2. 核心概念拆解:理解模型差异的关键维度
要正确选择和应用不同的DEA模型,需要深入理解几个关键概念差异。这些维度决定了模型的特性和适用场景。
径向vs非径向:
- 径向模型(如CCR、BCC)假设所有投入或产出按相同比例改进,计算时需要指定是投入导向还是产出导向。这种简化处理在实际中往往不成立,特别是当不同投入/产出的改进潜力差异较大时。
- 非径向模型(如SBM)允许各项投入/产出以不同比例调整,更符合现实情况。例如,一个工厂可能更容易减少能源消耗而非劳动力投入。
角度vs非角度:
- 角度模型需要预先指定是以投入最小化还是产出最大化为目标,这会影响效率评估结果。例如,医院评估若采用投入导向,则关注在给定产出下能否减少投入;若采用产出导向,则关注在给定投入下能否增加产出。
- 非角度模型(如SBM)同时考虑投入和产出的优化,无需预先指定导向,提供了更全面的效率视角。
松弛变量的处理:传统DEA模型在计算效率时忽略了松弛变量,可能导致效率被高估。例如,一个决策单元可能在某个投入项上存在大量未充分利用的资源,但由于其他投入项表现良好,仍被评估为完全有效。SBM模型通过将松弛直接纳入目标函数,解决了这一问题。
非期望产出的纳入:在环境效率、医疗质量等评估中,常需要同时考虑期望产出(如GDP、治愈病例)和非期望产出(如污染、医疗事故)。普通DEA模型无法直接处理这种复杂情况,而专门的SBM变体通过调整生产可能性集的定义,实现了对坏产出的合理考量。
提示:选择模型时,应先明确研究问题是否涉及非期望产出、是否需要区分高效单元、数据是否呈现规模报酬可变等特性,再据此选择最适合的模型变体。
3. 模型选择实战指南:从问题到解决方案
面对具体研究问题时,如何选择合适的效率评估模型?以下决策流程和案例说明将提供清晰指导。
决策树框架:
- 是否需要处理非期望产出?
- 是 → 考虑SBM或超效率SBM的非期望产出版本
- 否 → 进入下一问题
- 是否需要区分效率值为1的单元?
- 是 → 选择超效率模型(DEA或SBM)
- 否 → 进入下一问题
- 数据是否显示规模报酬可变?
- 是 → 选择BCC或SBM-VRS
- 否 → 选择CCR或SBM-CRS
- 是否存在明显的投入/产出松弛?
- 是 → 优先考虑SBM模型
- 否 → 传统DEA可能足够
典型应用场景示例:
案例1:医院效率评估
- 特点:不同规模医院、多种投入(医生、设备、床位)和产出(门诊量、手术量)、可能存在医疗质量问题(非期望产出)
- 推荐模型:考虑非期望产出的超效率SBM-VRS
- 理由:需要处理医疗事故作为坏产出,区分高效医院,且医院规模差异明显
案例2:制造业绿色生产率
- 特点:评估能源使用效率,产出包括正产出(产值)和负产出(碳排放)
- 推荐模型:考虑非期望产出的SBM-Malmquist
- 理由:需要分析效率随时间变化,且必须纳入环境因素
案例3:银行分支机构评比
- 特点:相似规模的分行,主要关注投入最小化(成本效率)
- 推荐模型:投入导向的BCC或超效率DEA
- 理由:无坏产出,规模相近,可能需要排名高效分行
常见误区警示:
- 错误:在存在明显松弛的情况下使用径向模型 → 结果:效率被高估
- 错误:忽略规模报酬特性随意选择CRS/VRS → 结果:基准面设定不当
- 错误:需要排序高效单元却使用普通DEA → 结果:无法区分前沿面上的单元
- 错误:有非期望产出却使用传统模型 → 结果:效率评估偏离实际问题
4. Python实现详解:从理论到代码
理解了模型原理后,实际操作中的编程实现成为关键环节。下面以考虑非期望产出的超效率SBM为例,解析Python实现的核心要点。
环境准备与数据格式:首先确保安装必要的科学计算库:
import numpy as np from scipy.optimize import linprog import pandas as pd输入数据通常组织为DataFrame或数组,行代表决策单元,列代表不同指标。例如:
# 示例数据结构 inputs = np.array([[2, 3], [4, 1], [3, 2]]) # 两个投入指标 good_outputs = np.array([[5], [4], [6]]) # 一个期望产出 bad_outputs = np.array([[1], [2], [1]]) # 一个非期望产出核心算法实现:超效率SBM的关键在于线性规划问题的构建。以下函数实现了考虑非期望产出的版本:
def super_sbm_undesirable(inputs, good_outputs, bad_outputs, crs=True): """ 考虑非期望产出的超效率SBM模型 :param inputs: 投入指标矩阵 (n_dmu, n_inputs) :param good_outputs: 期望产出矩阵 (n_dmu, n_good_outputs) :param bad_outputs: 非期望产出矩阵 (n_dmu, n_bad_outputs) :param crs: 规模报酬不变假设 (True为CRS,False为VRS) :return: 各DMU的超效率SBM效率值 """ n_dmu = inputs.shape[0] n_inputs = inputs.shape[1] n_good = good_outputs.shape[1] n_bad = bad_outputs.shape[1] efficiencies = np.zeros(n_dmu) for k in range(n_dmu): # 构建目标函数系数 c = np.zeros(1 + n_inputs + n_good + n_bad) c[0] = 1 # 对应tau # 构建约束矩阵 A_eq = [] b_eq = [] # 投入约束 for i in range(n_inputs): row = np.zeros(1 + n_inputs + n_good + n_bad) row[1+i] = inputs[k,i] for j in range(n_dmu): if j != k: row = np.hstack([row, -inputs[j,i]]) A_eq.append(row) b_eq.append(0) # 期望产出约束 for g in range(n_good): row = np.zeros(1 + n_inputs + n_good + n_bad) row[1+n_inputs+g] = -good_outputs[k,g] for j in range(n_dmu): if j != k: row = np.hstack([row, good_outputs[j,g]]) A_eq.append(row) b_eq.append(0) # 非期望产出约束 for b in range(n_bad): row = np.zeros(1 + n_inputs + n_good + n_bad) row[1+n_inputs+n_good+b] = bad_outputs[k,b] for j in range(n_dmu): if j != k: row = np.hstack([row, -bad_outputs[j,b]]) A_eq.append(row) b_eq.append(0) # VRS约束 if not crs: row = np.zeros(1 + n_inputs + n_good + n_bad) row = np.hstack([row, np.ones(n_dmu-1)]) A_eq.append(row) b_eq.append(1) # 解决线性规划 bounds = [(0, None) for _ in range(1 + n_inputs + n_good + n_bad)] + [(0, None) for _ in range(n_dmu-1)] result = linprog(c, A_eq=A_eq, b_eq=b_eq, bounds=bounds, method='highs') efficiencies[k] = result.x[0] return efficiencies关键参数说明:
crs:规模报酬假设,True表示不变(CRS),False表示可变(VRS)- 目标函数中的
tau代表效率值的倒数 - 投入、期望产出、非期望产出的松弛变量分别处理
- VRS情况下添加凸性约束(权重和为1)
结果解读与验证:计算得到的效率值可能大于1(超效率特性),分析时应注意:
- 效率值=1:处于前沿面上的基准单元
- 效率值>1:超高效单元,值越大效率越高
- 效率值<1:存在改进空间的单元
验证模型正确性的方法包括:
- 检查是否所有约束得到满足
- 对比传统SBM结果(应不超过超效率版本)
- 极端值测试(如所有单元相同输入输出时应都得1)
注意:实际应用中常需要数据标准化处理,特别是当不同指标量纲差异大时。此外,样本量较小时结果可能不稳定,建议结合bootstrap等方法进行稳健性检验。
5. 进阶技巧与常见问题解决
掌握了基础实现后,在实际研究中还会遇到各种特殊情况和复杂需求。以下分享一些实战中的进阶技巧和问题解决方案。
处理零值或负值数据:传统DEA要求数据为正,但实际中可能遇到零或负值(如利润可能为负)。解决方法包括:
- 数据平移:对所有值加一个足够大的常数
min_val = np.min(outputs) if min_val <= 0: outputs += abs(min_val) + 0.01 - 使用特殊模型:如Range Adjusted Measure (RAM) DEA
- 转换指标:用比率替代绝对值(如用利润率代替利润)
超效率模型的边界问题:超效率值理论上无上限,但极端情况下可能计算出极大值,这时可以:
- 检查数据是否存在异常值或录入错误
- 设定合理上限进行截断处理
- 考虑使用log变换缩小数值范围
动态效率分析:当需要分析效率随时间变化时,常用方法包括:
- Malmquist指数:分解效率变化和技术进步
# Malmquist指数计算示例 def malmquist_index(inputs_t0, outputs_t0, inputs_t1, outputs_t1): eff_t0 = dea_model(inputs_t0, outputs_t0) eff_t1 = dea_model(inputs_t1, outputs_t1) eff_t0_t1 = dea_model(inputs_t1, outputs_t1, frontier=inputs_t0, outputs_t0) eff_t1_t0 = dea_model(inputs_t0, outputs_t0, frontier=inputs_t1, outputs_t1) mi = np.sqrt((eff_t1/eff_t0) * (eff_t1/eff_t0_t1) * (eff_t0/eff_t1_t0)) return mi - 窗口分析:使用移动窗口构建基准面
- 全局基准:将所有时期数据合并构建单一基准面
大规模数据优化:当决策单元数量很大时(如上千个),线性规划求解可能变慢。加速技巧包括:
- 使用更高效的求解器(如Gurobi、CPLEX)
- 并行化计算(不同DMU的效率计算相互独立)
from joblib import Parallel, delayed def parallel_super_sbm(inputs, outputs, n_jobs=4): n_dmu = len(inputs) return Parallel(n_jobs=n_jobs)( delayed(calculate_single_dmu)(i, inputs, outputs) for i in range(n_dmu) ) - 采用近似算法或启发式方法
模型结果可视化:有效的结果展示能提升研究说服力。常用可视化包括:
- 效率值分布直方图
- 效率随时间变化的折线图(面板数据)
- 各DMU在投入-产出空间中的位置散点图
- Malmquist指数分解的雷达图
import matplotlib.pyplot as plt def plot_efficiency_distribution(efficiencies): plt.figure(figsize=(10,6)) plt.hist(efficiencies, bins=20, edgecolor='black') plt.axvline(1, color='red', linestyle='--') plt.xlabel('Efficiency Score') plt.ylabel('Frequency') plt.title('Distribution of Super-SBM Efficiency Scores') plt.show()敏感性分析框架:为确保结果稳健,建议进行以下检验:
- 指标选择敏感性:增减次要指标看结果变化
- 模型设定敏感性:比较CRS与VRS结果差异
- 数据扰动分析:对数据添加随机噪声检验稳定性
- 样本子集分析:在不同子样本中重复估计
实际项目中,我们曾用超效率SBM评估30家医院的运营效率。最初结果出现一家医院效率值异常高,检查发现是其门诊量数据录入错误(多了一个零)。修正后,最高效率值从58.7降至3.2,虽仍属高效但更合理。这个案例凸显了数据质量检查的重要性——再先进的模型也依赖准确的输入数据。