一、原理
1.定义 变异系数法(Coefficient of variation method)是直接利用各项指标所包含的信息,通过计算得到指标的权重。是一种客观赋权的方法。
此方法的基本做法是:在评价指标体系中,指标取值差异越大的指标,也就是越难以实现的指标,这样的指标更能反映被评价单位的差距。例如,在评价各个国家的经济发展状况时,选择人均国民生产总值(人均GNP)作为评价的标准指标之一,是因为人均GNP不仅能反映各个国家的经济发展水平,还能反映一个国家的现代化程度。如果各个国家的人均GNP没有多大的差别,则这个指标用来衡量现代化程度、经济发展水平就失去了意义。
2.作用
- 反映总体各单位标志值变动范围:全距。
- 反映总体各单位标志值对平均数离差程度:平均差、标准差及标准差系数。
- 是对事物发展均衡性的量度。
你可以用该方法比较差异,或者判断谁的推广价值更好等问题。
通过各变量与均值之间的距离(全距)来判断变异的程度。
文章图片
(2)评价
- 经济意义:A.D.越小,变量X越趋中,变异性越小,稳定性越好,或平均值的代表程度越高。
- 优点:计算简便,反映全部数据分布状况,具有充分的代表性。
- 局限性:A.D. 受极端值影响极大,易掩盖其真实水平,须用其他公式加以纠差。此外,以绝对值的方式消除离差的正负号,不合乎统计上的数字处理。
标准差采用平方法来消除离差的正负号,并通过平方根予以还原,因而比平均差更符合数学处理的要求。
文章图片
(2)评价
- 优点:适宜相同性质数据集的比较,是统计分析中最常用、最重要的变异指标。
- 缺点:受计量单位和平均水平的影响,不便于不同类数据集的比较。
(1)平均差变异系数
文章图片
(2)标准差变异系数
文章图片
三、步骤 1.指标正向化 参考上节博客所讲,数据可以分为4个类型。
- 极大型指标(效益类指标):指标数值越大越好。
- 极小型指标(成本类指标):指标数值越小越好。
- 中间型指标:指标数值越接近某个值越好。
- 区间型指标:指标数值在某个区间范围内最好,区间中的数值大小无优劣之分。
2.数据标准化 每个指标的数量级不一样,需要把它们化到同一个范围内比较。
文章图片
3.计算变异系数 计算编译系数的方法又分为以下3步,具体公式如上文所讲。
(1)计算指标的均值
(2)计算指标的标准差
(3)计算变异系数
4.计算权重 这里将计算的变异系数 V 进行归一化,即为所计算的权重 W。
文章图片
5.计算得分 将权重 W 与处理后的矩阵 r 相乘,获得测评对象的分数(该公式中,分数未转为百分比形式)。
文章图片
四、代码
import numpy as np'''
1 1 2 1 2 2
0.743 0.8267 0.8324 12 0.8637 0.0743 0.0409
0.7567 0.8033 0.8736 10 0.8538 0.0665 0.0716
0.8104 0.7667 0.8539 16 0.9038 0.0881 0.0657
''''''1.输入数据'''
print("请输入参评对象数目:")
n = eval(input())
print("请输入评价指标数目:")
m = eval(input())
print("请输入指标类型:1:极大型,2:极小型")
kind = input().split(" ")
print("请输入矩阵:")
X = np.zeros(shape=(n, m))
for i in range(n):
X[i] = input().split(" ")
X[i] = list(map(float, X[i]))
print("输入的矩阵为:\n{}".format(X))'''2.正向化处理'''
def minTomax(maxx, x):
x = list(x)
ans = [[(maxx-e)] for e in x]
# ans = [list(1/e) for e in x]
return np.array(ans)A = np.zeros(shape=(n, 1))
for i in range(m):
if kind[i] == "1":
v = np.array(X[:, i])
elif kind[i] == "2":
maxA = max(X[:, i])
v = minTomax(maxA, X[:, i])
if i == 0:
A = v.reshape(-1, 1)
else:
A = np.hstack([A, v.reshape(-1, 1)])
print("正向化矩阵为:\n{}".format(A))'''3.标准化处理'''
A = A.astype('float')
for j in range(m):
A[:, j] = A[:, j]/np.sqrt(sum(A[:, j]**2))
print("归一化矩阵为:\n{}".format(A))'''4.计算变异系数'''
Avg = np.average(A, axis=0)# 计算均值
Stad = np.std(A, axis=0)# 计算标准差
V = Stad/Avg# 计算变异系数
print("变异系数为:\n{}".format(V))'''5.计算权重'''
w = V/sum(V)
print('权重为:\n{}'.format(w))'''6.得分'''
s = np.dot(A, w)
Score = 100*s/max(s)
for i in range(len(Score)):
print(f"第{i+1}个测评对象的百分制得分为:{Score[i]}")
文章图片
文章图片
五、参考链接 【算法设计与分析|4 评价类算法(变异系数法笔记(附Python代码))】1.百度百科
2.视频来源B站
3.数据参考CSDN博客
推荐阅读
- Django|Django 编写第一个Django应用,第2部分
- flask|(零八)Flask有手就行——数据库迁移Flask-Migrate
- vuejs|基于Flask + Vue前后端分离的资产管理系统实现
- python|Python序列以及切片操作
- flask框架快速入门|【flask高级】从源码深入理解flask的应用上下文和请求上下文
- FDTD学习笔记|Lumerical官方案例、FDTD时域有限差分法仿真学习(十五)——y分支的逆向设计(Inverse design of y-branch)
- python|LeetCode 括号生成
- 笔记|解决ModularNotFoundError: No module named “cv2.aruco“
- 笔记|解决pip3 install numpy时ReadTimeoutError