别再混淆了!一文讲清DEA、SBM、超效率SBM的区别与应用场景(附Python代码示例)
2026/6/15 23:58:16 网站建设 项目流程

效率评估模型全解析:从基础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. 模型选择实战指南:从问题到解决方案

面对具体研究问题时,如何选择合适的效率评估模型?以下决策流程和案例说明将提供清晰指导。

决策树框架:

  1. 是否需要处理非期望产出?
    • 是 → 考虑SBM或超效率SBM的非期望产出版本
    • 否 → 进入下一问题
  2. 是否需要区分效率值为1的单元?
    • 是 → 选择超效率模型(DEA或SBM)
    • 否 → 进入下一问题
  3. 数据是否显示规模报酬可变?
    • 是 → 选择BCC或SBM-VRS
    • 否 → 选择CCR或SBM-CRS
  4. 是否存在明显的投入/产出松弛?
    • 是 → 优先考虑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:处于前沿面上的基准单元
  2. 效率值>1:超高效单元,值越大效率越高
  3. 效率值<1:存在改进空间的单元

验证模型正确性的方法包括:

  • 检查是否所有约束得到满足
  • 对比传统SBM结果(应不超过超效率版本)
  • 极端值测试(如所有单元相同输入输出时应都得1)

注意:实际应用中常需要数据标准化处理,特别是当不同指标量纲差异大时。此外,样本量较小时结果可能不稳定,建议结合bootstrap等方法进行稳健性检验。

5. 进阶技巧与常见问题解决

掌握了基础实现后,在实际研究中还会遇到各种特殊情况和复杂需求。以下分享一些实战中的进阶技巧和问题解决方案。

处理零值或负值数据:传统DEA要求数据为正,但实际中可能遇到零或负值(如利润可能为负)。解决方法包括:

  1. 数据平移:对所有值加一个足够大的常数
    min_val = np.min(outputs) if min_val <= 0: outputs += abs(min_val) + 0.01
  2. 使用特殊模型:如Range Adjusted Measure (RAM) DEA
  3. 转换指标:用比率替代绝对值(如用利润率代替利润)

超效率模型的边界问题:超效率值理论上无上限,但极端情况下可能计算出极大值,这时可以:

  • 检查数据是否存在异常值或录入错误
  • 设定合理上限进行截断处理
  • 考虑使用log变换缩小数值范围

动态效率分析:当需要分析效率随时间变化时,常用方法包括:

  1. 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
  2. 窗口分析:使用移动窗口构建基准面
  3. 全局基准:将所有时期数据合并构建单一基准面

大规模数据优化:当决策单元数量很大时(如上千个),线性规划求解可能变慢。加速技巧包括:

  • 使用更高效的求解器(如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) )
  • 采用近似算法或启发式方法

模型结果可视化:有效的结果展示能提升研究说服力。常用可视化包括:

  1. 效率值分布直方图
  2. 效率随时间变化的折线图(面板数据)
  3. 各DMU在投入-产出空间中的位置散点图
  4. 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()

敏感性分析框架:为确保结果稳健,建议进行以下检验:

  1. 指标选择敏感性:增减次要指标看结果变化
  2. 模型设定敏感性:比较CRS与VRS结果差异
  3. 数据扰动分析:对数据添加随机噪声检验稳定性
  4. 样本子集分析:在不同子样本中重复估计

实际项目中,我们曾用超效率SBM评估30家医院的运营效率。最初结果出现一家医院效率值异常高,检查发现是其门诊量数据录入错误(多了一个零)。修正后,最高效率值从58.7降至3.2,虽仍属高效但更合理。这个案例凸显了数据质量检查的重要性——再先进的模型也依赖准确的输入数据。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询