数据综合评价方法盘点:从原理到实践(一)熵值法

熵值法

原理

熵值法是一种基于信息熵的客观赋权方法。啥是信息熵呢?简单来说,它是衡量信息不确定性的一个指标。在数据综合评价里,如果某个指标的信息熵越小,那就意味着这个指标在不同样本之间的差异越大,提供的信息量也就越多,在综合评价里的重要性就更高,权重自然也得给它加大;反之,信息熵大,权重就小。

在数据综合评价领域,信息熵的概念有着重要应用。如果某个指标的信息熵越小,意味着该指标在不同样本之间的差异越大。例如,在评估学生成绩时,“考试成绩”这个指标可能在不同学生之间差异较大,信息熵就小,说明这个指标能提供较多区分学生水平的信息,在综合评价中就更为重要,赋予的权重也就应该更大;反之,如果某个指标在不同样本间差异不大,信息熵大,那么它在综合评价中的权重就小。

实现路径

  1. 数据标准化: 原始数据通常具有不同的量纲和数量级,这会对评价结果产生干扰。为了消除这些影响,需要对数据进行标准化处理。常用的方法是极差标准化。

    • 对于正向指标(指标值越大越好的指标),计算公式为:xij=xijmin(xj)max(xj)min(xj)x_{ij}^* = \frac{x_{ij} - \min(x_j)}{\max(x_j) - \min(x_j)}。其中,xijx_{ij}表示第ii个样本的第jj个指标值,xijx_{ij}^*表示标准化后的数值。例如,在评估学生成绩时,“考试成绩”是正向指标,通过这个公式可以将不同学生的成绩标准化到[0,1][0, 1]区间。
    • 对于负向指标(指标值越小越好的指标),计算公式为:xij=max(xj)xijmax(xj)min(xj)x_{ij}^* = \frac{\max(x_j) - x_{ij}}{\max(x_j) - \min(x_j)}
  2. 计算比重: 在数据标准化后,需要计算每个样本在各指标下的比重。计算公式为:pij=xiji=1nxijp_{ij} = \frac{x_{ij}^*}{\sum_{i = 1}^{n}x_{ij}^*}。这里,nn是样本数量,pijp_{ij}表示第jj项指标下第ii个样本的比重。例如,假设有三个学生,在“考试成绩”这一指标下,经过标准化后,他们的成绩分别为0.50.50.60.60.70.7,那么第一个学生在“考试成绩”指标下的比重就是0.5/(0.5+0.6+0.7)0.5 / (0.5 + 0.6 + 0.7)

  3. 计算熵值: 通过比重来计算每个指标的熵值,公式为:ej=ki=1npijln(pij)e_j = -k \sum_{i = 1}^{n}p_{ij} \ln(p_{ij}),其中k=1ln(n)k = \frac{1}{\ln(n)}。熵值反映了指标的信息不确定性程度。

  4. 计算差异系数: 为了更直观地体现各指标在评价中的相对重要性差异,计算差异系数gj=1ejg_j = 1 - e_j。差异系数越大,说明该指标在评价中的相对重要性越高。

  5. 计算权重: 根据差异系数计算各指标的权重,公式为:wj=gjj=1mgjw_j = \frac{g_j}{\sum_{j = 1}^{m}g_j}mm是指标数量。wjw_j就是第jj项指标的权重。

  6. 计算综合得分: 最后,通过权重和标准化后的数据计算每个样本的综合得分,公式为:Si=j=1mwjxijS_i = \sum_{j = 1}^{m}w_j x_{ij}^*

Python 实现代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import numpy as np


def entropy_weight_method(data):
# 数据标准化
data = (data - data.min(axis = 0)) / (data.max(axis = 0) - data.min(axis = 0))
# 计算比重
p = data / data.sum(axis = 0)
# 计算熵值
e = -np.sum(p * np.log(p) / np.log(data.shape[0]), axis = 0)
# 计算差异系数
g = 1 - e
# 计算权重
w = g / g.sum()
# 计算综合得分
score = np.dot(data, w)
return w, score


# 示例数据
data = np.array([[10, 20, 30],
[15, 25, 35],
[20, 30, 40]])

weights, scores = entropy_weight_method(data)
print("权重:", weights)
print("综合得分:", scores)

优劣势

  • 优势
    • 客观公正:熵值法完全基于数据本身的信息来确定权重,避免了人为因素的主观干扰,使得评价结果具有较高的可信度和可靠性。在一些对公平性要求较高的评价场景中,如科研成果评价、企业绩效评估等,这种客观性尤为重要。
    • 计算简单:整个计算过程主要涉及基本的数学运算和矩阵操作,不需要复杂的数学模型和算法,容易理解和实现。对于初学者和非专业的数据分析人员来说,也能够快速掌握和应用。
    • 数据适应性强:对数据的分布没有严格要求,无论是正态分布、偏态分布还是其他不规则分布的数据,都能进行有效的处理。这使得熵值法在实际应用中具有更广泛的适用性。
  • 劣势
    • 信息利用有限:熵值法只考虑了指标数据的离散程度,即各样本在指标上的差异情况,而没有考虑指标之间的相关性。在实际问题中,很多指标之间可能存在一定的关联关系,忽略这些相关性可能会导致遗漏一些重要信息,影响评价结果的全面性和准确性。
    • 数据质量依赖高:该方法对数据质量要求较高。如果数据存在缺失值或者异常值,会对熵值计算和权重确定产生较大影响,进而导致评价结果不准确。例如,在数据收集过程中,如果某个样本的某个指标值记录错误或缺失,可能会使该指标的熵值计算出现偏差,最终影响整体的权重分配和综合得分。

具体案例

假设一家电商平台要评估三家入驻商家的综合实力,评价指标有商品销量、好评率、店铺活跃度。收集到的数据如下:

商家 商品销量 好评率 店铺活跃度
商家 A 1000 0.9 80
商家 B 1500 0.85 90
商家 C 2000 0.8 100

首先,将这些数据整理成矩阵形式:

1
2
3
data = np.array([[1000, 0.9, 80],
[1500, 0.85, 90],
[2000, 0.8, 100]])

然后,按照熵值法的步骤进行计算:

  1. 数据标准化
    • 对于商品销量(正向指标):
      • 最小值为 min(1000,1500,2000)=1000\min(1000, 1500, 2000) = 1000,最大值为 max(1000,1500,2000)=2000\max(1000, 1500, 2000) = 2000
      • 商家 A 的标准化值为 (10001000)/(20001000)=0(1000 - 1000) / (2000 - 1000) = 0
      • 商家 B 的标准化值为 (15001000)/(20001000)=0.5(1500 - 1000) / (2000 - 1000) = 0.5
      • 商家 C 的标准化值为 (20001000)/(20001000)=1(2000 - 1000) / (2000 - 1000) = 1
    • 对于好评率(正向指标):
      • 最小值为 min(0.9,0.85,0.8)=0.8\min(0.9, 0.85, 0.8) = 0.8,最大值为 max(0.9,0.85,0.8)=0.9\max(0.9, 0.85, 0.8) = 0.9
      • 商家 A 的标准化值为 (0.90.8)/(0.90.8)=1(0.9 - 0.8) / (0.9 - 0.8) = 1
      • 商家 B 的标准化值为 (0.850.8)/(0.90.8)=0.5(0.85 - 0.8) / (0.9 - 0.8) = 0.5
      • 商家 C 的标准化值为 (0.80.8)/(0.90.8)=0(0.8 - 0.8) / (0.9 - 0.8) = 0
    • 对于店铺活跃度(正向指标):
      • 最小值为 min(80,90,100)=80\min(80, 90, 100) = 80,最大值为 max(80,90,100)=100\max(80, 90, 100) = 100
      • 商家 A 的标准化值为 (8080)/(10080)=0(80 - 80) / (100 - 80) = 0
      • 商家 B 的标准化值为 (9080)/(10080)=0.5(90 - 80) / (100 - 80) = 0.5
      • 商家 C 的标准化值为 (10080)/(10080)=1(100 - 80) / (100 - 80) = 1

标准化后的数据矩阵为:

1
2
3
data_std = np.array([[0, 1, 0],
[0.5, 0.5, 0.5],
[1, 0, 1]])

  1. 计算比重
    • 对于商品销量指标:
      • 商家 A 的比重为 0/(0+0.5+1)=00 / (0 + 0.5 + 1) = 0
      • 商家 B 的比重为 0.5/(0+0.5+1)=0.3330.5 / (0 + 0.5 + 1) = 0.333(保留三位小数)。
      • 商家 C 的比重为 1/(0+0.5+1)=0.6671 / (0 + 0.5 + 1) = 0.667(保留三位小数)。
    • 对于好评率指标:
      • 商家 A 的比重为 1/(1+0.5+0)=0.6671 / (1 + 0.5 + 0) = 0.667(保留三位小数)。
      • 商家 B 的比重为 0.5/(1+0.5+0)=0.3330.5 / (1 + 0.5 + 0) = 0.333(保留三位小数)。
      • 商家 C 的比重为 0/(1+0.5+0)=00 / (1 + 0.5 + 0) = 0
    • 对于店铺活跃度指标:
      • 商家 A 的比重为 0/(0+0.5+1)=00 / (0 + 0.5 + 1) = 0
      • 商家 B 的比重为 0.5/(0+0.5+1)=0.3330.5 / (0 + 0.5 + 1) = 0.333(保留三位小数)。
      • 商家 C 的比重为 1/(0+0.5+1)=0.6671 / (0 + 0.5 + 1) = 0.667(保留三位小数)。

比重矩阵为:

1
2
3
p = np.array([[0, 0.667, 0],
[0.333, 0.333, 0.333],
[0.667, 0, 0.667]])

  1. 计算熵值
    • 商品销量指标的熵值:
      • k=1/ln(3)0.910k = 1 / \ln(3) \approx 0.910 (保留三位小数)。
      • e1=0.910×(0×ln(0)+0.333×ln(0.333)+0.667×ln(0.667))0.811e_1 = -0.910 \times (0 \times \ln(0) + 0.333 \times \ln(0.333) + 0.667 \times \ln(0.667)) \approx 0.811 (保留三位小数)。这里 ln(0)\ln(0) 在实际计算中按照极限处理为 0。
    • 好评率指标的熵值:
      • e2=0.910×(0.667×ln(0.667)+0.333×ln(0.333)+0×ln(0))0.811e_2 = -0.910 \times (0.667 \times \ln(0.667) + 0.333 \times \ln(0.333) + 0 \times \ln(0)) \approx 0.811 (保留三位小数)。
    • 店铺活跃度指标的熵值:
      • e3=0.910×(0×ln(0)+0.333×ln(0.333)+0.667×ln(0.667))0.811e_3 = -0.910 \times (0 \times \ln(0) + 0.333 \times \ln(0.333) + 0.667 \times \ln(0.667)) \approx 0.811 (保留三位小数)。

熵值向量为:

1
e = np.array([0.811, 0.811, 0.811])

  1. 计算差异系数
    • 商品销量指标的差异系数:g1=10.811=0.189g_1 = 1 - 0.811 = 0.189
    • 好评率指标的差异系数:g2=10.811=0.189g_2 = 1 - 0.811 = 0.189
    • 店铺活跃度指标的差异系数:g3=10.811=0.189g_3 = 1 - 0.811 = 0.189

差异系数向量为:

1
g = np.array([0.189, 0.189, 0.189])

  1. 计算权重
    • 总差异系数为 0.189+0.189+0.189=0.5670.189 + 0.189 + 0.189 = 0.567
    • 商品销量指标的权重:w1=0.189/0.567=0.333w_1 = 0.189 / 0.567 = 0.333(保留三位小数)。
    • 好评率指标的权重:w2=0.189/0.567=0.333w_2 = 0.189 / 0.567 = 0.333(保留三位小数)。
    • 店铺活跃度指标的权重:w3=0.189/0.567=0.333w_3 = 0.189 / 0.567 = 0.333(保留三位小数)。

权重向量为:

1
w = np.array([0.333, 0.333, 0.333])

  1. 计算综合得分
    • 商家 A 的综合得分:S1=0×0.333+1×0.333+0×0.333=0.333S_1 = 0 \times 0.333 + 1 \times 0.333 + 0 \times 0.333 = 0.333(保留三位小数)。
    • 商家 B 的综合得分:S2=0.5×0.333+0.5×0.333+0.5×0.333=0.5S_2 = 0.5 \times 0.333 + 0.5 \times 0.333 + 0.5 \times 0.333 = 0.5
    • 商家 C 的综合得分:S3=1×0.333+0×0.333+1×0.333=0.667S_3 = 1 \times 0.333 + 0 \times 0.333 + 1 \times 0.333 = 0.667(保留三位小数)。

综合得分向量为:

1
scores = np.array([0.333, 0.5, 0.667])

综上,商品销量、好评率、店铺活跃度的权重分别是0.3330.3330.3330.3330.3330.333,商家 A、B、C 的综合得分分别是0.3330.3330.50.50.6670.667。根据这些得分,商家 C 的综合实力最强,其次是商家 B,最后是商家 A。电商平台可以根据这些结果进行资源分配、推荐策略等决策。