线性模型赋权算法
在统计理论和实践中,权重是表明各个评价指标(或者评价项目)重要性的权数,表示各个评价指标在总体中所起的不同作用。权重有不同的种类,各种类别的权重有着不同的数学特点和经济含义,一般有以下几种权重。
- 按照权重的表现形式的不同,可分为绝对数权重和相对数权重。相对数权重也称比重权数,能更加直观地反映权重在评价中的作用。
- 按照权重的形成方式划分,可分为人工权重和自然权重。自然权重是由于变换统计资料的表现形式和统计指标的合成方式而得到的权重,也称为客观权重。人工权重是根据研究目的和评价指标的内涵状况,主观地分析、判断来确定的反映各个指标重要程度的权数,也称为主观权重。
- 按照权重形成的数量特定的不同划分,可分为定性赋权和定量赋权。如果在统计综合评价时,采取定性赋权和定量赋权的方法相结合,获得的效果更好。
按照权重与待评价的各个指标之间相关程度划分,可分为独立权重和相关权重。
独立权重是指评价指标的权重与该指标数值的大小无关,在综合评价中较多地使用独立权重,以此权重建立的综合评价模型称为“定权综合”模型。
相关权重是指评价指标的权重与该指标的数值具有函数关系,例如,当某一评价的指标数值达到一定水平时,该指标的重要性相应的减弱;或者当某一评价指标的数值达到另一定水平时,该指标的重要性相应地增加。相关权重适用于评价指标的重要性随着指标取值的不同而发生变化的条件下,基于相关权重建立的综合评价模型被称为“变权模型”。比如评估环境质量多采用“变权综合”模型。
赋权算法的种类
主观赋权方法
- 德尔菲法(Delphi)
- AHP法
- 统计平均法(专家打分)
- 优序图法
- 客观赋权法
- 变异系数法
- 熵权法(熵值法)
- 主成分分析法
- 因子分析权数法
- 独立性权数法
- 标准离差法
- CRITIC法
- 组合赋权方法
客观赋权方法:变异系数法
变异系数法(Coefficient of variation method):是直接利用各项指标所包含的信息,通过计算得到指标的权重。此方法的基本做法是:在评价指标体系中,指标取值差异越大的指标,也就是越难以实现的指标,这样的指标更能反映被评价单位的差距,赋予的权重也越大。
例如,在评价各个国家的经济发展状况时,选择人均国民生产总值(人均GNP)作为评价的标准指标之一,是因为人均GNP不仅能反映各个国家的经济发展水平,还能反映一个国家的现代化程度。如果各个国家的人均GNP没有多大的差别,则这个指标用来衡量现代化程度、经济发展水平就失去了意义。
由于评价指标体系中的各项指标的量纲不同,不宜直接比较其差别程度。为了消除各项评价指标的量纲不同的影响,需要用各项指标的变异系数来衡量各项指标取值的差异程度。各项指标的变异系数公式如下:
式中:是第
项指标的变异系数、也称为标准差系数;
是第
项指标的标准差;
是第
项指标的平均数。
各项指标的权重为:
案例分析:中国现代化进程的统计考察
Ⅰ. 衡量现代化的评价标准
国际上比较通行的现代化具体评价标准是由美国社会学家英克尔斯提出的。英克尔斯在调查了各种不同类型的国家后,认为在社会现代化的过程中,尽管各国起点不同,社会制度不同,但都会经历同样的社会现代化过程,并提出了现代化的十项标准:
- 人均国民生产总值3000美元以上;
- 农业产值占国民生产总值的比重低于12%-15%;
- 服务业产值占国民生产总值的比重在45%以上;
- 非农业劳动力占总劳动力的比重在70%以上;
- 城市人口占总人口的比重在50%以上;
- 成人识字率80%以上;
- 适龄青年受高等教育的比率在10%-15%以上;
- 千人拥有医生数在1人以上;
- 平均预期寿命在70岁以上;
- 人口自然增长率在1%以下。
英克尔斯提出的评价标准涉及了经济发展、社会进步和人口素质等领域,对各国和各地区而言具有一定的代表性和共性,数据采集也比较方便,具有较强的可操作性。但该评价体系是在上世纪70年代末提出的,其包含的指标不够全面,其具体数量标准也是用来评价当时的现代化水平,作为21世纪现代化的评价标准明显偏低。针对这些问题,国内已有不少学者进行研究,提出了更完善的评价现代化的指标体系,但到目前为止在具体指标的选用等方面,还没有完全达成共识,在数据的采集上也存在一定困难。
本文的主要目的是要具体测算中国作为一个整体与现代化的差距,为了便于收集资料和进行国际对比,我们在实证分析时仍采用国际公认的英克尔斯的十项指标,作为衡量现代化进程的项目。但是应当指出,现代化是一个动态的、不断发展变化的概念。不同的时期,现代化的量化标准也应有所差别。在具体测算时,我们设定了3种具体的比较标准。
- 一是以上所述的英克尔斯给出的标准,这是一种低标准的现代化;
- 二是世界银行划分的全世界高收入国家英克尔斯十项指标1997年的平均水平,这是当代标准的现代化,如果达到这一平均水平则表明已经实现了20世纪末的现代化;
- 三是动态的现代化标准。随着时间的推移,高收入的国家不断发展,他们的现代化水平也会不断地提高,现代化的动态标准也将随之提高。动态标准的现代化是真正意义上的现代化,要实现这一现代化,我国的发展速度必须高于高收入国家的发展速度,同时需要花费更长的时间。
Ⅱ. 数据说明
由于英克尔斯提出的十项标准中有一些数据较难获取,需要进行必要的调整,以保证统计口径的一致性与可比性。这里需要说明的项目有以下几项:
- 人均GNP。该指标是国际对比中一个重要的项目。由于各国本币不同,所以不能对各国按本币计算的人均GNP直接进行比较,通常要按官方汇率(近三年移动平均值)换算成美元后再进行比较。但在现实经济生活中,由于种种原因,汇率并不能真实地反映各国国内市场的购买力,因此,用汇率法评价各国的人均GNP是不恰当的。为了弥补汇率法的缺陷,人们提出了购买力平价法。购买力平价是指购买相同数量的商品时所需不同国家货币额的比值。虽然购买力平价会受所选用代表商品和商品平均价格等因素的影响,但比起汇率法来说,更适于GNP的国际比较,所以本文进行人均GNP比较时采用的数据是世界银行在《1999年世界发展指标》中所列的按购买力平价法计算的人均GNP。目前,我国按购买力平价计算的人均GNP大约是按汇率计算的人均GNP的4倍左右。
- 农业占GNP的比重。英克尔斯所提出的指标是农业占GNP的比重,但当今各种统计资料给出的都是农业产值占GDP的比重,这两个指标差别不很大,而且各国口径统一,也便于比较。所以,本文用农业占GDP的比重代替农业占GNP的比重,相应地也采用第三产业占GDP的比重来代替第三产业占GNP的比重。
- 非农业劳动力占总劳动力的比重。总劳动力包括目前的就业者和失业但正在寻找工作的人。由于各国劳动力的定义、搜集的方法不同,劳动力数据不具有完全可比性,而且劳动力资料的搜集也较困难。因此本文以资料相对齐全而且可比性较强的非农业就业人口占总就业人口的比重来代替。
数据来源:
根据中国统计出版社《2000年国际统计年鉴》中所列的37个中等收入以上国家及地区1998年数据计算,分别是中国、中国香港、印度尼西亚、伊朗、以色列、日本、哈萨克斯坦、韩国、马来西亚、菲律宾、新加坡、斯里兰卡、泰国、土耳其、埃及、南非、加拿大、墨西哥、美国、阿根廷、巴西、委内瑞拉、保加利亚、白俄罗斯、捷克共和国、法国、德国、意大利、荷兰、波兰、罗马尼亚、俄罗斯、西班牙、英国、乌克兰、澳大利亚、新西兰。其中大学生占适龄人口比重的数据来源于世界银行《1999年世界发展指标》。
附表1 计算现代化评价指标权重的原始数据
国家 | 购买力平价法人均GNP | 农业占GDP比重(%) | 第三产业占GDP比重(%) | 非农业劳动力占总劳动力比重 | 城市人口占总人口比重(%) | 人口自然增长率(千分之一) | 平均预期寿命(岁) | 成人识字率(%) | 大学生入学率(%) | 千人拥有医生数(人) |
---|---|---|---|---|---|---|---|---|---|---|
中国 | 3051 | 20.4 | 30.1 | 0.5250 | 31.1 | 9.5 | 70.1 | 82.8 | 6 | 2 |
中国香港 | 20763 | 0.1 | 84.1 | 0.9969 | 100 | -1.7 | 78.6 | 92.9 | 28 | 1.3 |
印度尼西亚 | 2407 | 16.7 | 39.9 | 0.5504 | 38.8 | 15.6 | 65.6 | 85.7 | 7 | 0.2 |
伊朗 | 5121 | 24.9 | 38.4 | 60.6 | 16.5 | 69.5 | 74.6 | 18 | 0.9 | |
以色列 | 16861 | 0.9769 | 91 | 15.7 | 77.9 | 95.7 | 44 | 4.6 | ||
日本 | 23592 | 1.9 | 60.3 | 0.9473 | 78.5 | 2.1 | 80 | 99 | 43 | 1.8 |
哈萨克斯坦 | 4317 | 12.8 | 60.3 | 56.4 | 4.4 | 67.9 | 99 | 32 | 3.5 | |
韩国 | 13286 | 5.8 | 51.2 | 0.8824 | 80.4 | 8.7 | 72.6 | 97.5 | 60 | 1.1 |
马来西亚 | 7699 | 12.6 | 42 | 0.8120 | 55.9 | 20.5 | 72.2 | 86.4 | 11 | 0.5 |
菲律宾 | 3725 | 20.6 | 47.3 | 0.6012 | 56.8 | 22.3 | 68.6 | 94.8 | 35 | 0.6 |
新加坡 | 25295 | 0.2 | 65.2 | 0.9979 | 100 | 8.6 | 77.3 | 91.8 | 39 | 1.7 |
斯里兰卡 | 2945 | 22.4 | 51.1 | 0.5843 | 23 | 11.5 | 73.3 | 91.1 | 5 | 4.2 |
泰国 | 5524 | 9.6 | 49.5 | 0.4875 | 21 | 10.2 | 68.9 | 95 | 21 | 2.9 |
土耳其 | 6594 | 17.4 | 54.7 | 0.5658 | 72.9 | 14.8 | 69.3 | 84 | 18 | 1.5 |
埃及 | 3146 | 17.3 | 51.1 | 44.9 | 17.2 | 66.7 | 53.7 | 2.1 | ||
南非 | 8296 | 4.2 | 62.2 | 52.9 | 15.9 | 53.2 | 84.6 | 19 | 0.6 | |
加拿大 | 22814 | 0.9651 | 76.9 | 4.4 | 79.1 | 99 | 90 | 2.1 | ||
墨西哥 | 7450 | 5.5 | 68.6 | 0.8021 | 74 | 22.4 | 72.3 | 90.8 | 16 | 1.2 |
美国 | 29240 | 1.8 | 71.8 | 0.9733 | 76.8 | 5.8 | 76.8 | 99 | 81 | 2.6 |
阿根廷 | 11728 | 6 | 65.6 | 0.9849 | 89.3 | 11.7 | 73.1 | 96.7 | 42 | 2.7 |
巴西 | 6460 | 8.3 | 62.3 | 0.7581 | 80.1 | 13.0 | 67 | 84.5 | 12 | 1.3 |
委内瑞拉 | 5706 | 4.2 | 49.3 | 0.8921 | 86.3 | 20.5 | 72.6 | 92 | 25 | 2.4 |
白俄罗斯 | 6314 | 16 | 44 | 70.6 | -4.3 | 68.1 | 99.5 | 44 | 4.3 | |
保加利亚 | 4683 | 14.5 | 57 | 69 | -6.4 | 71.3 | 98.2 | 41 | 3.5 | |
捷克共和国 | 12197 | 4.3 | 58 | 0.9535 | 74.6 | -1.8 | 74.1 | 99 | 23 | 2.9 |
法国 | 21214 | 2.3 | 71.5 | 75.2 | 3.4 | 78.2 | 99 | 52 | 2.9 | |
德国 | 22026 | 1.1 | 44.2 | 0.9717 | 87.1 | -0.7 | 77.3 | 99 | 45 | 3.4 |
意大利 | 20365 | 2.8 | 66.4 | 66.8 | -0.1 | 78.3 | 98.3 | 43 | 5.5 | |
荷兰 | 22325 | 0.9681 | 89.2 | 3.1 | 78 | 99 | 50 | 2.6 | ||
波兰 | 7543 | 5.6 | 61.6 | 0.8089 | 64.8 | 0.6 | 72.7 | 99.7 | 24 | 2.3 |
罗马尼亚 | 5572 | 19.5 | 36.1 | 0.6003 | 55.7 | -1.3 | 70.2 | 97.9 | 23 | 1.8 |
俄罗斯 | 6180 | 7.5 | 55.7 | 77 | -4.7 | 66.7 | 99.5 | 41 | 4.6 | |
西班牙 | 15960 | 3.5 | 25.1 | 0.9239 | 77.2 | 0.1 | 78.1 | 97.4 | 51 | 4.2 |
英国 | 20314 | 1.8 | 66.7 | 0.9835 | 89.4 | 1.3 | 77.3 | 99 | 50 | 1.6 |
乌克兰 | 3130 | 13.8 | 48.4 | 0.7388 | 67.8 | -6.3 | 69.1 | 99.6 | 42 | 4.5 |
澳大利亚 | 21795 | 3.2 | 70.6 | 0.9524 | 84.7 | 6.5 | 78.3 | 99 | 76 | 2.5 |
新西兰 | 16084 | 0.9148 | 85.6 | 7.9 | 77.1 | 99 | 59 | 2.1 | ||
高收入国家97年平均值 | 22930 | 2 | 63 | 0.9580 | 76 | 4 | 77 |
97.5 | 58 | 2.5 |
Ⅲ. Python实现
从数据表格来看,十项指标和各个国家构成了一个矩阵,且涉及到批量计算,因此使用具有 Element-wise matrix multiplication 功能的 Numpy 进行具体实现。
数据格式转换
我们可以将以上数据存储在 .csv
类型的文件里再导入,这里我直接在jupyter lab中打开,并且转换为numpy的ndarray多维向量结构:
import numpy as np
a = [[3051,20.4,30.1,0.5250,31.1,9.5,70.1,82.8,6,2],
[20763,0.1,84.1,0.9969,100,-1.7,78.6,92.9,28,1.3],
[2407,16.7,39.9,0.5504,38.8,15.6,65.6,85.7,7,0.2],
[5121,24.9,38.4,np.nan,60.6,16.5,69.5,74.6,18,0.9],
[16861,np.nan,np.nan,0.9769,91,15.7,77.9,95.7,44,4.6],
[23592,1.9,60.3,0.9473,78.5,2.1,80,99,43,1.8],
[4317,12.8,60.3,np.nan,56.4,4.4,67.9,99,32,3.5],
[13286,5.8,51.2,0.8824,80.4,8.7,72.6,97.5,60,1.1],
[7699,12.6,42,0.8120,55.9,20.5,72.2,86.4,11,0.5],
[3725,20.6,47.3,0.6012,56.8,22.3,68.6,94.8,35,0.6],
[25295,0.2,65.2,0.9979,100,8.6,77.3,91.8,39,1.7],
[2945,22.4,51.1,0.5843,23,11.5,73.3,91.1,5,4.2],
[5524,9.6,49.5,0.4875,21,10.2,68.9,95,21,2.9],
[6594,17.4,54.7,0.5658,72.9,14.8,69.3,84,18,1.5],
[3146,17.3,51.1,np.nan,44.9,17.2,66.7,53.7,np.nan,2.1],
[8296,4.2,62.2,np.nan,52.9,15.9,53.2,84.6,19,0.6],
[22814,np.nan,np.nan,0.9651,76.9,4.4,79.1,99,90,2.1],
[7450,5.5,68.6,0.8021,74,22.4,72.3,90.8,16,1.2],
[29240,1.8,71.8,0.9733,76.8,5.8,76.8,99,81,2.6],
[11728,6,65.6,0.9849,89.3,11.7,73.1,96.7,42,2.7],
[6460,8.3,62.3,0.7581,80.1,13.0,67,84.5,12,1.3],
[5706,4.2,49.3,0.8921,86.3,20.5,72.6,92,25,2.4],
[6314,16,44,np.nan,70.6,-4.3,68.1,99.5,44,4.3],
[4683,14.5,57,np.nan,69,-6.4,71.3,98.2,41,3.5],
[12197,4.3,58,0.9535,74.6,-1.8,74.1,99,23,2.9],
[21214,2.3,71.5,np.nan,75.2,3.4,78.2,99,52,2.9],
[22026,1.1,44.2,0.9717,87.1,-0.7,77.3,99,45,3.4],
[20365,2.8,66.4,np.nan,66.8,-0.1,78.3,98.3,43,5.5],
[22325,np.nan,np.nan,0.9681,89.2,3.1,78,99,50,2.6],
[7543,5.6,61.6,0.8089,64.8,0.6,72.7,99.7,24,2.3],
[5572,19.5,36.1,0.6003,55.7,-1.3,70.2,97.9,23,1.8],
[6180,7.5,55.7,np.nan,77,-4.7,66.7,99.5,41,4.6],
[15960,3.5,25.1,0.9239,77.2,0.1,78.1,97.4,51,4.2],
[20314,1.8,66.7,0.9835,89.4,1.3,77.3,99,50,1.6],
[3130,13.8,48.4,0.7388,67.8,-6.3,69.1,99.6,42,4.5],
[21795,3.2,70.6,0.9524,84.7,6.5,78.3,99,76,2.5],
[16084,np.nan,np.nan,0.9148,85.6,7.9,77.1,99,59,2.1]]
a = np.array(a)
注意:数据中的缺失值要用np.nan来代替,这样计算时才能显示正确的维度,如果用0替代缺失值会导致结果计算错误。
然后按列计算矩阵中的统计值:每项指标的平均值和标准差。
np.nanmean(a, axis=0)
# 结果为:
array([1.19384324e+04, 9.35151515e+00, 5.48575758e+01, 8.25682143e-01,
6.97918919e+01, 7.21351351e+00, 7.26324324e+01, 9.33432432e+01,
3.65555556e+01, 2.44594595e+00])
注意此时不能使用 np.mean()
方法,因为其中包含 NaN
,所以需要使用 np.nanmean()
方法,同理,求标准差需要使用 np.nanstd()
方法。同时参数 axis=0
表示按列计算,如果想要按行计算只需要将其改为 axis=1
。
np.nanstd(a, axis=0)
# 结果为:
array([7.96627018e+03, 7.31578291e+00, 1.29363718e+01, 1.69876501e-01,
1.93387774e+01, 8.31856154e+00, 5.37522113e+00, 9.04972870e+00,
2.04768764e+01, 1.31408062e+00])
这样就可以通过公式求出每项指标的变异系数:
v = np.nanstd(a, axis=0) / np.nanmean(a, axis=0)
# 结果为:
array([0.66727941, 0.7823099 , 0.23581742, 0.2057408 , 0.27709204,
1.15319137, 0.0740058 , 0.09695108, 0.56015771, 0.53724843])
再由变异系数求得各项指标的权重:
w = v / v.sum()
# 结果为:
array([0.1453833 , 0.17044554, 0.05137865, 0.04482572, 0.06037135,
0.25125123, 0.01612399, 0.02112319, 0.1220442 , 0.11705284])
将结果汇总如下表:**
统计值 | 人均GNP(国际 美元) |
农业占GDP比重(%) | 第三产业占GDP比重(%) | 非农业劳动力比重(%) | 城市人口比重(%) | 人口自然增长率(千分) | 平均预 期寿命(岁) |
成人 识字率(%) |
大学生占适龄人口比重(%) | 千人拥有医生数(人) | 总和 |
---|---|---|---|---|---|---|---|---|---|---|---|
有值数 | 37 | 33 | 33 | 28 | 37 | 37 | 37 | 37 | 36 | 37 | |
标准差 | 7966.270 | 7.316 | 12.936 | 0.170 | 19.339 | 0.8319 | 5.375 | 9.050 | 20.477 | 1.314 | |
平均数 | 11938.43 | 9.352 | 54.858 | 0.826 | 69.792 | 0.7214 | 72.632 | 93.343 | 36.556 | 2.446 | |
变异系数 | 0.667 | 0.782 | 0.236 | 0.206 | 0.277 | 1.153 | 0.074 | 0.097 | 0.560 | 0.537 | 4.590 |
权数 | 0.145 | 0.170 | 0.051 | 0.045 | 0.060 | 0.251 | 0.016 | 0.021 | 0.122 | 0.117 | 1.000 |
确定了现代化的指标体系、评价标准以及各项指标的权重后,我们采用综合指数法对我国当前的现代化程度进行综合分析。
首先,分别计算我国各项现代化指标达标程度。对于正指标,用我国的各项指标的实际值
除以目标值
,即:
对于逆指标,则取其倒数,为:
各个指标的目标值可以选择正指标的最大值和负指标的最小值,这里目标值直接选取高收入国家97年平均值。
target = np.array([22930, 2, 63, 0.9580, 76, 4, 77, 97.5, 58, 2.5], dtype='float')
根据各项指标与目标值的关系,可以判断正指标为:
| 正指标 | 负指标 |
| :—-: | :—-: |
| 人均GNP(国际美元) | 农业占GDP比重 |
| 第三产业占GDP比重 | 人口自然增长率 |
| 非农业劳动力比重 | |
| 城市人口比重 | |
| 平均预期寿命 | |
| 成人识字率 | |
| 大学生占适龄人口比重 | |
| 千人拥有医生数 | |
构建一个指标向量,然后使用这个指标向量对正负指标的达标程度进行过滤求解::
pos_neg = np.array([1, -1, 1, 1, 1, -1, 1, 1, 1, 1], dtype='float')
# 构建过滤向量
pos = (pos_neg + 1) / 2
neg = (1 - pos_neg) / 2
# 求解正指标的达标程度并过滤
g_pos = np.divide(a, target)
g_pos = g_pos * pos
# 求解负指标的达标程度并过滤
g_neg = np.divide(target, a)
g_neg = g_neg * neg
# 将过滤后的正负达标矩阵相加得到最终的达标矩阵
g = g_pos + g_neg
然后,以各指标实现目标的程度分别乘以各自的权数
后加总求出目标的综合实现程度
,即:
# 将矩阵中的 NaN 转化为数值0,避免计算报错
g = np.nan_to_num(g)
rlt = (w * g).sum(axis = 1)
# 最终结果为:
array([ 0.35454714, 3.30041455, 0.2456091 , 0.29725346, 0.63392198,
1.17638917, 0.64326734, 0.61952136, 0.32193904, 0.33370165,
2.35873127, 0.45082198, 0.46390344, 0.39911556, 0.2993479 ,
0.38726078, 0.80501745, 0.43100524, 1.04286136, 0.63864304,
0.42770062, 0.51697849, 0.24931458, 0.2838175 , -0.02940791,
0.97937674, -0.54395026, -9.30627719, 0.84662477, 2.11828019,
-0.4499109 , 0.31456886, 10.71508191, 1.48045177, 0.34804123,
0.88357152, 0.60006079])
Ⅳ. 结果分析
将以上计算结果汇总到表格中:
国家 | 中国 | 中国香港 | 印度尼西亚 | 伊朗 | 以色列 | 日本 | 哈萨克斯坦 | 韩国 | 马来西亚 | 菲律宾 | 新加坡 | 斯里兰卡 | 泰国 | 土耳其 | 埃及 | 南非 | 加拿大 | 墨西哥 | 美国 | 阿根廷 | 巴西 | 委内瑞拉 | 白俄罗斯 | 保加利亚 | 捷克共和国 | 法国 | 德国 | 意大利 | 荷兰 | 波兰 | 罗马尼亚 | 俄罗斯 | 西班牙 | 英国 | 乌克兰 | 澳大利亚 | 新西兰 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
综合指数 | 0.35 | 3.3 | 0.25 | 0.3 | 0.63 | 1.18 | 0.64 | 0.62 | 0.32 | 0.33 | 2.36 | 0.45 | 0.46 | 0.4 | 0.3 | 0.39 | 0.81 | 0.43 | 1.04 | 0.64 | 0.43 | 0.52 | 0.25 | 0.28 | -0.03 | 0.98 | -0.54 | -9.31 | 0.85 | 2.12 | -0.45 | 0.31 | 10.72 | 1.48 | 0.35 | 0.88 | 0.6 |
从表中可以看出,采用英克尔斯的十项指标得到结果大部分还是比较合理的,但是有些有些国家如德国、意大利出现了负值。分析数据可知这是由于“人口自然增长率”这项指标为负指标,且存在负值,而且该指标的权重为所有指标中最高的0.251。这样就很容易产生错误的结果,因此可以将这项指标剔除后重新使用上述流程进行计算。
而有些指标如“农业增加值占GNP比重”“与非农业劳动力占总劳动力比重”之间相互之间相关性太高,没有必要都列入。
也可以增加一些指标,如反映推动现代化进程的信息化综合指数、反映现代化公平程度的基尼系数、以及反映可持续发展的环境质量综合指数等等。
在权重的确定方面,也可以考虑采用主观赋权与客观赋权相结合的方式,使权重的确定更加合理。
代码模块化
将以上Python代码整理后,变为以下可以复用的版本:
import numpy as np
def coefficient_of_variation(data, target, pos_neg):
v = np.nanstd(data, axis=0) / np.nanmean(data, axis=0)
w = v / v.sum()
pos = (pos_neg + 1) / 2
neg = (1 - pos_neg) / 2
g_pos = np.divide(data, target)
g_pos = g_pos * pos
g_neg = np.divide(target, data)
g_neg = g_neg * neg
g = g_pos + g_neg
g = np.nan_to_num(g)
rlt = (w * g).sum(axis = 1)
return rlt
if __name__ == '__main__':
a = [[3051,20.4,30.1,0.5250,31.1,9.5,70.1,82.8,6,2],
[20763,0.1,84.1,0.9969,100,-1.7,78.6,92.9,28,1.3],
[2407,16.7,39.9,0.5504,38.8,15.6,65.6,85.7,7,0.2],
[5121,24.9,38.4,np.nan,60.6,16.5,69.5,74.6,18,0.9],
[16861,np.nan,np.nan,0.9769,91,15.7,77.9,95.7,44,4.6],
[23592,1.9,60.3,0.9473,78.5,2.1,80,99,43,1.8],
[4317,12.8,60.3,np.nan,56.4,4.4,67.9,99,32,3.5],
[13286,5.8,51.2,0.8824,80.4,8.7,72.6,97.5,60,1.1],
[7699,12.6,42,0.8120,55.9,20.5,72.2,86.4,11,0.5],
[3725,20.6,47.3,0.6012,56.8,22.3,68.6,94.8,35,0.6],
[25295,0.2,65.2,0.9979,100,8.6,77.3,91.8,39,1.7],
[2945,22.4,51.1,0.5843,23,11.5,73.3,91.1,5,4.2],
[5524,9.6,49.5,0.4875,21,10.2,68.9,95,21,2.9],
[6594,17.4,54.7,0.5658,72.9,14.8,69.3,84,18,1.5],
[3146,17.3,51.1,np.nan,44.9,17.2,66.7,53.7,np.nan,2.1],
[8296,4.2,62.2,np.nan,52.9,15.9,53.2,84.6,19,0.6],
[22814,np.nan,np.nan,0.9651,76.9,4.4,79.1,99,90,2.1],
[7450,5.5,68.6,0.8021,74,22.4,72.3,90.8,16,1.2],
[29240,1.8,71.8,0.9733,76.8,5.8,76.8,99,81,2.6],
[11728,6,65.6,0.9849,89.3,11.7,73.1,96.7,42,2.7],
[6460,8.3,62.3,0.7581,80.1,13.0,67,84.5,12,1.3],
[5706,4.2,49.3,0.8921,86.3,20.5,72.6,92,25,2.4],
[6314,16,44,np.nan,70.6,-4.3,68.1,99.5,44,4.3],
[4683,14.5,57,np.nan,69,-6.4,71.3,98.2,41,3.5],
[12197,4.3,58,0.9535,74.6,-1.8,74.1,99,23,2.9],
[21214,2.3,71.5,np.nan,75.2,3.4,78.2,99,52,2.9],
[22026,1.1,44.2,0.9717,87.1,-0.7,77.3,99,45,3.4],
[20365,2.8,66.4,np.nan,66.8,-0.1,78.3,98.3,43,5.5],
[22325,np.nan,np.nan,0.9681,89.2,3.1,78,99,50,2.6],
[7543,5.6,61.6,0.8089,64.8,0.6,72.7,99.7,24,2.3],
[5572,19.5,36.1,0.6003,55.7,-1.3,70.2,97.9,23,1.8],
[6180,7.5,55.7,np.nan,77,-4.7,66.7,99.5,41,4.6],
[15960,3.5,25.1,0.9239,77.2,0.1,78.1,97.4,51,4.2],
[20314,1.8,66.7,0.9835,89.4,1.3,77.3,99,50,1.6],
[3130,13.8,48.4,0.7388,67.8,-6.3,69.1,99.6,42,4.5],
[21795,3.2,70.6,0.9524,84.7,6.5,78.3,99,76,2.5],
[16084,np.nan,np.nan,0.9148,85.6,7.9,77.1,99,59,2.1]]
a = np.array(a)
a = np.delete(a, 5, axis=1)
target = np.array([22930, 2, 63, 0.9580, 76, 77, 97.5, 58, 2.5], dtype='float')
pos_neg = np.array([1, -1, 1, 1, 1, 1, 1, 1, 1], dtype='float')
result = coefficient_of_variation(data=a, target=target, pos_neg=pos_neg)
result = np.around(result, decimals=2)
以下为将人口出生率这项指标剔除后计算得到的结果:
国家 | 中国 | 中国香港 | 印度尼西亚 | 伊朗 | 以色列 | 日本 | 哈萨克斯坦 | 韩国 | 马来西亚 | 菲律宾 | 新加坡 | 斯里兰卡 | 泰国 | 土耳其 | 埃及 | 南非 | 加拿大 | 墨西哥 | 美国 | 阿根廷 | 巴西 | 委内瑞拉 | 白俄罗斯 | 保加利亚 | 捷克共和国 | 法国 | 德国 | 意大利 | 荷兰 | 波兰 | 罗马尼亚 | 俄罗斯 | 西班牙 | 英国 | 乌克兰 | 澳大利亚 | 新西兰 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
综合指数 | 0.33 | 5.2 | 0.24 | 0.32 | 0.76 | 0.93 | 0.55 | 0.67 | 0.36 | 0.39 | 2.99 | 0.49 | 0.49 | 0.44 | 0.32 | 0.43 | 0.77 | 0.52 | 1.16 | 0.74 | 0.47 | 0.62 | 0.65 | 0.59 | 0.71 | 0.91 | 1.19 | 0.99 | 0.7 | 0.59 | 0.43 | 0.71 | 0.89 | 0.94 | 0.68 | 0.97 | 0.63 |
这个结果看上去就合理多了,所以说不论使用何种赋权方法,指标的选择都至关重要。