面板数据熵值法
本文主要是讲解熵值法的处理过程和代码实现。
建立指标体系和指标评价时有可能用到熵值法(熵权法),但以往的经验来看,熵值法常用于时序数据或者是截面数据。实际上,熵值法在面板数据的应用也是十分常见,但很多时候在数据的处理上各种论文的做法有所不同。本文提供一种常用的面板数据熵值法,给大家提供参考。
一、原始数据设定
- 假设数据为
d
个年度(year)m
个省份(prov)的n
个指标。 - 显然数据是
(d, m, n)
三维数组,但.csv
存储数据一般是二维表,因此实际取得的数据是(d*m, n)
的二维数组 - X θ i j X_{\theta i j} Xθij 表示第 θ \theta θ 年省份 i i i 的第 j j j 个指标值。
二、数据标准化
-
这里采用的是极差标准化,注意这里的最值取的是某一指标下所有年度所有省份的最值。
-
正向指标和负向指标采用的方法有所不同:
X θ i j ′ = { X θ i j − min ( X θ i j ) max ( X θ i j ) − min ( X θ i j ) 第 j 个指标为正向指标 max ( X θ i j ) − X θ i j max ( X θ i j ) − min ( X θ i j ) 第 j 个指标为负向指标 X'_{\theta i j} = \left\{\begin{matrix} \frac{X_{\theta i j} - \min(X_{\theta i j})} {\max(X_{\theta i j}) - \min(X_{\theta i j})} & 第j个指标为正向指标 \\ \frac{\max(X_{\theta i j}) - X_{\theta i j}} {\max(X_{\theta i j}) - \min(X_{\theta i j})} & 第j个指标为负向指标 \end{matrix}\right. Xθij′={max(Xθij)−min(Xθij)Xθij−min(Xθij)max(Xθij)−min(Xθij)max(Xθij)−Xθij第j个指标为正向指标第j个指标为负向指标 -
注意:极差标准化后会生成0的数据,需要对此作数据平移。
-
这里计算得到的 X ′ = [ X θ i j ] ( d × m ) × n X' = [X_{\theta i j}]_{(d \times m) \times n} X′=[Xθij](d×m)×n 是一个二维数组。
三、几率(比重)计算
-
这里计算的是第 θ \theta θ 年省份 i i i 的第 j j j 个指标值在第 j j j 个指标下的占比。
P θ i j = X θ i j ′ ∑ θ = 1 d ∑ i = 1 m X θ i j ′ P_{\theta i j} = \frac{X'_{\theta i j}} {\sum\limits_{\theta=1}^{d}\sum\limits_{i=1}^{m}X'_{\theta i j}} Pθij=θ=1∑di=1∑mXθij′Xθij′ -
这里计算得到的 P = [ P θ i j ] ( d × m ) × n P = [P_{\theta i j}]_{(d \times m) \times n} P=[Pθij](d×m)×n 是一个二维数组。
四、信息熵计算
-
计算第 j j j 个指标对应的信息熵
E j = − 1 ln ( d m ) ∑ θ = 1 d ∑ i = 1 m [ P θ i j ⋅ ln ( P θ i j ) ] E_j = - \frac{1}{\ln(dm)} \sum\limits_{\theta = 1}^{d}\sum\limits_{i = 1}^{m} [P_{\theta i j}\cdot \ln(P_{\theta i j})] Ej=−ln(dm)1θ=1∑di=1∑m[Pθij⋅ln(Pθij)] -
这里计算得到的 E = [ E j ] n × 1 E = [E_j]_{n \times 1} E=[Ej]n×1 是一个二维数组。
五、权重计算
-
计算第 j j j 项指标的差异系数
G j = 1 − E j G_j = 1 - E_j Gj=1−Ej -
计算第 j j j 项指标的权重
W j = G j ∑ j = 1 n G j W_j = \frac{G_j}{\sum\limits_{j=1}^{n}G_j} Wj=j=1∑nGjGj -
这里计算得到的 W = [ W j ] n × 1 W = [W_j]_{n \times 1} W=[Wj]n×1 是一个二维数组。
六、综合得分计算
-
计算第 θ \theta θ 年第 i i i 个省的综合得分
Z θ i = ∑ j = 1 n ( W j ⋅ X θ i j ′ ) Z = X ′ ⋅ W \begin{aligned} Z_{\theta i} &= \sum\limits_{j = 1}^{n} (W_j \cdot X'_{\theta i j}) \\ Z &= X' \cdot W \end{aligned} ZθiZ=j=1∑n(Wj⋅Xθij′)=X′⋅W -
这里最终计算得到的 Z = [ Z θ i ] ( d × m ) × 1 Z = [Z_{\theta i}]_{(d \times m) \times 1} Z=[Zθi](d×m)×1 是同样是一个二维数组。
七、Python代码实现(更新于2021.12.19)
- 下面的代码输出的结果包括:标准化后的数据,指标权重和得分。如果后续想要用Topsis法,可以直接使用标准化后的数据进行下一轮计算。
- 代码中是基于上面原始数据的假定设定的,代码内容修改需要看具体的数据情况。
- 注:2021年12月19日对“极差标准化”部分作了修改,原代码存在错误,造成数据异常变动。
import pandas as pd
import numpy as np
# 熵值法
def entropy_method(data_, features_, m_, d_, ne_features_=None, zero_offset=1e-6):
"""
data_:DataFrame类型,数据集(需要包含年份year)
features_:List类型,变量名列表
ne_features_:List类型,负向指标变量名列表
m_:int类型,省份数量
d_: int类型,年份数量
zero_offset: float类型, 最小值平移数
"""
# 极差标准化
normal_data_ = data_.copy()
for feature_ in features_:
# 该部分是固定某指标下的最值,用于标准化处理(2021.12.19)
normal_data_min = min(normal_data_.loc[:, feature_])
normal_data_max = max(normal_data_.loc[:, feature_])
for year_ in normal_data_['year'].unique():
# 原代码中该部分存在错误,标准化时发生变动,数据不具有可比性
# normal_data_min = min(normal_data_.loc[:, feature_])
# normal_data_max = max(normal_data_.loc[:, feature_])
if ne_features_ and feature_ in ne_features_:
temp = normal_data_max - normal_data_.loc[normal_data_['year'] == year_, feature_]
else:
temp = normal_data_.loc[normal_data_['year'] == year_, feature_] - normal_data_min
temp = temp / (normal_data_max - normal_data_min)
normal_data_.loc[normal_data_['year'] == year_, feature_] = temp
# 最小值平移处理
for feature_ in features_:
normal_data_.loc[normal_data_[feature_] == 0, feature_] = zero_offset
# 计算指标比重
pro_data_ = normal_data_.copy()
for feature_ in features_:
index_ = pro_data_.loc[:, feature_] / sum(pro_data_.loc[:, feature_])
pro_data_.loc[:, feature_] = index_
# 计算信息熵
entropy_ = np.arange(len(features_)).astype(float) # 注意初始化需要设定为浮点型
for ind_, feature_ in enumerate(features_):
entropy_[ind_] = (- 1 / np.log(m_ * d_)) * sum(pro_data_[feature_] * np.log(pro_data_[feature_]))
# 权重计算
g_ = 1 - entropy_ # 计算变异系数
w_ = g_ / sum(g_) # 计算权重
# 综合得分计算
score_ = np.dot(normal_data_.loc[:, features_], w_)
# 汇总信息输出
res_ = dict()
res_['normal_data'] = normal_data_
res_['weight'] = pd.DataFrame(data=w_, index=features_)
res_['score'] = pd.DataFrame(data=score_)
return res_
参考资料
[1]王晓红,李雅欣.数字经济对经济高质量发展的影响研究——基于2013-2018年省级面板数据[J].经济视角,2021,40(01):44-53.
[2]贺健,张红梅.数字普惠金融对经济高质量发展的地区差异影响研究——基于系统GMM及门槛效应的检验[J].金融理论与实践,2020(07):26-32.