一 数据包络模型介绍
1.1 背景介绍
小明是中国银行长沙分行的管理人员,每到年底时,小明需要评估长沙分行下辖所有支行在这一年的营运效率。营运效率在这里定义为:在给定一定量的资源投入下,该分行将投入的资源转化为我们想要的产出的能力。
小明需要做的第一件事是选取投入指标和产出指标。假设他选取各个支行的员工数作为投入指标:该支行本年度新增存款作为产出指标,评估各个支行的效率是显而易见的:按照本年度新增存款/员工数从高到低排序即可。即平均每位员工拉来的存款越多,该支行的营运效率越高,这被称为单投入单产出下的效率评估。
然而,真实情况显然没有这么简单。在真实的银行管理运营中,我们需要考虑除了员工数之外的其他诸多投入指标,如营业支出、固定资产净值等;此外,我们也需要考虑除了本年度新增存款之外的其他诸多产出指标,如资本收益等,这被称为多投入多产出下的效率评估。
对于单投入-单产出的模型,可以通过投入产出比、生产函数等方法进行效率评估;对于多投入-单产出的模型,有多元线性回归、逻辑回归等方法进行评估;那么对于多投入-多产出模型,我们应该采用什么方法对其进行效率评估呢?
1.2 DEA方法的思想
DEA是对其决策单元(DMU)的投入规模、技术有效性作出评价,即对各同类型的企业投入一定数量的资金、劳动力等资源后,其产出的效益(经济效益和社会效益)做一个相对有效性的评价。
DEA方法是一种以相对效率概念为基础,以凸分析和线性规划为工具的评价方法,应用数学规划模型计算比较决策单元之间的相对效率,对评价对象作出评价。它能充分考虑对于决策单元本身最优的投入产出方案,因而能够更理想地反映评价对象自身的信息和特点。
二 CCR模型介绍
2.1 线性分式模型
m
a
x
h
0
(
u
,
w
)
=
∑
r
=
1
s
u
r
y
r
0
∑
i
=
1
m
w
i
x
i
0
max\;h_{0}(u,w)=\frac{\sum_{r=1}^s u_{r}y_{r0}}{\sum_{i=1}^m w_{i}x_{i0}}
maxh0(u,w)=∑i=1mwixi0∑r=1suryr0
S
u
b
j
e
c
t
t
o
Subject\;to
Subjectto
- ∑ r = 1 s u r y r j ∑ i = 1 m w i x i j ≤ 1 , j = 1 , . . . , n \frac{\sum_{r=1}^s u_{r}y_{rj}}{\sum_{i=1}^m w_{i}x_{ij}}\leq1,j=1,...,n ∑i=1mwixij∑r=1suryrj≤1,j=1,...,n
- w i , u r ≥ 0 f o r a l l i a n d r \\w_{i},u_{r}\geq0\;for\;all\;i\;and\;r wi,ur≥0foralliandr
根据DEA方法的基本思想,构建以最大化函数为加权产出投入比的线性分式模型,控制每个DMU加权产出投入比小于等于1,寻找其中某一个DMU所能达到的最大加权产出投入比,若某一DMU的最大化函数能够等于1,则说明该DMU是有效的(efficient),反之,若最大化函数小于1,则说明该DMU是无效的(inefficient),也就是说明在相同投入的情况下,存在其他DMU产出大于该DMU。
2.2 线性规划模型
通过Cooper转换,将上述线性分式模型转换为线性规划模型。该模型又称为乘数模型。
m
a
x
z
=
∑
r
=
1
s
u
r
y
r
o
max\;z=\sum_{r=1}^s u_{r}y_{ro}
maxz=∑r=1suryro
S
u
b
j
e
c
t
t
o
Subject\;to
Subjectto
- ∑ r = 1 s u r y r j − ∑ i = 1 m w i x i j ≤ 0 , j = 1 , . . . , n \sum_{r=1}^su_{r}y_{rj}-\sum_{i=1}^mw_{i}x_{ij}\leq0,j=1,...,n ∑r=1suryrj−∑i=1mwixij≤0,j=1,...,n
- ∑ i = 1 m w i x r 0 = 1 \sum_{i=1}^mw_{i}x_{r0}=1 ∑i=1mwixr0=1
- w i , u r ≥ 0 f o r a l l i a n d r \\w_{i},u_{r}\geq0\;for\;all\;i\;and\;r wi,ur≥0foralliandr
线性规划模型的约束在于控制待评价DMU加权投入之和为1,并保证每一DMU的加权产出和小于等于其加权投入和,由此得到最大化函数为待评价DMU的加权产出和,可视为效率因子,若效率因子等于1,说明该DMU有效,反之,该DMU无效。
2.3 对偶模型
根据运筹学(目标函数约束对偶)或凸优化(拉格朗日对偶)知识,得到上述线性规划模型的对偶模型。该对偶模型又称为包络模型。
m
i
n
θ
min\;\theta
minθ
S
u
b
j
e
c
t
t
o
Subject\;to
Subjectto
- ∑ j = 1 n x i j λ j ≤ θ x i 0 , i = 1 , . . . , m \sum_{j=1}^nx_{ij}\lambda_{j}\leq\theta\,x_{i0},i=1,...,m ∑j=1nxijλj≤θxi0,i=1,...,m
- ∑ j = 1 n y r j λ j ≥ y r 0 , r = 1 , . . . , s \sum_{j=1}^ny_{rj}\lambda_{j}\geq\,y_{r0},r=1,...,s ∑j=1nyrjλj≥yr0,r=1,...,s
- λ j ≥ 0 , j = 1 , . . . , n \lambda_{j}\geq0,j=1,...,n λj≥0,j=1,...,n
转换后的对偶模型最优函数可视为研究某一DMU在其各维度下产出不变的情况下,所能够压缩到的最小投入量,其中
θ
\theta
θ代表能够压缩到的最小投入量。当
θ
\theta
θ为取到1时,显然是该约束方程组下的一个可行解,即当前DMU实际的投入与产出。若最终求解得到的
θ
\theta
θ为1,则说明该DMU是有效的。
从实际意义角度分析约束方程组,考虑全部DMU在各维度的加权产出和大于等于该DMU的产出,并考虑该DMU在各维度的投入与
θ
\theta
θ的乘积大于等于全部DMU在各维度的加权投入和。由此若能找到一
θ
<
1
\theta<1
θ<1,则说明该DMU在经营上存在更优策略(可通过压缩投入达到相同产出),可向其它DMU学习并改进,即该DMU是无效的。
三 例题分析
3.1 例题介绍
以台湾纺织业的纺织品供应商数据为例,投入指标考虑退货率、折扣率以及营业费用率,产出指标考虑研发率、生产率、毛利率、数量折扣以及库存周转率。由于研究的问题是企业的经营效率,故投入指标不考虑纺织品成本。我们将通过手写模型,代码求解,使你更加直观地认识并理解数据包络。
3.2 手写模型
CCR包括四个模型,分别是以投入为导向的乘数模型、包络模型以及以产出为导向的乘数模型、包络模型。具体为投入导向还是输出导向,取决于包络模型中的目标函数,若包络模型中的目标函数为最小化投入,则为投入导向;若包络模型中的目标函数为最大化产出,则为产出导向。
以DMU06为例,书写投入导向的乘数模型,即上述模型介绍中的线性规划模型。
3.3 代码实现
Talk is cheap,show me the code.
对于乘数模型和包络模型,我们可以利用python中求解线性规划的库函数进行求解,其中,对于包络模型,由于目标函数恒定,我们只需传入12个不同的约束方程组的左侧系数矩阵以及右侧常量向量即可。
OK,上代码。
from scipy.optimize import linprog
# 包络模型
def solve_envelope(inputs, outputs):
# 构建线性规划模型
c = [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] # 目标函数系数,最小化 theta
A_ub = inputs # 约束条件中的不等式左侧系数矩阵
b_ub = outputs # 约束条件中的不等式右侧向量
bounds = [(0, None)] * len(inputs[0]) # 变量的上下界约束
# 求解线性规划
res = linprog(c, A_ub=A_ub, b_ub=b_ub, bounds=bounds, method='highs')
# 返回最优解
return res.fun
# 左侧系数矩阵数据(初始值为DMU6数据)
inputs = [
[-1.28, 0.06, 0.54, 1.11, 0.15, 0.19, 1.28, 0.01, 0.42, 0.65, 0.25, 0.72, 0.13],
[-0.5, 0.66, 0.22, 0.5, 0.48, 0.41, 0.5, 0.01, 0.13, 1.05, 0.07, 0.18, 1.37],
[-7.01, 5.73, 2.92, 8.38, 5.68, 4.16, 7.01, 5, 2.82, 3.83, 2.64, 4.25, 5.55],
[0, -1.11, -1.13, -2.12, -1.57, -1.5, -3.08, -2, -1.04, -1.66, -2.62, -2.09, -2.52],
[0, -201, -267, -311, -361, -300, -310, -250, -398, -375, -103, -164, -200],
[0, -0.01, -9.69, -6.36, -6.42, -9.51, -13.81, -5.41, -6.82, -7.51, -1.43, -6.71, -2.98],
[0, -7, -7, -5, -5, -10, -7, -8, -7, -5, -8, -6, -6],
[0, -0.67, -6.02, -5.8, -6.17, -6.76, -7.48, -7.04, -11.16, -5.17, -5.16, -12.45, -6.36]
]
outputs = [0, 0, 0, -3.08, -310, -13.81, -7, -7.48] # 右侧系数向量(初始值为DMU6数据)
# 构建长度为12的列表存储输入和输出矩阵
inputs_list = []
outputs_list = []
# 获得12个左侧系数矩阵
for i in range(12):
temp_inputs = [inputs[j][:] for j in range(len(inputs))]
for m in range(3):
temp_inputs[m][0] = 0 - inputs[m][i + 1]
inputs_list.append([temp_inputs[j][:] for j in range(len(temp_inputs))])
# 获得12个右侧系数向量
for i in range(12):
temp_outputs = [outputs[j] for j in range(len(outputs))]
for s in range(3, len(outputs)):
temp_outputs[s] = inputs[s][i + 1]
outputs_list.append([temp_outputs[j] for j in range(len(temp_outputs))])
for i in range(12):
print("DMU{}的效率值为{:.2f}".format(i + 1, solve_envelope(inputs_list[i], outputs_list[i])))
DMU1的效率值为0.70
DMU2的效率值为1.00
DMU3的效率值为0.41
DMU4的效率值为0.98
DMU5的效率值为1.00
DMU6的效率值为0.78
DMU7的效率值为1.00
DMU8的效率值为1.00
DMU9的效率值为0.88
DMU10的效率值为1.00
DMU11的效率值为0.88
DMU12的效率值为0.85
在上述案例中,我们手写DMU06的乘数模型,并通过Python代码计算各个DMU包络模型下的效率值,运行结果如上。从结果分析,DMU2、5、7、8、10的效率值为1,说明这五个决策单元是经营有效的,而其它DMU的效率值均小于1,说明在这些DMU上,存在更好的投入组合来达到它们原本的各项产出指标。亟需改进的为DMU3,效率值仅为0.41;而我们手写的DMU6,效率值为0.78,也存在上升空间。
根据运算结果,可以得到各DMU的经营有效表格,如下:
决策单元编号01~06 | 效率值 | 经营是否有效 | 决策单元编号07~12 | 效率值 | 经营是否有效 |
---|---|---|---|---|---|
01 | 0.70 | 无效 | 07 | 1.00 | 有效 |
02 | 1.00 | 有效 | 08 | 1.00 | 有效 |
03 | 0.41 | 无效 | 09 | 0.88 | 无效 |
04 | 0.98 | 无效 | 10 | 1.00 | 有效 |
05 | 1.00 | 有效 | 11 | 0.88 | 无效 |
06 | 0.78 | 无效 | 12 | 0.85 | 无效 |
四 BCC模型
4.1 模型介绍
在上述介绍的CCR模型中,可以发现其中的对偶模型中的约束方程组中的
λ
j
≥
0
\lambda_{j}\geq0
λj≥0,但是并没有保证
∑
j
=
1
n
λ
j
=
1
\sum_{j=1}^n\lambda_{j}=1
∑j=1nλj=1。在微观经济学中,有规模报酬[规模报酬]的概念,在CCR模型中,我们假定企业的规模报酬不变;而在接下来要介绍的BCC模型中,规模报酬是会发生变化的,这就要求了模型中必须包括
∑
j
=
1
n
λ
j
=
1
\sum_{j=1}^n\lambda_{j}=1
∑j=1nλj=1。这样才能保证研究的某一DMU产量与生产要素的相对比例不发生变化。因此,可以构建以投入为导向的BCC模型如下:
m
i
n
θ
min\;\theta
minθ
S
u
b
j
e
c
t
t
o
Subject\;to
Subjectto
- ∑ j = 1 n x i j λ j ≤ θ x i 0 , i = 1 , . . . , m \sum_{j=1}^nx_{ij}\lambda_{j}\leq\theta\,x_{i0},i=1,...,m ∑j=1nxijλj≤θxi0,i=1,...,m
- ∑ j = 1 n y r j λ j ≥ y r 0 , r = 1 , . . . , s \sum_{j=1}^ny_{rj}\lambda_{j}\geq\,y_{r0},r=1,...,s ∑j=1nyrjλj≥yr0,r=1,...,s
- ∑ j = 1 n λ j = 1 \sum_{j=1}^n\lambda_{j}=1 ∑j=1nλj=1
- λ j ≥ 0 , j = 1 , . . . , n \lambda_{j}\geq0,j=1,...,n λj≥0,j=1,...,n
相较于CCR模型,BCC模型需要在约束方程组中添加
∑
j
=
1
n
λ
j
=
1
\sum_{j=1}^n\lambda_{j}=1
∑j=1nλj=1的等式约束条件。在实际场景中,大多数企业的规模报酬并非恒定不变,因此,BCC模型相较于CCR模型显得更加理性。
4.2 代码实现
接下来,我们还是根据3.1提供的例题,建立BCC模型并进行求解,观察结果相较于CCR模型的求解结果是否发生变化。
OK,上代码。
from scipy.optimize import linprog
# 包络模型
def solve_envelope(inputs, outputs):
# 构建线性规划模型
c = [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] # 目标函数系数,最小化 theta
A_ub = inputs # 约束条件中的不等式左侧系数矩阵
b_ub = outputs # 约束条件中的不等式右侧向量
A_eq = [[0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]
b_eq = [1]
bounds = [(0, None)] * len(inputs[0]) # 变量的上下界约束
# 求解线性规划
res = linprog(c, A_ub=A_ub, b_ub=b_ub, A_eq=A_eq, b_eq=b_eq, bounds=bounds, method='highs')
# 返回最优解
return res.fun
# 左侧系数矩阵数据(初始值为DMU6数据)
inputs = [
[-1.28, 0.06, 0.54, 1.11, 0.15, 0.19, 1.28, 0.01, 0.42, 0.65, 0.25, 0.72, 0.13],
[-0.5, 0.66, 0.22, 0.5, 0.48, 0.41, 0.5, 0.01, 0.13, 1.05, 0.07, 0.18, 1.37],
[-7.01, 5.73, 2.92, 8.38, 5.68, 4.16, 7.01, 5, 2.82, 3.83, 2.64, 4.25, 5.55],
[0, -1.11, -1.13, -2.12, -1.57, -1.5, -3.08, -2, -1.04, -1.66, -2.62, -2.09, -2.52],
[0, -201, -267, -311, -361, -300, -310, -250, -398, -375, -103, -164, -200],
[0, -0.01, -9.69, -6.36, -6.42, -9.51, -13.81, -5.41, -6.82, -7.51, -1.43, -6.71, -2.98],
[0, -7, -7, -5, -5, -10, -7, -8, -7, -5, -8, -6, -6],
[0, -0.67, -6.02, -5.8, -6.17, -6.76, -7.48, -7.04, -11.16, -5.17, -5.16, -12.45, -6.36]
]
outputs = [0, 0, 0, -3.08, -310, -13.81, -7, -7.48] # 右侧系数向量(初始值为DMU6数据)
# 构建长度为12的列表存储输入和输出矩阵
inputs_list = []
outputs_list = []
# 获得12个左侧系数矩阵
for i in range(12):
temp_inputs = [inputs[j][:] for j in range(len(inputs))]
for m in range(3):
temp_inputs[m][0] = 0 - inputs[m][i + 1]
inputs_list.append([temp_inputs[j][:] for j in range(len(temp_inputs))])
# 获得12个右侧系数向量
for i in range(12):
temp_outputs = [outputs[j] for j in range(len(outputs))]
for s in range(3, len(outputs)):
temp_outputs[s] = inputs[s][i + 1]
outputs_list.append([temp_outputs[j] for j in range(len(temp_outputs))])
for i in range(12):
print("DMU{}的效率值为{:.2f}".format(i + 1, solve_envelope(inputs_list[i], outputs_list[i])))
DMU1的效率值为0.81
DMU2的效率值为1.00
DMU3的效率值为0.57
DMU4的效率值为1.00
DMU5的效率值为1.00
DMU6的效率值为1.00
DMU7的效率值为1.00
DMU8的效率值为1.00
DMU9的效率值为1.00
DMU10的效率值为1.00
DMU11的效率值为1.00
DMU12的效率值为1.00
相较于CCR模型,BCC模型的代码只需添加一个等式约束即可,因此只需在函数中添加等式约束的左侧系数矩阵(A_eq)和右侧系数向量(b_eq)即可,最终得到的结果如上。从最终得到的结果来看,相较于CCR模型,BCC模型计算得到的结果显示:不具有有效性的DMU仅有DMU1和DMU3,由此可以说明,在限定等式约束的情况下,具有有效性的DMU更多。
总结
本篇文章介绍了多投入多产出下的效率评估中的一种方法——DEA方法,并通过建立线性分式模型、线性规划模型及其对偶模型,逐步剖析CCR数据包络模型的转换过程,再通过实际例题将抽象数学模型具象化,手写出CCR的乘数模型、利用Python求解出CCR数据包络模型的全部结果,使读者能够更直观地感受并理解CCR模型的计算过程。最后,在CCR模型的基础上添加新增约束条件,将CCR转换为BCC模型,同样利用Python计算结果,并对比CCR、BCC模型的计算结果,带来不同的研究发现。
好了,小伙伴们,CCR、BCC数据包络模型的介绍就到这里了,在学习的过程中不要忘记动手实践哦,亲自动手写出模型并编写程序计算出结果能够帮助大家更好地理解模型。Blog到此为止,希望可以帮助到大家!