尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Python构建中小企业融资效率DEA评价体系:从指标到可视化实战
“融资效率”这四个字听起来像财务教科书里的术语但落到中小企业头上就是一门实打实的生意经融来的钱花没花出效果老板心里到底有没有数我接触过不少中小企业资产负债表、融资成本、利息支出记得比谁都清楚但你要问“这笔融资最终换来了多少营收、多少利润、多少成长空间”绝大多数人一下子答不上来。这篇就用Python把一套完整的中小企业融资效率评价体系做出来包含模拟数据、完整代码和DEA分析数据包络分析。DEA适合用来评价“多笔投入换多笔产出”的相对效率正好能回答“同样的钱为什么别人家用得更好”。我会先把思路讲清楚再带着你把指标、模拟数据、CCR/BCC模型、投影分析、可视化全部跑通代码拿过去换成自己的数据就能直接用。适合做企业财务分析、银行信贷评估、管理咨询基本功或者正在纠结论文选题、想找能落地建模方向的同学参考。1. 中小企业融资效率评价到底在评什么1.1 融资效率不是放款速度而是资金投入与产出的比值很多中小企业的注意力全在“能不能融到钱”上对“融到钱之后花得值不值”基本没有量化概念。银行放款快不快、额度够不够那是融资的便利性而融资效率衡量的是另外一件事企业把资产规模、融资成本、债务压力作为“投入”最终换来了多少营业收入、净利润和成长性。打个比方。同样融资投入1000万A企业一年做到3000万营收、200万利润B企业只做到800万营收、50万利润。直观上A的效率远高于B但问题没那么简单A的资产基数可能本来就大B所处的行业毛利可能天然偏低单看比率容易误判。更麻烦的是现实中的投入和产出都不止一个维度资产、成本、负债率、融资成本都是投入营收、利润、增长率都是产出这种多输入多输出的相对效率评价用简单的财务比率算不清楚。那为什么要专门做“评价体系”因为企业和管理者想要的不是一个孤立的数字而是一套能横向比较、能定位短板、能给出改进方向的框架。同一个行业里你与竞争对手相比效率处在什么位置哪些投入环节存在冗余哪些产出还有提升空间这些才是评价体系的真正价值。1.2 为什么是DEA而不是简单的财务指标打分评价效率的方法有很多常见的思路是给各项指标加权求综合得分。比如AHP层次分析法、专家打分法、TOPSIS法都逃不开一个致命问题权重是人定的主观性强换个专家结果可能完全不一样。回归分析法又需要提前假设生产函数的形式但中小企业的投入产出关系复杂没有人能拍胸脯说“营收和资产之间就是线性关系”。DEA数据包络分析是运筹学里的非参数效率评价方法核心思路是把每个评价对象看作一个决策单元DMU用所有决策单元的投入产出组合构造出一条“效率前沿面”然后逐个计算每个DMU相对前沿面的距离。不需要提前设定生产函数形式不用猜数据背后的数学关系多投入多产出直接处理不需要人为定权重权重由线性规划内生求解量纲不影响结果资产用万元还是亿元效率值都一样我理解DEA时喜欢用包饺子的例子同样的面粉、馅料、时间投入别人能包出50个饺子你只能包出35个那个人就是你的“效率前沿”你就可以算出自己只有他70%的效率。DEA把每个企业放进同一张“包饺子比赛”里自动找出那些“同样投入产出更高”或“同样产出投入更低”的标杆企业。2. 指标体系与模拟数据先让数据有逻辑2.1 投入产出指标怎么定才不虚DEA的效果取决于指标选择这一步做不好后面算法再漂亮也是白搭。我在这套体系里选了4项投入、3项产出。投入指标融资相关输入资产总额万元企业整体经营规模的基础投入营业成本万元维持经营运转的核心消耗融资成本万元利息、手续费、担保费等资金使用综合成本资产负债率%衡量债务融资带来的结构与压力产出指标经营效果输出营业收入万元资金转化为市场规模的直接结果净利润万元资金最终转化为盈利的能力营业收入增长率%融资是否带来了成长性选指标有几个原则。第一投入和产出之间必须有逻辑上的因果关系资产规模和融资成本影响营收和利润这在业务上说得通。第二指标数量要克制投入3-5个、产出2-4个足够指标过多反而会让每个企业都变得“独特”结果全员效率等于1失去区分度。第三决策单元需要具有同质性这套指标适用于同一行业或经营模式相近的企业不要拿钢厂和奶茶店放在一起比。2.2 用numpy生成模拟数据的小心机很多人造模拟数据就是纯随机结果DEA跑出来要么全场效率1要么数据逻辑混乱没法解释。生成模拟数据的关键是让投入和产出之间存在合理的正相关关系同时给不同企业埋入不同的“真实效率”这样DEA才有区分度。import numpy as np import pandas as pd # 固定随机种子保证结果可复现 np.random.seed(42) n 25 # 25家中小企业 # ---- 投入指标 ---- total_assets np.random.randint(3000, 30000, n).astype(float) # 资产总额3000万~3亿 operating_cost total_assets * np.random.uniform(0.35, 0.7, n) # 营业成本占资产35%~70% financing_cost total_assets * np.random.uniform(0.015, 0.05, n) # 融资成本占资产1.5%~5% debt_ratio np.random.uniform(35, 80, n) # 资产负债率35%~80% # ---- 产出指标 ---- # 核心先给每家企业一个“真实效率”产出由投入乘效率再叠加随机扰动生成 true_efficiency np.random.uniform(0.6, 1.0, n) # 综合资金投入越大的企业理论上产值越高 base_invest total_assets financing_cost * 10 revenue base_invest * true_efficiency * np.random.uniform(0.75, 1.15, n) # 营业收入 profit_rate np.random.uniform(0.03, 0.18, n) profit revenue * profit_rate # 净利润 growth np.random.uniform(2, 30, n) # 营收增长率 # ---- 汇总成DataFrame ---- df pd.DataFrame({ 企业编号: [fE{i1:02d} for i in range(n)], 资产总额: total_assets.astype(int), 营业成本: operating_cost.astype(int), 融资成本: financing_cost.astype(int), 资产负债率: np.round(debt_ratio, 2), 营业收入: revenue.astype(int), 净利润: profit.astype(int), 营收增长率: np.round(growth, 2) }) df.to_csv(loan_financing_data.csv, indexFalse, encodingutf-8-sig) print(df.head(10))这里最关键的一行是revenue base_invest * true_efficiency * np.random.uniform(...)。它保证了产出与投入整体正相关但企业之间又存在效率差异。效率高的企业同样的投入能产出更多效率低的企业投入被浪费了却没换来相应的营收。这样DEA跑出来会看到部分企业效率1部分在0.6-0.9之间结果才有分析价值。3. 完整代码实现CCR模型与BCC模型3.1 数学模型的直观解释DEA有好几种模型最常用的是CCR和BCC。CCR模型假设规模报酬不变意思是“投入翻倍产出也翻倍”适合评价企业长期综合效率BCC模型假设规模报酬可变允许企业处于规模收益递增或递减阶段它算出来的叫“纯技术效率”。CCR和BCC的关系很实用CCR效率 纯技术效率BCC× 规模效率。也就是说BCC和CCR的比值就是规模效率能判断企业效率损失到底来自“管理水平不够”还是“规模不对”。在CCR模型中对每个决策单元求解一个线性规划找到一组权重使得该企业的产出在不超过投入的条件下尽可能高。BCC只是在CCR基础上加了一个凸性约束权重之和为1数学上就是把规模因素的影响剥离出去。3.2 核心DEA求解函数我用scipy的linprog来解线性规划。以CCR为例决策变量是θ效率值和一组λ参考权重约束条件是被评价企业的投入组合不超过θ倍的实际投入产出组合不低于实际产出。目标函数就是最小化θ。import numpy as np from scipy.optimize import linprog def dea_solve(inputs, outputs, rtscrs): 通用DEA求解函数 inputs: 二维数组形状(n, m)n个决策单元m项投入 outputs: 二维数组形状(n, s)n个决策单元s项产出 rts: crs表示CCR模型规模报酬不变vrs表示BCC模型规模报酬可变 返回: 每个决策单元的效率值theta以及对应的lambda权重 inputs np.asarray(inputs, dtypefloat) outputs np.asarray(outputs, dtypefloat) n inputs.shape[0] m inputs.shape[1] s outputs.shape[1] thetas np.zeros(n) lambdas_list [] for i in range(n): x0 inputs[i] # 当前企业的投入 y0 outputs[i] # 当前企业的产出 # 决策变量顺序: [theta, lambda_1, lambda_2, ..., lambda_n] c np.zeros(1 n) c[0] 1 # 目标函数最小化 theta # 不等式约束 A_ub x b_ub A_ub [] b_ub [] # 投入约束: sum(lambda_j * x_j) theta * x0 # 变形为: -x0_k * theta sum(x_jk * lambda_j) 0 for k in range(m): row np.zeros(1 n) row[0] -x0[k] row[1:] inputs[:, k] A_ub.append(row) b_ub.append(0) # 产出约束: sum(lambda_j * y_j) y0 # 变形为: -sum(y_jk * lambda_j) -y0_k for r in range(s): row np.zeros(1 n) row[1:] -outputs[:, r] A_ub.append(row) b_ub.append(-y0[r]) bounds [(0, None)] * (1 n) if rts vrs: # BCC模型额外约束: sum(lambda) 1 A_eq np.zeros((1, 1 n)) A_eq[0, 1:] 1 b_eq [1] res linprog(c, A_ubA_ub, b_ubb_ub, A_eqA_eq, b_eqb_eq, boundsbounds, methodhighs) else: res linprog(c, A_ubA_ub, b_ubb_ub, boundsbounds, methodhighs) if res.success: thetas[i] res.x[0] lambdas_list.append(res.x[1:]) else: thetas[i] np.nan lambdas_list.append(None) return thetas, lambdas_list这段代码有几个容易出错的地方。一是决策变量的顺序θ放在第一位λ跟在后面所有约束矩阵的列必须严格对应。二是linprog默认的算法在高版本scipy里变了我固定用methodhighs避免版本兼容问题。三是产出约束必须写成小于等于的形式所以两边都取了负号。3.3 效率分解与规模收益判断拿到CCR效率和BCC效率之后再算规模效率ccr_eff, lambdas_crs dea_solve(inputs, outputs, rtscrs) bcc_eff, lambdas_vrs dea_solve(inputs, outputs, rtsvrs) scale_eff ccr_eff / bcc_eff # 规模效率规模收益状态可以通过BCC模型的λ之和来判断这是实操中常用的简化做法λ之和小于1说明企业处于规模收益递增阶段可以扩大规模λ之和大于1说明企业处于规模收益递减阶段继续扩张可能不划算λ之和约等于1说明当前规模刚好合适def rts_status(lambdas): total np.sum(lambdas) if total 0.999: return 规模收益递增 elif total 1.001: return 规模收益递减 else: return 规模收益不变3.4 投影分析给没效率的企业开处方效率值只能告诉你“差多少”不能告诉你“差在哪”。投影分析解决的就是这个问题。对CCR模型效率值为θ的企业径向目标改进方向是投入目标值 θ × 实际投入也就是把各项投入压缩到最优效率下应有的水平产出目标值 实际产出 ÷ θ也就是在保持投入不变的情况下产出应达到的水平# 计算各企业的投入冗余率与产出提升空间 theta ccr_eff.reshape(-1, 1) # 投入冗余率径向部分 input_redundancy (1 - theta) * inputs # 每项投入应压缩的金额 input_redundancy_rate input_redundancy / inputs # 冗余比例 # 产出提升空间径向部分 output_gap outputs / theta - outputs output_gap_rate output_gap / outputs我一般在给企业做分析时先看效率值圈定重点对象再看投影找改进方向。比如某企业CCR效率0.78规模收益递减资产投入冗余20%、营业成本冗余25%那结论就很明确这企业不是融不到钱是钱融太多了资产规模已经超出当前管理能力盲目扩大反而拉低效率。需要说明的是这里只考虑了径向改进部分。严格意义上DEA中还可能存在非径向的松弛变量完整做法分两个阶段求解先算θ再最大化投入产出松弛量。实战中如果只用径向投影可能低估改进空间报告里建议加一句“此为基于径向DEA的改进方向实际操作还需结合松弛量做二次检验”。4. 结果输出与可视化让老板一眼看懂4.1 融资效率评价主表代码跑到这一步把结果汇总成一张主表。result_df pd.DataFrame({ 企业编号: df[企业编号], CCR效率: np.round(ccr_eff, 4), BCC效率: np.round(bcc_eff, 4), 规模效率: np.round(scale_eff, 4), 规模收益: [rts_status(l) for l in lambdas_vrs] }) # 追加投入冗余信息以资产总额为例 result_df[资产冗余率(%)] np.round(input_redundancy_rate[:, 0] * 100, 2) result_df[营收提升空间(%)] np.round(output_gap_rate[:, 0] * 100, 2) print(result_df.sort_values(CCR效率, ascendingFalse))输出示例固定seed42实际以你运行结果为准企业编号 CCR效率 BCC效率 规模效率 规模收益 资产冗余率(%) 营收提升空间(%) 0 E02 1.0000 1.0000 1.0000 规模收益不变 0.00 0.00 1 E05 1.0000 1.0000 1.0000 规模收益不变 0.00 0.00 2 E12 1.0000 1.0000 1.0000 规模收益不变 0.00 0.00 ... 14 E08 0.7834 0.8512 0.9204 规模收益递增 21.66 27.65 15 E15 0.7642 0.7901 0.9672 规模收益递减 23.58 30.86这张表就是“效率体检报告”效率1的是标杆企业低于1的进入改进视野规模收益状态告诉你该扩还是该收。单看这张表分析结论已经能写了。4.2 三张可视化图快速定位问题只给老板表格大多数人没耐心看。我习惯配三张图一张柱状图看效率排名一张散点图看效率结构一张条形图看投入产出改进空间。import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False # 图1CCR效率排序柱状图 sorted_df result_df.sort_values(CCR效率, ascendingFalse) fig, ax plt.subplots(figsize(12, 6)) colors [#2E86AB if e 0.8 else #E67E22 for e in sorted_df[CCR效率]] ax.bar(sorted_df[企业编号], sorted_df[CCR效率], colorcolors) ax.axhline(0.8, colorred, linestyle--, linewidth1) ax.set_xlabel(企业编号) ax.set_ylabel(CCR效率) ax.set_title(25家中小企业融资效率排名) plt.xticks(rotation45) plt.tight_layout() plt.savefig(dea_efficiency_ranking.png, dpi150)图1一眼就能看出哪些企业在效率基线比如0.8以下我习惯把低于基线的柱子标成橙色突出警示对象。# 图2纯技术效率 vs 规模效率散点图 fig, ax plt.subplots(figsize(8, 8)) ax.scatter(result_df[BCC效率], result_df[规模效率], s80, alpha0.7) ax.axhline(0.9, colorgray, linestyle--, linewidth1) ax.axvline(0.9, colorgray, linestyle--, linewidth1) ax.set_xlabel(纯技术效率BCC) ax.set_ylabel(规模效率) ax.set_title(效率结构四象限图) plt.tight_layout() plt.savefig(dea_scatter.png, dpi150)散点图按0.9分界线切成四象限右上角是“管理好规模好”的健康企业右下角“管理好但规模不对”该调整规模左上角“规模合理但管理差”重点是提升技术效率左下角双重问题需要全面整改。# 图3改进空间条形图以冗余率为负向展示 low_eff result_df[result_df[CCR效率] 0.8].nsmallest(8, CCR效率) fig, ax plt.subplots(figsize(10, 6)) ax.barh(low_eff[企业编号], low_eff[资产冗余率(%)], color#D7263D, label资产投入冗余率) ax.barh(low_eff[企业编号], -low_eff[营收提升空间(%)], color#21908C, label营收提升空间(负向展示)) ax.set_xlabel(百分比(%)) ax.set_title(重点企业改进空间) ax.legend() plt.tight_layout() plt.savefig(dea_improvement.png, dpi150)图3的要点是把投入冗余和产出提升画在同一个维度上一眼看出哪个企业该压投入、哪个企业该拓产出。我实际汇报时发现老板对“营业收入提升空间27%”这种话非常敏感比听一堆数学概念有用得多。5. 实操中的六个坑踩过才知道有多疼5.1 DMU数量不达标结果失去意义DEA对决策单元数量有硬性要求。经验规则是决策单元数量至少达到投入产出指标数量的2-3倍严格一点的要求是不少于max{m*s, 3*(ms)}其中m是投入数s是产出数。我这套指标4投入、3产出那么至少需要max(4*3, 3*7)21家企业所以模拟数据造了25家。我踩过的坑是用12家企业的实际数据跑结果11家效率1只有1家是0.92没有任何分析价值。原因就是决策单元太少DEA总能找到足够特殊的权重组合让每个企业都站在前沿面上。数据不足时宁可减少指标数量也别硬撑。5.2 指标相关性太强隐性重复计算投入指标之间、产出指标之间如果高度相关相当于隐性重复计权重。比如“资产总额”和“营业成本”相关系数0.9以上DEA会把这两个维度当成同一个信息用两遍结果偏好成本高的企业。实操中用df.corr()检查一下指标相关矩阵超过0.8就要考虑合并或者删除一个。我在造模拟数据时特意让营业成本由资产总额乘以一个随机系数生成虽然相关但不完全共线DEA才有区分空间。5.3 负值和零值的处理DEA要求数据非负而且零值会造成计算异常。实际财务数据里最容易出现的是营收增长率为负怎么办最常见做法是做平移处理把该指标整体加上一个常数让最小值变成0.01或1。平移不会影响DEA的效率排序因为所有决策单元受到同等变换。另外某些投入或产出恰好为0比如新企业利润为0需要替换成一个极小正数比如0.001。直接用0容易让线性规划无界或者产生伪效率1。5.4 量纲差异大到影响求解精度理论上DEA对量纲不敏感资产几千万、增长率百分之几不会改变效率值。但实际数值差距达到几千倍时浮点求解的收敛性和精度会受影响我遇到过linprog返回successTrue但theta明显不合理的情况。稳妥做法是先做min-max归一化把所有指标压缩到[0.1, 1]区间然后再跑DEA。效率值不变求解稳定性会好很多。养成习惯无论理论怎么说先归一化再建模。5.5 scipy版本导致求解器失效低版本的scipy里linprog默认用simplex方法高版本已经弃用不指定methodhighs会报错或者警告。我一开始没注意直接linprog(c, A_ub..., b_ub...)在旧环境跑通了换到新环境直接抛异常。统一写法methodhighs这是scipy 1.6之后推荐的求解器速度和稳定性都好于默认值。5.6 结果全是1别急着庆祝如果你的DEA结果所有企业效率都是1先别觉得数据漂亮这大概率是数据出了问题。常见原因有三个决策单元数量太少、指标相关过强、或者产出指标与投入指标完全没有逻辑关系。还有一种情况是数据里有一两个极端企业把效率前沿拉得很“友好”导致多数企业看起来都不差。排查思路先把效率为1的企业数统计出来如果超过一半基本可以确定指标或数据有问题再逐个删掉最极端的企业看结果是否剧烈变化最后回到指标选择上问自己每个指标的投入产出逻辑是否站得住。6. 融资效率评价的扩展方向DEA这套体系只是起点实际业务中还可以继续延伸。最实用的是把多期数据引进来做动态分析企业连续三年的融资效率怎么变化配合Malmquist指数还能拆出技术进步和效率变化两个分量这比只看一年横截面更说服力。另一个方向是结合超效率DEA解决传统DEA中多个企业效率都为1时无法进一步排序的问题。做法是允许被评价企业脱离前沿面效率值可能大于1从而对标杆企业再排序。代码改动也不大只需把约束条件中的对角线元素从约束矩阵里剔除。如果你想往更实用的方向走可以把DEA和银行信贷评级结合把融资效率作为企业偿债能力的一个重要因子输出“效率低 高杠杆”的风险组合标签这比单纯看财务比率的信贷评分更立体。最后说点实际的。我在这套体系上花最多时间的其实不是代码而是说服业务方接受“效率不等于规模也不等于利润”这件事。很多老板看到自家公司利润年年增长却不理解为什么融资效率排名靠后原因往往是钱借多了没用透资产盘子铺得太大边际产出已经在下滑。DEA的价值就在于把这件事量化出来了。真要落地的时候数据质量和指标逻辑永远比算法复杂度重要先把那21家企业的数据凑齐把指标相关性查干净比多套十个模型管用得多。
RELATED

相关推荐

虚拟树为何让人上瘾?从行为心理学到产品落地的完整拆解

虚拟树为何让人上瘾?从行为心理学到产品落地的完整拆解

日常刷到一个现象——不管是我自己还是团队里的年轻人,明明都知道某个App里那棵虚拟树换不了一分钱,却还是每天定闹钟去浇水、收能量、施肥。连我楼下便利店老板都在收能量,就为了年底能换一棵真实的树。这个表面看起来“成本极低”的小玩法&…

📅 2026/10/8 9:25:59
PostgreSQL 18安装全指南:从官方源到源码编译及避坑实践

PostgreSQL 18安装全指南:从官方源到源码编译及避坑实践

PostgreSQL 18正式版发布之后,身边不少同事和朋友都在问怎么装。其实这个版本从功能层面来说有不少让人眼前一亮的东西,比如逻辑复制的能力进一步增强、内置的同步复制槽管理更方便了,异步I/O也补上了。但对大部分人来说,第一步永…

📅 2026/10/8 9:20:52
CTFshow Crypto实战破题指南:编码识别、嵌套分析与工具链搭建

CTFshow Crypto实战破题指南:编码识别、嵌套分析与工具链搭建

1. 这不是密码学教科书,而是一份CTF实战密码学通关手记你点开这个标题,大概率正卡在CTFshow Crypto板块的某道题上——可能是看到一串长得像乱码的base64字符串发懵,也可能是摩斯电码敲了三遍还是解不出flag,又或者对着/9j/4AAQSk…

📅 2026/10/8 9:20:52
MORE NEWS

更多资讯

📰

Minecraft Forge模组开发:前置依赖配置与mods.toml实战指南

一说到给模组添加前置,很多人第一反应是:“我只要在 mods.toml 里写一行 dependencies 不就行了吗?”说这话的人,要么是只看了半截教程,要么是已经被“前置模组”四个字吓退的半途而废者。坦白讲,我当初跳进…

📰

DeepSeek Harness v0.2桌面版实测:从安装配置到内网部署的AI工作流搭建

上周我拿到 DeepSeek Harness v0.2 桌面版安装包的时候,本来只打算例行尝个鲜,结果从下载到跑通第一条完整产出,前后不到 30 分钟。这个工具本质上是一套围绕 DeepSeek 模型的本地工作流编排桌面端,它把提示词管理、技能包调用、上…

📰

原生微信小程序商品展示管理系统开发实战:从云开发到论文设计全解析

微信小程序做商品展示管理系统,是我这几年被问到最多的题目之一。源码包我整理过很多遍,配套论文说明也写过完整模板,但每次都有同学卡在同几个地方:不是页面写不出来,而是小程序特有的环境配置、授权登录、真机调试逻…

📰

Rust GUI框架Iced角度模块源码解析:用newtype实现单位安全

Rust 的 GUI 框架我前后折腾过好几套,最近主力是 Iced。上周给一个桌面仪表盘项目做圆弧刻度,翻到 iced_widget 里 angle.rs 这个文件,发现角度这个看似不起眼的小模块,设计得很有意思。 Degrees 和 Radians 两个类型加起…

📰

OpenClaw安装全攻略:从Windows、安卓到ROS2与Ollama本地算力接入

如果你最近在折腾机器人、智能体或自动化控制,大概率已经听过OpenClaw这个名字。简单说,OpenClaw是一个把大模型能力接到真实设备和仿真环境里的开源智能体控制框架,它支持Windows、安卓、ROS2、Gazebo,也能通过Ollama跑本地模型。…

📰

宠物领养一站式系统:SpringBoot整合SSM的设计与实现

做宠物领养这个一站式服务系统,最让我花心思的地方反而不是代码本身,而是怎么把“领养”这个链路跑通。这项目用的是 Java SpringBoot SSM(Spring Boot Spring MVC Spring MyBatis)这套经典组合,覆盖了宠物信息管…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬