前言:
信息熵是一種用於衡量系統內部信息量的度量。在信息論中,信息是系統有序程度的一種度量。
信息是確定性的增加,不確定性的減少(香農定理)。而信息熵是系統無序程度的一種度量,是系統不確定性的量度。兩者絕對值相等,但符號相反。一個系統的信息熵越小,該系統所含的信息量越大。
信息熵被廣泛用於計算機編碼,通信理論,博弈論等與“信息量”和“不確定性”相關的理論模型中。
熵權法就是一個通過信息熵理論確定系統中各指標權值的賦值方法,能夠較為精確客觀地判斷系統中各指標對總評價的貢獻大小。
信息熵的概念
• 單調性,即發生概率越高的事件,其所攜帶的信息熵越低。極端案例就是“太陽從東方升起”,因為為確定事件,所以不攜帶任何信息量。從信息論的角度,認為這句話沒有消除任何不確定性。
• 非負性,即信息熵不能為負。這個很好理解,因為負的信息,即你得知了某個信息后,卻增加了不確定性是不合邏輯
• 累加性,即多隨機事件同時發生存在的總不確定性的量度是可以表示為各事件不確定性的量度的和。

熵權法介紹
熵最先由香農引入信息論,目前已經在工程技術、社會經濟等領域得到了非常廣泛的應用。
熵權法的基本思路是根據指標變異性的大小來確定客觀權重。
熵權法相對於其他打分評價模型來說,具有精確客觀的優點。基於信息熵所計算得出的權重能夠較為精確地反應不同指標間的差別。但是相對應的,由於該模型的本質是用有限個決策樣本去“估計”指標的信息熵,在樣本量過少的情況下,基於熵權法所計算得出的權重則有可能出現較大誤差。一般來講,樣本決策數必須大於等於指標數。
一般來說,若某個指標的信息熵
越小,表明指標值得變異程度越大,提供的信息量越多,在綜合評價中所能起到的作用也越大,其權重也就越大。相反,某個指標的信息熵
越大,表明指標值得變異程度越小,提供的信息量也越少,在綜合評價中所起到的作用也越小,其權重也就越小。
熵權法賦權步驟
數據標准化
將各個指標的數據進行標准化處理。
假設給定了k個指標
,其中
。假設對各指標數據標准化后的值為
,那么
。
求各指標的信息熵
根據信息論中信息熵的定義,一組數據的信息熵
,
(近似寫為:
,n取e為底數) ,其中
。
,如果
則定義
再帶入。
確定各指標權重
根據信息熵的計算公式,計算出各個指標的信息熵為
。通過信息熵計算各指標的權重:
。
熵權法賦權實例
背景介紹
某醫院為了提高自身的護理水平,對擁有的11個科室進行了考核,考核標准包括9項整體護理,並對護理水平較好的科室進行獎勵。下表是對各個科室指標考核后的評分結果。
表1 11個科室9項整體護理評價指標得分表

但是由於各項護理的難易程度不同,因此需要對9項護理進行賦權,以便能夠更加合理的對各個科室的護理水平進行評價。
熵權法進行賦權
1.數據標准化
根據原始評分表,對數據進行標准化后可以得到下列數據標准化表
表2 11個科室9項整體護理評價指標得分表標准化表

2.求各指標的信息熵
根據信息熵的計算公式
,可以計算出9項護理指標各自的信息熵如下:
表3 9項指標信息熵表
3.計算各指標的權重
根據指標權重的計算公式
,可以得到各個指標的權重如下表所示:
表4 9項指標權重表
4.對各個科室進行評分
根據計算出的指標權重,以及對11個科室9項護理水平的評分。設Zl為第l個科室的最終得分,則
,各個科室最終得分如下表所示:
表5 11個科室最終得分表

實現過程
數據源:

python3代碼:
1 # -*- encoding=utf-8 -*-
2
3 import warnings 4 warnings.filterwarnings("ignore") 5 import pandas as pd 6 import numpy as np 7
8
9 def get_score(wi_list,data): 10 """
11 :param wi_list: 權重系數列表 12 :param data:評價指標數據框 13 :return:返回得分 14 """
15
16 # 將權重轉換為矩陣
17
18 cof_var = np.mat(wi_list) 19
20 # 將數據框轉換為矩陣
21 context_train_data = np.mat(data) 22
23 # 權重跟自變量相乘
24 last_hot_matrix = context_train_data * cof_var.T 25 last_hot_matrix = pd.DataFrame(last_hot_matrix) 26
27 # 累加求和得到總分
28 last_hot_score = list(last_hot_matrix.apply(sum)) 29
30 # max-min 歸一化
31
32 # last_hot_score_autoNorm = autoNorm(last_hot_score)
33
34 # 值映射成分數(0-100分)
35
36 # last_hot_score_result = [i * 100 for i in last_hot_score_autoNorm]
37
38 return last_hot_score 39
40
41
42 def get_entropy_weight(data): 43 """
44 :param data: 評價指標數據框 45 :return: 各指標權重列表 46 """
47 # 數據標准化
48 data = (data - data.min())/(data.max() - data.min()) 49 m,n=data.shape 50 #將dataframe格式轉化為matrix格式
51 data=data.as_matrix(columns=None) 52 k=1/np.log(m) 53 yij=data.sum(axis=0) 54 #第二步,計算pij
55 pij=data/yij 56 test=pij*np.log(pij) 57 test=np.nan_to_num(test) 58
59 #計算每種指標的信息熵
60 ej=-k*(test.sum(axis=0)) 61 #計算每種指標的權重
62 wi=(1-ej)/np.sum(1-ej) 63
64 wi_list=list(wi) 65
66
67 return wi_list 68
69
70
71 if __name__ == '__main__': 72
73
74 data0 = pd.read_excel("C:\\Users\\Oreo\\Desktop\\test2.xlsx", encoding='utf8') 75
76 data = data0.iloc[:, 1:10] 77 mm=data 78 wi_list=get_entropy_weight(data) 79 score_list=get_score(mm,wi_list) 80 mm['score']=score_list 81 mm['科室']=data0['科室'] 82 # 然后對數據框按得分從大到小排序
83 result = mm.sort_values(by='score', axis=0, ascending=False) 84 result['rank'] = range(1, len(result) + 1) 85
86 print(result) 87
88 # 寫出csv數據
89 result.to_csv('C:\\Users\\Oreo\\Desktop\\test2_result.csv', index=False)
數據結果:

GitHub地址
參考鏈接
