权重是指某一因素或指标相对于某一事物的重要程度,其不同于一般的比重,体现的不仅仅是某一因素或指标所占的百分比,强调的是因素或指标的相对重要程度,倾向于贡献度或重要性。而在我们的数据分析过程中,倘若各个指标的重要程度不同,则我们便需要对我们的指标数据赋予一定权重。
指标权重的选择,直接影响评价指标体系的公正性及预测的准确性,因此指标权重的确定更需要讲究客观性。今天就为大家介绍一种数据分析中常用的赋值法——熵值权重法,同时,我也将结合实例为大家讲讲如何用python实现熵值法。
(1)熵值权重法的理论基础
在信息系统中的信息熵是信息无序度的度量,信息熵越大,信息的无序度越高,其信息的效用值越小;反之,信息熵越小,信息的无序度越小,信息的效用值越大.
因此可以运用信息熵评价所获系统信息的有序程度及信息的效用值.在评价体系中,指标的信息熵越大,则其信息的效用值越小,因此赋予该指标较小的指标权重;指标的信息熵越小,则其信息的效用值越大,因此赋予该指标较大的指标权重.
(2)熵值权重法的计算步骤
(由于有些公式需要借助mathtype编辑,因此我们的计算步骤会先在word里编辑,然后通过图片的方式放到文章里)
1、将各指标数据进行min-max标准化:
以上就是利用熵值法计算权重的计算过程,下面我们将结合实例,用python实现上述计算过程。
(3)python实现
在本次实例过程中,我们使用的数据是:2010-2018年间广州市经济与环境的时间序列资料,数据来源为《广州市统计年鉴》及《国民经济和社会发展统计公报》,感兴趣的同学也可利用其它数据进行实例操作。(本次实验的Excel数据附在文后)
1、首先,还是先导入我们的数据分析库pandas和numpy,然后将我们的数据导入python中,(这里我们的数据是用Excel保存的,所以要用Excel的导入方法);接着我们稍微对原始数据进行索引名的修改,方便观察;最后,用我们之前说的用shape、以及head的方法先观察一下我们的数据。
import numpy as np
import pandas as pd
df=pd.read_excel('data_py.xlsx',sheet_name='广州',encoding='utf-8')
df.drop(columns="时间",axis=1,inplace=True)
df.set_index([[2010,2011,2012,2013,2014,2015,2016,2017,2018]],inplace=True)
print(df.shape)
print(df.head(5))
可以看到,我们的数据一共有9行15列,分别代表着9年的数据,每年的数据有15项指标。
2、对指标数据进行标准化,这里注意了~
由于二氧化硫年平均浓度、二氧化氮年平均浓度这两项指标属于负指标,为了使其增长不会导致体系总体评分的下降,因此在具体标准化处理时采用与正指标不同的计算方法。
针对正指标,我们采用的是:(x-min)/(max-min)
针对负指标,我们采用的是:(max-x)/(max-min)
下面是标准化
#正指标 (x-min)/(max-min)
# 负指标 (max-x)/(max-min)
for i in list(df.columns):
# 获取各个指标的最大值和最小值
Max = np.max(df[i])
Min = np.min(df[i])
if (i == '二氧化硫年平均浓度') or (i == '二氧化氮年平均浓度'):
df[i] = (Max - df[i])/(Max - Min)
else:
# 标准化
df[i] = (df[i] - Min)/(Max - Min)
可以看到,所有指标已经被我们标准化了(标准化后的数据取值都在0-1之间)
3、计算指标比重、熵值及差异系数:
注意了!!
#下面求指标比重
def bizhong(df_bizhong):
for column in df_bizhong.columns:
sigma_xij = sum(df_bizhong[column])
df_bizhong[column] = df_bizhong[column].apply(lambda x_ij: x_ij / sigma_xij if x_ij / sigma_xij != 0 else 1e-6)
return df_bizhong
df_bizhong=bizhong(df)
#下面求熵值Hi
#先算K值
k=1/ np.log(9) #考察年度为九年
# print(k)
h_j = (-k) * np.array([sum([pij*np.log(pij) for pij in df_bizhong[column]]) for column in df_bizhong.columns])
h_js = pd.Series(h_j, index=df_bizhong.columns, name='指标的熵值')
#下面求差异系数
df_bianyi=pd.Series(1-h_j, index=df_bizhong.columns, name='差异系数')
可以看到,这个时候各个指标的差异系数就被我们算出来了。
4、根据差异系数,最后计算我们的指标权重:
#下面计算指标权重
df_Weight = df_bianyi / sum(df_bianyi)
df_Weight.name = '指标权重'
由此,我们的指标权重就计算出来了~有兴趣的同学还可以还可以把上述代码封装起来,以便多次利用,这里就不做啦~
同时,大家还可以根据算出来的指标权重,结合原来的指标值,算出各个指标的因子得分情况。这里我就不再举例了。
最后,我把本次实验的Excel数据附上,感兴趣的同学可以自己动手试试~
链接:
https://pan.baidu.com/s/1MOmda_0kDbwRNp9jJ0XOgwpan.baidu.com提取码:5ca2
以上便是<如何用python实现熵值法求指标权重>的内容,感谢大家的细心阅读,同时欢迎感兴趣的小伙伴一起讨论、学习,想要了解更多内容的可以看我的其他文章,同时可以持续关注我的动态~