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.数据标准化处理(归一化)
# 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-熵值法
在信息论中,熵是对不确定性或随机性的一种度量,不确定性越大,熵值就越大,不确定性越小,熵值就越小.不确定性越大,表明随机性越大,数据越离散,则包含的信息就越大,在确定权重的时候往往就越小. 熵值法确定 ...
- excel熵值法计算权重_指标权重确定方法 1-熵值法
在信息论中,熵是对不确定性或随机性的一种度量,不确定性越大,熵值就越大,不确定性越小,熵值就越小.不确定性越大,表明随机性越大,数据越离散,则包含的信息就越大,在确定权重的时候往往就越小. 熵值法确定 ...
- python计算实例_python计算熵值法计算实例
import csv csv_file =csv.reader(open('1.csv','r')) print(csv_file) for s in csv_file: print(s) impor ...
- Python实现熵值法确定权重
该文为转载文章,无排版,链接直达 Python实现熵值法确定权重 本文从以下四个方面,介绍用Python实现熵值法确定权重: 一. 熵值法介绍 二. 熵值法实现 三. Python实现熵值法示例1 四 ...
- 【数学建模】熵值法与多指标评价系统
获取更多关于算法.人工智能.复杂性科学的内容,欢迎关注我的公众号<复杂与美> ##一.熵的基本概念 熵最初是热力学中的一个概念,后来延伸到信息领域.熵是对系统无序度的度量,系统越无序,熵越 ...
- 评价模型中熵值法Excel和Python实现
因为项目需要,要用分数的形式评价用户对某个产品的喜好程度,其中的指标权重确定用熵值法计算.在网上搜集了些资料,再自己捣腾了一下分别用Excel和Python的方法来实现. 目录 一.熵值法介绍 二 ...
- df满足条件的值修改_如何用python实现熵值法求指标权重(实例)
权重是指某一因素或指标相对于某一事物的重要程度,其不同于一般的比重,体现的不仅仅是某一因素或指标所占的百分比,强调的是因素或指标的相对重要程度,倾向于贡献度或重要性.而在我们的数据分析过程中,倘若各个 ...
- 【统计方法】基于熵值法的面板数据指标权重计算
面板数据熵值法 本文主要是讲解熵值法的处理过程和代码实现. 建立指标体系和指标评价时有可能用到熵值法(熵权法),但以往的经验来看,熵值法常用于时序数据或者是截面数据.实际上,熵值法在面板数据的 ...
- 利用熵值法确定指标权重---原理及Python实现
背景 在进行一些综合评估类项目时,需要给一些指标确定一个合理的权重,用来计算综合得分,这种综合评估类项目在实际的业务中有很多应用,比如:学生奖学金评定方法.广告效果综合评估.电视节目满意度综合评估.用 ...
最新文章
- 【原创】如何分析一个网站使用的服务器类型
- 使用Cookie记录信息
- 使用 Java Native Interface 的最佳实践
- QML控件拖动并靠边停留
- 查看SQL SERVER 加密存储过程,函数,触发器,视图
- [LCP28] 采购方案
- server2019 sqlcmd命令安装_Ubuntu20.04LTS安装MS sql-server2019的方法
- google谷歌官方的上拉刷新(可变的颜色)
- 敏捷开发一千零一问系列之十一:需求谁做主?
- equals 跟== 的区别
- 掌门教育微服务体系 Solar(中)
- ai人工智能_我的人工智能周:第5部分
- 【python】将json字符串转化为json对象
- 如何使用Vegas进行调音?
- 1-65535字符集
- 重重事故下,区块链安全的难题与出路 |链捕手
- Photoshop制作漂亮白色荧光文字图片
- 实现一个简单的图片轮播效果
- 火焰焰心matlab,火焰的形貌-中性焰、碳化焰、氧化焰
- 论文阅读中经常出现的“消融研究/实验”
热门文章
- JAVA循环题------15只狮子选狮王
- matlab 就近保留整数,matlab里面如何保留小数特定位,取整数及四舍五入
- MySQL 快速造数 mysql_random_data_load
- 如何有效地识别钓鱼网站? 远离未知风险
- 【BSV资讯】图瓦卢国家数字账本:赋能于全球首批区块链公民
- 【DeepCV】轻量化模型 Lightweight model
- UML Thinking in UML大象 参与者
- 一步一个脚印学C/2022/7/27
- phpStudy闪退
- 强强联合!百望云入驻微软实验室,揭开数智发展新篇章!