サービスサイエンスのことはじめ　高木英明先生(AHP)

「サービスサイエンスのことはじめ　高木英明著　p.137~p.146」を読んでＡＨＰ(analytic hierarchy process)を実装してみました。juliaの上にＲを乗っけて使用しています。


#呼び込み
using RCall
using PyCall
using PyPlot
using Plots

#AHP(ANALYTIC HIERARCHY PROCESS)

R"data=data.frame(equal_importance=c(1,1),moderate_importance=c(3,1/3),strong_importance=c(5,1/5),very_strong_importance=c(7,1/7),extreme_importance=c(9,1/9))"

R"data"

#カリキュラムの整合性の観点での重みｗを計算。1:数理システム工学科、2：コンピュータ学科、3：動態システム学科について、どの程度望ましいと言えるか（比較）


R"dim=3"

R"D=t(matrix(c(1,9,3,1/9,1,1/5,1/3,5,1),ncol=dim,nrow=dim))"

#幾何平均を取ることにより、重みの計算を行う。

R"w=c()"

R"for(j in 1:nrow(D)){ w=c(w,prod(D[j,])^(1/dim))}"

R"w=w/sum(w)"

w=rcopy(R"w")

#結果

println("数理システム工学科のカリキュラムの整合性の採点は")
println(w[1])

println("コンピュータ学科のカリキュラムの整合性の採点は")
println(w[2])

println("動態システム工学のカリキュラムの整合性の採点は")
println(w[3])


#高校生22名に3つの学科名候補に対する行列データを作成し、受験生から見た魅力の観点の重みＷを計算。



R"num1=16;num2=6;"

R"dim=3"

R"D1=matrix(rep(1,dim^2),ncol=dim,nrow=dim)"

R"D2=t(matrix(c(1,1/3,1,3,1,3,1,1/3,1),ncol=dim,nrow=dim))"

R"D=array(0,dim=c(dim,dim))"

R"for(i in 1:dim){
for(j in 1:dim){

D[i,j]=(D1[i,j]^(num1/(num1+num2)))*(D2[i,j]^(num2/(num1+num2)))

}
}"

R"W=apply(D,1,prod)^(1/dim)"

R"W=W/sum(W)"



#総合評価に対する「カリキュラムの整合性の観点」と「受験生から見た魅力の観点」の重みｖを計算

R"val=5"

R"D=t(array(c(1,val,1/val,1),dim=c(2,2)));v=c()"

R"for(j in 1:nrow(D)){

v=c(v,prod(D[j,])^(1/ncol(D)))

}"

R"v=v/sum(v)"

v=rcopy(R"v")

println("カリキュラムの整合性の観点に対する総合評価の重要度は")
println(v[1])

println("受験生から見た魅力の観点に対する総合評価の重要度は")
println(v[2])

#総合評価

R"W=cbind(w,W)"

R"result=(W)%*%t(t(v))"

result=rcopy(R"result")

println("数理システム工学科の総合評価は")
println(result[1])

println("コンピュータ学科の総合評価は")
println(result[2])

println("動態システム学科の総合評価は")
println(result[3])

#カリキュラムの整合性と受験生から見た魅力を変化させた数表を出す

R"h=0.1;"

R"plot_data=data.frame(v1=seq(0,1,h),math_sys=0,compute=0,move_sys=0)"

R"for(j in 1:nrow(W)){

lin_reg=function(x){

value=W[j,2]+(W[j,1]-W[j,2])*x

return(value)

}

for(k in 1:nrow(plot_data)){

plot_data[k,(j+1)]=lin_reg(plot_data$v1[k])

}

}"

R"plot_data"

plot_data=rcopy(R"plot_data")



```{r}

#AHP(R code)

library(dplyr)

data=data.frame(重要度=c("同じくらい","やや重要","かなり重要","非常に重要","極度に重要"),dij=c(1,3,5,7,9)) %>% dplyr::mutate(dji=1/dij)


#数理システム工学科、コンピュータ学科、動態システム学科の3つの学科に対して、「カリキュラムの整合性」と「受験生からみた魅力」の2つの観点で採点を行う。この2つの観点に対して、重要度を決定し、各観点からの各学科の選好度と総合点での選好度を比較する。

#「カリキュラムの整合性」は「受験生から見た魅力」より「かなり重要」だと仮定する。

d=t(matrix(c(1,5,1/5,1),ncol=2,nrow=2))

vec=c()

for(j in 1:nrow(d)){
  
vec=c(vec,sqrt(prod(d[j,])))  
  
}

w=vec/sum(vec)

#「カリキュラムとの整合性」の観点から3つの学科名候補を採点した行列Dを指定；

D=t(matrix(c(1,9,3,1/9,1,1/5,1/3,5,1),ncol=3,nrow=3))

vec=c()

for(j in 1:nrow(D)){
  
vec=c(vec,(prod(D[j,]))^(1/nrow(D)))  
  
}

w1=vec/sum(vec)

#「受験生から見た魅力」を検査

n=16

matrix1=array(1,dim=c(3,3))

m=6

matrix2=t(matrix(c(1,1/3,1,3,1,3,1,1/3,1),ncol=3,nrow=3))

DD=array(0,dim=c(3,3))

for(j in 1:nrow(DD)){
for(i in 1:ncol(DD)){
  
DD[i,j]=(matrix1[i,j]^(n/(n+m)))*(matrix2[i,j]^(m/(n+m)))  
  
}  
}

w2=c()

for(j in 1:nrow(DD)){
  
w2=c(w2,prod(DD[j,])^(1/nrow(DD)))
  
}

w2=w2/sum(w2)

matrix_w=matrix(c(w1,w2),nrow=3,ncol=2)

result=data.frame(学科名=c("数理システム工学科","コンピュータ学科","動態システム学科"),カリキュラムの整合性=w1,受験生から見た魅力=w2,総合評価=matrix_w%*%w)

for(j in 1:nrow(matrix_w)){

Data=data.frame(v1=seq(0,1,0.01),value=0)

for(k in 1:nrow(Data)){

Data$value[k]=(matrix_w[j,1]-matrix_w[j,2])*Data$v1[k]+matrix_w[j,2]

}

plot(Data$v1,Data$value,xlab="v1",ylab="value",main="red:数理システム、blue:動態システム、green:コンピュータ学科",xlim=c(0,1),ylim=c(0,1),type="o",col=j+1)

par(new=T)

}
```