什么是数据包络分析(DEA),在地学研究中有什么应用(附代码)

文摘   科学   2024-03-25 08:30   重庆  

|本文共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 gurobipyimport 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】,即可获取完整的代码及示例数据!

喜欢也行,不喜欢也行;如果觉得有用处的话,还请点点右下角的赞/在看,记得关注我哟!!!

遥感地理阁
专注于地理学、遥感科学、人工智能等领域,合作交流、成果分享等事宜请加Y2theK