一、何为Data Envelopment Analysis(数据包络分析)
Data Envelopment Analysis(数据包络分析)是一种非参数评估方法。它是通过比较同一类目标的效率来进行数据的评估。Data Envelopment Analysis入门资料中通常采用线性规划来解决问题。
二、Data Envelopment Analysis的基本概念
Data Envelopment Analysis 根据线性规划思想,采用“包络面”的概念进行分析。即定义一个“包络面”,将数据点依据各项指标投射到这个“包络面”上,通过计算这些点在“包络面”上的投影面积,来确定各点之间的“相对效率”。评估对象要具有可比性,否则不能进行分析。
三、Data Envelopment Analysis的应用领域
Data Envelopment Analysis的应用领域非常广泛:
- 银行业:对银行各部门的效率进行评估;
- 教育领域:对教育部门的效率进行评估;
- 卫生保健:对卫生保健系统或医疗机构等的效率进行评估;
- 城市规划:对城市规划、可持续发展等问题进行研究;
- 环境保护:对环境保护局、公司等的管理效率进行评估。
四、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的概念、应用领域、计算过程和改进模型的介绍,希望读者能更深入地了解此方法,并在实际工作中进行实践探索。