🌈🌈🌈往期精选内容:
💖【数学建模】TOPSIS算法全解析:从数学原理到医疗器械采购决策应用-优快云博客
💖【数学建模】层次分析法(AHP):从理论到实战的全面解析_层次分析法计-优快云博客
💖【数学建模】图论模型:从Dijkstra算法到最小费用最大流实战-优快云博客
💖【数学建模】主成分分析(PCA)详解:从理论到实践的全面指南-优快云博客
💖【数学建模】数据拟合与插值技术全解析:从线性插值到Logistic模型实战优快云博客
💖【数学建模】熵权法——基于2021全国大学生数学建模C题供应商评价数学建模实战-优快云博客
💖MNIST手写数字识别——基于PyTorch的MLP模型的Python代码-优快云博客
CRITIC权重法解析:从数学原理到实战分析
💖 引言
在多指标决策分析中,如何科学地确定各指标的权重是关键问题。主观赋权法(如层次分析法)依赖专家经验,可能引入人为偏差;而传统客观赋权法(如熵权法)仅考虑数据离散性,忽略了指标间的关联性。CRITIC
权重法作为一种改进的客观赋权方法,通过同时衡量指标的对比强度(数据波动性)和冲突性(指标间相关性),能更全面地反映数据内在信息,广泛应用于经济学、管理学、医学等领域。本文将系统解析其原理、应用场景及实现方法,并附Python
代码示例。
📚 一、CRITIC权重法
🚀 1.1、 概念定义
CRITIC
方法Criteria Importance Through Intercriteria Correlation
)是由Diakoulaki
于1995年提出的一种客观权重赋权法,是一种比熵权法和标准离差法更好的赋权法。它是基于评价指标的对比强度和指标之间的冲突性来综合衡量指标的客观权重。考虑指标变异性大小的同时兼顾指标之间的相关性,并非数字越大就说明越重要,完全利用数据自身的客观属性进行科学评价。对比强度是指同一个指标各个评价方案之间取值差距的大小,以标准差的形式来表现。标准差越大,说明波动越大,即各方案之间的取值差距越大,权重会越高;指标之间的冲突性,用相关系数进行表示,若两个指标之间具有较强的正相关,说明其冲突性越小,权重会越低。对于 CRITIC
法而言,在标准差一定时,指标间冲突性越小,权重也越小;冲突性越大,权重也越大;另外,当两个指标间的正相关程度越大时,(相关系数越接近 1),冲突性越小,这表明这两个指标在评价方案的优劣上反映的信息有较大的相似性。
🚀 1.2、 应用场景
CRITIC
法适用于以下场景:
- 指标间存在相关性:如医院科室综合评价(出院人数、床位使用率等关联指标)。
- 需兼顾稳定性与独立性:如城市可持续发展评估(经济、环境、社会指标既相关又需独立分析)。
- 数据波动性显著:如客户信用评分(收入、负债等指标离散程度差异大)。
🚀 1.3、 使用条件
• 数据需无量纲化:建议采用正向化/逆向化处理,避免标准化导致标准差统一化。
• 样本量适中:过少可能导致相关系数不稳定,一般要求样本量≥10。
• 指标类型兼容:支持混合型指标(正向、负向、区间型),需提前统一方向。
📚 二、数学原理与数据处理
🚀 2.1、 数据正向化
• 正向指标(越大越好):
x
i
j
′
=
x
i
j
−
min
(
x
j
)
max
(
x
j
)
−
min
(
x
j
)
x'_{ij} = \frac{x_{ij} - \min(x_j)}{\max(x_j) - \min(x_j)}
xij′=max(xj)−min(xj)xij−min(xj)
• 负向指标(越小越好):
x
i
j
′
=
max
(
x
j
)
−
x
i
j
max
(
x
j
)
−
min
(
x
j
)
x'_{ij} = \frac{\max(x_j) - x_{ij}}{\max(x_j) - \min(x_j)}
xij′=max(xj)−min(xj)max(xj)−xij
注意:
-
避免使用标准化(
Z-score
),因其会消除标准差差异。 -
若是各个指标之间的单位和量级(即计量指标的数量级)不同,在进行分析前需要自行对数据进行归一化
-
数据单位和量级差不多,也可以直接计算,结果相差不大
🚀 2.2、指标变异性
以标准差的形式来表现变异性,
S
j
Sj
Sj 表示第
j
j
j 个指标的标准差
x
ˉ
j
=
1
n
∑
i
=
1
n
x
i
j
S
j
=
∑
i
=
1
n
(
x
i
j
−
x
ˉ
j
)
2
n
−
1
\bar{x}_j = \frac{1}{n} \sum_{i=1}^n x_{ij} \\ S_j = \sqrt{\frac{\sum_{i=1}^n (x_{ij} - \bar{x}_j)^2}{n-1}}
xˉj=n1i=1∑nxijSj=n−1∑i=1n(xij−xˉj)2
其中, n n n 为样本数, x ˉ j \bar{x}_j xˉj 为指标j的均值。
🚀 2.3、计算冲突性(相关系数)
r i j = ∑ k = 1 n ( x k i − x ˉ i ) ( x k j − x ˉ j ) ∑ k = 1 n ( x k i − x ˉ i ) 2 ∑ k = 1 n ( x k j − x ˉ j ) 2 r_{ij} = \frac{\sum_{k=1}^{n} (x_{ki} - \bar{x}_i)(x_{kj} - \bar{x}_j)}{\sqrt{\sum_{k=1}^{n} (x_{ki} - \bar{x}_i)^2 \sum_{k=1}^{n} (x_{kj} - \bar{x}_j)^2}} rij=∑k=1n(xki−xˉi)2∑k=1n(xkj−xˉj)2∑k=1n(xki−xˉi)(xkj−xˉj)
R j = ∑ i = 1 P ( 1 − ∣ r i j ∣ ) R_j = \sum_{i=1}^P (1 - | r_{ij} |) Rj=i=1∑P(1−∣rij∣)
以相关系数的形式来表现冲突性, n n n为样本数, m m m是指标数量 r i j r_{ij} rij表示评价指标 i i i和 j j j 之间的相关系数
🚀 2.4、计算信息量
C j = S j ∑ i = 1 p ( 1 − r i j ) = S j × R j C_j = S_j \sum_{i=1}^{p} (1 - r_{ij}) = S_j \times R_j Cj=Sji=1∑p(1−rij)=Sj×Rj
C j C_j Cj越大,第 j j j 个评价指标在整个评价指标体系中的作用越大,就应该给其分配更多的权重。
🚀 2.5、计算权重
第 j j j个指标的客观权重 W j W_j Wj
W j = C j ∑ j = 1 p C j W_j = \frac{C_j}{\sum_{j=1}^{p} C_j} Wj=∑j=1pCjCj
📚 三、案例分析
🚀 3.2 案例说明
本文使用SPSSPRO官网示例作为例子,来进行分析。
案例:数据是 100 个客户的各方面(能力,品格,担保,资本,环境)评分,利用 CRITIC
权重法来计算各个变量(能力,品格,担保,资本,环境)的重要性,即所占的权重。
(注意:若是各个指标之间的单位和量级(即计量指标的数量级)不同,在进行分析前需要自行对数据进行归一化)。
SPSSPRO
官网的案例分析没有归一化直接计算,而是进行了直接计算,案例对比了是否进行归一化两种结果,分析使用归一化的情形和必要性,详细见结论。也可参考SPSSPRO
对CRITIC
权重法的讲解[1]综合分析。
数据获取:见[1]网页中下载。
🚀 3.2 计算结果
根据CRITIC
法计算得到的各指标权重如下表所示:
不进行归一化结果:
项 | 指标变异性 | 指标冲突性 | 信息量 | 权重 |
---|---|---|---|---|
能力 | 2.035 | 1.292 | 2.63 | 0.197 |
品格 | 2.31 | 1.271 | 2.936 | 0.22 |
担保 | 1.446 | 1.274 | 1.841 | 0.138 |
资本 | 1.963 | 1.389 | 2.727 | 0.204 |
环境 | 1.29 | 2.483 | 3.204 | 0.24 |
进行归一化结果:
项 | 指标变异性 | 指标冲突性 | 信息量 | 权重 |
---|---|---|---|---|
能力 | 0.174 | 1.292 | 0.225 | 0.14 |
品格 | 0.196 | 1.271 | 0.249 | 0.155 |
担保 | 0.199 | 1.274 | 0.253 | 0.157 |
资本 | 0.221 | 1.389 | 0.307 | 0.19 |
环境 | 0.232 | 2.483 | 0.575 | 0.357 |
🚀 3.3 结论
使用Critic
客观赋权法时,以上计算结果归一化与不归一化结果差异较大的问题,需结合数据特性和研究目标考虑。
原因分析:
数据均在60-70分之间(理论范围0-100),但实际范围可能因指标而异。各指标的实际最大值与最小值不同,最大最小归一化会改变标准差的相对比例,从而影响权重。
选择建议
- 不归一化的情况:
- 若各指标的实际范围差异反映了真实差异(如某指标区分度更高),且这种差异需体现在权重中。
- 保留原始标准差信息,认为数据波动性直接影响指标重要性。
- 归一化的情况:
- 若各指标范围差异由主观打分习惯或数据采集偏差导致,需消除这种影响。
- 希望所有指标在同一尺度下公平比较,避免范围差异主导权重。
建议优先基于实际范围正确归一化。
🚀 3.4 Python代码实现
import pandas as pd
import numpy as np
def critic_weight(data, kind):
# 数据正向化
# normalized = np.zeros_like(data)
normalized = data
for i in range(data.shape[1]):
col = data[:, i]
min_val, max_val = np.min(col), np.max(col)
if kind[i] == '1': # 正向指标
normalized[:, i] = (col - min_val) / (max_val - min_val)
else: # 负向指标
normalized[:, i] = (max_val - col) / (max_val - min_val)
# 计算对比强度(标准差)
std = np.std(normalized, axis=0)
# 计算冲突性(相关系数)
corr = np.corrcoef(normalized.T)
conflict = np.sum(1 - np.abs(corr), axis=1)
# 计算信息承载量与权重
info = std * conflict
weights = info / np.sum(info)
return std, conflict, info, weights
# 读取数据
data = pd.read_excel('./CRITIC权重法.xlsx').values
# 指标类型(假设所有指标都是正向指标)
kind = ['1', '1', '1', '1', '1'] # 根据实际情况调整
# 计算权重
std, conflict, info, weights = critic_weight(data, kind)
# 创建结果表格
results = pd.DataFrame({
'项': ['能力', '品格', '担保', '资本', '环境'],
'指标变异性': np.round(std, 3),
'指标冲突性': np.round(conflict, 3),
'信息量': np.round(info, 3),
'权重': np.round(weights, 3)
})
# 打印结果表格
results