一、原理
1.定义
变异系数法(Coefficient of variation method)是直接利用各项指标所包含的信息,通过计算得到指标的权重。是一种客观赋权的方法。
此方法的基本做法是:在评价指标体系中,指标取值差异越大的指标,也就是越难以实现的指标,这样的指标更能反映被评价单位的差距。例如,在评价各个国家的经济发展状况时,选择人均国民生产总值(人均GNP)作为评价的标准指标之一,是因为人均GNP不仅能反映各个国家的经济发展水平,还能反映一个国家的现代化程度。如果各个国家的人均GNP没有多大的差别,则这个指标用来衡量现代化程度、经济发展水平就失去了意义。
2.作用
- 反映总体各单位标志值变动范围:全距。
- 反映总体各单位标志值对平均数离差程度:平均差、标准差及标准差系数。
- 是对事物发展均衡性的量度。
你可以用该方法比较差异,或者判断谁的推广价值更好等问题。
二、相关概念
1.平均差(Mean A bsolute Deviation)
(1)原理
通过各变量与均值之间的距离(全距)来判断变异的程度。
(2)评价
- 经济意义:A.D.越小,变量X越趋中,变异性越小,稳定性越好,或平均值的代表程度越高。
- 优点:计算简便,反映全部数据分布状况,具有充分的代表性。
- 局限性:A.D. 受极端值影响极大,易掩盖其真实水平,须用其他公式加以纠差。此外,以绝对值的方式消除离差的正负号,不合乎统计上的数字处理。
2.标准差(Standard Deviation)
(1)原理
标准差采用平方法来消除离差的正负号,并通过平方根予以还原,因而比平均差更符合数学处理的要求。
(2)评价
- 优点:适宜相同性质数据集的比较,是统计分析中最常用、最重要的变异指标。
- 缺点:受计量单位和平均水平的影响,不便于不同类数据集的比较。
3.变异系数(Cofficient of Variation)
为了对比分析不同平均水平或者不同计量单位的变量数列之间标志值的变异程度。
(1)平均差变异系数
(2)标准差变异系数
三、步骤
1.指标正向化
参考上节博客所讲,数据可以分为4个类型。
- 极大型指标(效益类指标):指标数值越大越好。
- 极小型指标(成本类指标):指标数值越小越好。
- 中间型指标:指标数值越接近某个值越好。
- 区间型指标:指标数值在某个区间范围内最好,区间中的数值大小无优劣之分。
(本篇博客代码仅仅采用了前两种数据类型,4种类型的数据处理代码参考TOPSIS法所讲。)
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]}")