目次
刀根「経営効率化...」の例題
g.in = c(1,rep(0,7),0,0,0)
g.mat = rbind(c(4,-4,-7,-8,-4,-2,-10,-3,-1,0,0),
c(3,-3,-3,-1,-2,-4,-1,-7,0,-1,0),
c(0,1,1,1,1,1,1,1,0,0,-1))
g.rhs = c(0,0,1)
g.dir = rep("=", 3)
soln = lp ("min", g.in, g.mat, g.dir, g.rhs)
soln$solution
g.in = c(1,rep(0,7),0,0,0)
g.mat = rbind(c(7,-4,-7,-8,-4,-2,-10,-3,-1,0,0),
c(3,-3,-3,-1,-2,-4,-1,-7,0,-1,0),
c(0,1,1,1,1,1,1,1,0,0,-1))
g.rhs = c(0,0,1)
g.dir = rep("=", 3)
soln = lp ("min", g.in, g.mat, g.dir, g.rhs)
soln$solution
g.in = c(1,1)
g.mat = rbind(c(5,3),c(4,5))
g.rhs = c(15,20)
g.dir = rep("<=", 2)
soln = lp ("max", g.in, g.mat, g.dir, g.rhs)
soln$solution
g.dir2 = rep(">=", 2)
soln = lp ("min", g.rhs, t(g.mat), g.dir2, g.in)
soln$solution
CCR() は、投入行列と算出行列と DMU の番号を与えて、その DMU の効率値と、それを実現するウェイトベクトルを計算する関数である。
投入量の行列、産出量の行列は、行に DMU、列に項目名を配置する。DMU の番号は、1から投入行列の行数以下の整数とする。行列のサイズ違反、DMU の指定違反についてのチェックはしない。
計算結果は、効率値($opt)、入力項目のウェイトベクトル($win)、出力項目のウェイトベクトル($wout)をlist として返す。
線形計画法の解を求めるために、lp() 関数を使う。
lp("min"/"max", 目的関数係数ベクトル, 係数行列, "="/">="/"<=", 定数ベクトル)
lp() を使うために lpSolve パッケージを使うので、最初に、library(lpSolve) を実行させる必要がある。
lpSolve がない場合は、install.packages("lpSolve") を実行してインポートしなければいけない(ここを参照のこと)。
as.matrix() は、ベクトルを1列の行列として扱うことを許す関数である。投入、あるいは算出の項目数が1の場合は、ncol() 関数の引数がベクトルとなり、正しい結果が得られないので、この関数が必要になる。
#### 投入行列 input と算出行列 output が与えられているとき、dmu の効率性を計算する。
#### 行列は、DMU を行に、項目を列にしたものを与える。
#### 結果は、効率値($opt)と、投入ベクトルの係数($win)、算出ベクトルの係数($wout)。
CCR <- function(input, output, dmu) {
matin <- as.matrix(input)
matout <- as.matrix(output)
ndmu <- nrow(matin)
nin <- ncol(matin)
nout <- ncol(matout)
g.in <- c(rep(0,nin),matout[dmu,])
g.mat <- rbind(c(matin[dmu,],rep(0,nout)), cbind(-matin,matout))
g.dir <- c("=", rep("<=", ndmu))
g.rhs <- c(1,rep(0,ndmu))
soln <- lp("max", g.in, g.mat, g.dir, g.rhs)$solution
return(list(opt=sum(soln[nin+1:nout]*matout[dmu,]),
win=soln[1:nin], wout=soln[nin+1:nout]))
}
#### 投入行列 input と算出行列 output が与えられているとき、すべての DMU の効率性を計算し、
#### 効率値($opt)と、投入ベクトルの係数($win)、算出ベクトルの係数($wout)の一覧表を返す。
#### DMU を行に、入出力の各項目を列に配置してある。
DEAtable <- function(input, output) {
n <- nrow(as.matrix(input))
tbl <- sapply(1:n, function(k) unlist(CCR(input, output, k)))
return(t(tbl))
}
使用例 データは、刀根薫「経営効率性の測定と改善」46ページから引用した、東京の区立図書館の「蔵書数」「職員数」「登録者数」「貸出冊数」である。
> install.packages("lpSolve") # パッケージのインストール
> library(lpSolve) # ライブラリを呼び出す
> libr < read.table("clipboard", header=TRUE) # 表形式のデータをクリップボード経由で読み込む
> (input <- libr[,2:3]) # (この場合は)2入力2出力のデータを扱う
蔵書 数職員数
1 163.523 26
2 338.671 30
3 281.655 51
4 400.993 78
(以下省略)
> (output <- libr[,4:5])
登録者数 貸出冊数
1 5.561 105.321
2 18.106 314.682
3 16.498 542.349
4 30.810 847.872
(以下省略)
> CCR(input, output, 1)
$opt
[1] 0.2260062
$win
[1] 0.00000000 0.03846154
$wout
[1] 0.04064128 0.00000000
> (dealib = round(DEAtable(input,output),6))
opt win1 win2 wout1 wout2
[1,] 0.226006 0.000000 0.038462 0.040641 0.000000
[2,] 0.637738 0.000000 0.033333 0.035222 0.000000
[3,] 0.540055 0.003550 0.000000 0.000000 0.000996
[4,] 0.593021 0.002494 0.000000 0.000000 0.000699
(以下省略)
> bpx <- barplot(dealib[,1],main="東京区立図書館の効率性")
> text(bpx,0.1,labels=libr[,1],srt=90,cex=0.8)
注
round(.., 6) は、小数点7桁以下を四捨五入する関数である。barplot() の戻り値は、各棒の左端の x 座標である。text(..., srt=90, ...) はテキストを左に90度回転して表示するオプション、cex=0.8 はフォントの大きさを8割に縮小表示するオプションである。