
简介DEA的MATLAB程序包内含DEA-Solver工具箱面向运筹学、管理学与经济学领域的研究者和实践者用于评价企业、高校、医院等多投入多产出组织的相对效率。压缩包共21个文件以xls数据表格、pdf理论文献、m脚本及mat数据文件为主整体约2.54MB其中包含CCR、BCC等经典DEA模型的定义、求解与结果分析组件还有doc和txt说明便于查阅。已有442人学习适合希望系统掌握DEA建模方法、快速开展效率评价实战的读者。借助这份资源可以学习DEA原理在MATLAB中快速构建和求解模型还可基于示例数据与文档进行自定义扩展或用作教学演示。需注意运行DEA-Solver可能需要安装MATLAB优化工具箱合理设置参数能有效缩短大型数据集的计算时间。 先说结论这个MATLAB工程干的事情就是给你一套能直接跑的数据包络分析工具箱里面那个dea solver不是那种带界面的商业软件而是封装好了的求解函数。你只要把决策单元DMU的投入产出数据整理成矩阵调用一下就能得到效率值、松弛变量、投影值这些结果。DEA这个名字听起来学术但实际应用场景非常广高校院系绩效评估、银行网点运营效率、医院科室资源利用、物流分拨中心效率对比甚至我自己还帮人做过连锁门店的坪效分析用的都是这套逻辑。这篇文章我打算从DEA的基本思路讲起再结合这个MATLAB项目里的solver实际用法把数据准备、模型选择、代码调用、结果解读、常见坑位一次说清楚。适合两类人看一是运筹学、管理科学方向的学生或老师论文需要跑DEA又不想从零写线性规划二是工作中需要做效率评估的从业者想在Excel手算之外找一个能批量处理、可复现的分析工具。1. 项目概述与整体思路1.1 DEA是什么为什么用MATLABDEA全称Data Envelopment Analysis中文叫数据包络分析是一种基于线性规划的相对效率评价方法。它不需要预设生产函数也不需要价格信息只依赖投入产出数据就能算出每个决策单元在“生产前沿面”上的相对效率。这个特性特别适合处理多投入、多产出的效率评价问题比如教育、医疗、金融这些难以用单一利润指标衡量的领域。为什么用MATLAB因为DEA本质上是一堆线性规划问题。每个决策单元都要解一个优化模型样本量一大手动在Excel里排规划求解既不现实又容易出错。MATLAB自带的linprog可以直接求解线性规划但直接用linprog写DEA需要自己做模型转换、变量对齐、结果解析代码量不小。这个项目里内置的dea solver就把这些事情封装好了你提供数据它负责求解省掉中间一堆容易出错的环节。1.2 内含的dea solver到底是个什么东西根据项目标题来看这个MATLAB工程里最重要的资产就是dea solver。我拿到类似项目后第一件事就是打开函数目录看看里面封装了什么。常见的实现方式是这样一个主函数dea或deasolver.m内部接收投入矩阵X、产出矩阵Y以及模型选项比如CCR还是BCC、投入导向还是产出导向然后循环调用linprog计算每个DMU的效率值。这里有一个容易忽略的点DEA的线性规划模型往往是对偶模型直接写原问题也可以但求解效率和对偶变量的解释都会差一些。成熟的solver会自动处理好两件事一是把效率模型转成标准线性规划形式二是处理无穷小量epsilon避免所有变量权重为零的退化情况。如果只看结果不看内部实现这个问题不明显一旦你自己尝试手写一个简单的DEA脚本就会发现很容易卡在边界条件上。1.3 这类项目适合什么人、能解决什么问题我个人的判断是这类“程序内置solver”的组合最适合三种情况学生写论文。管理科学与工程、应用经济学的论文里DEA是常用实证工具直接跑现成solver可以快速验证假设把精力聚焦在模型解释上而不是debug线性规划。企业做效率评价。比如区域经理要评估几十家门店的运营效率投入指标选人力成本、营业面积、库存产出选销售额、客流量、利润DEA能在没有标准成本数据的情况下给出一个相对效率排序。研究者做方法对比。你可以在同一套数据上切换CCR、BCC、SBM模型比较不同模型下的效率差异这在方法类文章中是常见的敏感性分析。但也有不适合的人如果你需要的是带有友好图形界面的商业软件比如DEA-Solver Pro那么这个MATLAB脚本显然不是你的菜它更偏向脚本化、批量化、可嵌入分析流程。2. 核心原理与模型选型2.1 CCR、BCC、SBM怎么选DEA最基础的模型是CCR由Charnes、Cooper和Rhodes在1978年提出它假设规模报酬不变CRS也就是说投入翻倍、产出也翻倍。BCC模型由Banker、Charnes和Cooper在1984年扩展放宽到规模报酬可变VRS区分了纯技术效率和规模效率。简单理解CCR算出来的效率值是综合技术效率BCC算出来的是纯技术效率两者相除可以得到规模效率。在solver的配置里通常会有model参数比如CCR或BCC。实际使用中如果评价对象之间规模差异很大比如既有几十人的小店又有上千人的大厂那用BCC更合理否则可能把所有规模不经济都归到技术无效率里。如果规模差异不大CCR往往够用。还有SBM模型它属于非径向DEA能处理投入产出同比例和非同比例变化的问题对于存在零值、负值的数据SBM通常更稳健但计算复杂度高一些。2.2 投入导向还是产出导向这是个看似简单但非常影响结果的选择。投入导向Input-Oriented的意思是在产出不变的前提下测算投入能压缩多少比例。产出导向Output-Oriented是在投入不变的前提下测算产出能增长多少比例。怎么选核心看评价对象的控制能力。比如评价医院科室效率科主任大多控制不了门诊量需求但可以通过优化排班、耗材管理来控制成本这更贴合投入导向。反过来评价销售团队效率团队可以努力增加销售额但资源投入比如广告预算往往由公司统一调度这种场景更适合产出导向。在dea solver的调用参数里orient可以设置成input或output如果不确定建议把两个都跑一遍观察效率排名是否发生明显变化这本身就是论文里不错的分析素材。2.3 规模效率与松弛变量到底看什么很多人跑完DEA只看效率值结果发现自己浪费了大半信息。以BCC模型为例输出结果里除了技术效率还能得到规模效率和规模报酬状态递增、递减、不变。规模报酬递增意味着可以扩大规模递减则意味着扩张要谨慎。这个信息对运营决策比效率值本身更有指导意义。松弛变量同样重要。一个DMU效率为1不一定就是“完美”。在非径向模型中投入冗余或产出不足都会体现为松弛变量非零。比如某门店效率0.95你去看松弛变量发现人员投入松弛了15%这意味着在不降低产出的情况下理论上可以裁掉15%的人力。这些具体数值比一个单纯的0.95更能指导改进行动。3. MATLAB实操用dea solver跑通一个完整案例3.1 数据准备DMU、投入、产出的表格结构这是整个流程里最花时间的一步也是最多人出错的一步。DEA对数据格式要求很严格每行是一个决策单元每一列是一个指标。我通常习惯用Excel整理再通过MATLAB的readmatrix或readtable导入。一个典型的例子评估12个物流配送中心的效率投入指标选人工成本、车辆数、仓库面积产出指标选日处理订单数、准时交付率。那么数据矩阵就是12行投入矩阵X是12×3产出矩阵Y是12×2。注意指标的单位可以不一致因为DEA的线性规划会自动处理权重但指标的方向必须一致投入越小越好产出越大越好。3.2 核心代码调用dea solver计算效率假如工程里的solver函数名是dea_solver基本调用方式大概长这样% 加载数据这里假设已经保存为xlsx文件 data readmatrix(DMU_data.xlsx); % 假设前3列是投入后2列是产出 X data(:, 1:3); Y data(:, 4:5); % 调用solver使用BCC模型投入导向 options.model BCC; options.orient input; % 有些solver版本还会要求你指定是否计算超效率、是否汇总结果 options.super false; result dea_solver(X, Y, options); % 结果里一般包含 eff效率值、rank排名、lambda同组权重、slack、target eff result.eff;这里有一点非常关键linprog默认求解的是最小化问题而DEA的效率模型通常表达为最大化或分式规划。成熟的solver内部会把效率值模型转化为线性规划的对偶形式再调用linprog求解具体方向由solver自己管理。你只需要明确你选择的是投入还是产出导向不需要自己设定目标函数符号。3.3 结果读取效率值、排名、投影值跑完solver之后输出结果一般是一个结构体我习惯逐个字段打印出来看% 效率值和排名 disp(table((1:size(X,1)), eff, rank)); % 查看松弛变量判断投入冗余 disp(result.slack_input); disp(result.slack_output);投影值是我最常用来做决策建议的参数。投影的意思是如果这个DMU要达到效率前沿它的目标投入产出应该是多少。你可以简单理解成“最优状态下的指标值”。比如某个配送中心当前每日处理订单量是5000单投影值是6500单那说明产出不足改进方向就是提升订单处理能力而不是压缩车辆数。把投影值和当前值的差整理成表格可以直接给业务部门做改进参考。4. 常见问题与排查技巧实录4.1 效率值全是1是不是跑错了这是最常见的困惑。我拿到一份结果看到所有效率全是1第一反应不是“样本都好棒”而是“模型可能区分度不够”。产生这个现象的原因通常有三个决策单元数量太少或者指标数量太多。DEA的经验法则是DMU数量至少是指标数量的两到三倍最好达到三倍以上。如果只有10个DMU却有6个指标那么绝大多数DMU都容易被识别为有效。投入产出指标之间高度相关。比如同时放入“营业面积”和“租金成本”这两个指标高度相关等于变相降低了指标维度的实际数量也让DEA更容易把所有DMU都包络起来。模型和数据范围不匹配。比如数据存在缺失或异常值solver内部自动处理时把异常点当成前沿导致结果整体偏高。遇到这种情况先检查数据量再检查指标相关性最后可以做一次相关系数矩阵看看有没有冗余指标。删除一个强相关指标往往就能让效率值分布拉开。4.2 指标多、DMU少怎么处理学术论文里经常见到“样本只有十几个指标选了七八个”的尴尬局面。解决办法有几个方向但都不是很完美减少指标。用主成分分析先降维把多个投入指标合成一个或两个综合指标再跑DEA。不过这会让结果的物理含义变差解释起来比较费劲。扩大样本。如果研究对象可以细分到月别或区域别尽量扩展DMU数量。使用窗口DEAWindow DEA把同一单位不同时期的数据当成多个DMU变成面板形式的效率测算这是学术论文里比较常用的妥协方案。实测下来我建议至少保证“DMU数量 ≥ 2 × 指标数量”否则结果几乎不可用落不了地。4.3 solver结果和自己手写linprog对不上这是一个很有代表性的debug问题。你拿自己手写的CCR脚本和这个项目里的solver跑同一份数据结果差异明显。我遇到过的情况主要有两种第一模型形式不一致。比如你手写的是产出导向但dea solver默认是投入导向结果当然对不上。第二无穷小量的处理方式不同。很多DEA源代码里会设置一个很小的epsilon比如1e-6手动写代码时如果忽略它或者epsilon取得太大效率值会出现微小差异。还有人会犯一个错误以“让每个DMU的效率值在0到1之间”为理由对计算后的效率值做归一化。这样做完全破坏了DEA的原理DEA本身的效率值已经是相对比例不需要额外归一化。如果你看到solver里有个normalize选项除非你明确知道它在做什么不然别乱开。4.4 可视化与论文出图建议DEA结果用表格呈现太枯燥我一般做三类图效率分布直方图展示整体效率形态。效率值与规模报酬状态散点图X轴是规模状态Y轴是效率值可以看到高效率单位集中在哪个规模区间。投入产出投影对比图可以用条形图把当前值和目标值并列显示一眼看出改进空间。MATLAB里画图有几个小技巧。用tiledlayout做多子图比subplot更整齐尤其适合输出论文图。图例和字号建议统一用set(gca, FontSize, 12)固定不然放到Word里会显得参差不齐。输出图片用exportgraphics函数线宽和清晰度都比saveas好很多。我在实际跑这个项目时还有一个心得dea solver返回的lambda权重矩阵值得多看一眼。它告诉你一个无效DMU是参考了哪些有效DMU的线性组合才得到的目标值。比如某门店的目标产出是参考了门店3和门店7的组合这是很有说服力的对标信息比单纯给个“改进方向”硬气得多。后面我把这个方法用在一个连锁零售项目上就是通过这个参考集找出了几个标杆门店把它们的运营参数整理成SOP整个项目组的接受度非常高。最后再分享一个小操作如果你不想每次跑数据都打开MATLAB脚本改路径可以在脚本开头加一段uigetfile选择Excel文件把数据导入这个交互动作从“改代码”变成“选文件”这样即使不会写MATLAB的同事也能自己换数据跑结果。很多所谓的“DEA小工具”说白了就是把这一步做顺了用起来才显得高级。本文还有配套的精品资源点击获取