数据包络分析(超效率-SBM模型)附python代码
这段时间差不多忙完了,终于有时间可以来经营我的博客了。
上阵子挺多人私信我,原谅我记性不好,可能没有回复全。
这篇文章是超效率的扩展。
超效率SBM
SBM本身就是非径向模型(non-radial model),想要了解径向超效率的请自行去前面翻阅。
上篇文章说到super-SBM的一个模型,公式为:
这个模型是分式模型,我们可以通过charnes cooper变换,将其转变成为:
python代码(部分)
在编程过程中,本来我以为第一个模型是无法出结果的,但是很无语的是,是我有bug了。这里就附上第一个模型的超效率核心部分代码(第二个也是差不多,万变不离其宗)。
首先,数据为:
def __SBM_super_C(self): for k in self.DMUs: MODEL = gurobipy.Model() fi = MODEL.addVars(self.m1) lambdas = MODEL.addVars(self.DMUs) fo = MODEL.addVars(self.m2) t = MODEL.addVar() MODEL.update() MODEL.setObjective(t + t/self.m1 * quicksum(fi[j] for j in range(self.m1)), sense=gurobipy.GRB.MINIMIZE) MODEL.addConstrs(quicksum(lambdas[i] * self.X[i][j] for i in self.DMUs if i != k) <= (1+fi[j]) * self.X[k][j] for j in range(self.m1)) MODEL.addConstrs(quicksum(lambdas[i] * self.Y[i][j] for i in self.DMUs if i != k) >= (1-fo[j]) * self.Y[k][j] for j in range(self.m2)) MODEL.addConstr(t-t/self.m2 * quicksum(fo[j] for j in range(self.m2)) == 1) MODEL.setParam(OutputFlag, 0) MODEL.setParam("NonConvex", 2) MODEL.optimize() self.Result.at[k, (效益分析, 效率)] = MODEL.objVal return self.Result
首先是用最基本的SBM模型对所有DMUs进行分析,结果如下,前四个DMUs是SBM有效的:
效率(SBM) 有效性 类型 A 1 SBM 有效 规模报酬固定 B 1 SBM 有效 规模报酬固定 C 1 SBM 有效 规模报酬固定 D 1 SBM 有效 规模报酬固定 E 0.42 非 SBM 有效 规模报酬固定 F 0.571429 非 SBM 有效 规模报酬固定
然后为深入了解前四个DMUs中哪个更好,针对这四个,做超效率-SBM模型分析。(注意此时得到的E、F值不用,用基础SBM中得到的效率值。)
效益分析 效率 A 1.14286 B 1.16383 C 1.08824 D 1.125 E 1 F 1
最终,整合后得到的效率值应该是:
效益分析 效率 A 1.14286 B 1.16383 C 1.08824 D 1.125 E 0.42 F 0.571429
这个例子是来自于书本的(Data Envelopment Analysis 2th Edition),书中给出了结果,与复现结果是一致的。
上一篇:
通过多线程提高代码的执行效率例子
下一篇:
Monogodb之极客时间学习笔记(一)