python 基於熵值法進行綜合評價


    在多指標的綜合加權評價中,確定各項指標的權重是非常關鍵的環節。對各指標賦權的合理與否,直接關系到分析的結論。確定權重系數的方法很多,歸納起來分為兩類:即主觀賦權法和客觀賦權法。主觀賦權法是由評價人員根據各項指標的重要性而認為賦權的一種方法,充分反應專家的經驗,目前,使用較多的是專家咨詢法、層次分析法、循環打分法等。客觀賦權法是從實際數據出發,利用指標值所反應的客觀信息確定權重的一種方法,如熵值法、銀子分析法、主成分分析、均方差法、相關系數法等。本文主要介紹熵值法進行綜合評價,並使用Python進行實現。

1.賦權方法介紹

    熵最早是一個物理熱力學概念,是指在一定條件下對無序或隨機變量計算不能做功的一種熱能單位。通過這種測算方法,衍生出一種數學計算方法即熵值法,用以計算某些指標所反映出的權重,用來確定某些指標的離散性,從而對多種的指標數據進行綜合性的評定和分析,進而確定其最具影響力的指標因素,為決策提供一定的參考依據。

    熵值最早由申農(Shannon)將其引入信息論計算,信息是系統對有序數據的衡定,熵值是對不確定指標或無序指標的衡定,兩者在結果互為相反數。由此,可以通過信息和熵的計算和分析得出,熵與信息的無序性構成正比例關系,和權重值構成成反比例關系。利用權重指標的變異程度的特性,可以計算並確定其指標權重的大小,從而能對研宄對象開展比較客觀的評價。熵值法還能夠在計算評定過程中剔除對整體評價影響不大的權重指標,能夠更好地提高評價的准確性。

2.引入案例

設有以下模型,3層系統,15各原始指標,其中8個正向指標,6個負向指標,1個中性指標。使用熵值法進行賦權評價。

 

 3.具體操作

1.數據標准化(歸一化)

    假設有m期數據,則設原始數據矩陣為X=(xi)m*n,其中m為樣本容量n為指標個數,xij為第i個樣本的第j個指標值。為了消除各指標的量綱、數量級及指標的正負取向有差異所帶來的不可公度性,分析之前須將初始評價指標xij進行標准化。

     對於正向指標處理:

 

     

 

     對於負向指標:

     

 

     對於中性指標:

    

 

     上式中,yij代表無量綱化后數據,經過無量綱化的數據都落到了[0,1]區間,yij值越大,說明評價結果越高。

2.非負平移處理

    由於部分數據在無量綱化處理后為零或負值,為了便面在熵值求權數時取對數無意義,需要對數據進行處理。這里采取平移法。

    zij=yij+1 (i=1,2,...m;j=1,2,...n)

3.求各指標在各方案下的比值

    

 

 4.求各指標的信息熵

 

 5.求各指標的效用

     gj=1 - ej ,(j = 1,2,...,n)

 6.求各指標權重

    

 

 4.具體實現

4.1數據讀取

df_src = pd.read_excel('data.xls', skiprows=1,dtype=object)
df_src = df_src.set_index('date')
df_src.index = pd.to_datetime(df_src.index, format='%Y%m%d').date
# 正向指標
l_target_positive = ['x4','x5','x10','x11','x12','x13','x14','x15']
# 反向指標
l_target_negative = ['x1','x3','x6','x7','x8','x9']
# 中性指標
l_target_middle = ['x2']

l_target_economy = ['x1','x2','x3','x4'] # r1指標
l_target_finance = ['x5','x6','x7'] # r2指標
l_target_self = ['x8','x9','x10','x11','x12','x13','x14','x15'] # r3指標

4.2無量綱化

# 熵值法-正向指標處理
def normalize_entropy_positive(data, train_split):
    data_max = data[:train_split].max(axis=0)
    data_min = data[:train_split].min(axis=0)
    return (data - data_min) / (data_max-data_min)
# data:數據
# train_split訓練集索引
# 熵值法-負向指標處理
def normalize_entropy_negative(data, train_split):
    data_max = data[:train_split].max(axis=0)
    data_min = data[:train_split].min(axis=0)
    return (data_max - data) / (data_max-data_min)

# 熵值法-中性指標處理
def normalize_entropy_middle(data, train_split):
    data_mean = data[:train_split].mean(axis=0)
    data_max = data[:train_split].max(axis=0)
    data_min = data[:train_split].min(axis=0)
    
    new_data = data.copy()
    new_data[data<data_mean] = (data - data_min) / (data_mean-data_min)
    new_data[data>=data_mean] = (data_max - data) / (data_max-data_mean)
    return new_data
df = df_src.copy()
df[l_target_positive] = normalize_entropy_positive(df[l_target_positive],len(df))
df[l_target_negative] = normalize_entropy_negative(df[l_target_negative],len(df))
df[l_target_middle] = normalize_entropy_middle(df[l_target_middle],len(df))

4.3 非負平移

df = df + 1

4.4 求各指標在各方案下的比值

# 熵值法-計算比重
def normalize_entropy_calculate_frequency(data, train_split):
    data_sum = data[:train_split].sum(axis=0)
    return data / data_sum

df = normalize_entropy_calculate_frequency(df,len(df))

4.5 求各指標信息熵、效用、權重

# 計算指標熵值,效用,權重
def cal_entropy(x):
    m = len(x)
    r1 = -1/np.log(m) * np.sum(x * x.map(np.log))
    r2 = 1-r1
    return (r1,r2)
df_entropy = df.apply(cal_entropy, axis=0,result_type='expand').T
df_entropy.columns = ['信息熵','效用值']
df_entropy['權重'] = df_entropy['效用值']/np.sum(df_entropy['效用值'])

4.6 計算綜合指標權重

層級關系如下,相加得出權重。

l_target_economy = ['x1','x2','x3','x4'] # r1指標
l_target_finance = ['x5','x6','x7'] # r2指標
l_target_self = ['x8','x9','x10','x11','x12','x13','x14','x15'] # r3指標
# 計算綜合指標權重
df_out2 = df_entropy['權重'].to_frame().T
df_out2['r1'] = df_out2[l_target_economy].sum(axis=1)
df_out2['r2'] = df_out2[l_target_finance].sum(axis=1)
df_out2['r3'] = df_out2[l_target_self].sum(axis=1)

4.7 計算綜合得分

# 計算分指標綜合得分
df_out = df * df_entropy['權重'].T

df_out['r1'] = df_out[l_target_economy].sum(axis=1)
df_out['r2'] = df_out[l_target_finance].sum(axis=1)
df_out['r3'] = df_out[l_target_self].sum(axis=1)
df_out['r4'] = df_out[l_target_economy+l_target_finance+l_target_self].sum(axis=1)

小結

各類賦權方法的科學性,統計學屆還在探討,居中的方法就是,使用主觀賦權和客觀賦權相互應征。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM