用R语言deaR包搞定DEA效率分析:从数据导入到结果解读的保姆级教程

张开发
2026/4/21 17:33:34 15 分钟阅读
用R语言deaR包搞定DEA效率分析:从数据导入到结果解读的保姆级教程
用R语言deaR包搞定DEA效率分析从数据导入到结果解读的保姆级教程第一次接触数据包络分析DEA时我被那些晦涩的理论公式和复杂的效率指标搞得晕头转向。直到发现R语言的deaR包才真正找到了将理论转化为实践的工具钥匙。本文将带你从零开始用最直白的语言和详实的操作步骤完成一次完整的DEA效率分析之旅。1. 环境准备与数据导入工欲善其事必先利其器。在开始DEA分析前我们需要确保R环境和数据都准备就绪。不同于其他统计方法DEA对数据格式有着特殊要求这也是新手最容易踩坑的地方。首先安装必要的包如果尚未安装install.packages(deaR) install.packages(readxl) # 用于读取Excel数据推荐使用RStudio作为开发环境它的自动补全和可视化功能能极大提升工作效率。安装完成后加载这两个包library(deaR) library(readxl)数据准备要点决策单元(DMU)需要放在第一列如银行名称、年份等标识符投入指标连续排列在前产出指标连续排列在后避免缺失值和极端异常值假设我们有一个名为bank_efficiency.csv的数据文件结构如下bankemployeesassetsexpensesrevenueloansA15050080120400B20060090150500读取并转换数据的正确姿势raw_data - read.csv(bank_efficiency.csv) dea_data - read_data( raw_data, dmus 1, # DMU所在列 inputs 2:4, # 投入指标列范围 outputs 5:6 # 产出指标列范围 )注意如果数据存储在Excel中可以使用read_excel()函数替代read.csv()。确保所有数值都是正数DEA不接受零或负值。2. 基础模型构建与运行理解了数据格式后我们进入核心环节——模型构建。DEA有两大经典模型CCR规模报酬不变和BCC规模报酬可变它们适用于不同场景。2.1 CCR模型实现CCR模型是DEA最基础的形式假设决策单元在最优规模下运作。运行CCR模型的代码如下ccr_result - model_basic( dea_data, dmu_eval 1:nrow(raw_data), # 评估所有DMU dmu_ref 1:nrow(raw_data), # 参考集为全部DMU orientation io, # 投入导向 rts crs # 规模报酬不变 )关键参数解析orientation分析导向io投入导向在产出不变情况下最小化投入oo产出导向在投入不变情况下最大化产出rts规模报酬假设crs规模报酬不变CCRvrs规模报酬可变BCC2.2 BCC模型实现当决策单元可能不在最优规模运行时BCC模型更为合适bcc_result - model_basic( dea_data, dmu_eval 1:nrow(raw_data), dmu_ref 1:nrow(raw_data), orientation io, rts vrs # 规模报酬可变 )模型运行后使用summary()函数生成详细报告summary(ccr_result, exportExcel TRUE) summary(bcc_result, exportExcel TRUE)这将生成包含多个工作表的Excel文件存储在工作目录中。如果遇到无法打开zip文件错误尝试安装writexl包install.packages(writexl)3. 结果解读与可视化模型跑出结果只是第一步真正考验功力的是如何解读那些数字背后的含义。我们以CCR模型输出为例拆解关键结果表。3.1 效率值分析生成的Excel文件中efficiencies工作表包含各DMU的效率得分DMUeff_scoreA1.000B0.857C0.923效率值为1表示DEA有效前沿面小于1表示存在改进空间效率值排名可以直观比较DMU相对表现绘制效率值分布直方图eff_scores - efficiencies(ccr_result)$eff hist(eff_scores, main 效率值分布, xlab 效率得分, col lightblue)3.2 松弛变量解读slacks工作表展示了投入过剩或产出不足的情况DMUinput_slack1output_slack1B15.20C08.7投入松弛可以减少的投入量产出松弛可以增加的产出量全为零表示DEA有效3.3 目标值与参考集targets和references工作表揭示了改进方向目标值非有效DMU达到有效应该达到的投入产出水平参考集每个DMU的benchmark组合提取银行B的参考DMUreferences - references(ccr_result) print(references[[B]])4. 高级技巧与疑难排解掌握了基础分析流程后我们来看几个提升分析深度和解决常见问题的技巧。4.1 模型选择策略何时用CCR何时用BCC这里有个简单判断流程先运行CCR模型检查效率值的分布如果大部分DMU效率值接近1 → 可能规模报酬不变 → 用CCR如果效率值分散 → 运行BCC模型比较两种模型结果# 计算规模效率 scale_eff - eff_scores_ccr / eff_scores_bcc4.2 数据敏感性检验DEA结果对指标选择非常敏感。建议使用相关系数矩阵检查指标间关系尝试不同的指标组合使用交叉验证方法生成投入产出相关系数矩阵cor_matrix - cor(raw_data[, -1]) print(cor_matrix)4.3 常见错误处理错误1Error in read_data: inputs and outputs must be positive检查数据中是否有零或负值对数据进行标准化处理如x/max(x)错误2System is computationally singular检查是否有完全线性相关的指标减少指标数量或使用主成分分析错误3效率值全部为1可能指标选择不当尝试增加DMU数量或减少指标数量4.4 结果可视化进阶除了基础直方图还可以绘制效率前沿面plot(ccr_result, type efficient)制作雷达图比较DMU表现library(fmsb) radarchart(rbind(rep(1,3), rep(0,3), raw_data[1:3, -1]))5. 实际案例银行分支机构效率评估让我们通过一个真实案例巩固所学知识。假设要评估某银行20家分支机构的运营效率数据包含投入员工数、营业面积、运营成本产出存款额、贷款额、中间业务收入分析步骤数据清洗与验证bank_data - read.csv(branch_data.csv) summary(bank_data) # 检查异常值构建DEA数据集dea_bank - read_data( bank_data, dmus 1, inputs 2:4, outputs 5:7 )运行CCR和BCC模型ccr_bank - model_basic(dea_bank, rts crs) bcc_bank - model_basic(dea_bank, rts vrs)结果整合分析# 提取各类效率值 tech_eff - efficiencies(ccr_bank)$eff pure_tech_eff - efficiencies(bcc_bank)$eff scale_eff - tech_eff / pure_tech_eff # 创建结果数据框 result_df - data.frame( Branch bank_data$branch, Technical tech_eff, PureTechnical pure_tech_eff, Scale scale_eff )制定改进建议识别低效分支效率值0.9分析其松弛变量找出改进方向参考高效分支的最佳实践# 找出低效分支 inefficient - result_df[result_df$Technical 0.9, ] # 获取这些分支的松弛变量 slacks - slacks(ccr_bank)$input slacks[as.numeric(rownames(inefficient)), ]通过这个完整流程我们不仅能计算出各分支的效率得分还能明确具体改进方向和幅度为管理决策提供有力支持。

更多文章