|本文共943字,阅读约需3分钟
1
算法介绍
数据包络分析(Data Envelopment Analysis,DEA)是一种非参数的数学规划方法,主要用于评价决策单元(DMU)的生产效率。DEA被广泛应用来衡量具有多个输入和多个输出的系统或组织,在给定资源投入下的产出表现。
DEA模型不依赖于预先知道的生产函数形式,而是通过构建线性规划模型,基于实际观测到的输入(如成本、人力、物质资源等)和输出(如产量、销售额、服务数量等)数据,计算每个决策单元的技术效率、规模效率以及纯技术效率。
具体来说,DEA能够解决以下问题:
效率评价:确定决策单元是否达到最优效率边界,即在保持相同产出的情况下能否减少输入,或者在保持相同输入不变的情况下能否增加产出。
标杆管理:识别效率最高的决策单元作为“标杆”,为其他低效单位提供改进的方向。
资源配置优化:指导资源在不同决策单元之间的合理分配,以提高整体系统的效率。
目前,DEA模型已经发展出了多种模型变体,适应不同的应用场景,例如C2R模型、BCC模型以及超效率模型等。
2
应用示例
在地学研究中,DEA方法具有广泛的应用潜力:
1.区域发展效率评估
DEA可用于评估不同地区的经济、社会、环境等方面的综合效率或单项效率。通过比较各地区单位投入下的产出水平,找出最优效率边界,为区域政策制定和资源配置提供科学依据。
参考文献:曹炳汝,孔泽云,邓莉娟.长江经济带省域物流效率及时空演化研究[J].地理科学,2019,39(12):1841-1848.
2.自然资源管理与可持续性评价
DEA可以用于评价不同自然资源管理体系的效率,包括水资源、森林资源、矿产资源等的开发利用情况,以及相应的环境保护措施效果。
参考文献:王朝,张廷龙,李双等.基于DEA和Malmquist指数的汉江干流水资源利用效率变动研究[J].水土保持研究,2023,30(01):291-296.
3.城市或区域规划
针对城市的公共服务设施布局、交通网络效率、能源消耗结构等方面,DEA能够帮助识别高效的城市发展模式和低效环节,从而指导城市规划和优化资源配置。
参考文献:田超,程琳琳,邵盈钞.京津冀地区城市三生空间碳代谢效率特征及演进模式[J/OL].环境科学:1-15
3
算法代码
DEA模型也可以使用SPSS或者Stata进行构建,自己习惯使用Python进行建模,核心代码如下:
import gurobipy
import pandas as pd
class DEA(object):
def __init__(self, DMUs_Name, X, Y, AP=False):
"""
初始化 DEA 模型类
:param DMUs_Name: 生产单元名称列表
:param X: 输入指标矩阵 (DataFrame)
:param Y: 输出指标矩阵 (DataFrame)
:param AP: 是否考虑全输入/全输出 (默认为False)
"""
self.m1, self.m1_name, self.m2, self.m2_name, self.AP = X.shape[1], X.columns.tolist(), Y.shape[1], Y.columns.tolist(), AP
self.DMUs, self.X, self.Y = gurobipy.multidict({DMU: [X.loc[DMU].tolist(), Y.loc[DMU].tolist()] for DMU in DMUs_Name})
print(f'DEA(AP={AP}) MODEL RUNNING...')
def __CCR(self):
for k in self.DMUs:
MODEL = gurobipy.Model()
OE, lambdas, s_negitive, s_positive = MODEL.addVar(), MODEL.addVars(self.DMUs), MODEL.addVars(self.m1), MODEL.addVars(self.m2)
MODEL.update()
MODEL.setObjectiveN(OE, index=0, priority=1) # 多目标优化(默认最小值)
MODEL.setObjectiveN(-(sum(s_negitive) + sum(s_positive)), index=1, priority=0)
MODEL.addConstrs(
gurobipy.quicksum(lambdas[i] * self.X[i][j] for i in self.DMUs if i != k or not self.AP) + s_negitive[
j] == OE * self.X[k][j] for j in range(self.m1))
MODEL.addConstrs(
gurobipy.quicksum(lambdas[i] * self.Y[i][j] for i in self.DMUs if i != k or not self.AP) - s_positive[
j] == self.Y[k][j] for j in range(self.m2))
MODEL.setParam('OutputFlag', 0)
MODEL.optimize()
self.Result.at[k, ('效益分析', '综合技术效益(CCR)')] = MODEL.objVal
return self.Result
def __BCC(self):
for k in self.DMUs:
MODEL = gurobipy.Model()
TE, lambdas, s_negitive, s_positive = MODEL.addVar(), MODEL.addVars(self.DMUs), MODEL.addVars(self.m1), MODEL.addVars(self.m2)
MODEL.update()
MODEL.setObjectiveN(TE, index=0, priority=1) # 多目标优化(默认最小值)
MODEL.setObjectiveN(-(sum(s_negitive) + sum(s_positive)), index=1, priority=0)
MODEL.addConstrs(
gurobipy.quicksum(lambdas[i] * self.X[i][j] for i in self.DMUs if i != k or not self.AP) + s_negitive[
j] == TE * self.X[k][j] for j in range(self.m1))
MODEL.addConstrs(
gurobipy.quicksum(lambdas[i] * self.Y[i][j] for i in self.DMUs if i != k or not self.AP) - s_positive[
j] == self.Y[k][j] for j in range(self.m2))
MODEL.addConstr(gurobipy.quicksum(lambdas[i] for i in self.DMUs if i != k or not self.AP) == 1)
MODEL.setParam('OutputFlag', 0)
MODEL.optimize()
self.Result.at[k, ('效益分析', '技术效益(BCC)')] = MODEL.objVal if MODEL.status == gurobipy.GRB.Status.OPTIMAL else 'N/A'
self.Result.at[k, ('规模报酬分析', '有效性')] = '非 DEA 有效' if MODEL.objVal < 1 else 'DEA 弱有效' if s_negitive.sum().getValue() + s_positive.sum().getValue() != 0 else 'DEA 强有效'
for m in range(self.m1):
self.Result.at[k, ('差额变数分析', f'{self.m1_name[m]}')] = s_negitive[m].X
self.Result.at[k, ('投入冗余率', f'{self.m1_name[m]}')] = 'N/A' if self.X[k][m] == 0 else s_negitive[
m].X / self.X[k][m]
for m in range(self.m2):
self.Result.at[k, ('差额变数分析', f'{self.m2_name[m]}')] = s_positive[m].X
self.Result.at[k, ('产出不足率', f'{self.m2_name[m]}')] = 'N/A' if self.Y[k][m] == 0 else s_positive[
m].X / self.Y[k][m]
return self.Result
def dea(self):
columns_Page = ['效益分析'] * 3 + ['规模报酬分析'] * 1 + ['差额变数分析'] * (self.m1 + self.m2) + ['投入冗余率'] * self.m1 + ['产出不足率'] * self.m2
columns_Group = ['技术效益(BCC)', '规模效益(CCR/BCC)', '综合技术效益(CCR)', '有效性'] + (self.m1_name + self.m2_name) * 2
self.Result = pd.DataFrame(index=self.DMUs, columns=[columns_Page, columns_Group])
self.__CCR()
self.__BCC()
self.Result.loc[:, ('效益分析', '规模效益(CCR/BCC)')] = self.Result.loc[:,
('效益分析', '综合技术效益(CCR)')] / self.Result.loc[:,
('效益分析', '技术效益(BCC)')]
return self.Result
def analysis(self, file_name=None):
Result = self.dea()
file_name = 'DEA 数据包络分析报告.xlsx' if file_name is None else f'\\{file_name}.xlsx'
Result.to_excel(file_name, 'DEA 数据包络分析报告')
计算结果如下,分析可知,这些生产单元在综合技术效益和规模经济性方面表现较差,存在着一定程度的冗余现象。然而,在技术效益方面,从1996年开始,所有生产单元都达到了DEA的强有效性,即技术效率较高,不存在不足的部分。
4
代码获取
公众号后台回复【240325】,即可获取完整的代码及示例数据!
喜欢也行,不喜欢也行;如果觉得有用处的话,还请点点右下角的赞/在看,记得关注我哟!!!