
简介这是一套专为运筹学、管理科学与经济学领域研究者及高年级本科生/研究生设计的MATLAB数据包络分析DEA开源工具箱用于快速实现CCR、BCC、超效率、窗口分析等多种DEA模型解决多投入多产出相对效率评估问题。压缩包共33个文件含26个核心MATLAB函数.m覆盖数据预处理、模型求解、结果可视化与敏感性分析2个说明文本readme.txt、README.md提供安装指引与调用范例1份PDF文档wp20163.pdf为配套理论参考另含1个CSV示例数据、1个MAT工作空间、1个LICENSE授权文件及1份单元测试配置结构完整、即装即用。资源体积仅582KB轻量高效已获339人学习下载。用户可直接调用模块化函数完成实证分析复现经典DEA案例结合示例数据快速验证算法逻辑并基于清晰的unittests与examples目录开展自定义扩展开发。1. 这不是普通 MATLAB 工具箱它专为 DEA 效率建模而生解决的是多投入多产出场景下“谁更高效”的量化难题当你面对医院、学校、银行网点或制造车间这类实体手头有多个投入指标如人力、经费、设备台数和多个产出指标如就诊人次、毕业率、贷款总额、合格品数量却无法用简单比值判断哪个单位“更有效”时数据包络分析Data Envelopment Analysis, DEA就是标准解法。Matlab 数据包络分析工具箱.zip 并非 MathWorks 官方 Optimization Toolbox 的子集而是一个由学术研究者或工程实践者持续维护的开源 MATLAB 函数集合它把 Charnes-Cooper 变换、CCR/BCC 模型、超效率 DEA、交叉效率、Malmquist 指数等核心算法封装成可直接调用的.m文件。它不依赖 Symbolic Math Toolbox但要求基础优化能力——这意味着你必须已安装 MATLAB R2016b 或更高版本并确保quadprog或linprog可用。新手可跳过线性规划推导直接建模有运筹背景的用户则能快速修改目标函数与约束结构。它不提供 GUI所有操作通过脚本驱动正因如此模型复现、参数批量扫描、结果自动化导出才真正可控。2. 从解压到运行四步完成 DEA 基础建模闭环2.1 解压与路径配置让 MATLAB “看见”工具箱函数下载得到的Matlab 数据包络分析工具箱.zip是一个压缩包其内部结构通常为根目录下含dea.m、sbm.m、superdea.m等主函数以及data/子目录存放示例数据如hospital_data.mat。切勿将整个 zip 文件拖入 MATLAB 当前文件夹。正确做法是# 在终端或文件管理器中执行Windows 示例 unzip Matlab 数据包络分析工具箱.zip -d ./dea_toolbox解压后在 MATLAB 命令行中执行addpath(genpath(./dea_toolbox)); savepath; % 永久保存路径仅需首次提示genpath会递归添加所有子文件夹确保dea.m和其依赖的lp_solver.m若存在均被识别。若报错Undefined function dea请运行which dea验证路径是否生效若返回空说明addpath未成功或函数名拼写错误注意大小写。2.2 构造符合 DEA 要求的数据矩阵投入与产出必须严格分离DEA 模型对数据格式极为敏感。输入必须是两个数值矩阵Xn×mn 个决策单元 DMUm 个投入指标Yn×ss 个产出指标。不允许缺失值、负值或零值零投入/产出会导致模型无界。常见错误包括将年份、ID 列混入X误将成本类投入当作产出未对量纲差异大的指标做标准化如“员工数”与“年预算万元”并列。正确构造示例如下% 假设读取 CSV前3列为投入人力、面积、设备数后2列为产出服务人次、满意度得分 data readmatrix(bank_branches.csv); X data(:, 1:3); % 投入矩阵3列 Y data(:, 4:5); % 产出矩阵2列 % 强制检查确认无零/负值 if any(X 0, all) || any(Y 0, all) error(DEA 要求所有投入与产出值严格大于0); end2.2.1 标准化处理为何不能跳过以及如何选方法投入产出指标量纲不一如“平方米” vs “百分比”会扭曲效率权重。工具箱本身不自动标准化必须由用户预处理。两种主流方式方法公式适用场景MATLAB 实现极差标准化(x - min) / (max - min)各指标极差稳定、无极端离群值X_std (X - min(X)) ./ (max(X) - min(X));Z-score 标准化(x - mean) / std数据近似正态、需保留分布形态X_std zscore(X);注意标准化必须分别对 X 和 Y 独立进行且测试集/新数据必须使用训练集的min/max或mean/std参数否则效率值不可比。2.3 调用 dea.m 执行 CCR 模型理解返回值的业务含义最简调用只需三行[theta, lambda, slacks] dea(X, Y);该命令默认运行输入导向input-oriented、规模报酬不变CRS的 CCR 模型。返回值解析如下theta: 1×n 向量每个 DMU 的技术效率值0 ≤ θ ≤ 1。θ1 表示该 DMU 位于前沿面上为 DEA 有效θ1 表示存在改进空间数值越小冗余越大。lambda: n×n 矩阵第 j 列表示构成 DMU j 的“参考组合”中各 DMU 的权重。非零权重对应的 DMU 即为其“标杆对象”。slacks: 2×(ms) 矩阵第一行是投入松弛input slack第二行是产出松弛output slack。非零值揭示具体改进方向如某 DMU 投入人力可减少 2.3 人同时产出服务人次可增加 150。2.3.1 关键参数控制如何切换 BCC 模型与方向dea.m通常支持可选参数结构体。查看函数头注释help dea可确认支持项。典型用法options struct(model, BCC, orient, output, returns, VRS); [theta_bcc, ~, ~] dea(X, Y, options);model:CCR默认或BCC规模报酬可变orient:input最小化投入或output最大化产出returns:CRS或VRS与 model 逻辑一致部分版本冗余提示BCC 模型下 θ1 仅表示纯技术有效还需结合规模效率 CCR_θ / BCC_θ判断是否处于最优规模。若未传options务必确认工具箱默认行为——某些旧版默认 BCC易导致结果误读。3. 超效率与交叉效率突破传统 DEA 的“满分天花板”与主观性3.1 为什么需要超效率 DEA当所有单位都“满分”时如何排序标准 CCR/BCC 模型中有效 DMUθ1无法进一步区分优劣形成“满分天花板”。超效率 DEASuper-SBM 或 Super-CCR通过在计算某 DMU 效率时将其自身从参考集中剔除使有效单元获得 1 的效率值从而实现精细排序。调用方式取决于工具箱实现常见为% 若工具箱提供 superdea.m theta_super superdea(X, Y, model, SBM); % SBM 超效率更鲁棒 % 或通过 dea.m 的扩展参数需查文档 options.super true; theta_super dea(X, Y, options);结果中theta_super 1的 DMU数值越大表示其相对其他所有单位的领先优势越显著。但需警惕超效率模型对异常值极度敏感。若某 DMU 投入极小而产出极大可能获得虚高分值建议同步检查其slacks是否合理。3.2 交叉效率用同行评议机制降低权重主观性传统 DEA 中每个 DMU 自由选择对自己最有利的权重导致结果缺乏可比性。交叉效率Cross-efficiency强制每个 DMU 使用其他所有 DMU 计算出的最优权重来评价自己再取平均形成共识型评分。工具箱若未内置可手动实现核心循环n size(X, 1); cross_eff zeros(n, 1); for k 1:n % 构造排除第k个DMU的参考集 X_ref X([1:k-1, k1:end], :); Y_ref Y([1:k-1, k1:end], :); % 用参考集计算第k个DMU的效率此处调用dea需确保支持单DMU评估 [~, ~, ~] dea(X_ref, Y_ref); % 实际需调用支持指定评估对象的函数 % ...省略具体求解依赖工具箱接口 end注意完整交叉效率需两层循环外层遍历被评 DMU内层遍历权重提供者计算量为 O(n³)。对于 n100 的数据集应启用parfor并确认工具箱函数线程安全。部分工具箱如dea_cross.m已封装此逻辑直接调用即可。3.2.1 三种常见交叉效率聚合策略对比策略计算方式优点缺点算术平均所有同行评分的简单均值实现简单、解释直观易受极端低分拉低整体评价最大值Aggressive取所有同行评分的最大值鼓励卓越表现忽略多数意见稳定性差最小值Benevolent取所有同行评分的最小值体现最严苛标准防过度乐观可能因单一挑剔DMU导致全盘低估实际项目中我一般先计算算术平均再用箱线图识别离群评分对偏差 1.5 倍 IQR 的 DMU 进行权重敏感性分析。4. 结果可视化与敏感性验证让 DEA 输出真正驱动决策4.1 绘制效率雷达图与标杆映射网络超越数字表格效率值theta是一维标量但决策者需要看到“为什么有效”、“向谁学习”。以下代码生成双视图% 雷达图展示各 DMU 在投入冗余与产出不足上的分布 figure(Name, DEA 效率诊断雷达图); polarplot(deg2rad(0:72:360), [theta; theta(1)], -o); % 简化示意实际需映射多维松弛 title(各分支效率值θ); % 标杆网络图用图论展示 DMU 间的参考关系 G digraph(zeros(n)); for j 1:n % lambda(:,j) 中非零元素即为 DMU j 的标杆 refs find(lambda(:,j) 1e-6); G addedge(G, j*ones(size(refs)), refs); end figure; plot(G, Layout, force, NodeLabel, arrayfun(num2str, 1:n, UniformOutput, false)); title(DEA 标杆映射网络箭头指向标杆单位);提示雷达图需将slacks投影到统一尺度如百分比冗余上述仅为示意框架。真实应用中我常用scatter绘制thetavs 规模效率散点图用颜色编码行业类别快速定位“高效率但小规模”或“低效率但超大规模”的特殊群体。4.2 敏感性分析检验结论是否被个别数据点绑架DEA 结果可能因单个异常 DMU 而剧烈波动。执行以下三步验证删除法Leave-One-Out逐个剔除 DMU重跑全模型观察theta均值变化率base_theta dea(X, Y); delta_mean zeros(n, 1); for k 1:n X_loo X([1:k-1, k1:end], :); Y_loo Y([1:k-1, k1:end], :); theta_loo dea(X_loo, Y_loo); delta_mean(k) abs(mean(theta_loo) - mean(base_theta)) / mean(base_theta); end扰动法对投入/产出施加 ±5% 随机噪声重复 100 次统计theta的 95% 置信区间宽度。聚类稳健性用 K-means 将 DMU 分为 3 类分别在各类内运行 DEA检查跨类效率排名是否一致。注意若delta_mean 0.1515%的 DMU 超过 10%说明结果高度依赖少数单位必须核查其数据真实性或考虑使用 Robust DEA 变体如dea_robust.m若工具箱提供。5. 高级技巧将 DEA 结果嵌入业务系统与自动化报告流5.1 生成可交付的 Excel 报告包含动态图表与关键发现摘要MATLAB 原生支持 Excel 写入。以下代码生成带格式的报告% 创建 Excel 文件 xlswrite(DEA_Report.xlsx, DEA 效率分析报告, Summary, A1); xlswrite(DEA_Report.xlsx, {DMU_ID, Efficiency_θ, Slack_Human, Slack_Budget}, Summary, A3); % 写入数据假设 id_names 是字符数组 data_report [id_names, num2cell(theta), num2cell(slacks(1,:)), num2cell(slacks(2,:))]; xlswrite(DEA_Report.xlsx, data_report, Summary, A4); % 插入柱状图需 MATLAB R2019b fig figure(Visible, off); bar(theta); title(各 DMU 技术效率值); print(fig, -dmeta, efficiency_chart.emf); % 导出 Windows 兼容图元 % 后续用 Excel COM 接口插入图片此处略5.1.1 自动化关键发现提取用规则引擎替代人工解读效率报告的价值在于行动建议。我常编写规则函数将theta和slacks转为自然语言摘要function summary generate_insight(theta, slacks, threshold_low, threshold_high) n length(theta); summary strings(n, 1); for i 1:n if theta(i) threshold_high summary(i) sprintf(DMU %d高效标杆建议提炼其 %s 管理模式推广, ... i, get_best_practice(slacks(:,i))); % 辅助函数识别主导松弛 elseif theta(i) threshold_low % 找出最大松弛维度 [max_slack, dim_idx] max([slacks(1,i), slacks(2,i)]); var_name {人力投入, 预算投入, 服务产出, 质量产出}(dim_idx); summary(i) sprintf(DMU %d效率低下首要改进 %s当前冗余 %.1f%%, ... i, var_name, max_slack * 100); else summary(i) sprintf(DMU %d中等效率关注 %s 优化潜力, ... i, get_secondary_slack(slacks(:,i))); end end end提示threshold_low0.7、threshold_high0.95是经多项目验证的实用分界点。get_best_practice可基于lambda矩阵中最高权重的 DMU 的行业标签返回如“三甲医院流程”。5.2 与数据库联动实时加载数据并触发 DEA 分析若 DMU 数据存于 SQL Server可用 Database Toolbox 直连conn database(DEA_DB, user, pwd, Vendor, SQLServer, Server, db-server); sql_query SELECT dmu_id, staff, area, budget, cases, satisfaction FROM branches WHERE year 2024; data_db fetch(conn, sql_query); X_db data_db{:, {staff, area, budget}}; Y_db data_db{:, {cases, satisfaction}}; % 执行分析 [theta_live, ~, slacks_live] dea(X_db, Y_db); % 写回数据库 insert(conn, dea_results, {dmu_id, efficiency, slack_staff}, ... [data_db{:, dmu_id}, num2cell(theta_live), num2cell(slacks_live(1,:))]); close(conn);此流程可封装为定时任务Windows Task Scheduler 或 Linux cron实现“数据入库 → 自动分析 → 结果入库 → BI 看板更新”的闭环。关键在于确保dea.m不依赖交互式输入所有参数硬编码或从配置文件读取。本文还有配套的精品资源点击获取