1  入力と出力

1.1 学習目標

  • DEAとDMUの考え方を理解する.
  • 1入力1出力の場合の効率性を計算できる.
  • 2入力1出力,1入力2出力の場合に,効率的なDMUを図から判定できる.
  • 効率的フロンティアの意味を理解する.

1.2 前提知識

1.3 データ包絡分析とは

データ包絡分析(DEA: Data Envelopment Analysis)は,分析対象の効率性を評価するための手法である(Charnes ほか 1978年).DEAでは,分析対象をDMU(Decision Making Unit)と呼ぶ.DMUは,複数の入力(input)を複数の出力(output)に変換するものである.

下の表は,いくつかのDMUの例を示している.

DMU 入力 出力
店舗 店員数,面積 売上高,顧客数
大学 教員数,研究費 卒業生数,論文数,特許数
病院 医師数,看護師数,ベッド数 患者数,手術件数,治癒率

1.4 1入力1出力

n 個のDMUがあり,\text{DMU}_j (j=1,2,\ldots,n) は1つの入力 x_j と1つの出力 y_j を持つとする.そのとき,\text{DMU}_j の効率性は

\frac{y_j}{x_j}

で評価できる.これは,単位入力あたりの出力を表している.この値が大きいほど効率がよく,値が最大となるDMUを効率的(efficient)であるという.

横軸に入力,縦軸に出力をとって点 (x_j, y_j) をプロットすると,原点と点 (x_j, y_j) を結ぶ直線の傾きは y_j/x_j に等しい.したがって,効率的なDMUを通る直線の傾きが最も大きく,すべての点はこの直線上かその下側に位置する.この直線を効率的フロンティア(efficient frontier)と呼ぶ.

例 1.1 (1入力1出力の問題例) ある会社は,以下の6つの店舗を運営している.効率的である店舗はどれか.

店舗 A B C D E F
店員数(x 2 3 3 4 2 5
売上高(y 1 3 2 3 2 2

店舗 j の店員数を x_j,売上高を y_j とすると,その効率性は y_j/x_j で計算できる.下の計算結果から,店舗BとEが最も効率的であることがわかる.

コード
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"] = df["sale"] / df["employee"]
print(df)
  store  employee  sale     theta
0     A         2     1  0.500000
1     B         3     3  1.000000
2     C         3     2  0.666667
3     D         4     3  0.750000
4     E         2     2  1.000000
5     F         5     2  0.400000

横軸に店員数,縦軸に売上高をとって,点 (x_j, y_j) をプロットした散布図を下の図に示す.

コード
plt.scatter(df["employee"], df["sale"], color="#144f78")
for i in range(len(df)):
    plt.text(df["employee"][i] + 0.1, df["sale"][i], df["store"][i])
plt.plot([0, 4], [0, 4], color="#b03535", linestyle="--", label="efficient frontier")
plt.xlabel("Employee")
plt.ylabel("Sale")
plt.xlim(0, 6)
plt.ylim(0, 4)
plt.legend()
plt.grid()
plt.show()

破線が効率的フロンティアであり,効率的な店舗BとEはその上にある.

1.5 2入力1出力

次に,\text{DMU}_j が2つの入力 x_{1j}, x_{2j} と1つの出力 y_j を持つ場合を考える.入力が2つあるため,1入力1出力のように1つの比で効率性を表すことはできない.そこで,出力1単位あたりに必要な入力量

\frac{x_{1j}}{y_j},\quad \frac{x_{2j}}{y_j}

を考える.どちらも,値が小さいほど効率的である.

この2つの値を同時に最小にするDMUがあるとは限らないため,効率性を1つの数値で順位づけすることはできない.そこで,2つの値がどちらも \text{DMU}_j 以下で,少なくとも一方は \text{DMU}_j より小さいような他のDMUが存在しないとき,\text{DMU}_j は効率的であるとする.\text{DMU}_j を点 P_j = \left( x_{1j}/y_j,\ x_{2j}/y_j \right) として平面上にプロットすると,効率的なDMUは点の集まりの左下の境界に並び,これらを結んだ折れ線が効率的フロンティアとなる.

例 1.2 (2入力1出力の問題例) ある会社は,以下の6つの店舗を運営している.効率的である店舗はどれか.

店舗 A B C D E F
店員数(x_1 4 7 8 4 2 5
面積(x_2 3 3 1 2 4 2
売上高(y 1 1 1 1 1 1

店舗 j の店員数を x_{1j},面積を x_{2j},売上高を y_{j} とする.各店舗の点 P_j をプロットした散布図を下の図に示す.

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

data = {
    "store": ["A", "B", "C", "D", "E", "F"],
    "employee": [4, 7, 8, 4, 2, 5],
    "area": [3, 3, 1, 2, 4, 2],
    "sale": [1, 1, 1, 1, 1, 1],
}
df = pd.DataFrame(data)
plt.scatter(df["employee"], df["area"], color="#144f78")
for i in range(len(df)):
    plt.text(df["employee"][i] + 0.1, df["area"][i], df["store"][i])
plt.plot(
    [2, 2, 4, 8, 11],
    [5, 4, 2, 1, 1],
    color="#b03535",
    linestyle="--",
    label="efficient frontier",
)
plt.xlabel("Employee/Sale")
plt.ylabel("Area/Sale")
plt.xlim(0, 11)
plt.ylim(0, 5)
plt.legend()
plt.grid()
plt.show()

DEAでは,任意の2点を結ぶ線分上の点が実現可能であると仮定する.例えば,P_DP_E に対して,0 \le w \le 1 を満たす w を用いて w P_D + (1-w) P_E と表される点は,すべて実現可能である.

C,D,Eは効率的で,これらの点を結ぶ折れ線が効率的フロンティアとなる.

1.6 1入力2出力

今度は,\text{DMU}_j が1つの入力 x_j と2つの出力 y_{1j}, y_{2j} を持つ場合を考える.2入力1出力と同様に,入力1単位あたりの出力

\frac{y_{1j}}{x_j},\quad \frac{y_{2j}}{x_j}

を考える.こちらは,値が大きいほど効率的である.2つの値がどちらも \text{DMU}_j 以上で,少なくとも一方は \text{DMU}_j より大きいような他のDMUが存在しないとき,\text{DMU}_j は効率的であるとする.この場合,効率的なDMUは点の集まりの右上の境界に並ぶ.

例 1.3 (1入力2出力の問題例) ある会社は,以下の6つの店舗を運営している.効率的である店舗はどれか.

店舗 A B C D E F
店員数(x 1 1 1 1 1 1
売上高(y_1 1 2 3 4 4 6
顧客数(y_2 5 7 4 3 6 2

店舗 j の店員数を x_{j},売上高を y_{1j},顧客数を y_{2j} とする.y_{1j}/x_{j}y_{2j}/x_{j} を横軸と縦軸にとった散布図を下の図に示す.

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

data = {
    "store": ["A", "B", "C", "D", "E", "F"],
    "employee": [1, 1, 1, 1, 1, 1],
    "sale": [1, 2, 3, 4, 4, 6],
    "customer": [5, 7, 4, 3, 6, 2],
}
df = pd.DataFrame(data)
plt.scatter(df["sale"], df["customer"], color="#144f78")
for i in range(len(df)):
    plt.text(df["sale"][i] + 0.1, df["customer"][i], df["store"][i])
plt.plot(
    [0, 2, 4, 6, 6],
    [7, 7, 6, 2, 0],
    color="#b03535",
    linestyle="--",
    label="efficient frontier",
)
plt.xlabel("sale/employee")
plt.ylabel("customer/employee")
plt.xlim(0, 7)
plt.ylim(0, 8)
plt.legend()
plt.grid()
plt.show()

店舗B,E,Fは効率的で,これらの点を結ぶ折れ線が効率的フロンティアとなる.

1.7 まとめ

  • DEAは,複数の入力から複数の出力への変換を行うDMUの効率性を評価する手法である.
  • 1入力1出力の場合,\text{DMU}_j の効率性は y_j/x_j で評価でき,この値が大きいほど効率的である.
  • 2入力1出力の場合は入力を出力で割った比,1入力2出力の場合は出力を入力で割った比を軸にとると,散布図から効率的なDMUを判定できる.
  • 入力または出力が複数ある場合,効率性を1つの数値で表すことはできない.どちらの指標でも劣らず,少なくとも一方では優れている他のDMUが存在しないとき,そのDMUを効率的とみなす.
  • DEAでは,任意の2点を結ぶ線分上の点が実現可能であると仮定する.効率的なDMUを結ぶ折れ線を効率的フロンティアと呼ぶ.

1.8 用語集

English Japanese
Data Envelopment Analysis (DEA) データ包絡分析
Decision Making Unit (DMU) 意思決定主体;意思決定単位
Reference Set 参照集合
Efficient 効率的
Efficient Frontier 効率的フロンティア

1.9 文献案内

DEAは,Charnes ほか (1978年) が提案したCCRモデルに始まる.このモデルは チャプター 2 で扱う.

本書で扱わないモデルや応用例については,Cooper ほか (2007年) が体系的な教科書であり,Cooper ほか (2011年) には各分野の専門家による解説が収められている.

1.10 練習問題

練習 1.1 (1入力1出力) 次の表のような入力と出力が与えられたとき,効率的なDMUを求めよ.効率性を [0,1] の範囲で評価せよ.

DMU A B C D E
入力 4 7 8 5 6
出力 2 7 9 4 5

解答 1.1. まず,出力を入力で割った比 y_j/x_j を求める.この値は1を超えることがあるため,最大値で割って [0,1] の範囲に収める.

コード
import pandas as pd

data = {
    "DMU": ["A", "B", "C", "D", "E"],
    "input": [4, 7, 8, 5, 6],
    "output": [2, 7, 9, 4, 5],
}
df = pd.DataFrame(data)
df["ratio"] = df["output"] / df["input"]
df["efficiency"] = df["ratio"] / df["ratio"].max()
print(df)
  DMU  input  output     ratio  efficiency
0   A      4       2  0.500000    0.444444
1   B      7       7  1.000000    0.888889
2   C      8       9  1.125000    1.000000
3   D      5       4  0.800000    0.711111
4   E      6       5  0.833333    0.740741

効率性が1となるDMU Cが効率的である.

練習 1.2 (2入力1出力) 次の表のような入力と出力が与えられたとき,効率的なDMUを求めよ.

DMU A B C D E
入力1 6 6 12 4 15
入力2 4 12 9 8 5
出力 2 6 3 2 5

解答 1.2. 下の図より,DMU B,Eが効率的であることがわかる.

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

data = {
    "DMU": ["A", "B", "C", "D", "E"],
    "input1": [6, 6, 12, 4, 15],
    "input2": [4, 12, 9, 8, 5],
    "output": [2, 6, 3, 2, 5],
}
df = pd.DataFrame(data)
x = df["input1"] / df["output"]
y = df["input2"] / df["output"]
plt.scatter(x, y, color="#144f78")
for i in range(len(df)):
    plt.text(x[i] + 0.1, y[i], df["DMU"][i])
# 効率的フロンティアの描画 B-E
plt.plot(
    [1, 1, 3, 6],
    [6, 2, 1, 1],
    color="#b03535",
    linestyle="--",
    label="efficient frontier",
)
plt.xlabel("input1/output")
plt.ylabel("input2/output")
plt.xlim(0, 6)
plt.ylim(0, 6)
plt.grid()
plt.show()