数据包络分析(Data Envelopment Analysis, DEA)详解与Python代码示例

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
实时数仓Hologres,5000CU*H 100GB 3个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 数据包络分析(Data Envelopment Analysis, DEA)详解与Python代码示例

数据包络分析(Data Envelopment Analysis, DEA)详解与Python代码示例

一、数据包络分析(DEA)详解

数据包络分析(DEA)是一种非参数的评价方法,主要用于评估具有多个投入和多个产出的决策单元(Decision Making Units, DMUs)的相对效率。DEA方法最初由A.Charnes和W.W.Cooper在1978年提出,现已广泛应用于生产管理、金融分析、教育评估等多个领域。

DEA的核心思想是通过比较不同DMUs的输入和输出数据,确定一个效率前沿(Efficiency Frontier),即所有DMUs中效率最高的集合。位于效率前沿上的DMUs被认为是相对有效的,而位于效率前沿下方的DMUs则被认为是相对无效的。DEA方法可以帮助管理者识别出效率低下的DMUs,并为其改进提供方向。

DEA模型通常分为两类:CRS(Constant Returns to Scale)模型和VRS(Variable Returns to Scale)模型。CRS模型假设DMUs的规模效率是恒定的,即输入和输出之间存在线性关系;而VRS模型则假设DMUs的规模效率是可变的,即输入和输出之间存在非线性关系。在实际应用中,可以根据具体情况选择合适的模型。

二、Python代码示例

以下是一个使用Python实现DEA模型的简单示例。这里我们采用CRS模型(也称为CCR模型),并使用Gurobi作为优化求解器。请注意,为了运行此代码,您需要安装Gurobi和相应的Python库。

import gurobipy as gp
import pandas as pd

# 假设我们有三个DMUs(A, B, C),每个DMUs有两个输入(x1, x2)和两个输出(y1, y2)
inputs = pd.DataFrame({
   
    'DMU': ['A', 'B', 'C'],
    'x1': [2, 1, 3],
    'x2': [3, 2, 4]
})
outputs = pd.DataFrame({
   
    'DMU': ['A', 'B', 'C'],
    'y1': [4, 3, 6],
    'y2': [5, 4, 7]
})

# 合并输入和输出数据
data = pd.merge(inputs, outputs, on='DMU')

# 设置Gurobi模型
m = gp.Model('DEA_CCR')

# 定义变量
lambdas = m.addVars(data.shape[0], name='lambda')
OE = m.addVar(name='OE', lb=0, ub=1, vtype=gp.GRB.CONTINUOUS)
s_neg = m.addVars(data.shape[1]-2, name='s_neg')  # 输入的松弛变量
s_pos = m.addVars(2, name='s_pos')  # 输出的松弛变量

# 设置目标函数(最大化OE)
m.setObjective(OE, gp.GRB.MAXIMIZE)

# 设置约束条件
for i in range(data.shape[0]):
    if i == 0:  # 对于第一个DMU,设置OE为其效率值
        m.addConstr(OE * data.loc[i, 'x1':] <= gp.quicksum(lambdas[j] * data.loc[j, 'x1':] for j in range(data.shape[0])))
        m.addConstr(data.loc[i, 'y1':] >= gp.quicksum(lambdas[j] * data.loc[j, 'y1':] for j in range(data.shape[0])) - s_pos)
    else:  # 对于其他DMU,设置其权重为非负
        m.addConstr(lambdas[i] >= 0)

# 设置松弛变量为非负
for var in s_neg:
    m.addConstr(var >= 0)
for var in s_pos:
    m.addConstr(var >= 0)

# 求解模型
m.optimize()

# 输出结果
for v in m.getVars():
    print(v.varName, v.x)

注释

  • gurobipy是Gurobi优化求解器的Python接口,用于构建和求解优化模型。
  • pd.DataFrame用于存储和处理输入和输出数据。
  • m.addVars用于添加决策变量,包括DMUs的权重(lambdas)、效率值(OE)以及松弛变量(s_negs_pos)。
  • 目标函数设置为最大化效率值(OE)。
  • 约束条件包括输入
相关文章
|
25天前
|
缓存 Rust 算法
从混沌到秩序:Python的依赖管理工具分析
Python 的依赖管理工具一直没有标准化,主要原因包括历史发展的随意性、社区的分散性、多样化的使用场景、向后兼容性的挑战、缺乏统一治理以及生态系统的快速变化。依赖管理工具用于处理项目中的依赖关系,确保不同环境下的依赖项一致性,避免软件故障和兼容性问题。常用的 Python 依赖管理工具如 pip、venv、pip-tools、Pipenv、Poetry 等各有优缺点,选择时需根据项目需求权衡。新工具如 uv 和 Pixi 在性能和功能上有所改进,值得考虑。
83 35
|
1月前
|
机器学习/深度学习 数据可视化 数据挖掘
使用Python实现基于矩阵分解的长期事件(MFLEs)时间序列分析
在现代数据分析中,高维时间序列数据的处理和预测极具挑战性。基于矩阵分解的长期事件(MFLEs)分析技术应运而生,通过降维和时间序列特性结合,有效应对大规模数据。MFLE利用矩阵分解提取潜在特征,降低计算复杂度,过滤噪声,并发现主要模式。相比传统方法如ARIMA和深度学习模型如LSTM,MFLE在多变量处理、计算效率和可解释性上更具优势。通过合理应用MFLE,可在物联网、金融等领域获得良好分析效果。
62 0
使用Python实现基于矩阵分解的长期事件(MFLEs)时间序列分析
|
27天前
|
数据采集 数据可视化 数据挖掘
金融波动率的多模型建模研究:GARCH族与HAR模型的Python实现与对比分析
本文探讨了金融资产波动率建模中的三种主流方法:GARCH、GJR-GARCH和HAR模型,基于SPY的实际交易数据进行实证分析。GARCH模型捕捉波动率聚类特征,GJR-GARCH引入杠杆效应,HAR整合多时间尺度波动率信息。通过Python实现模型估计与性能比较,展示了各模型在风险管理、衍生品定价等领域的应用优势。
237 66
金融波动率的多模型建模研究:GARCH族与HAR模型的Python实现与对比分析
|
17天前
|
并行计算 安全 Java
Python GIL(全局解释器锁)机制对多线程性能影响的深度分析
在Python开发中,GIL(全局解释器锁)一直备受关注。本文基于CPython解释器,探讨GIL的技术本质及其对程序性能的影响。GIL确保同一时刻只有一个线程执行代码,以保护内存管理的安全性,但也限制了多线程并行计算的效率。文章分析了GIL的必要性、局限性,并介绍了多进程、异步编程等替代方案。尽管Python 3.13计划移除GIL,但该特性至少要到2028年才会默认禁用,因此理解GIL仍至关重要。
90 16
Python GIL(全局解释器锁)机制对多线程性能影响的深度分析
|
4天前
|
数据采集 数据安全/隐私保护 Python
从零开始:用Python爬取网站的汽车品牌和价格数据
在现代化办公室中,工程师小李和产品经理小张讨论如何获取懂车帝网站的汽车品牌和价格数据。小李提出使用Python编写爬虫,并通过亿牛云爬虫代理避免被封禁。代码实现包括设置代理、请求头、解析网页内容、多线程爬取等步骤,确保高效且稳定地抓取数据。小张表示理解并准备按照指导操作。
从零开始:用Python爬取网站的汽车品牌和价格数据
|
1月前
|
数据可视化 算法 数据挖掘
Python时间序列分析工具Aeon使用指南
**Aeon** 是一个遵循 scikit-learn API 风格的开源 Python 库,专注于时间序列处理。它提供了分类、回归、聚类、预测建模和数据预处理等功能模块,支持多种算法和自定义距离度量。Aeon 活跃开发并持续更新至2024年,与 pandas 1.4.0 版本兼容,内置可视化工具,适合数据探索和基础分析任务。尽管在高级功能和性能优化方面有提升空间,但其简洁的 API 和完整的基础功能使其成为时间序列分析的有效工具。
79 37
Python时间序列分析工具Aeon使用指南
|
22天前
|
存储 缓存 Java
Python高性能编程:五种核心优化技术的原理与Python代码
Python在高性能应用场景中常因执行速度不及C、C++等编译型语言而受质疑,但通过合理利用标准库的优化特性,如`__slots__`机制、列表推导式、`@lru_cache`装饰器和生成器等,可以显著提升代码效率。本文详细介绍了这些实用的性能优化技术,帮助开发者在不牺牲代码质量的前提下提高程序性能。实验数据表明,这些优化方法能在内存使用和计算效率方面带来显著改进,适用于大规模数据处理、递归计算等场景。
58 5
Python高性能编程:五种核心优化技术的原理与Python代码
|
1月前
|
机器学习/深度学习 运维 数据可视化
Python时间序列分析:使用TSFresh进行自动化特征提取
TSFresh 是一个专门用于时间序列数据特征自动提取的框架,支持分类、回归和异常检测等机器学习任务。它通过自动化特征工程流程,处理数百个统计特征(如均值、方差、自相关性等),并通过假设检验筛选显著特征,提升分析效率。TSFresh 支持单变量和多变量时间序列数据,能够与 scikit-learn 等库无缝集成,适用于大规模时间序列数据的特征提取与模型训练。其工作流程包括数据格式转换、特征提取和选择,并提供可视化工具帮助理解特征分布及与目标变量的关系。
70 16
Python时间序列分析:使用TSFresh进行自动化特征提取
|
24天前
|
数据挖掘 数据处理 开发者
Python3 自定义排序详解:方法与示例
Python的排序功能强大且灵活,主要通过`sorted()`函数和列表的`sort()`方法实现。两者均支持`key`参数自定义排序规则。本文详细介绍了基础排序、按字符串长度或元组元素排序、降序排序、多条件排序及使用`lambda`表达式和`functools.cmp_to_key`进行复杂排序。通过示例展示了如何对简单数据类型、字典、类对象及复杂数据结构(如列车信息)进行排序。掌握这些技巧可以显著提升数据处理能力,为编程提供更强大的支持。
30 10
|
2月前
|
Python
课程设计项目之基于Python实现围棋游戏代码
游戏进去默认为九路玩法,当然也可以选择十三路或是十九路玩法 使用pycharam打开项目,pip安装模块并引用,然后运行即可, 代码每行都有详细的注释,可以做课程设计或者毕业设计项目参考
78 33