3  CCRモデル

CCRモデルは,1978年にCharnes, Cooper, and Rhodesによって提案されたもので,DEAの基本的なモデルである.

\(n\) 個のDMUを評価する.各DMUは \(m\) 個の入力と \(s\) 個の出力を持つとする.\(\text{DMU}_j\) (\(j=1,2,\ldots,n\)) の \(i\) 番目の入力を \(x_{ij}\)\(r\) 番目の出力を \(y_{rj}\) と表す.このとき,入力データと出力データはそれぞれ次のような行列で表される.

\[ \mathbf{X} = \begin{pmatrix} x_{11} & x_{12} & \cdots & x_{1n} \\ x_{21} & x_{22} & \cdots & x_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ x_{m1} & x_{m2} & \cdots & x_{mn} \end{pmatrix} \]

\[ \mathbf{Y} = \begin{pmatrix} y_{11} & y_{12} & \cdots & y_{1n} \\ y_{21} & y_{22} & \cdots & y_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ y_{s1} & y_{s2} & \cdots & y_{sn} \end{pmatrix} \]

入力の重み \(\mathbf{v}\) と出力の重み \(\mathbf{u}\)\[ \mathbf{v} = \begin{pmatrix} v_1 \\ v_2 \\ \vdots \\ v_m \end{pmatrix},\quad \mathbf{u} = \begin{pmatrix} u_1 \\ u_2 \\ \vdots \\ u_s \end{pmatrix} \]

とし,\(\text{DMU}_o\) の効率性 \(\theta\)

\[ \theta = \frac{\sum_{r=1}^{s} u_r y_{ro}}{\sum_{i=1}^{m} v_i x_{io}} = \frac{u_1 y_{1o} + u_2 y_{2o} + \cdots + u_s y_{so}}{v_1 x_{1o} + v_2 x_{2o} + \cdots + v_m x_{mo}} \]

として計算できる.

CCRモデルの考え方は,\(\text{DMU}_o\) の効率性を最大化するような重み \(\mathbf{u}\)\(\mathbf{v}\) を選ぶことである.\(\text{DMU}_o\) は最適な重みを用いたとき,他のDMUとの比較を行う.

例 3.1 以下の表は,3つのDMUの入力と出力を示している.

DMU 1 2 3
Input 1 20 19 25
Input 2 151 131 160
Output 1 100 150 160
Output 2 90 50 55

入力データ \(\mathbf{X}\) と出力データ \(\mathbf{Y}\) は次のようになる. \[ \mathbf{X} = \begin{pmatrix} 20 & 19 & 25 \\ 151 & 131 & 160 \end{pmatrix}, \quad \mathbf{Y} = \begin{pmatrix} 100 & 150 & 160 \\ 90 & 50 & 55 \end{pmatrix} \]

入力に対する重みを \(\mathbf{v}\),出力に対する重みを \(\mathbf{u}\) とする.すなわち,

\[ \mathbf{v} = \begin{pmatrix} v_1 \\ v_2 \end{pmatrix}, \quad \mathbf{u} = \begin{pmatrix} u_1 \\ u_2 \end{pmatrix}. \]

\(\text{DMU}_1\) の効率性 \(\theta\) は,次のように表される.

\[\begin{align*} \theta &= \frac{\sum_{r=1}^{s} u_r y_{r1}}{\sum_{i=1}^{m} v_i x_{i1}} \\ &= \frac{u_1 y_{11} + u_2 y_{21}}{v_1 x_{11} + v_2 x_{21}} \\ &= \frac{100 u_1 + 90 u_2}{20 v_1 + 151 v_2} \end{align*}\]

同様にして,\(\text{DMU}_2\)\(\text{DMU}_3\) の効率性は次のようになる. \[\begin{align*} \text{DMU}_2: \quad & \theta = \frac{\sum_{r=1}^{s} u_r y_{r2}}{\sum_{i=1}^{m} v_i x_{i2}} = \frac{150 u_1 + 50 u_2}{19 v_1 + 131 v_2} \\ \text{DMU}_3: \quad & \theta = \frac{\sum_{r=1}^{s} u_r y_{r3}}{\sum_{i=1}^{m} v_i x_{i3}} = \frac{160 u_1 + 55 u_2}{25 v_1 + 160 v_2} \end{align*}\]

\(\mathbf{u}\)\(\mathbf{v}\) が与えられたとき,\(\text{DMU}_1\) の効率性 \(\theta\) を計算できる.例えば, \[ \mathbf{u} = \begin{pmatrix} 0.003 \\ 0.007 \end{pmatrix},\quad \mathbf{v} = \begin{pmatrix} 0.005 \\ 0.006 \end{pmatrix} \] とすると,\(\text{DMU}_1\) の効率性は \[\begin{align*} \theta &= \frac{100 \times 0.003 + 90 \times 0.007}{20 \times 0.005 + 151 \times 0.006} \end{align*}\] である.

3.0.1 CCRモデルの定式化

CCRモデルは,\(\text{DMU}_o\) の効率性 \(\theta\) を最大化する重み \(\mathbf{u^*}\)\(\mathbf{v^*}\) を求める.目的関数は,以下のようになる.

\[ \text{maximize} \quad \theta = \frac{\sum_{r=1}^{s} u_r y_{ro}}{\sum_{i=1}^{m} v_i x_{io}} \]

そこで,制約条件として,すべてのDMUの効率性が1以下であることを課す.すなわち,すべての \(j = 1, 2, \ldots, n\) について,次の不等式を満たす必要がある.

\[ \frac{\sum_{r=1}^{s} u_r y_{rj}}{\sum_{i=1}^{m} v_i x_{ij}} \leq 1, \quad \forall j = 1, 2, \ldots, n \]

また,重みは非負である必要があるため,\(\mathbf{u} \geq \mathbf{0}\)\(\mathbf{v} \geq \mathbf{0}\) とする.

したがって,CCRモデルは次の分数計画問題として定式化できる.

\[\begin{align*} \text{maximize} \quad & \theta = \frac{\sum_{r=1}^{s} u_r y_{ro}}{\sum_{i=1}^{m} v_i x_{io}} & \\ \text{subject to} \quad & \frac{\sum_{r=1}^{s} u_r y_{rj}}{\sum_{i=1}^{m} v_i x_{ij}} \leq 1, \quad & \forall j = 1, \ldots, n & \\ & u_r \geq 0, \quad & \forall r = 1, \ldots, s & \\ & v_i \geq 0, \quad & \forall i = 1, \ldots, m \end{align*}\]

この分数計画問題は,\(\text{DMU}_o\) の効率性 \(\theta\) を最大化する重み \(\mathbf{u^*}\)\(\mathbf{v^*}\) を求めるものである.制約条件は,すべてのDMUの効率性が1以下であることを保証している.

ノート

厳密に,制約条件は

\[ \frac{u_r}{\sum_{i=1}^{m} v_i x_{io}} \geq \epsilon > 0, \quad \forall r = 1, \ldots, s \]

\[ \frac{v_i}{\sum_{i=1}^{m} v_i x_{io}} \geq \epsilon > 0, \quad \forall i = 1, \ldots, m \]

とする必要がある.

この分数計画問題において,任意の \(\alpha > 0\) に対して,\((\mathbf{u}^*, \mathbf{v}^*)\) を最適解とすると,\((\alpha \mathbf{u}^*, \alpha \mathbf{v}^*)\) も最適解となる.

したがって,この分数計画問題は無限に多くの最適解を持つ.この問題を解決するために,分母を1に固定することで,次の線形計画問題に変換できる.

\[\begin{align*} \text{maximize} \quad & \theta = \sum_{r=1}^{s} u_r y_{ro} & \\ \text{subject to} \quad & \sum_{i=1}^{m} v_i x_{io} = 1 & \\ & \sum_{r=1}^{s} u_r y_{rj} - \sum_{i=1}^{m} v_i x_{ij} \leq 0, \quad & \forall j = 1, \ldots, n & \\ & u_r \geq 0, \quad & \forall r = 1, \ldots, s & \\ & v_i \geq 0, \quad & \forall i = 1, \ldots, m \end{align*}\]

定義 3.1  

  1. \(\theta^* = 1\) かつ最適解 \(\mathbf{u}^* > \mathbf{0}\)\(\mathbf{v}^* > \mathbf{0}\) を満たすとき,\(\text{DMU}_o\) は効率的である.
  2. \(\theta^* < 1\) のとき,\(\text{DMU}_o\) は非効率的である.

\(\theta^* < 1\) のとき,少なくとも1つの \(j \in \{1,2,\ldots,n\} \setminus \{o\}\) について,次の式が成り立つ.

\[ \sum_{r=1}^{s} u_r^* y_{rj} - \sum_{i=1}^{m} v_i^* x_{ij} = 0 \]

そうでなければ,\(\theta\) を増加させることができる.正式に,\(\text{DMU}_o\) における \(\theta^* < 1\) のとき,次の集合を\(\text{DMU}_o\)参照集合(reference set)と呼ぶ.

\[ \mathcal{R}_o = \{ j \mid \sum_{r=1}^{s} u_r^* y_{rj} - \sum_{i=1}^{m} v_i^* x_{ij} = 0 \} \]

参照集合 \(\mathcal{R}_o\) は,\(\text{DMU}_o\) を非効率的にしているDMUの集合である.

3.0.2 PythonによるCCRモデルの実装

以下に,PythonでCCRモデルを解く関数を示す.Gurobiをソルバーとして使用している.

!pip install gurobipy
from gurobipy import Model, GRB
import numpy as np

def ccr(inputs, outputs, dmu_index):
    num_dmu = inputs.shape[1]
    num_inputs = inputs.shape[0]
    num_outputs = outputs.shape[0]
    model = Model("DEA_CCR")
    # 変数の定義
    u = [model.addVar(name=f"u_{r}", lb=0) for r in range(num_outputs)]
    v = [model.addVar(name=f"v_{i}", lb=0) for i in range(num_inputs)]
    # 目的関数の定義
    model.setObjective(
        sum(u[r] * outputs[r, dmu_index] for r in range(num_outputs)),
        GRB.MAXIMIZE,
    )
    # 制約条件の定義
    model.addConstr(
        sum(v[i] * inputs[i, dmu_index] for i in range(num_inputs)) == 1,
        "input_normalization",
    )
    for j in range(num_dmu):
        model.addConstr(
            sum(u[r] * outputs[r, j] for r in range(num_outputs))
            - sum(v[i] * inputs[i, j] for i in range(num_inputs))
            <= 0,
            f"theta_constraint_{j}",
        )
    # 最適化の実行
    model.optimize()
    if model.status == GRB.OPTIMAL:
        theta = model.objVal
        output_weights = [u[r].X for r in range(num_outputs)]
        input_weights = [v[i].X for i in range(num_inputs)]
        ref_set = []
        for j in range(num_dmu):
            constr = model.getConstrByName(f"theta_constraint_{j}")
            if abs(constr.Slack) == 0:
                ref_set.append(j)
        return theta, output_weights, input_weights, ref_set
    else:
        return None

ccr()関数を用いて,すべてのDMUについてCCRモデルを解く関数を以下に示す.

def solve_all_ccr(inputs, outputs):
    inputs = np.atleast_2d(inputs)
    outputs = np.atleast_2d(outputs)

    num_dmu = inputs.shape[1]
    dmu_names = [chr(65 + i) for i in range(num_dmu)]

    results = []
    u_list = []
    v_list = []
    ref_sets = []

    for i in range(num_dmu):
        theta, u_val, v_val, ref_set = ccr(inputs, outputs, i)
        results.append(theta)
        u_list.append(u_val)
        v_list.append(v_val)
        ref_sets.append([dmu_names[j] for j in ref_set])

    for i in range(num_dmu):
        name = dmu_names[i]
        theta = results[i]
        u_val = u_list[i]
        v_val = v_list[i]
        ref_set = ref_sets[i]
        
        formatted_u = ", ".join(f"{w:.4f}" for w in u_val)
        formatted_v = ", ".join(f"{w:.4f}" for w in v_val)
        formatted_ref_set = ", ".join(ref_set)

        print(f"DMU {name}")
        print(f"  theta            : {theta:.4f}")
        print(f"  Output Weights u : [{formatted_u}]")
        print(f"  Input Weights  v : [{formatted_v}]")
        print(f"  Reference Set    : [{formatted_ref_set}]")
        print("-" * 50)

3.1 CCRモデルの例題

3.1.1 1入力1出力のCCRモデル

DMU A B C D E F
Input 2 3 3 4 2 5
Output 1 3 2 3 2 2

入力に対する重みを \(v\),出力に対する重みを \(u\) とする. \(\text{DMU}_A\) の効率性を評価するCCRモデルは次のようになる.

\[\begin{align*} \text{maximize} \quad & u & \\ \text{subject to} \quad & 2v = 1 & \\ & u - 2v \leq 0 & (A)\\ & 3u - 3v \leq 0 & (B)\\ & 2u - 3v \leq 0 & (C)\\ & 3u - 4v \leq 0 & (D)\\ & 2u - 2v \leq 0 & (E)\\ & 2u - 5v \leq 0 & (F)\\ & u \geq 0 & \\ & v \geq 0 & \end{align*}\]

\(2v = 1\) より,\(v = 0.5\) であるから,この等式を用いて,この線形計画問題は簡単に解ける.最適値は \(\theta^* = 0.5\),重みは \(u^* = 0.5\)\(v^* = 0.5\) である.

\(\theta^* = 0.5 < 1\) から,\(\text{DMU}_A\) は非効率的であることがわかる.また,\(u^*\)\(v^*\) を代入し,制約条件 (B) と (E) が等号で成り立っているため,\(\text{DMU}_A\) の参照集合は \(\mathcal{R}_A = \{B, E\}\) となる.さらに,

\[ \theta = \frac{u^* y_A}{v^* x_A} = 0.5 \]

であるから,\(A\) の出力 \(y_A\) を 2 倍するか,入力 \(x_A\) を 0.5 倍すれば,効率的になることがわかる.

同様にして,すべてのDMUについてCCRモデルを解くと,次の結果が得られる.

X = np.array([[2, 3, 3, 4, 2, 5]])
Y = np.array([1, 3, 2, 3, 2, 2])
solve_all_ccr(X, Y)
DMU A
  theta            : 0.5000
  Output Weights u : [0.5000]
  Input Weights  v : [0.5000]
  Reference Set    : [B, E]
--------------------------------------------------
DMU B
  theta            : 1.0000
  Output Weights u : [0.3333]
  Input Weights  v : [0.3333]
  Reference Set    : [B, E]
--------------------------------------------------
DMU C
  theta            : 0.6667
  Output Weights u : [0.3333]
  Input Weights  v : [0.3333]
  Reference Set    : [B, E]
--------------------------------------------------
DMU D
  theta            : 0.7500
  Output Weights u : [0.2500]
  Input Weights  v : [0.2500]
  Reference Set    : [B, E]
--------------------------------------------------
DMU E
  theta            : 1.0000
  Output Weights u : [0.5000]
  Input Weights  v : [0.5000]
  Reference Set    : [B, E]
--------------------------------------------------
DMU F
  theta            : 0.4000
  Output Weights u : [0.2000]
  Input Weights  v : [0.2000]
  Reference Set    : [B, E]
--------------------------------------------------

\(\{B, E\}\) が他のDMUの参照集合となっていることもわかる.

1入力1出力の分数計画問題において,目的関数は

\[ \frac{u y_o}{v x_o} = \frac{u}{v} \frac{y_o}{x_o} \]

となり,\(y_o/x_o\) に比例する.したがって,1入力1出力のCCRモデルの最適化問題を解くことは,すべてのDMUについて \(y_j/x_j\) を計算し,\([0,1]\) に正規化することと同じである.今回の例題では,DMU BとEの \(\theta^*=1\) で最大であるため,\(u/v = 1\) となる.

コード
import matplotlib.pyplot as plt
import pandas as pd

data = {
    "store": ["A", "B", "C", "D", "E", "F"],
    "employee": [2, 3, 3, 4, 2, 5],
    "sale": [1, 3, 2, 3, 2, 2],
}
df = pd.DataFrame(data)
df["theta"] = [0.5, 1.0, 0.67, 0.75, 1.0, 0.4]
df["u"] = [0.5, 0.33, 0.33, 0.25, 0.5, 0.2]
df["v"] = [0.5, 0.33, 0.33, 0.25, 0.5, 0.2]
plt.figure(figsize=(8, 6))
plt.scatter(df["employee"], df["sale"])
for i in range(len(df)):
    plt.text(df["employee"][i] + 0.1, df["sale"][i], df["store"][i])
plt.plot([0, 6], [0, 6], color="red", linestyle="--", label="efficient frontier")
plt.xlabel("Employee")
plt.ylabel("Sale")
plt.xlim(0, 6)
plt.ylim(0, 6)
plt.legend()
plt.grid()
plt.show()

3.1.2 2入力1出力のCCRモデル

DMU A B C D E F
Input 1 4 7 8 4 2 10
Input 2 3 3 1 2 4 1
Output 1 1 1 1 1 1

入力1に対する重みを \(v_1\),入力2に対する重みを \(v_2\),出力に対する重みを \(u\) とする. \(\text{DMU}_A\) の効率性を評価するCCRモデルは次のようになる.

\[\begin{align*} \text{maximize} \quad & u & \\ \text{subject to} \quad & 4v_1 + 3v_2 = 1 & \\ & u - 4v_1 - 3v_2 \leq 0 & (A)\\ & u - 7v_1 - 3v_2 \leq 0 & (B)\\ & u - 8v_1 - 1v_2 \leq 0 & (C)\\ & u - 4v_1 - 2v_2 \leq 0 & (D)\\ & u - 2v_1 - 4v_2 \leq 0 & (E)\\ & u - 10v_1 - 1v_2 \leq 0 & (F)\\ & u \geq 0 & \\ & v_1 \geq 0 & \\ & v_2 \geq 0 & \end{align*}\]

ソルバーでこの線形計画問題を解くと,最適値は \(\theta^* = 0.8571\),重みは \(u^* = 0.8571\)\(v_1^* = 0.1429\)\(v_2^* = 0.1429\) である.また,\(u^*, v_1^*, v_2^*\) を制約条件に代入し,\(A\) の参照集合は \(\mathcal{R}_A = \{D, E\}\) となる.

3.1.3 2入力2出力のCCRモデル

DMU A B C D E F G H I J K L
Input 1 20 19 25 27 22 55 33 31 30 50 53 38
Input 2 151 131 160 168 158 255 235 206 244 268 306 284
Output 1 100 150 160 180 94 230 220 152 190 250 260 250
Output 2 90 50 55 72 66 90 88 80 100 100 147 120

\(\text{DMU}_A\) の効率性を評価するCCRモデルは次のようになる.

\[\begin{align*} \text{maximize} \quad & 100 u_1 + 90 u_2 & \\ \text{subject to} \quad & 20 v_1 + 151 v_2 = 1 & \\ & 100 u_1 + 90 u_2 - 20 v_1 - 151 v_2 \leq 0 & \\ & 150 u_1 + 50 u_2 - 19 v_1 - 131 v_2 \leq 0 & \\ & 160 u_1 + 55 u_2 - 25 v_1 - 160 v_2 \leq 0 & \\ & 180 u_1 + 72 u_2 - 27 v_1 - 168 v_2 \leq 0 & \\ & 94 u_1 + 66 u_2 - 22 v_1 - 158 v_2 \leq 0 & \\ & 230 u_1 + 90 u_2 - 55 v_1 - 255 v_2 \leq 0 & \\ & 220 u_1 + 88 u_2 - 33 v_1 - 235 v_2 \leq 0 & \\ & 152 u_1 + 80 u_2 - 31 v_1 - 206 v_2 \leq 0 & \\ & 190 u_1 + 100 u_2 - 30 v_1 - 244 v_2 \leq 0 & \\ & 250 u_1 + 100 u_2 - 50 v_1 - 268 v_2 \leq 0 & \\ & 260 u_1 + 147 u_2 - 53 v_1 - 306 v_2 \leq 0 & \\ & 250 u_1 + 120 u_2 - 38 v_1 - 284 v_2 \leq 0 & \\ & u_r \geq 0, \quad \forall r = 1, 2 & \\ & v_i \geq 0, \quad \forall i = 1, 2 & \end{align*}\]

3.2 演習問題

練習 3.1 以下の表は,4つのDMUの入力と出力を示している.

DMU A B C D
Input 5 10 15 20
Output 10 20 25 30

以下の問いに答えよ.ただし,効率性を \(\theta\),従業員数に対する重みを \(v\),売上高に対する重みを \(u\) とする。

  1. DMU A のCCRモデルを定式化せよ.
  2. 上記の線形計画問題を解き,DMU A の効率性 \(\theta^*\) と重み \(u^*\)\(v^*\) を求めよ.
  3. DMU A の参照集合を求めよ.