代码先看
import numpy as np from scipy.optimize import linprog def dea_ccr(X, Y, eps=1e-6): X, Y = np.array(X, float), np.array(Y, float) n, m, s = X.shape[0], X.shape[1], Y.shape[1] eff, lam = np.zeros(n), np.zeros((n, n)) for k in range(n): c = np.r_[1, np.zeros(n)] A, b = [], [] for r in range(s): A.append(np.r_[0, -Y[:, r]]) b.append(-Y[k, r]) for i in range(m): A.append(np.r_[-X[k, i], X[:, i]]) b.append(0) res = linprog(c, A_ub=A, b_ub=b, bounds=[(None, None)] + [(0, None)] * n, method='highs') if res.success: eff[k], lam[k] = res.x[0], res.x[1:] lam[np.abs(lam) < eps] = 0 return eff, lam if __name__ == "__main__": names = ["医院A","医院B","医院C","医院D","医院E","医院F","医院G","医院H","医院I","医院J"] X = np.array([[20,300],[30,200],[40,100],[20,200],[10,400],[50,50],[35,150],[25,250],[45,80],[60,180]]) Y = np.array([[100,50],[150,80],[200,100],[80,120],[100,60],[200,150],[120,90],[110,70],[180,110],[160,130]]) eff, lam = dea_ccr(X, Y) rank = np.argsort(np.argsort(-eff)) + 1 # 核心输出:效率排名表 print("\nDEA效率评价(CCR投入导向)") print("DMU 效率θ 排名 解读") for i, name in enumerate(names): info = "最优" if abs(eff[i]-1)<1e-6 else f"浪费{100-eff[i]*100:.1f}%" print(f"{name:6} {eff[i]:7.4f} {rank[i]:3} {info}") # 改进建议(只输出非有效DMU) print("\n改进建议(目标投入 = θ × 当前投入)") print("DMU 当前(医生,床位) 目标(医生,床位) 可削减") for i, name in enumerate(names): if eff[i] < 1: cur = X[i] target = eff[i] * cur red = cur - target print(f"{name:6} ({cur[0]:3.0f},{cur[1]:3.0f}) ({target[0]:5.1f},{target[1]:5.1f}) (-{red[0]:.0f}人,-{red[1]:.0f}床)") print()DEA 结果详解
下面结合刚才运行的10家医院的结果,把每一部分掰开揉碎讲清楚。
第一部分:效率排名表
DMU | 效率θ | 排名 | 解读 ------------------------------------------------------------ 医院A | 0.7500 | 8 | 投入只需 75.0%,浪费 25.0% 医院B | 0.9062 | 5 | 投入只需 90.6%,浪费 9.4% 医院C | 1.0000 | 1 | 满分,效率最优 ✅ 医院D | 1.0000 | 2 | 满分,效率最优 ✅ 医院E | 1.0000 | 3 | 满分,效率最优 ✅ 医院F | 1.0000 | 4 | 满分,效率最优 ✅ 医院G | 0.7412 | 9 | 投入只需 74.1%,浪费 25.9% 医院H | 0.7724 | 7 | 投入只需 77.2%,浪费 22.8% 医院I | 0.8878 | 6 | 投入只需 88.8%,浪费 11.2% 医院J | 0.6304 | 10 | 投入只需 63.0%,浪费 37.0%1) θ(效率值)到底怎么来的?
DEA 的核心理念是"拿你家的投入跟别人家拼一个虚拟的同龄人比":
对于每个医院,问一个问题:
"把其他医院当积木,拼一个虚拟医院,产出不低于你,但投入最少能压到你的多少倍?"
这个倍数就是 θ。
以医院J(θ=0.6304)为例:
| 投入 | 产出 | |
|---|---|---|
| 医院J 自己 | 60人 + 180床 | 160门诊 + 130住院 |
| 虚拟目标(θ×当前) | 37.8人 + 113.5床 | ≥160门诊 + ≥130住院 |
含义:别的医院可以用D、C、F 三家拼出一个组合,这个组合只用 37.8 人 + 113.5 床,产出就不低于医院J。换句话说:医院J浪费了37%的资源(投入的 100% 中只用 63% 就够了)。
2) 为什么有 4 家医院 θ=1.0?
θ=1.0 意味着:找不到任何组合能用更少的投入达到不低于它的产出。
这 4 家(C、D、E、F)构成了生产前沿面(production frontier)。它们不一定"完美",只是在这个样本集合里,它们是各自方向上的"最优者":
- C:床少但产出极高(100床 → 200门诊+100住院)
- D:住院产出特别高(200床 → 120住院,结构独特)
- E:床虽多但产出一比也算高效
- F:极致精干(50人+50床 → 200门诊+150住院,产出最高!)
注意:虽然 C、D、E、F 都是 θ=1.0,但排名并列 #1,这是代码里用了argsort随机排的——实际上它们都是满分,并列第一。
第二部分:标杆参考(λ 向量)
医院J(θ=0.6304):参照 → 医院C(λ=0.2174) + 医院D(λ=0.3478) + 医院F(λ=0.4435)λ 的含义:在构造"虚拟比较对象"时,每家标杆医院的占比权重。
1) 怎么读这条信息?
意思是:给医院J 找的"虚拟比较对象",是这样拼出来的:
虚拟医院 = 0.2174 × 医院C + 0.3478 × 医院D + 0.4435 × 医院F算一下这个虚拟医院的投入:
医生:0.2174×40 + 0.3478×20 + 0.4435×50 = 8.7 + 7.0 + 22.2 = 37.9人 床位:0.2174×100 + 0.3478×200 + 0.4435×50 = 21.7 + 69.6 + 22.2 = 113.5床刚好就是上面"目标投入"的 37.8人 + 113.5床!
2) 怎么用这个信息?
- λ 最大的 → 最重要的标杆:对医院J 来说,F(λ=0.4435)最值得学,投入精干但产出最高
- λ=1.0 且指向自己→ 满分 DMU(C、D、E、F 各指向自己),说明别人拼不出来比它更优的组合
第三部分:改进建议(目标投入量)
医院J | ( 60, 180) | ( 37.8, 113.5) | (-22人, -67床)怎么读?
| 当前投入 | 目标投入 | 可削减 |
|---|---|---|
| 60人 + 180床 | 37.8人 + 113.5床 | 砍掉 22 人 + 67 床 |
前提是:产出不变(160门诊+130住院)。这个"目标投入"不是拍脑袋想的,而是 DEA 的线性规划求解器算出来的"在效率前沿上你最少需要多少投入"。
总结:一张表看懂三个模块
| 模块 | 核心问题 | 怎么读 |
|---|---|---|
| 效率排名 | 谁高效谁低效? | θ=1.0 满分,越小越浪费 |
| 标杆参考 | 低效的该向谁学? | λ 最大的就是你的"榜样",权重越大越重要 |
| 改进建议 | 该怎么改? | 目标投入 = θ × 当前投入,中间差就是可削减量 |
三个必记原则
- DEA 是相对评价:你在样本集合里的排名,换一批 DMU 结果可能不同
- θ=1.0 ≠ 绝对完美:只是在这个集合里你是最优前沿,真实世界可能还有更强组合
- DMU 数量要够:一般要求
n ≥ 3×(m+s),否则区分度差(太多满分),当前 10 家刚好在临界线上
核心重点
DEA(数据包络分析)的核心价值在于:在“多投入、多产出”的复杂系统中,不预先假设生产函数,客观地评价多个同质单元(DMU)的相对效率,并为低效单元提供精确的量化改进路径。
在数学建模竞赛(如国赛、美赛)中,DEA 几乎是“多指标综合评价类”问题的杀手锏。以下是它的适用场景、独特优势及竞赛中的典型套用逻辑:
DEA 解决了传统方法的哪些痛点?
无需量纲统一:投入(如经费、人数)和产出(如论文数、利润)可以单位不同,直接计算,省去了归一化的主观性。
权重由数学规划内生:不需要像 AHP(层次分析)那样由专家打分赋权,DEA 针对每个 DMU 寻找最有利的权重,客观性强。
给出“投影”值:不仅告诉“你不行”,还精确告诉“你该如何减投入或增产出”来达到有效(这是 DEA 独有的杀手锏)。
常见应用领域与评价指标对照
以下表格梳理了数据包络分析(DEA)等效率评价方法在五大典型领域的投入-产出指标对照关系,供建模选题与指标体系设计时参考:
| 应用领域 | 典型投入指标 | 典型产出指标 | 建模目的 |
|---|---|---|---|
| 宏观经济/区域发展 | 土地、固定资产投资、劳动力、能源消耗 | GDP、财政收入、居民可支配收入 | 评价"省份/城市"的经济发展质量或绿色全要素生产率 |
| 环境与碳排放(热门) | 资本、劳动力、能源消费量 | 期望产出(GDP)、非期望产出(CO₂、SO₂) | 评价"低碳试点城市"或工业园区的生态效率(常用 SBM-DEA) |
| 教育/医疗评估 | 师资数量、教学经费、床位数、医生数 | 升学率、就业率、就诊人数、治愈率 | 评价"高校/医院"的办学或运营效率 |
| 金融/投资绩效 | 员工人数、营业成本、风险资产 | 净利润、不良贷款率(逆指标处理)、市场份额 | 评价"银行分行/基金公司"的盈利能力与风控平衡 |
| 国防/科技创新 | R&D 经费、研发人员全时当量 | 专利授权数、技术合同成交额、新产品销售收入 | 评价"高新技术企业"或科研院所的创新转化效率 |