别再混淆了!一文讲清SBM、DDF、NDDF在测算绿色全要素生产率时的区别与Python选型 绿色效率测算实战指南SBM、DDF与NDDF模型的核心差异与Python实现当我们需要评估企业或区域的绿色生产效率时数据包络分析DEA框架下的各类模型往往让人眼花缭乱。特别是当面对碳排放等非期望产出时传统效率测算方法显得力不从心。本文将深入剖析三种主流模型——SBMSlack-Based Measure、DDFDirectional Distance Function和NDDFNon-radial Directional Distance Function的核心区别并给出Python实现的实战建议。1. 模型核心思想对比从理论到应用场景1.1 SBM模型非径向的松弛变量专家SBM模型由Tone在2001年提出其最大特点是直接测量投入产出的松弛量即实际值与前沿面的差距。在处理绿色效率问题时优势能同时考虑投入过度和产出不足对非期望产出如污染的处理更为灵活特点效率值介于0到1之间1表示完全有效适用场景当投入产出可能存在较大冗余时特别有效# Python中的SBM实现通常使用PyDEA库 from pydea.deaproblem import DEAProblem inputs [[20], [30], [40]] # 投入数据 outputs [[10], [15], [20]] # 期望产出 bad_outputs [[5], [8], [10]] # 非期望产出 prob DEAProblem(inputs, outputs, bad_outputs, modelSBM) results prob.solve()1.2 DDF模型方向明确的效率改进指南DDF由Chung等人在1997年提出通过预设方向向量来评估效率核心参数方向向量g决定效率改进的路径缩放系数β衡量无效率程度优势能明确指定效率改进方向如减少碳排放同时增加GDP局限径向假设可能导致效率被高估参数类型典型设置经济含义g_x (投入)-1减少投入g_y (期望产出)1增加期望产出g_b (非期望产出)-1减少非期望产出1.3 NDDF模型灵活的非径向改进NDDF结合了SBM和DDF的优点突破性创新允许不同投入产出项以不同比例改进方向权重可调适应不同政策优先级典型应用碳排放绩效评估、资源环境效率测算提示当评估对象存在明显的投入产出异质性时如不同行业的企业NDDF通常比DDF更能反映真实效率。2. 关键技术差异一张表格看清本质下表总结了三种模型在处理绿色效率问题时的关键差异特征SBMDDFNDDF测量方式松弛量方向距离非径向距离效率值范围[0,1][0,∞)[0,∞)非期望产出处理弱处置性强弱可选强弱可选改进路径非径向径向非径向方向向量无固定可调权重Python库PyDEAPuLP/PyDEA自定义/PyDEA3. Python实现实战从数据到结果3.1 数据准备与预处理无论使用哪种模型良好的数据准备是成功的一半import pandas as pd import numpy as np # 典型的数据结构 data { DMU: [A, B, C], Labor: [20, 30, 25], # 投入1劳动力 Capital: [300, 400, 350], # 投入2资本 Energy: [50, 60, 55], # 投入3能源 GDP: [100, 120, 110], # 期望产出 CO2: [80, 90, 85] # 非期望产出 } df pd.DataFrame(data) inputs df[[Labor, Capital, Energy]].values outputs df[[GDP]].values bad_outputs df[[CO2]].values3.2 NDDF模型的完整实现以下是基于PuLP库的NDDF实现框架import pulp class NDDFModel: def __init__(self, inputs, outputs, bad_outputs, weights, directional): self.inputs inputs self.outputs outputs self.bad_outputs bad_outputs self.weights weights # 方向权重 self.directional directional # 方向向量 self.n_dmu inputs.shape[0] self.n_input inputs.shape[1] self.n_output outputs.shape[1] self.n_bad bad_outputs.shape[1] def solve(self): results [] for dmu in range(self.n_dmu): prob pulp.LpProblem(fNDDF_DMU_{dmu}, pulp.LpMaximize) # 定义变量 beta pulp.LpVariable.dicts(beta, range(self.n_inputself.n_outputself.n_bad), lowBound0) lambdas pulp.LpVariable.dicts(lambda, range(self.n_dmu), lowBound0) # 目标函数 prob pulp.lpSum([self.weights[i]*beta[i] for i in range(len(beta))]) # 约束条件 for i in range(self.n_input): prob (pulp.lpSum([lambdas[j]*self.inputs[j,i] for j in range(self.n_dmu)]) self.inputs[dmu,i] - beta[i]*self.directional[i]*self.inputs[dmu,i]) for r in range(self.n_output): prob (pulp.lpSum([lambdas[j]*self.outputs[j,r] for j in range(self.n_dmu)]) self.outputs[dmu,r] beta[self.n_inputr]*self.directional[self.n_inputr]*self.outputs[dmu,r]) for s in range(self.n_bad): prob (pulp.lpSum([lambdas[j]*self.bad_outputs[j,s] for j in range(self.n_dmu)]) self.bad_outputs[dmu,s] - beta[self.n_inputself.n_outputs]*self.directional[self.n_inputself.n_outputs]*self.bad_outputs[dmu,s]) prob.solve() eff pulp.value(prob.objective) results.append(eff) return results3.3 模型应用示例# 定义权重和方向向量 weights [1/6, 1/6, 1/6, 1/2, 1/6] # 投入和坏产出权重小好产出权重大 directional [1, 1, 1, 1, -1] # 投入和好产出增加方向坏产出减少方向 model NDDFModel(inputs, outputs, bad_outputs, weights, directional) efficiency_scores model.solve() for i, score in enumerate(efficiency_scores): print(fDMU {df[DMU][i]} 的无效率值: {score:.4f})4. 模型选型决策树什么情况下用哪种模型在实际应用中模型选择应考虑以下因素数据类型与特征如果投入产出可能存在大量冗余 → 选择SBM如果有明确政策导向的改进方向 → 选择DDF或NDDF分析目的单纯效率排序 → SBM效率改进路径分析 → DDF/NDDF跨期效率变化 → Malmquist-Luenberger指数基于DDF/NDDF计算复杂度SBM计算量最大DDF最简单NDDF介于两者之间注意当处理大规模数据时如数千个DMUDDF的计算效率优势会非常明显。5. 前沿扩展绿色全要素生产率测算将上述静态效率分析扩展到生产率增长测量常用的方法有Malmquist-Luenberger指数基于DDF/NDDFGlobal Malmquist指数考虑全局生产技术Luenberger生产率指标能分解为效率变化和技术进步# 两期ML指数计算示例 def ml_index(t1_efficiency, t2_efficiency, technology_change): t1_efficiency: 第1期的效率值 t2_efficiency: 第2期的效率值 technology_change: 技术前沿变化 eff_change t2_efficiency / t1_efficiency return eff_change * technology_change在实际研究碳排放绩效时张宁(2022)采用两期NDDF模型测算的火电企业碳生产率就很好地捕捉了低碳技术创新对效率提升的影响。