做建模这些年,我有个特别深的体会:很多同学一看到“评价”“绩效”“效率”这类题目,第一反应是层次分析法(AHP)或者熵权法,很少有人第一时间想到数据包络分析。但恰恰是DEA——这个看起来公式复杂、名字拗口的方法,在处理多投入、多产出的效率评价问题时,比AHP靠谱得多。为什么?因为AHP的权重是人为给定的,主观性太强;而DEA的权重是模型自己算出来的,不需要你拍脑袋,这在数学建模竞赛里是巨大的优势——评委不怕你的结论有倾向性,就怕你的结论说不出依据。
我之所以想专门写一篇DEA的拆解,是因为2025年国赛好多题都能看到DEA的影子:资源配置、供应链绩效、卫生健康投入产出效率……这个模型几乎是管理决策类题目的“万能钥匙”。2019年国赛“机场出租车”问题、2021年的一些优化评价题、2023年E题的分析,本质上都可以用DEA来切入。换句话说,DEA不是冷门模型,而是被大多数人低估的常规武器。
这篇文章我会按照自己备赛和带队的习惯来写:先讲清楚DEA到底解决什么问题、哪些题能用哪些题别硬用,再拆解CCR和BCC两种经典模型的数学直觉,然后直接上一份能在Python里跑通的完整代码,最后补充竞赛中容易踩的坑和论文呈现的技巧。无论你是刚入门的小白,还是已经会用几行代码建模的老手,这篇文章都能让你在赛场上少走弯路。
1. 看清楚再动手:DEA适合解哪类题,不适合哪类题
1.1 DEA本质上是一个“效率体检仪”
很多教程一上来就扔公式,搞得DEA像天书一样。但你先忘掉那堆线性规划符号,用大白话理解DEA是干什么的。
想象你面前有10家快递公司,每家都有员工数、车辆数、仓库面积这些“投入”,也都有订单量、客户满意度这些“产出”。现在老板要你给这10家公司打个分,看谁经营得最好。最简单的办法是算人均单量、每辆车的配送量,但问题来了——这些指标只能反映单一的投入产出比。要是某家公司员工少但仓库特别大,你拿人均单量排出来的名次就不公平。还有,客户满意度这种东西,很难用单一比值衡量。
DEA的思路特别有意思:它不预设公式,而是把每一家公司当作一个“决策单元”(DMU),然后在所有公司里寻找“谁最优”。只要有一家公司A的各类投入都不高于公司B,而各类产出都不低于公司B,那么公司B就没理由比A强。DEA用线性规划把所有产出和投入都压缩成一个“综合效率值”,效率值为1的就是相对最优,小于1的就是还有提升空间。注意我这里说的是“相对”——DEA评价的是“你在这群人里到底行不行”,而不是一个绝对标准。
1.2 近几年的赛题里,哪些场景会卡在DEA射程内
从我自己刷过的国赛、研赛(华为杯)题目来看,DEA最适合出现在下面几类场景。
第一类是资源配置评价。比如题目给了若干区域或部门,每个区域都有资金、人力、土地等投入指标和GDP、税收、就业等产出指标,让你分析“投入产出效率”并给出优化方案。这种题用DEA几乎是送分——数据都是现成的面板数据,效率值一跑,排名一给,结论就出来了。
第二类是方案优选与绩效比较。比如2023年E题涉及的公共卫生投入绩效评价,或者“某企业各分店运营效率分析”。这类题的共同点是投入产出指标都是多维度,单纯用加权求和会面临权重争议,而DEA恰好可以在不给定权重的情况下完成评价。
第三类是带改进方向的管理决策题。DEA不只给效率值,还会告诉你每个无效单元应该参照哪个有效单元去改进(这部分叫“投影分析”)。如果题目要求“提出合理化建议”,DEA给出的改进方向——比如“A公司应压缩15%员工数同时增加10%订单量”——比泛泛而谈有力得多。
1.3 什么时候不要用DEA,避免“模型万能论”
DEA虽好,但绝不是万能药。我见过不少队伍把DEA硬套在预测题上,结果跑出来一堆效率值,和题目要的“预测未来”完全不搭边,这就是典型的没用对地方。
DEA不太适合三类题。第一类是纯预测类题,比如让你预测未来几年的碳排放量或GDP,DEA根本不含时间序列动态关系,强行用只会显得外行。第二类是因果关系挖掘类题,比如让你分析“到底是价格影响了销量还是服务影响了销量”,这类题更适合回归、SEM结构方程等。第三类是指标方向混乱的题——DEA要求所有投入指标都是“越小越好”或至少方向一致,产出指标都是“越大越好”,如果你手里有几个指标方向没法统一,用DEA就很麻烦,比如“气泡”数据(既有正指标又有负指标)处理起来会非常别扭。
一句话总结:效率评价、绩效比较、资源配置优化,无脑想DEA;预测、因果推断、指标方向混乱的情况,绕道走。搞清楚这个边界,你的模型选型就成功了一半。
2. CCR与BCC:两种视角的效率评价,赛题里该怎么选
2.1 规模报酬不变与可变:两种假设背后的经济学直觉
DEA最核心的两个模型是CCR和BCC,名字分别是三位作者姓氏的首字母。它们最大的区别在于一个假设——规模报酬是否可变。
CCR模型假设规模报酬不变(CRS),意思是投入翻倍,产出也翻倍,所有决策单元都在最优规模上运行。这个假设在现实中往往不成立。你开一家奶茶店,从1家店扩张到2家店可能成本、人工都能摊薄;从50家扩张到51家可能就没有规模优势了。现实中绝大多数组织都处在“规模报酬递增”或“规模报酬递减”的阶段,这时再用CCR衡量效率会把“规模不合适”和“经营能力差”混在一起。
BCC模型假设规模报酬可变(VRS),它把综合技术效率(TE)拆成两个部分:一是纯技术效率(PTE),反映的是你有没有用先进的管理方式、技术手段来运营;二是规模效率(SE),反映的是你目前的规模离最优规模有多远。三者的关系是:TE = PTE × SE。
2.2 效率值怎么解读,才能让评委看到你懂行
很多同学跑完代码看到一堆效率值就完事了,这是最浪费的。我建议你在论文里永远用下面这套解读口径。
综合技术效率等于1,说明这个决策单元在现有投入产出结构下,相对其他单元是最优的,可以把它称为“DEA有效”。如果综合技术效率小于1,这时要看纯技术效率与规模效率哪个低。
假设一个物流网点TE=0.82,PTE=0.93,SE=0.88。你可以这样写:该网点综合效率偏低主要是规模效率不足导致的,即网点规模没有达到最优经营规模,应适当调整资源投入规模;而纯技术效率较高说明其内部管理水平尚可。反过来,如果TE=0.82,PTE=0.68,SE=0.98,那问题就出在管理或技术上,加人加钱也白搭,应该先优化流程、引入新方法。这种解读能直接对应到政策建议,是论文里非常加分的部分。
2.3 投入导向还是产出导向,结合题目要求去选
DEA模型还分为投入导向和产出导向。投入导向是“在保持产出不变的情况下,投入最多能压缩多少”,产出导向是“在投入不变的情况下,产出最多能增加多少”。两个方向最后算出来的效率值可能会不一样,所以选题时要想清楚。
如果题目问“如何节约成本”“如何优化资源配置”,选投入导向;如果题目问“如何提升产量”“如何增加收益”,选产出导向。比如一道“公交公司运营效率评价”题,公交线路的运营班次已经排死,很难大幅压缩车辆,但你希望在不增加车辆的情况下提高乘客满意度,那这就是产出导向。反过来,如果乘客量基本固定,主要是想看看哪些分公司养了太多闲人、浪费了太多经费,那就是投入导向。竞赛中大多数效率评价题选投入导向,因为资源投入比产出更容易调整,评委也更好理解。
下面这张表是我做赛题分析时常用的对照,写论文时可以借鉴:
| 对比维度 | CCR模型 | BCC模型 |
|---|---|---|
| 规模报酬假设 | 不变(CRS) | 可变(VRS) |
| 效率含义 | 综合技术效率(TE) | 纯技术效率(PTE)与规模效率(SE) |
| 适用场景 | 所有DMU规模相似,可视为最优规模 | DMU规模差异大,存在扩张或收缩可能 |
| 优势 | 计算简单,结论直接 | 能定位低效根源,政策建议更丰富 |
| 劣势 | 规模因素混入管理效率中 | 模型更复杂,需要额外解释 |
3. Python里的DEA:用DEAP库还是直接手写线性规划
3.1 先破除一个误区:DEAP跟DEA不是一回事
网上一搜“Python DEA”,很多教程会引导你去装一个叫DEAP的库。但这里必须先说清楚一个坑:DEAP的全称是Distributed Evolutionary Algorithms in Python,它是一个进化计算框架,跟数据包络分析没有直接关系。虽然理论上你可以用DEAP做优化求解DEA,但那是拿大炮打蚊子,而且容易把自己绕晕。
真正做DEA的常见工具其实是这几条路:R语言里的Benchmarking包特别成熟,适合快速验证;Python里你可以用scipy.optimize.linprog或pulp来自己写线性规划求解器;另外也有专门的gurobipy、cvxpy等商业或开源求解器。但竞赛场景下我最推荐自己用pulp或scipy写,为什么?因为你能完全控制模型结构和求解过程,论文里写清楚每一步的线性规划方程,评委想质疑都无从下口。用现成的黑盒包虽然省事,但一旦被问“内部怎么算的”就露怯了。
3.2 数据准备和代码实现:一套能直接改用的模板
我们用一个简化案例:8家物流企业,每家都有2个投入指标(员工数x1、运营成本x2)和2个产出指标(业务量y1、客户满意度y2)。下面这段代码是我自己调通后整理出来的模板,基于pulp求解器。
首先安装依赖:
pip install pulp pandas然后准备数据并执行CCR投入导向模型:
import pandas as pd from pulp import LpProblem, LpMinimize, LpVariable, LpStatus, value # 构造数据,实际赛题中把这里换成你读取的Excel或CSV即可 data = pd.DataFrame({ 'DMU': ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'], 'x1': [20, 30, 40, 50, 35, 45, 60, 55], # 员工数 'x2': [300, 400, 500, 600, 450, 550, 700, 650], # 运营成本 'y1': [100, 150, 180, 200, 160, 190, 210, 205], # 业务量 'y2': [50, 60, 70, 75, 65, 72, 80, 78] # 客户满意度 }) n = len(data) input_cols = ['x1', 'x2'] output_cols = ['y1', 'y2'] # 保存每个DMU的效率值 results = {} for i in range(n): prob = LpProblem(f"DEA_CCR_{i}", LpMinimize) # theta表示投入压缩比例,lambda是对照DMU的权重 theta = LpVariable("theta", 0) lam = [LpVariable(f"lam_{j}", 0) for j in range(n)] # 目标函数:最小化theta prob += theta # 投入约束:有效前沿上DMU的线性组合投入 <= theta * 当前DMU投入 for col in input_cols: prob += sum(lam[j] * data[col][j] for j in range(n)) <= theta * data[col][i] # 产出约束:有效前沿上DMU的线性组合产出 >= 当前DMU产出 for col in output_cols: prob += sum(lam[j] * data[col][j] for j in range(n)) >= data[col][i] # 求解 status = prob.solve() # 记录结果 results[data.loc[i, 'DMU']] = { 'status': LpStatus[status], 'TE': value(theta) } # 输出结果 for dmu, res in results.items(): print(f"{dmu}: 综合技术效率={res['TE']:.4f}")如果要用BCC模型,只需要在约束里增加一条所有lambda之和等于1的凸性约束:
# 在上面的循环里,增加一行约束即可 prob += sum(lam[j] for j in range(n)) == 1这就是CCR与BCC在代码层面唯一的差别。跑完之后,把两种模型的TE都算出来,再利用公式SE = TE / PTE(这里PTE是BCC算出来的效率值),三列效率就齐了。
3.3 跑完代码之后,有哪些“看不见”的细节需要检查
我第一次用pulp跑DEA时踩了几个坑,这里重点说一下。
第一,目标函数和约束的方向千万别搞反。CCR投入导向的目标是“最小化theta”,theta乘在当前DMU的投入上,约束是“线性组合的投入不超过theta倍的当前投入”。很多同学把theta乘到了产出上,跑出来的效率值就完全错了。
第二,pulp的变量默认是非负的,lambda非负正好符合DEA要求,但如果你用scipy写,记得显式设置bounds=(0, None)。这是一个极少被教程提到但极其关键的细节。
第三,DEA对数据中的0值和负值非常敏感。如果你的原始数据里有0投入或负增长类指标,模型可能无解或输出极端值。实际操作中,我会对这类指标做平移处理,也就是加上一个正的常数让其变为正数,比如“亏损额”这类负向产出,可以先取相反数再处理方向。但平移会影响不同DMU之间的相对距离,所以一旦平移了,在论文里必须写明处理方式和原因,评委不会因为你做了处理而扣分,但会因为你不交代处理过程而质疑。
4. 竞赛实战:选取指标、处理敏感性与解读结果
4.1 数量要求:DMU个数和指标数之间有硬约束
许多队伍跑出来的效率值清一色全是1,论文根本没法分析。这往往不是运算错误,而是指标数太多而决策单元太少导致的“区分度不足”问题。DEA的区分能力依赖一个经验法则:决策单元数量至少应该是指标总数的2到3倍以上,最好能达到3倍以上。
举个例子,如果你选了4个投入指标、3个产出指标,一共7个指标,那么至少需要14到21个决策单元才够用。不然的话,每个DMU的自由度都不够,模型会倾向于让每个DMU都找到一组“只针对自己有利”的权重,最后所有效率都接近1。这就像10个评委给2个选手打分,只要操作空间够大,肯定能打出双冠军。
如果你实在凑不够决策单元,我的建议是:减少指标个数,优先保产出指标。因为竞赛中最关键的评价结论通常落在产出上,投入指标可以用相关性分析剔除高度相关的冗余项。比如员工数和运营成本经常强相关,保留其中一个就够了。
4.2 指标选取:不是越多越好,方向要“投入小产出大”
DEA的指标选取有一个铁律:所有投入指标必须是“越小越好”的(成本型),所有产出指标必须是“越大越好”的(效益型)。这个方向必须统一,否则模型结论没有意义。
在实际赛题中,有人会把“客户投诉率”当作投入指标,投诉率确实是越低越好,但这属于产出端还是投入端?我通常建议把投诉率放在产出端,并用倒数或负向指标的方式处理——比如用“非投诉率 = 1 - 投诉率”来替代,这样它的方向就变成了“越大越好”。方向统一之后,指标之间的相关性也要检查。DEA虽然没有像回归那样严格的共线性要求,但强相关的指标会让好几个DMU的效率值挤在一起,结果难解读。我的习惯是先画相关系数热力图,把相关性高于0.8的指标挑出来删掉或合并。
4.3 敏感性分析与异常值:这步能看出你建模深不深
光把效率值算出来就交给评委,这种论文最多拿省奖。什么能让你从一堆“跑完即弃”的队伍里跳出来?敏感性分析。DEA的敏感性分析思路很简单:每次删除一个或几个指标(或决策单元),重新计算所有DMU的效率值,观察排名变化。
如果某些DMU在你的“删除某个指标”实验后效率排名剧烈波动,说明它们的效率高度依赖这个指标,结论不够稳健。在论文里用一张热力图或折线图展示这种波动,然后说“效率评价结果对模型设定具有较好的稳健性,排名变化在合理范围内”,评分一下就上去了。
这里要提醒一下:DEA对异常值相当敏感。如果你的数据里某家企业的投入产出出现了极端情况,比如别的企业员工数都是几十人,它来个几千人,那它很有可能会被误判为有效或无效。我在2023年做一次绩效分析时就遇到过一个网点因为仓库面积异常大而被判为DEA有效,但实际经营数据平平无奇。后来我才查到是录入错误。所以跑模型之前一定要先做描述性统计,检查最大值、最小值有没有离谱的数值。
4.4 结果解读:从“分数排名”到“标杆对照与投影改进”
效率值排名只是第一层。DEA最有价值的信息藏在两个地方:一是标杆对照,二是投影改进方向。
标杆对照是指,对于每个无效DMU,它应该去学习哪个有效DMU的经验。在代码里,所有lambda权重中,哪个DMU对应的lambda最大,哪个就是它的主要参照标杆。比如A的效率是0.8,对应B的lambda=0.6、C的lambda=0.3,那A最应该对标的是B,说明B在相同投入产出结构下是更优的经营范本。
投影改进方向则是利用松弛变量计算“目标值”,也就是把无效DMU修正到有效前沿上,投入需要压缩多少、产出需要增加多少。这一点在论文里可以直接转化成管理建议:不要写“建议提升运营效率”这种正确的废话,要写“该网点若以标杆企业为参照,员工数可从45人压缩至36人,业务量应提升至200单位”,这种有具体数字的建议才是评委想看的东西。由于上面那段代码里没有直接输出松弛变量,如果你需要投影值,可以在求解后读取lambda的值和每个变量的残差,常见求解器都支持读取变量对应的对偶值——这就是我为什么推荐手写模型而不是用黑盒包。
5. 把DEA写进论文:从数据到结论的表达细节
5.1 符号与模型表达:别让评委看不懂你的方程
很多同学论文里的模型部分是直接把参考书上的公式抄上去,然后说“本文采用DEA方法”,中间没有衔接,这是最大的扣分点。DEA写进论文,最严谨的顺序是:先定义决策单元,再定义投入产出指标,再给出CCR或BCC的对偶规划形式。
具体来说,我论文里通常这样写:
设有n个决策单元(DMU,记为j=1,2,...,n),每个决策单元有m种投入指标x_ij(i=1,2,...,m)和s种产出指标y_rj(r=1,2,...,s)。对于被评价的决策单元DMU_0,其CCR投入导向模型如下:
目标函数:min θ
约束条件: ∑_{j=1}^{n} λ_j x_ij ≤ θ x_i0, i=1,2,...,m ∑_{j=1}^{n} λ_j y_rj ≥ y_r0, r=1,2,...,s λ_j ≥ 0, j=1,2,...,n
这里θ就是综合效率值。如果要写BCC,在上面基础上加上∑λ_j = 1即可。
这个表述不需要太长的推演,但公式和符号定义必须与后文表格一一对应。文中第一次出现“DMU”时,要写全称decision making unit并给出中文译名“决策单元”。
5.2 结果表格怎么呈现,才能一眼抓住评委
效率值结果表是DEA论文的核心可视化。我最推荐的表格格式是下面这样,一页纸内既能看排名,又能看结构:
| 决策单元 | 综合技术效率TE | 纯技术效率PTE | 规模效率SE | 规模报酬状态 | 主要参照标杆 |
|---|---|---|---|---|---|
| 企业A | 1.000 | 1.000 | 1.000 | 不变 | 自身 |
| 企业B | 0.876 | 0.920 | 0.952 | 递增 | 企业A、C |
| 企业C | 1.000 | 1.000 | 1.000 | 不变 | 自身 |
| 企业D | 0.761 | 0.800 | 0.951 | 递减 | 企业A |
“规模报酬状态”这一列是很多人忽略的。递增说明该DMU处于规模偏小的状态,继续扩大规模能带来更高比例的产出;递减则说明规模偏大,继续扩张不划算。把这个信息写进建议部分,比单纯说“效率有待提升”有力得多。
5.3 多方法融合:DEA不只是单独出个效率值就收工
在真正的赛题里,DEA很少单独撑起一篇完整论文,它更适合作为评价模块嵌入分析链条。我见过比较好的思路是DEA+TOPSIS、DEA+聚类、DEA+回归联动。
DEA+TOPSIS的思路是,先用DEA算出各决策单元的效率值和规模报酬状态,再用TOPSIS对投入产出指标和效率值做综合排序,这样既能保留DEA的相对有效性,又能给出一个更精细的“好中差”排名。DEA+聚类的思路则是先跑DEA拿到效率值,再用K-means或层次聚类对各DMU分类,观察不同效率层次在投入产出结构上的差异。DEA+回归的思路是把效率值作为被解释变量,外部环境因素(政策、人口密度、资源禀赋等)作为解释变量,看看哪些外部因素显著影响了效率。这种“两阶段法”在文献里非常经典,适合题目要求你进一步分析效率影响因素的情况。
用这些融合方法时,切忌把两个模型各跑一遍就往论文里堆,一定要有内在逻辑链条:DEA解决“谁好谁坏”,TOPSIS解决“综合谁最优”,聚类解决“能不能分群讨论”,回归解决“为什么会有差异”。每一步都在回答前一步留下的问题,这才是评委喜欢看到的建模思路。
5.4 结合政策建议:让“模型输出”变成“可落地方案”
DEA跑出结果后,很多队伍不知道怎么把效率值转化为政策建议。我在这里分享一个万能路径:先分类,再定位,最后给对策。
分类就是按照“高效率高规模”“高效率低规模”“低效率高规模”“低效率低规模”把决策单元分档。高效率高规模的是标杆,让大家学习;高效率低规模的是潜力股,建议扩大规模;低效率高规模的是重资产低产出,建议收缩规模或重组资源;低效率低规模的是问题户,建议优先改善管理再考虑规模扩张。定位就是针对每一类DMU,结合具体指标差值给出改进目标值。给对策时一定要落到“人、财、物、流程、制度”五个层面,不要空谈“提高管理水平”。
例如你评价的是某地区医疗资源配置效率,低效率高规模的医院,建议不是简单地削减资源,而是参照标杆医院的科室结构和设备使用率进行内部调配;低效率低规模的社区医院,建议合并相邻机构、共享医疗设备,通过规模扩展提升专业化程度。这样结论就有血有肉,不再是模型数字的堆砌。
在我个人带队经验里,DEA最让参赛者意外的一点是:它的论文呈现难度并不在于数学推导,而在于你能不能把“相对效率”这个概念用通俗的语言解释给评委听。很多人写着写着就陷入了“术语轰炸”,反而把一道本可以拿高分的管理评价题写成了让人看不懂的公式堆砌。如果用一句话总结我的建议,那就是:DEA是工具,解读才是你的本事;效率值是起点,科学的政策建议才是终点。把松弛变量、标杆对照、规模报酬这三个信息吃透,你手里的DEA就不再是一个“跑完就忘”的模型,而是一把能反复使用的分析利器。