模糊综合评价法的R语言实现

1背景:

1,本文数据来源于一门课程的调研作业,当时以广外运动小程序为例,研究学生用户对这个小程序的满意度,采用层次分析法和模糊综合评价对学生问卷评价结果进行分析,实现则用了R语言。

2,代码和数据源只需搜索“ 4.5数据源和代码下载”即可找到,如果要在线查看,搜索4.5.1判断矩阵下载,“4.5.2隶属度矩阵”“4.5.3代码下载”
3,作者姓万,参加这个课堂项目时负责理论框架,指导代码设计,当初参加的人应该知道我是谁,但不必说出来。

2本文要研究什么

本文想知道学生对本校的运动监督小程序的满意度有多高或多低?是很不满意、不满意、满意、很满意中的哪一个?
以及更重要的是:到底哪些地方满意,哪些地方不满意,因此就需要知道满意度受哪些因素影响。

3层次分析法和模糊综合评价能干嘛?

3.1层次分析法能评估最优方案

层次分析法是由Saaty(1980)提出的一种多准则决策模型,它将决策问题按目标、评价准则及各备选方案的顺序分解为不同的层次结构,然后用求解判断矩阵特征向量,求得每一层次的各元素对上一层次某元素的优先权重,
最后再加权和的方法逐层合并各备择方案对总目目标最终权重,最终权重最大者即为最优方案。
如下图,有3个饭堂,要知道哪个饭堂最令人满意,就可以通过饭菜、服务、就餐环境等准则分别打分,如第一饭堂在饭菜品质得33分,服务得56分,环境45分,形象26分,但还要确定哪些准则权重更大,如专家认为,饭菜权重是44%、服务权重19%、环境31%、形象6%。
这样一加总下来,
第一饭堂得分=33X44%+56X19%+45x31%+26X6%=约41分
同理其它饭堂得分,最终看得分排名,排名第一就是最令人满意的。

食堂满意度层次架构

其基本原理是将待评价或识别的复杂问题分解成若干层次,由专家或决策者对所列指标通过重要程度的两两比较逐层进行判断评分,利用计算判断矩阵的特征向量确定下层指针对上层指标的贡献程度或权重,从而得到最基层指针对于总体目标的重要性权重排序。
它具有方便灵活且实用的特点,广泛应用于人力资源管理、城市规划、决策管理、绩效评价等各领域。

3.2模糊综合评价法能评估等级

模糊综合评价法和层次分析法类似,但它要评估的不是具体的哪个方案或哪个食堂更好,而是在很坏、坏、好、很好这几个评级中,哪一个更符合我们食堂的整体情况。同理,这次项目中,我们想知道这个运动小程序的满意度到底是很不满意、不满意、满意、很满意中的哪个等级。

4怎么实现模糊综合评价法

4.1第一步,构筑层次模型

模糊综合评价的第一步是利用层次分析法,来构筑层次模型,(为了设计问卷),如下图所示,针对本文研究内容,我们设目标C为小程序满意度,分别设准则层C12,C13,C14,C15为质量感知,对价值的感知,实际期望差距及客户抱怨这4个要素,一般只需要参考相关论文或教科书的要素体系,本文参考的教科书是汤兵勇的客户关系管理(第3版),高等教育出版社;

C12等指标也同理设立即可
在这里插入图片描述

4.2第二步,数据源1判断矩阵

模糊综合评价的第二步,是利用层次分析法,来构筑判断矩阵(一张表),会邀请一位专家用两两比较方式打分来填写表格。

比如:
1对于小程序满意度来说,以下哪种情况最符合:
A,C12质量感知的重要性远小于C13价值感知(C12极端重要)
B,C12质量感知的重要性小于C13价值感知(C12稍微重要)
C,C12质量感知的重要性大于C13价值感知(C12稍微不重要)
D,C12质量感知的重要性远大于C13价值感知(C12极端不重要)
E都一样重要

如果选A,如下图,则要给C12和C13相比的那个空格打1/9分,因为它属于评分标准表的最后一种情况,而给C13和C12相比的空格打9分,属于评分表的“极端重要情况”(是的,相比顺序不一样就会有两个空格)
在这里插入图片描述
而如果选B,则要给C12和C13相比的那个空格打1/3分,而给C13和C12相比的空格打3分(是的,相比顺序不一样就会有两个空格),因为这里大于则给C13比C12那格打3分,对应的另一格则打3分的倒数(1/3分)

如果选C,则和B相反,给C12和C13相比的那个空格打3分,C13和C12相比的空格打1/3分。
选D,则和选A相反,则要给C12和C13相比的那个空格打9分,而给C13和C12相比的空格打1/9分。
如果选E,则两个格均为1分。
当然,实际上的评分标准如图,除了明显重要、强烈重要外,还有个取中值表示介于强烈重要与极端重要(8分)、明显与强烈(6分)等情况。

在这里插入图片描述
但是打完了C12和C13指标的得分,还有C12和C14、C12和C15、C13和C14等还需要打分,只要是满意度直接下属的C12-C15指标,就要进行两两比较,才能完成下图这第一个判断矩阵。
在这里插入图片描述
C12直接下属的指标也有矩阵,C13到C15也都各有矩阵。
在这里插入图片描述

4.3数据源2 隶属度矩阵

4.3.1问卷设计

在这里插入图片描述

1首先要根据上图的二级指标设计问卷,让用户给这些指标打分,
如果你很熟悉的话就跳过这部分的说明,去看“4.4.2问卷统计为评级”

比如:以C126可靠性为例,可以出2个量表题(只出一道则风险较高,若检验信效度时发现这个题目应当放弃,则这个C126二级指标也得被放弃)。
比如:
6.小程序大部分时候是稳定的,不会卡顿,对于这句话,你的态度是以下哪种?
A非常反对 B反对(代表不满意) C认同(代表满意) D非常认同

7.小程序的操作很简单,不担心操作失误,对于这句话,你的态度是以下哪种?
A非常反对 B反对 (代表不满意)C认同(代表满意) D非常认同

以上题目,采用的是4分制,(A则1分,B则2分,C则3分,D则4分)不过你也可以选择5分制,多一个选项而已。

4.3.2问卷统计为评级

2之后,对于每道题,统计选非常反对,反对,认同,非常认同选项的用户百分比分别是多少,再用如下公式计算出C126评为这4个评级的百分比(也许你能找到更好的公式)

C126被评为“非常不满意”的百分比=average(C126旗下第一题选择非常反对的用户占比+旗下第二题选择非常反对的用户占比+…+旗下第N题选择非常反对的用户占比)

同理,评为“不满意”的百分比
C126被评为不满意的百分比=average(C126旗下第一题选择反对的用户占比+旗下第二题选择反对的用户占比+…+旗下第N题选择反对的用户占比)
其它评为满意、非常满意的百分比也同理。
最终得到如下结果:(C126那一行)
在这里插入图片描述
这里统计发现,C126被评为很不满意的比例0.1471,不满意的为0.3382…
其它指标也同理,最终评完所有二级指标,得到下图的所有数值。

在这里插入图片描述

4.3.3整理成隶属度矩阵

但为了读取方便,一般会按照C12,C13,C14,C15这种高级指标来分别存放这些表格,这就是隶属度矩阵,如下图:
在这里插入图片描述
C12质量隶属度矩阵内部如下:

在这里插入图片描述
注意,要有V1-V4这些列名,否则R语言读取出错,其它隶属度矩阵同理。

4.4 第三步:代码处理判断矩阵

1此处的处理分为 一致性检验、计算权重,代码如下

#L1准则层判断矩阵读取、一致性检验、权重w1
setwd("C:/data")#设定数据源路径,将从该路径读取CSV表格
a=read.csv("准则层对目标层判断矩阵.csv")#该CSV里面是专家判断矩阵
a#显示该CSV的数据,
ev=eigen(a)
lamda=ev$values[1]
#此处lamda用round()保留有效小数2位,防止浮点数运算精度问题
lamda=round(lamda,2)
#判断矩阵行数n=4,查表得随机一致性指标RI=0.90,即crl公式的分母
cil=(lamda-4)/3
crl=cil/0.90
crl
#crl是随机一致性比例,小于0.10则说明该判断矩阵有一致性
w1=ev$vectors[,1]/sum(ev$vectors[,1])#取出第一列特征向量值作为判断矩阵权重值

4.4.1一致性检验

1为何进行一致性检验,
层次分析法(AHP)虽然能将专家的定性思维定量化,但人在认知上有不可避免的片面性,不一定每个判断矩阵都有完全一致性,因此需要一致性检验。此处用矩阵基础理论的一致性检验来检查指标之间权重是否有矛盾点。

2如何进行一致性检验
基于矩阵理论的一致性检验步骤如下:
(1)计算判断矩阵的最大特征值(或称最大特征根)λmax;
对应代码块如下

#L1准则层判断矩阵读取、一致性检验、权重w1
setwd("C:/data")#设定数据源路径,将从该路径读取CSV表格
a=read.csv("准则层对目标层判断矩阵.csv")#该CSV里面是专家判断矩阵
a#显示该CSV的数据,
ev=eigen(a)
lamda=ev$values[1]
#此处lamda用round()保留有效小数2位,防止浮点数运算精度问题
lamda=round(lamda,2)

(2)计算一致性指标 CI: CI=(λmax-n)/(n-1) ,
n 为判断矩阵的行数,也即层次子系统中的指标个数。
对应代码块的cil这行

#判断矩阵行数n=4,查表得随机一致性指标RI=0.90,即crl公式的分母
cil=(lamda-4)/3

(3)计算随机一致性比率 CR:CR=CI/RI
RI 为随机一致性指标,需要查下方的表格:
在这里插入图片描述

此处发现判断矩阵有4行,查表得RI=0.90
在这里插入图片描述
对应代码块是crl所在的2行

crl=cil/0.90
crl#显示crl

这时需要根据CR结果(代码中的crl)进行判断,当 CR≤0.10 时,判断矩阵具有一致性,CR<1 时被认为一致性可以接受。否则,应对判断矩阵重新调整,比如:让专家修改判断矩阵的评分。

4.4.2计算权重

在R语言中,取出第一列特征向量值作为判断矩阵权重值
第一个判断矩阵的权重w1,就在w1这一行计算

w1=ev$vectors[,1]/sum(ev$vectors[,1])#取出第一列特征向量值作为判断矩阵权重值

权重含义
w1是准则层权重,即准则层指标C12到C15的权重。
其余要素层指标权重也同理可得。

判断矩阵都在下方4.5.1标题内,只要搜索“ 4.5.1”即可看见它们。

我设定w22要从第二块判断矩阵那里计算,它是从属于C12客户期望的要素层指标权重,包含了C124总体质量评价,C125满足特定需求评价,C126可靠性评价三者的权重。
其余w23到w25的含义同理,得到如下结果:
w1=0.3158 0.3158 0.3158 0.0526
w22=0.2 0.6 0.2
w23=0.0997 0.3701 0.3452 0.1850
w24=0.3874 0.4434 0.1692
w25=0.25 0.75

4.6处理隶属度矩阵,得到2个模糊评价

4.6.1一级模糊评价矩阵K

计算隶属度矩阵R求出一级模糊评价,公式为:
Ki=Wi*Ri=(wi1,wi2,…,win)(ri1,ri2,…,rim)T
得到的一级模糊评价矩阵K如下:
在这里插入图片描述
它的含义是什么?它只是个中间产品,求到二级模糊评价p后才有意义(搜索4.6.2二级模糊评价p)
代码先读取隶属度矩阵

#底下 r2-r5为隶属度矩阵

r2=read.csv("C12质量隶属度R2.csv")
r2=as.matrix(r2)
class(r2)

r3=read.csv("C13价值隶属度R3.csv")
r3=as.matrix(r3)
class(r3)

r4=read.csv("C14实际期望R4.csv")
r4=as.matrix(r4)
class(r4)

r5=read.csv("C15客户抱怨R5.csv")
#发现读入的数据不是matrix类型,先转换为matrix类型
r5=as.matrix(r5)
class(r5)

再计算出一级模糊评价

#以下为单因素一级模糊评价k2-k5
#k1=w21%*%r1
k2=w22%*%r2
k3=w23%*%r3
k4=w24%*%r4
k5=w25%*%r5
#%*%结果整合成向量,后矩阵
#k=c(k1,k2,k3,k4,k5)
k=c(k2,k3,k4,k5)
k=matrix(k, ncol=4, byrow=TRUE)
round(k,4)#用于填入论文,填入时保留4位小数

4.6.2二级模糊评价P

最后,将上一步得到的矩阵K与前面求得的准则层权重w1,作矩阵相乘运算,得到二级模糊评价P。公式为:
P=WK
将w1和矩阵K代入,得
P=W
K=w1*K=(0.1801 0.2965 0.4474 0.076)
这四个数值分别代表模糊评价的“很不满意”、“不满意”、“满意”、“很满意”这4个等级的隶属度,隶属度越高,则越符合这个评级,发现满意对应的隶属度是0.4474,是最高,说明总体而言,小程序的满意度是 “满意”这个评级。

代码实现:

#8二级模糊评价P
p=w1%*%k
p
round(p,4)#用于填入论文,因为填入要保留4位小数

本部分完整代码

#底下 r2-r5为隶属度矩阵

r2=read.csv("C12质量隶属度R2.csv")
r2=as.matrix(r2)
class(r2)

r3=read.csv("C13价值隶属度R3.csv")
r3=as.matrix(r3)
class(r3)

r4=read.csv("C14实际期望R4.csv")
r4=as.matrix(r4)
class(r4)

r5=read.csv("C15客户抱怨R5.csv")
#发现读入的数据不是matrix类型,先转换为matrix类型
r5=as.matrix(r5)
class(r5)
#以下为单因素一级模糊评价k2-k5
#k1=w21%*%r1
k2=w22%*%r2
k3=w23%*%r3
k4=w24%*%r4
k5=w25%*%r5
#%*%结果整合成向量,后矩阵
#k=c(k1,k2,k3,k4,k5)
k=c(k2,k3,k4,k5)
k=matrix(k, ncol=4, byrow=TRUE)
round(k,4)#用于填入论文,填入时保留4位小数

#8二级模糊评价P
p=w1%*%k
p
round(p,4)#用于填入论文,因为填入要保留4位小数

5两个结论

5.1满意度为满意这个评级

由二级模糊评价P得到总体评级:

P=WK=w1K=(0.1801 0.2965 0.4474 0.076)
这四个数值分别代表模糊评价的“很不满意”、“不满意”、“满意”、“很满意”这4个等级的隶属度,隶属度越高,则越符合这个评级,发现满意对应的隶属度是0.4474,是最高,说明总体而言,小程序的满意度是 “满意”这个评级。

5.2不满意的是

从下图,学生评价比例那张表看:
在这里插入图片描述

C138同等成本下对质量感知,即和同类免费运动APP(如咕咚)相比,觉得这个运动小程序不够好
以及C137总使用成本,“不满意”的隶属度偏高,说明该运动小程序总体使用不太方便,可能是因为学校的指定打卡地点的蓝牙信号不好,小程序很难识别到打卡地点。
因此,广外课外运动管理系统应该着重提升系统质量及体验,以提升学生整体满意程度。

4.5数据源和代码下载

链接:https://pan.baidu.com/s/1pNmkfZuZfbXrERSFKvImfQ
提取码:o5lj
度盘二维码也可下载:
在这里插入图片描述
在这里插入图片描述
使用方式,代码中数据源路径都是c:/data
创造一个data为名的文件夹,放到C盘根目录下,再把上图隶属度矩阵和判断矩阵的表格一股脑地丢进去就行。

4.5.1判断矩阵下载

判断矩阵有5个,如果链接失效就直接复制下方的数值到EXCEL,转为CSV格式即可.

1,文件名为 准则层对目标层判断矩阵.csv
C12 C13 C14 C15
1 1 1 6
1 1 1 6
1 1 1 6
0.166666667 0.166666667 0.166666667 1

2,文件名为准则层2质量感知.csv
C124 C125 C126
1 0.333333333 1
3 1 3
1 0.333333333 1

3,文件名为准则层3价值感知.csv

C137 C138 C139 C1310
1 0.25 0.333333333 0.5
4 1 1 2
3 1 1 2
2 0.5 0.5 1

4,文件名为准则层4期望-实际差距.csv
C1411 C1412 C1413
1 1 2
1 1 3
0.5 0.333333333 1

5文件名为:准则层5客户抱怨.csv
C1514 C1515
1 0.333333333
3 1

4.5.2隶属度矩阵下载

文件名为C12质量隶属度R2.csv
复制以下数据到EXCEL后,转为CSV格式即可:

V1 V2 V3 V4
0.1029 0.3088 0.4853 0.1029
0.1764 0.2941 0.4216 0.1078
0.1471 0.3382 0.4118 0.1029

文件名为C13价值隶属度R3.csv
V1 V2 V3 V4
0.0882 0.3529 0.4706 0.0882
0.2353 0.3824 0.2941 0.0882
0.2647 0.1765 0.4706 0.0882
0.2059 0.3235 0.4118 0.0588

C14实际期望R4.csv
V1 V2 V3 V4
0.1471 0.2059 0.5882 0.0588
0.1471 0.3235 0.5 0.0294
0.2353 0.3235 0.4118 0.0294

C15客户抱怨R5.csv
V1 V2 V3 V4
0.2206 0.3088 0.4118 0.0588
0.1429 0.3571 0.4286 0.0714

4.5.3代码下载


#L1准则层判断矩阵读取、一致性检验、权重w1
setwd("C:/data")#设定数据源路径,将从该路径读取CSV表格
a=read.csv("准则层对目标层判断矩阵.csv")#该CSV里面是专家判断矩阵
a#显示该CSV的数据,
ev=eigen(a)
lamda=ev$values[1]
#此处lamda用round()保留有效小数2位,防止浮点数运算精度问题
lamda=round(lamda,2)
#判断矩阵行数n=4,查表得随机一致性指标RI=0.90,即crl公式的分母
cil=(lamda-4)/3
crl=cil/0.90
crl
#crl是随机一致性比例,小于0.10则说明该判断矩阵有一致性
w1=ev$vectors[,1]/sum(ev$vectors[,1])#取出第一列特征向量值作为判断矩阵权重值





#以下是L2要素层判断矩阵读取、一致性检验、权重值,有c2-c5这4个判断矩阵

#质量感知下属有C124-C126指标,读取其所在的判断矩阵、一致性检验、权重值w22
c2=read.csv("准则层2质量感知.csv")
ev=eigen(c2)
lamda=ev$values[1]
#此处lamda用round()保留有效小数2位,防止浮点数运算精度问题
lamda=round(lamda,2)
#ci22=(lamda-7)/6

#判断矩阵行数n=3,查表得随机一致性指标RI=0.58,即crl公式的分母
ci22=(lamda-3)/2
cr22=ci22/0.58
cr22
#cr是随机一致性比例,小于0.10则说明判断矩阵有一致性
w22=ev$vectors[,1]/sum(ev$vectors[,1])
#质量感知

#价值感知下属有C137-C1310指标,读取其所在的判断矩阵和一致性检验、权重w23
c3=read.csv("准则层3价值感知.csv")
ev=eigen(c3)
lamda=ev$values[1]
#此处lamda用round()保留有效小数2位,防止浮点数运算精度问题
lamda=round(lamda,2)
#判断矩阵行数n=4,查表得随机一致性指标RI=0.90,即crl公式的分母
ci23=(lamda-4)/3
cr23=ci23/0.90
cr23
#cr是随机一致性比例,小于0.10则说明该判断矩阵有一致性
w23=ev$vectors[,1]/sum(ev$vectors[,1])
#价值感知

#期望与实际差距,下属有C1411-C1413指标,读取其所在的判断矩阵和一致性检验、权重w24
c4=read.csv("准则层4期望-实际差距.csv")
ev=eigen(c4)
lamda=ev$values[1]
#此处lamda用round()保留有效小数2位,防止浮点数运算精度问题
lamda=round(lamda,2)
#判断矩阵行数n=3,查表得随机一致性指标RI=0.58,即crl公式的分母
ci24=(lamda-3)/2
cr24=ci24/0.58
cr24
#cr是随机一致性比例,小于0.10则说明该判断矩阵有一致性
w24=ev$vectors[,1]/sum(ev$vectors[,1])
#期望与实际差距


#客户抱怨下属有C1514-C1515指标,读取其所在的判断矩阵和一致性检验、权重w25
c5=read.csv("准则层5客户抱怨.csv")
ev=eigen(c5)
lamda=ev$values[1]
#此处lamda用round()保留有效小数2位,防止浮点数运算精度问题
lamda=round(lamda,2)
#判断矩阵行数n=2,查表得随机一致性指标RI=0,即crl公式的分母,但计算上不可除以0,用0.0001代替
ci25=(lamda-2)/1
cr25=ci25/0.0001
cr25
#cr是随机一致性比例,小于0.10则说明该判断矩阵有一致性
w25=ev$vectors[,1]/sum(ev$vectors[,1])
#反馈情况-客户抱怨

#cr值结果汇总
crl

cr22
cr23
cr24
cr25

#以下为w1,w22-25结果
w1

w22
w23
w24
w25
#以下为取4位小数后w
round(w1,4)

round(w22,4)
round(w23,4)
round(w24,4)
round(w25,4)
#底下 r2-r5为隶属度矩阵

r2=read.csv("C12质量隶属度R2.csv")
r2=as.matrix(r2)
class(r2)

r3=read.csv("C13价值隶属度R3.csv")
r3=as.matrix(r3)
class(r3)

r4=read.csv("C14实际期望R4.csv")
r4=as.matrix(r4)
class(r4)

r5=read.csv("C15客户抱怨R5.csv")
#发现读入的数据不是matrix类型,先转换为matrix类型
r5=as.matrix(r5)
class(r5)
#以下为单因素一级模糊评价k2-k5
#k1=w21%*%r1
k2=w22%*%r2
k3=w23%*%r3
k4=w24%*%r4
k5=w25%*%r5
#%*%结果整合成向量,后矩阵
#k=c(k1,k2,k3,k4,k5)
k=c(k2,k3,k4,k5)
k=matrix(k, ncol=4, byrow=TRUE)
round(k,4)#用于填入论文,填入时保留4位小数

#8二级模糊评价P
p=w1%*%k
p
round(p,4)#用于填入论文,因为填入要保留4位小数

相关推荐
©️2020 CSDN 皮肤主题: 1024 设计师:白松林 返回首页