df满足条件的值修改_如何用python实现熵值法求指标权重(实例)

本文介绍了熵值权重法的理论基础,强调了指标权重在数据分析中的重要性,并详细阐述了如何利用Python进行熵值法的计算。通过实例展示了数据标准化、计算熵值、差异系数和权重的过程,提供了数据源链接供读者自行实践。
摘要由CSDN通过智能技术生成

b0401196bac7bf8b008bea0b2fc241dc.png

权重是指某一因素或指标相对于某一事物的重要程度,其不同于一般的比重,体现的不仅仅是某一因素或指标所占的百分比,强调的是因素或指标的相对重要程度,倾向于贡献度或重要性。而在我们的数据分析过程中,倘若各个指标的重要程度不同,则我们便需要对我们的指标数据赋予一定权重。

指标权重的选择,直接影响评价指标体系的公正性及预测的准确性,因此指标权重的确定更需要讲究客观性。今天就为大家介绍一种数据分析中常用的赋值法——熵值权重法,同时,我也将结合实例为大家讲讲如何用python实现熵值法。

(1)熵值权重法的理论基础

在信息系统中的信息熵是信息无序度的度量,信息熵越大,信息的无序度越高,其信息的效用值越小;反之,信息熵越小,信息的无序度越小,信息的效用值越大.

因此可以运用信息熵评价所获系统信息的有序程度及信息的效用值.在评价体系中,指标的信息熵越大,则其信息的效用值越小,因此赋予该指标较小的指标权重;指标的信息熵越小,则其信息的效用值越大,因此赋予该指标较大的指标权重.

(2)熵值权重法的计算步骤

(由于有些公式需要借助mathtype编辑,因此我们的计算步骤会先在word里编辑,然后通过图片的方式放到文章里)

1、将各指标数据进行min-max标准化:

f60b7c0c359fb242abc572f9f85d20b9.png

03d4bf3da089fdaa9db882cbffbfe290.png

1f7f9b2047a87fd9a81a17baab4d65b1.png

41901e116a514fc5b030735b700a4ba4.png

135c50e65a90a73d29c50f10440c1c66.png

以上就是利用熵值法计算权重的计算过程,下面我们将结合实例,用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))

1d9664e2a0315b9b3dfd047a36f39062.png

可以看到,我们的数据一共有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)

0c30f3798b7084c69a291782955d969a.png

可以看到,所有指标已经被我们标准化了(标准化后的数据取值都在0-1之间)

3、计算指标比重、熵值及差异系数

注意了!!

189063a6f1b933c01cce8299716578e7.png
#下面求指标比重
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='差异系数')

08e9ba9e1905bfd438e2009c2eaf7331.png

可以看到,这个时候各个指标的差异系数就被我们算出来了。

4、根据差异系数,最后计算我们的指标权重

#下面计算指标权重
df_Weight = df_bianyi / sum(df_bianyi)
df_Weight.name = '指标权重'

769b2d401c34af4cfb03a74aa3ea141f.png

由此,我们的指标权重就计算出来了~有兴趣的同学还可以还可以把上述代码封装起来,以便多次利用,这里就不做啦~

同时,大家还可以根据算出来的指标权重,结合原来的指标值,算出各个指标的因子得分情况。这里我就不再举例了。

最后,我把本次实验的Excel数据附上,感兴趣的同学可以自己动手试试~

链接:

https://pan.baidu.com/s/1MOmda_0kDbwRNp9jJ0XOgw​pan.baidu.com

提取码:5ca2


以上便是<如何用python实现熵值法求指标权重>的内容,感谢大家的细心阅读,同时欢迎感兴趣的小伙伴一起讨论、学习,想要了解更多内容的可以看我的其他文章,同时可以持续关注我的动态~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值