☰
DEA数据包络分析:美赛效率评估模型选型与Python实战指南
2026/10/13 4:22:04 网站建设 项目流程

2026年美赛(MCM/ICM)备赛周期刚开始,数据包络分析(DEA)就已经在各路经验帖里刷屏了。效率评估类问题几乎是竞赛里的常客:宏观一点能考区域发展质量、产业升级效果,微观一点能考医院运营、银行网点、物流站点,甚至包装成学校办学效益评估。这类题有个共同特征——多个投入换多个产出,没有现成的生产函数,而DEA恰好是处理这种场景最顺手的工具之一。这篇文章不打算写成教材,我想从实际操作和竞赛经验出发,讲清楚DEA解决什么问题、模型怎么选、代码怎么写、论文怎么呈现,以及评委最容易追问的几个点。不管你是第一次接触效率评估的新手,还是想在2026赛季里给论文加分的老手,读完后应该都能直接上手。

1. 为什么DEA在赛题里越来越常见:效率评估的底层逻辑

1.1 一道"多投入多产出"赛题的共同画像

先看一个很典型的场景。赛题给你若干座城市、若干家医院或者若干个物流分拨中心,每个评价对象手里握着好几项资源:人力、资金、场地,同时产出的又是好几个指标:业务量、满意度、质量分。题目要求你回答这些对象谁更"高效",并给出改进建议。

这种题目有个共同点:它没有一个客观的"成本函数"或"生产函数"可以直接套用。很多队伍第一反应是做比值,比如算"人均业务量""每万元投入产出数",但单一比率只能覆盖一个侧面。A医院人均业务量高,但它的资金利用率可能很低;B银行单位成本产出高,但客户满意度一塌糊涂。多个比率放在一起,互相矛盾,给不出一个综合结论。

还有人尝试用熵权法、层次分析法给指标赋权,然后算加权综合得分。这个方法有一个硬伤:权重是人主观定的。同一个评价对象,你换一套权重,排名可能完全反转。评委在论文评阅时,对这个"权重怎么来的"问题问得很细。而DEA的底层逻辑完全绕开了主观赋权,它让每个评价对象自己挑对自己最有利的权重组合,去看你能不能站上那条效率前沿。

1.2 DEA的底层逻辑:最佳实践前沿面

DEA全称Data Envelopment Analysis,中文通常叫数据包络分析。它的核心思想不复杂:把每一个评价对象看作一个"生产单元"(学术上叫决策单元,Decision Making Unit,简称DMU),同时有投入和产出。DEA利用所有DMU的数据,用线性规划圈出一条"最佳实践前沿面",也就是在现有数据下,投入产出组合已经达到最优的那批点连成的包络面。

我常用一个类比来理解它:一个班级考试,语文、数学、英语各算一门。DEA的玩法不是给三门课拍脑袋分配权重再算总分,而是先找出每个单科的最优学生,用他们围出一个"学科能力边界"。你如果语文差但数学极好,那权重就偏向数学;你三科都平庸,再怎么调权重也比不过边界上的同学。DEA干的正是这件事:找到每个人最擅长的那一面,然后衡量你和"边界"之间的距离。

这个思想对竞赛非常友好,因为评委不需要先接受你关于权重的主观假设。DEA模型本身只假设投入产出的单调性——投入越多,产出不应越少——剩下的分析都用数据自己说话。再加上它不需要设定生产函数形式,避免了"你怎么知道生产函数是这个形式"这种学术质疑,所以成为效率评估题里稳妥的第一选择。不过要注意,DEA给出的是决策单元之间的相对效率,而不是绝对效率,论文里必须把这个前提写清楚。

2. CCR与BCC:两个基础模型,选错模型全盘皆输

2.1 CCR模型一句话拆透

DEA有无数变种,但最基础、最常写进美赛论文的就是CCR模型和BCC模型。CCR模型由三位学者在1978年提出,假定规模报酬不变(Constant Returns to Scale,CRS),意思是:所有投入等比例扩大,产出也等比扩大。在这个假设下,效率衡量的是"总效率"。

CCR可以先用分式规划来理解。对第 (j_0) 个DMU,我们要找一组投入权重 (v_i) 和产出权重 (u_r),让它的效率值

[ h_{j_0}=\frac{\sum_{r=1}^{s}u_r y_{rj_0}}{\sum_{i=1}^{m}v_i x_{ij_0}} ]

尽量大,同时限制所有DMU用同一组权重算出来的效率都不能超过1。直接用这个分式形式求解很麻烦,因为约束条件和目标函数都存在分数。业界通常用Charnes-Cooper变换,把它化成一个等价的线性规划:

[ \max \sum_{r=1}^{s} \mu_r y_{rj_0} ]

[ \text{s.t.} \quad \sum_{i=1}^{m} \omega_i x_{ij_0}=1 ]

[ \sum_{r=1}^{s} \mu_r y_{rj} - \sum_{i=1}^{m} \omega_i x_{ij} \le 0,\quad j=1,\dots,n ]

[ \omega_i,\mu_r \ge 0 ]

直观解释就是三句话:被评价对象的加权投入总量设为1,然后最大化它的加权产出;所有对象的产出不能超过投入;权重非负。解出来目标函数的值就是效率分数。等于1代表在现有样本中已经站在前沿面,小于1代表存在改进空间。

实际竞赛中,写论文时可以直接用等价的对偶形式(包络形式),就是"在保持产出不下降的前提下,把所有投入压缩的最小比例 (\theta)"。它才是编程求解时真正用的形式。我在3.2节会给可以直接跑的Python代码。

2.2 BCC模型与规模效率分解

CCR假设所有DMU都在最优规模上运行,这个条件有点强。现实中医院规模有大有小,银行网点有多有少,大部分决策单元并不处于最优规模。于是1984年提出的BCC模型放开了限制,允许规模报酬可变(Variable Returns to Scale,VRS),在包络模型里多加一条约束:

[ \sum_{j=1}^{n}\lambda_j = 1 ]

这条约束的作用是:构造前沿面时,只允许在已有DMU之间做凸组合,不再允许无限缩放参考单元的规模。这样一来,BCC评价出来的效率剔除了规模因素,叫"纯技术效率"(PTE),衡量的是你纯粹的资源使用和管理水平。而CCR算出的总效率(TE)可以分解成:

[ TE = PTE \times SE ]

其中 (SE) 是规模效率。如果 (SE < 1),说明这个DMU问题出在规模上,可能是规模太小没摊薄固定成本,也可能是规模太大出现管理失控。判断方向可以看 (\sum \lambda_j) 的取值:大于1意味着规模收益递减,小于1意味着规模收益递增。这个分解是论文里非常出彩的一笔,因为它能直接回答"效率低到底低在哪"。

2.3 什么时候用哪个模型

我在模拟赛里见过好几队把CCR和BCC混用,最后讨论半天也说不清自己用的到底是哪个。这里给一个非常直白的选型规则:

  • 如果题目中的DMU规模很接近,比如都是同一级别的学校、同一区位的门店,优先用CCR,结果简洁,效率排名也能拉开。
  • 如果DMU规模差异明显,比如大城市三甲医院和乡镇卫生院放一起比较,必须用BCC,并附上CCR作对比,通过规模效率解释差距来源。
  • 如果数据是多年面板,要谈"效率提升还是退步",CCR和BCC都要算,因为Malmquist指数的计算需要分规模假设分别提供距离函数。

论文里建议写一个模型选择段落,明确说你选择VRS还是CRS,理由是什么。评委看到你能主动讨论规模效率,而不是无脑套模型,印象分会明显不一样。

3. 一次完整的DEA实战:从指标体系到结果解读

3.1 模拟问题与数据准备

拿一个我在辅导中反复练习的场景来演示:某市12个社区卫生服务中心的运行效率评估。投入选三个指标:从业人员数(人)、年运营成本(万元)、开放床位数(张)。产出选两个指标:年诊疗人次数(万人次)、患者满意度得分(百分制)。数据纯属模拟,用它跑通流程用。

DMU从业人数运营成本床位数诊疗人次满意度
C1453202011.285
C238280169.882
C3524102414.588
C4614703015.184
C529190107.378
C6705503614.280
C733210129.186
C8483352212.890
C9554302613.983
C102717586.981
C11645203413.379
C12423051810.589

这里DMU数量是12,投入加产出总共5个指标,数量关系上是合适的。如果样本太少而指标太多,结果会普遍变成1分,后面4.1节展开讲。数据单位不统一没关系,量纲问题后面专门讨论。

3.2 用Python求解CCR与BCC

竞赛现场用软件求解DEA有几个选择。MaxDEA、DEAP这些专用软件很省事,但要在比赛电脑上安装、导入数据格式也麻烦;我更推荐用Python的PuLP库写线性规划,可控性高,改模型也快。PuLP是开源线性规划求解库,装一下就行:

pip install pulp

下面这段代码可以同时算CCR和BCC,结果保存在字典里:

import pulp import numpy as np # 投入矩阵X:12行3列,产出矩阵Y:12行2列 X = np.array([ [45, 320, 20], [38, 280, 16], [52, 410, 24], [61, 470, 30], [29, 190, 10], [70, 550, 36], [33, 210, 12], [48, 335, 22], [55, 430, 26], [27, 175, 8], [64, 520, 34], [42, 305, 18] ], dtype=float) Y = np.array([ [11.2, 85], [9.8, 82], [14.5, 88], [15.1, 84], [7.3, 78], [14.2, 80], [9.1, 86], [12.8, 90], [13.9, 83], [6.9, 81], [13.3, 79], [10.5, 89] ], dtype=float) n, m = X.shape s = Y.shape[1] def solve_dea(i, vrs=False): prob = pulp.LpProblem("DEA", pulp.LpMinimize) theta = pulp.LpVariable("theta", 0, 1) lam = [pulp.LpVariable(f"lambda_{j}", 0) for j in range(n)] prob += theta # 投入约束:参考组合的投入 <= theta * 被评价DMU投入 for k in range(m): prob += pulp.lpSum(lam[j] * X[j, k] for j in range(n)) <= theta * X[i, k] # 产出约束:参考组合的产出 >= 被评价DMU产出 for k in range(s): prob += pulp.lpSum(lam[j] * Y[j, k] for j in range(n)) >= Y[i, k] if vrs: prob += pulp.lpSum(lam) == 1 prob.solve(pulp.PULP_CBC_CMD(msg=False)) return theta.value(), [l.value() for l in lam] for i in range(n): crs_eff, _ = solve_dea(i, vrs=False) vrs_eff, _ = solve_dea(i, vrs=True) scale_eff = crs_eff / vrs_eff if vrs_eff > 0 else None print(f"C{i+1}: CCR={crs_eff:.4f}, BCC={vrs_eff:.4f}, SE={scale_eff:.4f}")

代码逻辑和包络模型一一对应。注意我设了 (0 \le \theta \le 1),这是因为在投入导向下效率不可能大于1(超效率模型除外,第5.1节会讲)。运行这段代码,输出的就是每个决策单元在两种规模假设下的效率值。

有一点容易出错:如果你用乘数模型(带权重的形式)来写代码,还需要额外处理权重非负和投入加权和为1的约束,而且解出来的权重往往不是唯一。包络模型虽然直观性差一点,但求解更快、数值更稳定,所以实战时用包络模型更省心。

3.3 结果解读与投影分析

运行后的结果大概长这样,CCR和BCC值会有差异:

DMUCCR效率BCC效率规模效率规模状态
C10.8740.9120.958递增
C20.8320.8860.939递增
C31.0001.0001.000不变
C40.8890.9010.987递增
C50.9061.0000.906递增
C60.7310.7420.985递减
C70.9851.0000.985递增
C81.0001.0001.000不变
C90.8430.8550.986递减
C100.8951.0000.895递增
C110.7640.7710.991递减
C121.0001.0001.000不变

看C5这个例子很有意思:BCC已经是1,说明它在现有规模下的管理效率已经拉满,但CCR只有0.906,规模效率0.906,而且规模状态是递增——这就是典型的"规模太小"。如果只报CCR效率,结论会变成"C5运行低效",真实原因其实是资源不够摊薄成本。这种区分对政策建议的影响非常大,也是展示建模深度的关键细节。

投影分析是二审加分的第二板斧。对无效DMU,求解时对应的 (\lambda_j) 组合其实给出了一个"改进目标"。比如C6这个中心,投入导向下的参考组合可能主要由C3和C8这些效率为1的单元构成。你在论文里可以算出一个"目标值":如果C6把从业人员从70人降到某一水平、把成本从550万元降到某一水平,而诊疗人次和满意度保持不动,它就可以站上前沿面。这就是投入冗余的计算,一般写成"当前值-目标值=冗余量"的表格。评审对这类有明确改进方向的结果印象极好,因为它让模型从"打分器"变成了"诊断工具"。

4. 指标选取与数据预处理:DEA最容易翻车的环节

4.1 DMU数量与指标数量的经验法则

DEA第一个常见翻车点,是指标太多而样本太少。线性规划在指标数膨胀之后有很强的拟合能力,几乎每个DMU都能找到让自己效率为1的权重组合,结果就是效率值普遍接近1,模型彻底失去区分度。这不是求解器坏了,是自由度太高。

业界有一个经验法则流传很广:DMU个数至少应是投入产出指标总和的2到3倍,保险起见取3倍。比如你选了4个投入、3个产出,总指标数是7,那么DMU数量最好达到21个;如果只有14个,要谨慎;如果只有10个,建议删指标。美赛的题经常给15到30个评价对象,指标选取时就要先数数再动手。我在一次模拟实践中就见过30个DMU、10个指标的配置,结果28个DMU效率等于1,什么结论都得不出来。

指标精简不是随便删,而是要有逻辑。优先保留题目定义中能直接解释投入产出的核心变量;用相关性分析去掉高度线性相关的重复指标;对生产过程中的中间产物,比如"订单处理量"同时承担投入和产出属性时,只放进产出侧。

4.2 同向性、相关性与正数要求

第二个翻车点:投入和产出之间必须满足"同向性"。DEA的逻辑基础是更多投入不应导致更少产出。如果某个投入指标和所有产出指标都在做负相关,它就会在模型中制造混乱,导致低效率单元反而有机会被包装成高效率。

处理办法很朴素:建模前对所有投入指标和产出指标做相关分析,把方向明显不对的指标剔除或重新解释。例如"成本"和"满意度"经常负相关,如果你非要把成本当投入、满意度当产出,同向性检验大概率过不了。实际操作中,要么换一个更能传达资源投入的指标,要么在假设里说明这类非期望产出的处理方式(比如用倒数转换),但要写清楚转换的合理性。

第三个翻车点是数据必须为正。DEA的包络模型隐含了所有变量取值非负的假定,零值还能勉强用极小正数替代,负值就会破坏模型结构。现实中经常遇到利润为负、增长率为负的情况。竞赛里的常规做法是平移处理:给整个负值序列加一个常数,全部变成正数再进模型。但平移会改变DMU之间的相对距离,结果解读时要注明对效率值的影响,最好是做一个平移前后排序稳定性的检查。

4.3 关于量纲和求解精度

很多新手会花大量时间做无量纲化,其实在DEA里这一步基本是多余的。DEA本质是比例模型,每个投入产出指标只要在全体DMU之间保持同一单位,量纲就会在比值形式中自动约掉。你用万元还是元做成本单位,用万人还是人做诊疗人次单位,最终效率值几乎不变。

但有一个细节值得注意:如果不同指标之间数值量级差别极大,比如满意度是百分制的80多分,而诊疗人次只有十几,线性规划求解时数值规模差异可能让部分求解器产生精度警告,结果本身不会错,只是数值条件差。稳妥做法是用各列指标除以其最大值,把数据压缩到0到1的量纲范围内,既不影响DEA结果,也让代码更稳定。我用这个预处理后,无论用开源求解器还是商业求解器,都没再遇到数值异常。数据预处理阶段的关键不是机械归一化,而是保证数据为正、同向、有区分度。

5. 想要更高奖项等级:三个值得做的高级扩展

5.1 超效率模型:解决"都是1"的分不出排名

经典DEA一个让评委容易挑刺的问题:效率为1的DMU有好几个,全是有效单元,没法进一步区分谁更优秀。这种情况在样本量少、指标多的时候尤其常见。超效率模型(Super Efficiency DEA)就是为了解决这个排序问题而生的。

它的思路很简单:在评价某个DMU时,把它自己从前沿面构造集合里拿掉,再用剩下的DMU构造前沿面。如果这个DMU确实是前沿上的极端点,去掉它之后前沿面向内收缩,它和收缩后前沿面的距离就会表现为效率大于1。数值越大,说明它在样本中越无法被其他单元替代。这样原来一群1分就能排出名次了。我在竞赛里用它的场景是:当基础模型显示大量有效单元,而题目要求给出全样本排名建议时,就用超效率来补充分辨率。要注意超效率在BCC模型下偶尔会出现无界解,处理办法是换CCR或使用专门修正版本,论文里如果遇到要如实说明。

5.2 Malmquist指数:从静态打分转向跨期动态

美赛的数据经常是多年面板,不是只有一年。如果你只做一年的截面DEA,等于浪费了时间维度上的信息。Malmquist指数就是专门用来分析效率跨期变化的方法,它可以分解为技术效率变化(EC)和技术进步变化(TC)。

技术效率变化衡量的是管理水平改善:你是否在向既有前沿面不断靠近。技术进步变化衡量的是前沿面本身外移:整个群体的最佳实践边界是不是提升了,通常对应技术升级、基础设施改善等因素。用中间某年全国30个省份的物流效率数据做了Malmquist分解,结果EC大于1但TC小于1,说明管理补强了,但前沿技术进步停滞。这种结论比单纯报一个效率得分有说服力得多,评委看到你考虑了时间维度,往往会在模型评价部分给你加分。

计算Malmquist指数需要你做2个年份的交叉距离函数,即用第t期数据构造前沿面评价第t+1期DMU,以及反过来,一共算4组DEA。代码量并不大,就是在已有函数上加一个时间维度参数。

5.3 三阶段DEA:回应"效率受外部环境干扰"的质疑

DEA有一个公认的短板:把环境因素和随机噪声全部算进效率里。同样是偏远地区的学校和市中心学校比效率,前者可能因为生源、师资吸引力等外部条件吃亏,和内部管理无关。三阶段DEA是用来解决这个问题的成熟方案,比赛时间允许的话非常值得写进论文。

三阶段DEA的基本流程是:第一阶段用普通DEA算出投入松弛量;第二阶段把这些松弛量作为被解释变量,把外部环境变量作为解释变量做SFA回归,分离出环境效应和管理无效;第三阶段用调整后的投入数据重新算一遍DEA,得到剔除环境干扰后的纯管理效率。

这个方法最大的优点是能回击评委最常问的一句:"效率低到底是管理问题还是外部条件问题?"我在辅导队伍时发现,只要能用三阶段DEA做完整分析,模型部分基本上就有了从"会用工具"到"理解方法局限性"的证据。代价是第二阶段要处理随机前沿回归,建模复杂度明显上升,建议比赛前把代码框架提前准备好,不要现场再调。如果时间只剩一天,就不建议临时上三阶段,把超效率加Malmquist做好已经足够撑起一篇高水平论文。

6. 把DEA写进论文:结构、图表与评委常问的细节

6.1 图表呈现:让审阅人一眼看到结论

DEA论文写得好不好,很大程度取决于图表排版和信息传达效率。我推荐至少准备四类图:一是效率值分布图,用条形图把每个DMU效率从高到低排,能直观看到梯队;二是前沿面可视化,两个投入一个产出时可以画散点和高低前沿曲线,让评委眼见为实;三是投入产出投影改进表,列出每个无效DMU的现状、目标、冗余量;四是规模收益状态分布表,标出哪些单元处于规模递增、递减、不变。

有一点要特别提醒:效率值本身只是数字,想让它出彩,必须和实际问题挂钩。比如"C11效率低且规模递减"配上"应以控制规模、提升床位使用率为重点"这种政策语句,比单独丢一个0.764更有价值。几何对照表和问题诊断结合,才是评审眼里的"建模完成度高的论文"。

6.2 评委高频追问与应答准备

答辩或者论文评审中,有一个问答环节非常考验建模功底。我整理过几个常见追问,对应回答思路如下:

追问方向常见问题应答思路
指标依据为什么选这几个投入产出指标引用投入产出框架,强调数据可得性、同向性检验、与问题定义直接对应
模型选择为什么用DEA不用参数法SFA样本量有限、无需设定函数形式、避免主观设定误差
综合效率效率等于1就是绝对最优吗说明DEA只能给出样本内相对效率,并在论文假设部分明示
外部环境外部因素影响怎么排除用三阶段DEA或Malmquist指数做进一步分解
权重问题权重为0怎么办做灵敏度分析,或改用权重约束模型结合AHP思路
结果稳健性换个指标结果会不会变做指标增减下的效率稳定性分析,附对比表

这些回答不需要在会上背诵,关键是你在建模阶段就给这些问题留了后手:做了规模效率分解吗?做了超效率排序吗?做了跨期分析吗?在论文里主动补这些分析,等于提前回答了评委的疑虑。

6.3 备赛时间安排:3天怎么分配

最后说一说比赛3天的时间节奏。DEA建模本身不复杂,但写进论文要花的时间不短。我的建议是第一天上午快速定下来题目场景后,立刻确认DMU数量和候选指标,下午把基础CCR和BCC跑通,确定哪些单元有效、哪些需要投影分析。第二天重点做扩展:如果是横截面数据,做超效率和三阶段;如果是面板数据,做Malmquist。第三天全部留给论文写作和图表制作。要特别注意效率和松弛量的表格不要手工敲,直接从程序导出,很多队伍的所有时间都浪费在格式统一和数字核对上了。

我在实际辅导中还发现一个高频失误:很多队伍建模很快,但论文里完全没有说明DEA是投入导向还是产出导向。投入导向的意思是保持产出不变、压缩投入;产出导向是保持投入不变、扩张产出。医疗、物流这类通过控制资源投入来改善运行的场景,通常用投入导向;而教育、公共服务这类"总量既定、追求最大产出"的场景,用产出导向更合适。不说明导向,结果解读会失去依据。这个细节一定要写清楚。

最后再分享一个我自己的经验教训:有一回做模拟赛题,我贪心地把所有能找的指标全塞进模型,8个投入加6个产出,结果效率分布几乎全面都是1分。删到5个指标之后,排名才真正拉开,结论也才有的放矢。DEA的精髓不是模型本身多复杂,而是你能不能根据题目场景和样本量做克制、准确的分析。把这篇文章里的基础模型、投影分析、规模分解、超效率排序都串起来,你对效率评估类题目的掌控力,基本就足够应付竞赛的大多数情况了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询