一、SBM模型简介

(一)SBM提出背景       

         目前学术界对于效率测度使用最多的是DEA的两个基本模型,即CCR模型与BBC模型。CCR模型与BBC模型均属于径向模型,对测度条件要求严格,且效率值无法实现有效排序,效率值小于1表示决策单元无效,等于1的则表示决策单元有效,当多个决策单元的DEA均达到有效时,难以进行横向上的区分比较。超效率SBM模型是在DEA模型基础上进一步演化而来,由Tone在2002年提出,该模型解决了上述一系列问题,可以有效区分决策单元为1的对象,超效率SBM模型中的效率值可以大于1,当多个决策单元的DEA有效时,能够进行有效排序,因此本文选择使用超效率SBM模型对全国16个城市的政府开放数据效率值进行排序。

(二)SBM模型原理介绍

 

 

二、python实现SBM模型

(一)python实现方法

#导入所需要的包
import pandas as pd
import numpy as np
from scipy import optimize

#导入数据
df = pd.read_excel("dea_data.xlsx", index_col=0)
data = df.values

x = data[:, 0:2]
x = x.T
y_g = data[:, 2:4]
y_g = y_g.T
y_b = data[:, 4]
y_b = y_b.reshape(1,-1)# reshape的原因是只有一个非期望产出变量,上一行得到的y_b是一个一维的向量,需要将其转换成一个1×n的二维行向量,否则后续进行矩阵操作容易报错
m, n = x.shape
s1 = y_g.shape[0]
s2 = y_b.shape[0]

theta = []# 用于存储结果,每一个DMU的效率值,也即目标函数值都会append到theta里
for i in range(n):
    f = np.concatenate([np.zeros(n), -1/(m*x[:, i]),
                       np.zeros(s1+s2), np.array([1])])

    Aeq1 = np.hstack([x,
                      np.identity(m),
                      np.zeros((m, s1+s2)),
                      -x[:, i, None]])

    Aeq2 = np.hstack([y_g,
                      np.zeros((s1, m)),
                      -np.identity(s1),
                      np.zeros((s1, s2)),
                      -y_g[:, i, None]])

    Aeq3 = np.hstack([y_b,
                      np.zeros((s2, m)),
                      np.zeros((s2, s1)),
                      np.identity(s2),
                      -y_b[:, i, None]])

    Aeq4 = np.hstack([np.zeros(n),
                    np.zeros(m),
                    1/((s1+s2)*(y_g[:, i])),
                    1/((s1+s2)*(y_b[:, i])),
                    np.array([1])]).reshape(1, -1)

    Aeq = np.vstack([Aeq1, Aeq2, Aeq3, Aeq4])
    beq = np.concatenate([np.zeros(m+s1+s2),np.array([1])])
    bounds = tuple([(0, None) for t in range(n+s1+s2+m+1)])
    res = optimize.linprog(c=f, A_eq=Aeq, b_eq=beq, bounds=bounds)
    theta.append(res.fun)

(二)python实现备用

from pyDEA.DEA import DEA
from pyDEA.InputData import InputData
from pyDEA.OutputData import OutputData

# 定义输入数据
input_data = InputData([10, 15, 12], ["Input1", "Input2", "Input3"])

# 定义输出数据
output_data = OutputData([200, 300, 250], ["Output1", "Output2", "Output3"])

# 创建DEA对象
dea = DEA(input_data, output_data)

# 计算效率得分
efficiency_scores = dea.get_efficiency_scores()

# 打印每个单位的效率得分
for i, score in enumerate(efficiency_scores):
    print("Efficiency score for unit {}: {}".format(i + 1, score))

在上述代码中,首先创建了输入数据和输出数据的对象。然后,通过传入这些数据创建DEA对象。最后,调用get_efficiency_scores()方法计算每个单位的效率得分,并将结果打印出来。此外,pyDEA库还提供了其他功能,如投影法和前沿分析等,你可以根据需要进一步探索。

安装pyDEA库,可以使用以下命令在Python中安装它:

pip install pyDEA

三、参考文献

[1]含非期望产出的SBM,超效率SBM模型求解及其python实现 - 知乎 (zhihu.com)

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐