Python:多指标权重确定方法—熵值法

Python:多指标权重确定方法—熵值法

一、需准备的资料

1.一份excel的数据表格,列为指标(评价指标),行为城市(研究对象,也可以是年份,)

city GDP:亿元x.1 人口(万)x.2 城镇化率(%)x.3 从业人员(万)x.4 财政收入(亿元)x.5 固定资产投资(亿元)x.6 社会消费品零售总额(亿元)x.7 进出口总值(亿元)x.8 旅客吞吐量(万人次)x.9 货邮吞吐量(万吨)x.10
广州x1. 21503 1449 86 20 5947 5919 9402 9714 6583 233
深圳x2. 22438 1252 100 27 8624 5147 6016 28075 18142 115
珠海x3. 2564 176 89 1 314 1662 1128 3001 921 3
佛山x4. 9549 765 94 2 604 4265 3320 4358 4929 0.02
惠州x5. 3830 477 68 2 941 2234 1363 3419 959 0.4
香港x6. 22160 741 100 10 4772 4868 4461 71642 5665 493
澳门x7. 3406 65 100 0.76 1180 9 66256 736 716 3

2.数据表格保存在D:\5.python data的路径下,命名为szfqz.xls

二、最终获得的资料

1. 10个指标的权重

city GDP:亿元x.1 人口(万)x.2 城镇化率(%)x.3 从业人员(万)x.4 财政收入(亿元)x.5 固定资产投资(亿元)x.6 社会消费品零售总额(亿元)x.7 进出口总值(亿元)x.8 旅客吞吐量(万人次)x.9 货邮吞吐量(万吨)x.10
权重

2. 7个城市航空竞争力的排名

city 竞争力综合得分 排名
广州x1.
深圳x2.
珠海x3.
佛山x4.
惠州x5.
香港x6.
澳门x7.

三、计算步骤

1.数据标准化处理(归一化)

正向指标(数值越大越好): ,i=1,2,…,7;j=1,2,…,10负向指标(数值越小越好): ,i=1,2,…,7;j=1,2,…,10

# 1、数据的归一化(可以最大最小归一,也可以标准化归一)
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
from xlwt import *
from docx import Document
from docx.shared import Inches
plt.rcParams['font.sans-serif'] = ['microsoft YaHei']  # 显示中文微软雅黑字体
plt.rcParams['axes.unicode_minus'] = False  # 避免负号显示为方块
data = pd.read_excel('D:\\5.python data\\szfqz.xls')  # 把指定位置的excel表格数据导入python形成一个dataframe表格数据
print(data)  # 观察导入的数据表格,如这种类型格式的数据才能导入计算
del data[list(data)[0]]  # 第一列是城市,不参加求均值、标准差、变异系数的过程,所以先删掉
print(data)
GYH = (data-data.min())/(data.max()-data.min())  # 即实现简单标准化归一
pd.set_option('display.max_columns', None)  # display.max_columns代表所有列,None代表所有行
print(GYH)  # 归一之后的表格

归一化后的表格
在这里插入图片描述

例如: x_34=(x_34-min⁡( x_.4))/(max⁡( x_.4)-min⁡( x_.4))=(1.1-0.76)/(27.56-0.76)=0.012687

2.计算第i个城市第j项指标的比重:

,i=1,2,…,7;j=1,2,…,10

# 2.计算第i个城市第j项指标的比重
BZ = GYH/GYH.sum()  # 归一化之后表格中的值除以这一列的和得到新的比重表格
SM2 = '下面是比重表格'  # 写入excel中的字符串,根据需要来进行修改
excel = open("D:\\5.python data\\szfqz.csv", "a", encoding="utf_8_sig").write('\n' + SM2 + '\n')  # “a”代表追加写入模式,encoding...代表写入的时候正确显示中文,\n代表换行
BZ.to_csv("D:\\5.python data\\szfqz.csv", index=False, mode='a', encoding="utf_8_sig")

运算结果:
在这里插入图片描述

例如: 在这里插入图片描述

3.计算指标信息熵:

i=1,2,…,7;j=1,2,…,10

# 3. 计算指标信息熵
df3 = -BZ*BZ.apply(np.log2)
df3 = df3.sum()
print(df3)


结果:
GDP:亿元x.1 2.076935
人口(万)x.2 2.312275
城镇化率(%)x.3 2.552376
从业人员(万)x.4 1.784065
财政收入(亿元)x.5 1.960672
固定资产投资(亿元)x.6 2.465151
社会消费品零售总额(亿元)x.7 2.116074
进出口总值(亿元)x.8 1.604223
旅客吞吐量(万人次)x.9 1.970791
货邮吞吐量(万吨)x.10 1.432515

4.计算信息熵冗余度

在这里插入图片描述

df4= 1-df3
print(df4)

结果:
GDP:亿元x.1 -1.076935
人口(万)x.2 -1.312275
城镇化率(%)x.3 -1.552376
从业人员(万)x.4 -0.784065
财政收入(亿元)x.5 -0.960672
固定资产投资(亿元)x.6 -1.465151
社会消费品零售总额(亿元)x.7 -1.116074
进出口总值(亿元)x.8 -0.604223
旅客吞吐量(万人次)x.9 -0.970791
货邮吞吐量(万吨)x.10 -0.432515

5.计算指标权重

在这里插入图片描述

wj = df4/df4.sum()
print('\n 指标权重表格 \n', wj)
plt.bar(wj, color='G')
# dataframe排序:根据某一列的值,对权重数据画条形图
wj1 = wj.sort_values()  # 根据值的大小进行排序
# df.sort_index(inplace=True)  # 根据索引值排序,inplace如果手动设定为 True,那么原数组就可以被替换。
wj1.plot.barh()
plot.show()
# 把指标权重表格导入到CSV中
SM3 = '下面是指标的权重表格'  # 写入CSV中的字符串,根据需要来进行修改
CSV3 = open("D:\\5.python data\\szfqz.csv", "a", encoding="utf_8_sig").write('\n\n' + SM3 + '\n')  # “a”代表追加写入模式,encoding...代表写入的时候正确显示中文,\n代表换行
BZ.to_csv("D:\\5.python data\\szfqz.csv", index=False, mode='a', encoding="utf_8_sig")
SM4 = '根据熵值法计算的权重数据,城市航空竞争力影响各因素中权重分别为XX指标占XX%,XX指标占X%,XX指标占X%,XX指标占X%,XX指标占X%。故我们在进行提升城市航空竞争力决策时,更多是考虑XX指标、XX指标等重要因素。这是从权重角度考虑的'  # 写入CSV中的字符串,根据需要来进行修改
CSV4 = open("D:\\5.python data\\szfqz.csv", "a", encoding="utf_8_sig").write('\n\n' + SM4 + '\n')

权重表格:
GDP:亿元x.1 0.104810
人口(万)x.2 0.127714
城镇化率(%)x.3 0.151082
从业人员(万)x.4 0.076307
财政收入(亿元)x.5 0.093495
固定资产投资(亿元)x.6 0.142593
社会消费品零售总额(亿元)x.7 0.108620
进出口总值(亿元)x.8 0.058805
旅客吞吐量(万人次)x.9 0.094480
货邮吞吐量(万吨)x.10 0.042094

在这里插入图片描述

6.计算指标评价得分:

在这里插入图片描述

BZ_mat = np.mat(BZ)  # 因为涉及到两个dataframe的值相乘,需要先转化为矩阵,首先把权重转化为矩阵
wj_mat = np.mat(wj)  # 把指标权重化为矩阵形式
sij = BZ_mat*wj_mat.T  # BZ_mat是一个7X10的矩阵,wj_mat是一个1X10的矩阵,所以要转置
sij = pd.DataFrame(sij)  # 把相乘后的矩阵结果转化为dataframe
print('\n 各个城市的综合评分 \n', sij)
# 把综合评分数据导入CSV中
SM5 = '下面是城市的综合评分'  # 写入CSV中的字符串,根据需要来进行修改
CSV5 = open("D:\\5.python data\\szfqz.csv", "a", encoding="utf_8_sig").write('\n\n' + SM5 + '\n')  # “a”代表追加写入模式,encoding...代表写入的时候正确显示中文,\n代表换行
sij.to_csv("D:\\5.python data\\szfqz.csv", index=False, mode='a', encoding="utf_8_sig")

[[0.24918247]
[0.29075881]
[0.03917411]
[0.11138891]
[0.03647488]
[0.23594778]
[0.03707304]]

最后附上所有代码

# -*- encoding=utf-8 -*-
# ==================================
# 参考下面四篇文章
# https://www.jianshu.com/p/468e2af86d59
# https://www.jb51.net/article/188971.htm
# https://blog.csdn.net/u013617144/article/details/79533868
# https://www.jianshu.com/p/3e08e6f6e244
# =====================================================
# 1、数据的归一化(可以最大最小归一,也可以标准化归一)
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
plt.rcParams['font.sans-serif'] = ['microsoft YaHei']  # 显示中文微软雅黑字体
plt.rcParams['axes.unicode_minus'] = False  # 避免负号显示为方块
data = pd.read_excel('D:\\5.python data\\szfqz.xls')  # 把指定位置的excel表格数据导入python形成一个dataframe表格数据
print('\n 原始数据 \n', data)  # 观察导入的数据表格,如这种类型格式的数据才能导入计算
# 原始数据导入CSV中
SM0 = '原始数据表格:'  # 把原始数据data显示在结果CSV中
CSV0 = open("D:\\5.python data\\szfqz.csv", "a", encoding="utf_8_sig").write('\n\n' + SM0 + '\n')
data.to_csv("D:\\5.python data\\szfqz.csv", index=False, mode='a', encoding="utf_8_sig")
# 原始数据的预处理
del data[list(data)[0]]  # 第一列是城市,不参加求均值、标准差、变异系数的过程,所以先删掉
print('\n 原始数据去掉第一列城市后的数据 \n', data)
GYH = (data-data.min())/(data.max()-data.min())  # 即实现简单标准化归一
pd.set_option('display.max_columns', None)  # display.max_columns代表显示所有列,None代表显示所有行
print('\n 简单归一化形成的dataframe \n', GYH)  # 归一之后的表格
# 把归一化之后的数据导入到CSV表格中
SM1 = '下面是简单归一化之后的表格:'  # 在CSV中对归一化后数据的简单说明
CSV1 = open("D:\\5.python data\\szfqz.csv", "a", encoding="utf_8_sig").write('\n\n' + SM1+'\n')
GYH.to_csv("D:\\5.python data\\szfqz.csv", index=False, mode='a', encoding="utf_8_sig")
# BZGYH = (data-data.mean())/(data.std())  # data.mean()是平均值、data.std()是标准差

# 2.计算第i个城市第j项指标的比重
BZ = GYH/GYH.sum()  # 归一化之后表格中的值除以这一列的和得到新的比重表格
# 把比重表格导入到CSV中
# SM2 = '下面是比重表格'  # 写入CSV中的字符串,根据需要来进行修改
# CSV2 = open("D:\\5.python data\\szfqz.csv", "a", encoding="utf_8_sig").write('\n\n' + SM2 + '\n')  # “a”代表追加写入模式,encoding...代表写入的时候正确显示中文,\n代表换行
# BZ.to_csv("D:\\5.python data\\szfqz.csv", index=False, mode='a', encoding="utf_8_sig")

# 3. 计算指标信息熵
df3 = -BZ*BZ.apply(np.log2)  #比重表格中的每个值乘以它以2为底的对数,并取负值,形成一个新的dataframe表格
df3 = df3.sum()  # 每个指标代表的列求和
# print('这是每个指标的信息熵+\n', df3)

# 4.计算信息熵冗余度
df4= 1-df3
# print(df4)

# 5.计算指标权重
wj = df4/df4.sum()
print('\n 指标权重表格 \n', wj)
plt.bar(wj, color='G')
# dataframe排序:根据某一列的值
wj1 = wj.sort_values()  # 根据值的大小进行排序
# df.sort_index(inplace=True)  # 根据索引值排序,inplace如果手动设定为 True,那么原数组就可以被替换。
wj1.plot.barh()
plt.show()
# 把指标权重表格导入到CSV中
SM3 = '下面是指标的权重表格'  # 写入CSV中的字符串,根据需要来进行修改
CSV3 = open("D:\\5.python data\\szfqz.csv", "a", encoding="utf_8_sig").write('\n\n' + SM3 + '\n')  # “a”代表追加写入模式,encoding...代表写入的时候正确显示中文,\n代表换行
BZ.to_csv("D:\\5.python data\\szfqz.csv", index=False, mode='a', encoding="utf_8_sig")
SM4 = '根据熵值法计算的权重数据,城市航空竞争力影响各因素中权重分别为XX指标占XX%,XX指标占X%,XX指标占X%,XX指标占X%,XX指标占X%。故我们在进行提升城市航空竞争力决策时,更多是考虑XX指标、XX指标等重要因素。这是从权重角度考虑的'  # 写入CSV中的字符串,根据需要来进行修改
CSV4 = open("D:\\5.python data\\szfqz.csv", "a", encoding="utf_8_sig").write('\n\n' + SM4 + '\n')

# 6.计算城市评价得分
BZ_mat = np.mat(BZ)  # 因为涉及到两个dataframe的值相乘,需要先转化为矩阵,首先把权重转化为矩阵
wj_mat = np.mat(wj)  # 把指标权重化为矩阵形式
sij = BZ_mat*wj_mat.T  # BZ_mat是一个7X10的矩阵,wj_mat是一个1X10的矩阵,所以要转置
sij = pd.DataFrame(sij)  # 把相乘后的矩阵结果转化为dataframe
print('\n 各个城市的综合评分 \n', sij)
# 把综合评分数据导入CSV中
SM5 = '下面是城市的综合评分'  # 写入CSV中的字符串,根据需要来进行修改
CSV5 = open("D:\\5.python data\\szfqz.csv", "a", encoding="utf_8_sig").write('\n\n' + SM5 + '\n')  # “a”代表追加写入模式,encoding...代表写入的时候正确显示中文,\n代表换行
sij.to_csv("D:\\5.python data\\szfqz.csv", index=False, mode='a', encoding="utf_8_sig")
  • 9
    点赞
  • 92
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
熵值法是一种常用的多指标决策方法,可以用来求解多个指标权重。下面是使用Python实现熵值法指标权重的基本思路: 1. 首先,需要准备好一个评价矩阵,其中包含了各个评价指标的得分情况。评价矩阵可以使用NumPy库中的数组来表示。 2. 然后,需要将评价矩阵标准化,使得各个指标得分在相同的范围内。标准化可以使用最大-最小规范化的方法,即将每个指标的得分都归一化到[0,1]的范围内。 3. 接着,需要计算每个指标权重计算权重方法是先计算每个指标对应的信息熵,再计算每个指标的熵权。信息熵可以使用熵值法公式来计算,熵权则是指标的信息熵与各个指标信息熵之和的比值。 4. 最后,将各个指标的熵权作为其权重,即可得到每个指标权重值。 以下是Python代码示例: ```python import numpy as np # 定义评价矩阵 eval_matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # 对评价矩阵进行标准化 norm_matrix = (eval_matrix - eval_matrix.min(axis=0)) / (eval_matrix.max(axis=0) - eval_matrix.min(axis=0)) # 计算每个指标对应的信息熵 entropy = -np.sum(norm_matrix * np.log(norm_matrix), axis=0) # 计算每个指标的熵权 entropy_weight = entropy / np.sum(entropy) # 输出每个指标权重值 print(entropy_weight) ``` 以上代码中,我们首先定义了一个评价矩阵eval_matrix,然后对其进行了标准化得到了norm_matrix,接着计算了每个指标对应的信息熵entropy,最后计算了每个指标的熵权entropy_weight并输出了结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值