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.数据标准化处理(归一化)

# 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)  # 归一之后的表格

归一化后的表格

例如:

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

# 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.计算指标信息熵:

# 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")

Python:多指标权重确定方法—熵值法相关推荐

  1. 熵值法计算权重有异常值_指标权重确定方法 1-熵值法

    在信息论中,熵是对不确定性或随机性的一种度量,不确定性越大,熵值就越大,不确定性越小,熵值就越小.不确定性越大,表明随机性越大,数据越离散,则包含的信息就越大,在确定权重的时候往往就越小. 熵值法确定 ...

  2. excel熵值法计算权重_指标权重确定方法 1-熵值法

    在信息论中,熵是对不确定性或随机性的一种度量,不确定性越大,熵值就越大,不确定性越小,熵值就越小.不确定性越大,表明随机性越大,数据越离散,则包含的信息就越大,在确定权重的时候往往就越小. 熵值法确定 ...

  3. python计算实例_python计算熵值法计算实例

    import csv csv_file =csv.reader(open('1.csv','r')) print(csv_file) for s in csv_file: print(s) impor ...

  4. Python实现熵值法确定权重

    该文为转载文章,无排版,链接直达 Python实现熵值法确定权重 本文从以下四个方面,介绍用Python实现熵值法确定权重: 一. 熵值法介绍 二. 熵值法实现 三. Python实现熵值法示例1 四 ...

  5. 【数学建模】熵值法与多指标评价系统

    获取更多关于算法.人工智能.复杂性科学的内容,欢迎关注我的公众号<复杂与美> ##一.熵的基本概念 熵最初是热力学中的一个概念,后来延伸到信息领域.熵是对系统无序度的度量,系统越无序,熵越 ...

  6. 评价模型中熵值法Excel和Python实现

      因为项目需要,要用分数的形式评价用户对某个产品的喜好程度,其中的指标权重确定用熵值法计算.在网上搜集了些资料,再自己捣腾了一下分别用Excel和Python的方法来实现. 目录 一.熵值法介绍 二 ...

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

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

  8. 【统计方法】基于熵值法的面板数据指标权重计算

    面板数据熵值法   本文主要是讲解熵值法的处理过程和代码实现.   建立指标体系和指标评价时有可能用到熵值法(熵权法),但以往的经验来看,熵值法常用于时序数据或者是截面数据.实际上,熵值法在面板数据的 ...

  9. 利用熵值法确定指标权重---原理及Python实现

    背景 在进行一些综合评估类项目时,需要给一些指标确定一个合理的权重,用来计算综合得分,这种综合评估类项目在实际的业务中有很多应用,比如:学生奖学金评定方法.广告效果综合评估.电视节目满意度综合评估.用 ...

最新文章

  1. 【原创】如何分析一个网站使用的服务器类型
  2. 使用Cookie记录信息
  3. 使用 Java Native Interface 的最佳实践
  4. QML控件拖动并靠边停留
  5. 查看SQL SERVER 加密存储过程,函数,触发器,视图
  6. [LCP28] 采购方案
  7. server2019 sqlcmd命令安装_Ubuntu20.04LTS安装MS sql-server2019的方法
  8. google谷歌官方的上拉刷新(可变的颜色)
  9. 敏捷开发一千零一问系列之十一:需求谁做主?
  10. equals 跟== 的区别
  11. 掌门教育微服务体系 Solar(中)
  12. ai人工智能_我的人工智能周:第5部分
  13. 【python】将json字符串转化为json对象
  14. 如何使用Vegas进行调音?
  15. 1-65535字符集
  16. 重重事故下,区块链安全的难题与出路 |链捕手
  17. Photoshop制作漂亮白色荧光文字图片
  18. 实现一个简单的图片轮播效果
  19. 火焰焰心matlab,火焰的形貌-中性焰、碳化焰、氧化焰
  20. 论文阅读中经常出现的“消融研究/实验”

热门文章

  1. JAVA循环题------15只狮子选狮王
  2. matlab 就近保留整数,matlab里面如何保留小数特定位,取整数及四舍五入
  3. MySQL 快速造数 mysql_random_data_load
  4. 如何有效地识别钓鱼网站? 远离未知风险
  5. 【BSV资讯】图瓦卢国家数字账本:赋能于全球首批区块链公民
  6. 【DeepCV】轻量化模型 Lightweight model
  7. UML Thinking in UML大象 参与者
  8. 一步一个脚印学C/2022/7/27
  9. phpStudy闪退
  10. 强强联合!百望云入驻微软实验室,揭开数智发展新篇章!