一、何为Data Envelopment Analysis(数据包络分析)
Data Envelopment Analysis(数据包络分析)是一种非参数评估方法。它是通过比较同一类目标的效率来进行数据的评估。Data Envelopment Analysis入门资料中通常采用线性规划来解决问题。
二、Data Envelopment Analysis的基本概念
Data Envelopment Analysis 根据线性规划思想,采用“包络面”的概念进行分析。即定义一个“包络面”,将数据点依据各项指标投射到这个“包络面”上,通过计算这些点在“包络面”上的投影面积,来确定各点之间的“相对效率”。评估对象要具有可比性,否则不能进行分析。
三、Data Envelopment Analysis的应用领域
Data Envelopment Analysis的应用领域非常广泛: 1、银行业:对银行各部门的效率进行评估;
2、教育领域:对教育部门的效率进行评估;
3、卫生保健:对卫生保健系统或医疗机构等的效率进行评估;
4、城市规划:对城市规划、可持续发展等问题进行研究;
5、环境保护:对环境保护局、公司等的管理效率进行评估。
四、Data Envelopment Analysis 的计算过程
Step 1
确定评估指标及其单位,收集数据
import pandas as pd data=pd.read_csv('data.csv',index_col='id') data.head()
Step 2
确定评估对象,根据指标数据,建立评价模型,确定数据可行性。
import numpy as np from pyomo.environ import * model=ConcreteModel() n,m=data.shape model.J=Set(initialize=range(n)) model.I=Set(initialize=range(m)) model.a=Param(model.J,model.I,initialize=data.values) model.x=Var(model.I) model.y=Var(model.J) model.obj=Objective(expr=model.y[m-1],sense=maximize) def ax_constraint(model,j): return sum(model.a[j,i]*model.x[i] for i in model.I )<=model.y[j] model.const1=Constraint(model.J,rule=ax_constraint) def ay_constraint(model,i): return model.x[i]>=0 model.const2=Constraint(model.I,rule=ay_constraint) def sumy_constraint(model): return sum(model.y[j] for j in model.J)==1 model.const_sumy=Constraint(rule=sumy_constraint)
Step 3
求解模型,确定相对有效环境单位数和效率结果
solver=SolverFactory('glpk') solver.solve(model) x=pd.Series([model.x[i]() for i in model.I],index=data.columns) y=pd.Series([model.y[j]() for j in model.J],index=data.index)
Step 4
分析结果,确定应用方法
result=pd.DataFrame({'x':x,'y':y,'z':y/x}) result
五、Data Envelopment Analysis模型的改进
Data Envelopment Analysis模型的改进有很多种,其中最常见的是基于超越率TE和松弛度Slack的方法,分别在优化模型的约束中加入一个目标函数,使之更具可信度,但同时也增加了模型的复杂度。
TE模型
model.TE=Expression(expr=sum(x[i] for i in model.I)) def te_constraint(model,j): return sum(model.a[j,i]*model.x[i] for i in model.I)>=model.y[j]*model.TE model.const3=Constraint(model.J,rule=te_constraint) model.obj2=Objective(expr=model.TE,sense=minimize) solver.solve(model) x=pd.Series([model.x[i]() for i in model.I],index=data.columns) y=pd.Series([model.y[j]() for j in model.J],index=data.index) result=pd.DataFrame({'x':x,'y':y,'z':y/x}) result
Slack模型
model.Slack=Var(initialize=1) def slack_constraint(model,j,i): return sum(model.a[j,i]*model.x[i] for i in model.I ) +model.Slack>=model.y[j] model.const4=Constraint(model.J,model.I,rule=slack_constraint) model.obj3=Objective(expr=model.Slack,sense=minimize) solver.solve(model) x=pd.Series([model.x[i]() for i in model.I],index=data.columns) y=pd.Series([model.y[j]() for j in model.J],index=data.index) result=pd.DataFrame({'x':x,'y':y,'z':y/x}) result
六、结语
Data Envelopment Analysis作为一种非参数评估方法,可以广泛应用于各个领域的数据分析与评估中。通过对Data Envelopment Analysis的概念、应用领域、计算过程和改进模型的介绍,希望读者能更深入地了解此方法,并在实际工作中进行实践探索。