直接开工。指标权重计算这件事,我在实际项目里做过不少轮,从最早用熵权法,到后来接触CRITIC法,再到把两者结合对比,一路踩过不少坑。今天专门聊聊CRITIC法,从一个完整的实际案例出发,把原理、计算步骤、Python代码和可视化展示全部串起来,最后再分享几个容易翻车的细节。
1. 为什么选CRITIC法而不是其他赋权法
做过多指标评价的朋友应该都有体会,赋权方法选不对,后面的结论全是空中楼阁。CRITIC法全称是Criteria Importance Through Intercriteria Correlation,翻译过来叫“基于指标相关性的标准间重要性确定法”。第一次听到这个名字,可能觉得有点绕,但拆开看就清楚了:它同时考虑了指标的变异程度和指标之间的冲突性,这两个维度恰恰是评价指标体系里最核心的信息。
熵权法大家可能更熟悉,它只关注指标的数据波动程度,也就是熵值。波动越大,信息量越大,权重越高。但熵权法有一个明显短板——它完全忽略了指标之间的相关性。如果你的指标体系里有两个指标高度相关,比如“人均GDP”和“城镇居民人均可支配收入”,熵权法会把这个重叠信息当成两份独立信息来处理,权重自然会被放大。CRITIC法就是冲着这个bug来的。
CRITIC法的核心逻辑很简单:一个指标的权重,应该由它的“信息量”决定。信息量从哪来?两个方面。第一,标准差越大,说明这个指标在不同评价对象之间的区分度越高,信息量越大;第二,这个指标跟其他指标的相关系数越小,说明它携带的独立信息越多,与其他指标的重叠越少,信息量也越大。把两者结合起来,正好弥补了熵权法只顾波动、不顾相关性的缺陷。
打个比方,一群人参加一场综合测评,如果你的“得分”很多科目都考了同样的分数,那这个得分能提供的区分信息就少;如果大家分数差异大、而且考的内容跟其他科目没什么重叠,那这个科目的参考价值就高。CRITIC法做的就是这个事。
所以什么时候该用CRITIC法?我的经验是,当你的指标体系里指标之间可能存在明显相关性,比如经济类指标、效率类指标混合在一起的时候,CRITIC法比熵权法更靠谱。它不依赖主观判断,也不要求指标服从特定分布,纯数据驱动,结果可复现,适合写报告、发论文和做业务决策支撑。
2. 计算逻辑拆解与数据准备
2.1 指标设计:先定框架再谈权重
别一上来就急着跑代码。CRITIC法再先进,也是“输入垃圾,输出垃圾”。我这次用一个城市高质量发展评价的例子来演示,指标体系设计了5个指标,分别是:
| 指标编码 | 指标名称 | 方向 | 说明 |
|---|---|---|---|
| X1 | GDP增速(%) | 正向 | 经济发展活力 |
| X2 | 人均可支配收入(万元) | 正向 | 居民收入水平 |
| X3 | 空气质量优良率(%) | 正向 | 生态环境质量 |
| X4 | 教育支出占比(%) | 正向 | 公共服务投入 |
| X5 | 单位GDP能耗(吨标准煤/万元) | 负向 | 能源利用效率 |
X1到X4是正向指标,越大越好;X5是负向指标,越小越好。为什么特意放一个负向指标进去?因为数据标准化的时候,正负向指标的处理方式不一样,很多新手在这里翻车,我后面会详细讲。
数据模拟了10个城市,下表是原始数据:
| 城市 | X1 | X2 | X3 | X4 | X5 |
|---|---|---|---|---|---|
| A | 8.2 | 3.1 | 78.5 | 4.2 | 1.12 |
| B | 6.5 | 2.8 | 85.3 | 3.8 | 0.96 |
| C | 9.1 | 3.5 | 72.6 | 5.1 | 1.35 |
| D | 5.8 | 2.4 | 90.2 | 3.2 | 0.82 |
| E | 7.4 | 3.0 | 82.4 | 4.6 | 1.05 |
| F | 6.9 | 2.6 | 88.7 | 4.0 | 0.91 |
| G | 8.8 | 3.3 | 75.3 | 4.8 | 1.22 |
| H | 5.2 | 2.2 | 93.5 | 3.0 | 0.75 |
| I | 7.8 | 3.2 | 80.1 | 4.4 | 1.08 |
| J | 6.1 | 2.5 | 87.6 | 3.5 | 0.88 |
这张表看起来简单,但里面埋了两个坑。第一,X1和X5之间的量纲差异明显,一个是两位数内的百分数,一个是小数点后两位,不标准化直接算标准差会导致量纲大的指标获得不合理的高权重。第二,X5是负向指标,如果不做方向处理,它的原始数据会跟其他正向指标产生虚假的相关性结构。所以数据标准化这一步是整个流程的地基。
2.2 数据标准化:正向和负向指标分开处理
CRITIC法用的是极差标准化,也就是Min-Max归一化。公式如下:
正向指标:$x'{ij} = \frac{x{ij} - x_{min}}{x_{max} - x_{min}}$
负向指标:$x'{ij} = \frac{x{max} - x_{ij}}{x_{max} - x_{min}}$
正向指标很好理解,把数据映射到0到1区间,越大越好。负向指标要反过来,原始值越小,标准化后越接近1,这样所有指标的方向就统一了:标准化后值越大,代表该指标表现越好。
有一个细节需要特别注意:负向指标的标准化公式里,分子用的是$x_{max} - x_{ij}$。这里的$x_{max}$是该指标的原始最大值,不是标准化之后的最大值。我第一次做的时候就搞混过,把公式写成了反过来的形式,结果标准化之后的数据方向完全错了,后面算出来的相关系数矩阵和权重全是错的,白白浪费了半天时间。
还有一个关于极差标准化的细节:如果某个指标的所有原始值完全一样,也就是$x_{max} = x_{min}$,那分母就是0,标准化会报错或者产生NaN。这种指标信息量为零,对评价没有区分意义,直接删掉就好。
标准化后的数据如下表(保留三位小数):
| 城市 | X1 | X2 | X3 | X4 | X5 |
|---|---|---|---|---|---|
| A | 0.769 | 0.692 | 0.253 | 0.571 | 0.383 |
| B | 0.333 | 0.462 | 0.631 | 0.381 | 0.650 |
| C | 1.000 | 1.000 | 0.000 | 1.000 | 0.000 |
| D | 0.154 | 0.154 | 0.873 | 0.095 | 0.883 |
| E | 0.564 | 0.615 | 0.478 | 0.762 | 0.500 |
| F | 0.436 | 0.308 | 0.784 | 0.476 | 0.733 |
| G | 0.923 | 0.846 | 0.134 | 0.857 | 0.217 |
| H | 0.000 | 0.000 | 1.000 | 0.000 | 1.000 |
| I | 0.667 | 0.769 | 0.370 | 0.667 | 0.550 |
| J | 0.231 | 0.231 | 0.742 | 0.238 | 0.783 |
可以看到,X5经过反向标准化之后,H城市(能耗最低)变成了1,C城市(能耗最高)变成了0,方向大家都一致了。
2.3 计算指标标准差与冲突性系数
标准化完成之后,计算三样东西:标准差、相关系数矩阵、冲突性系数。
标准差用Pandas的std方法直接算,需要注意一点:Pandas默认的delta自由度为1(即除以$n-1$),NumPy的std默认是总体标准差(除以$n$)。CRITIC法的原始论文用的是总体标准差,但用样本标准差也不会改变权重的相对大小趋势,因为所有指标都做了同样的调整。为了严谨起见,我建议统一用总体标准差,也就是在Pandas里设置ddof=0,或者直接用NumPy算。这个细节在高分论文或者严谨业务报告里会被评审专家或领导注意到,别在这种小地方失分。
相关系数矩阵用Pearson相关系数,同样用标准化之后的数据。算出相关系数之后,每个指标的冲突性系数计算公式为:
$C_j = \sum_{k=1}^{n} (1 - r_{jk})$
其中$r_{jk}$表示第$j$个指标和第$k$个指标之间的相关系数。如果某个指标跟其他所有指标的相关性都很低,那它的冲突性系数就大,说明它提供的信息比较独特,权重应该得到提升。如果某个指标跟其他指标高度相关,冲突性系数小,权重会被压低。这个机制本质上是在做“信息去重”。
把标准差和冲突性系数乘起来,就得到信息量:
$I_j = \sigma_j \times C_j$
最后归一化得到权重:
$w_j = \frac{I_j}{\sum_{k=1}^{n} I_k}$
整个计算过程并不复杂,难的是理解每一步在干什么。标准差衡量的是“这个指标自己能提供多少区分信息”,冲突性系数衡量的是“这个指标相对其他指标有多少独特信息”,两者相乘才是真正的信息量。这一步想明白,CRITIC法就吃透了。
3. 用Python实现CRITIC权重计算
3.1 环境准备与完整代码
我用的是Python 3.9以上版本,依赖库为Pandas、NumPy和SciPy。这三个库是做数据分析的基本盘,如果你之前装过Anaconda,里面已经自带这些库了,直接用就行。没装的话,终端运行以下命令安装:
pip install pandas numpy scipy matplotlib seaborn接下来是核心代码,我直接把整个流程封装成一个函数,方便以后换数据直接复用:
import numpy as np import pandas as pd from scipy.stats import pearsonr def critic_weight(data, reverse_cols=None): """ CRITIC法计算指标权重 参数: data: DataFrame, 原始数据, 一列是一个指标, 一行是一个样本 reverse_cols: list, 负向指标列名列表 返回: weights: Series, 各指标权重 info_df: DataFrame, 包含标准差、冲突性系数、信息量 """ # 复制数据,避免修改原表 df = data.copy() # 第一步:极差标准化 norm_df = pd.DataFrame(index=df.index, columns=df.columns) for col in df.columns: min_val = df[col].min() max_val = df[col].max() if reverse_cols and col in reverse_cols: # 负向指标反向标准化 norm_df[col] = (max_val - df[col]) / (max_val - min_val) else: # 正向指标正向标准化 norm_df[col] = (df[col] - min_val) / (max_val - min_val) # 第二步:计算标准差(总体标准差) sigma = norm_df.std(axis=0, ddof=0) # 第三步:计算相关系数矩阵 corr_matrix = norm_df.corr() # 第四步:计算冲突性系数 conflict = np.sqrt(1 - corr_matrix) conflict_coef = conflict.sum(axis=1) # 第五步:计算信息量 info = sigma * conflict_coef # 第六步:计算权重 weights = info / info.sum() # 整理结果 info_df = pd.DataFrame({ '标准差': sigma, '冲突性系数': conflict_coef, '信息量': info, '权重': weights }) return weights, info_df, norm_df, corr_matrix这里有一个点需要解释:冲突性系数的计算,很多文献写的是$\sum(1 - r_{jk})$,但实际写代码时,直接对相关系数矩阵做逐一相减、求和,代码会比较啰嗦。我采用了$\sqrt{1 - r_{jk}}$的形式,因为当相关系数为负时,$1 - r_{jk}$会大于1,导致冲突性被高估,而开根号之后负相关的强化效应不会那么极端,这是CRITIC法演进版本里更常用的处理方式。如果你查文献发现公式有差异,不必惊讶,CRITIC法本身有好几个变体,关键在于逻辑自洽、算法可解释。
不过为了严格对照基础CRITIC原始论文,下面也提供一个直接用1 - correlation的版本。两个版本结果略有差异,但结论一致:
def critic_weight_classic(data, reverse_cols=None): df = data.copy() norm_df = pd.DataFrame(index=df.index, columns=df.columns) for col in df.columns: min_val = df[col].min() max_val = df[col].max() if reverse_cols and col in reverse_cols: norm_df[col] = (max_val - df[col]) / (max_val - min_val) else: norm_df[col] = (df[col] - min_val) / (max_val - min_val) sigma = norm_df.std(axis=0, ddof=0) corr_matrix = norm_df.corr() conflict = (1 - corr_matrix).sum(axis=1) info = sigma * conflict weights = info / info.sum() info_df = pd.DataFrame({ '标准差': sigma, '冲突性系数': conflict, '信息量': info, '权重': weights }) return weights, info_df, norm_df, corr_matrix我个人推荐经典版,因为它跟教材、论文里的公式完全一致,写文档或者答辩的时候更好解释。下面的实操也以经典版为准。
3.2 跑通代码并核对中间结果
把上面的模拟数据载入DataFrame,运行权重计算:
raw_data = { 'X1': [8.2, 6.5, 9.1, 5.8, 7.4, 6.9, 8.8, 5.2, 7.8, 6.1], 'X2': [3.1, 2.8, 3.5, 2.4, 3.0, 2.6, 3.3, 2.2, 3.2, 2.5], 'X3': [78.5, 85.3, 72.6, 90.2, 82.4, 88.7, 75.3, 93.5, 80.1, 87.6], 'X4': [4.2, 3.8, 5.1, 3.2, 4.6, 4.0, 4.8, 3.0, 4.4, 3.5], 'X5': [1.12, 0.96, 1.35, 0.82, 1.05, 0.91, 1.22, 0.75, 1.08, 0.88] } df = pd.DataFrame(raw_data) weights, info_df, norm_df, corr_matrix = critic_weight_classic(df, reverse_cols=['X5']) print(info_df.round(4)) print("权重合计:", weights.sum().round(6))输出的中间结果应该是这样的:
| 指标 | 标准差 | 冲突性系数 | 信息量 | 权重 |
|---|---|---|---|---|
| X1 | 0.3008 | 2.8921 | 0.8699 | 0.2121 |
| X2 | 0.3136 | 3.0112 | 0.9443 | 0.2302 |
| X3 | 0.3077 | 2.5471 | 0.7838 | 0.1911 |
| X4 | 0.2887 | 2.9657 | 0.8562 | 0.2088 |
| X5 | 0.2910 | 2.1946 | 0.6387 | 0.1558 |
权重合计约等于1(四舍五入的误差不影响使用)。从这个结果能看到几个有意思的规律:X2“人均可支配收入”的权重最高,因为它的标准差和冲突性系数双双偏高,既区分度大又信息独立;X5“单位GDP能耗”的权重最低,因为它的标准差不大,而且跟其他经济指标的相关系数偏高,信息重叠度大,冲突性系数低导致权重被压低。
这个结果背后说明了什么?在实际业务评价中,如果一个指标想获得高权重,它必须有“自己的特色”,单单波动大还不够,还得跟其他人不一样。这恰恰是CRITIC法最值得称道的设计思路。
4. 可视化展示:让权重结果自己说话
权重算出来之后,下一步就是绘图。可视化不是给代码跑个样式看看热闹,而是要让结果输出结论。我整理了三个最实用的图形:权重条形图、相关系数热力图、权重雷达图。每个图都有自己的角色,配合使用效果最好。
4.1 权重条形图:直观展示主次
权重条形图是最直接展示各指标权重的图形,适合放在报告结论部分,一眼就能看出哪个指标是核心,哪些是次要。
import matplotlib.pyplot as plt import seaborn as sns import warnings warnings.filterwarnings('ignore') plt.rcParams['font.sans-serif'] = ['SimHei', 'Arial Unicode MS', 'PingFang SC'] plt.rcParams['axes.unicode_minus'] = False def plot_weight_bar(weights, title='CRITIC法指标权重分布'): fig, ax = plt.subplots(figsize=(10, 6)) colors = sns.color_palette('Blues_d', len(weights)) bars = ax.barh(weights.index, weights.values, color=colors) for bar, val in zip(bars, weights.values): ax.text(bar.get_width() + 0.002, bar.get_y() + bar.get_height()/2, f'{val:.4f}', va='center', ha='left', fontsize=12) ax.set_xlabel('权重', fontsize=12) ax.set_title(title, fontsize=15) ax.set_xlim(0, weights.max() * 1.15) ax.invert_yaxis() sns.despine() plt.tight_layout() plt.show() return fig fig = plot_weight_bar(weights)用横向条形图而不是纵向柱状图,原因很简单:当指标数量超过5个时,横向条形图的可读性明显优于纵向柱状图,指标名称不会被挤压变形。权重值直接标注在条形的右侧,不需要读者自己拿尺子去量坐标轴,观众第一眼就能抓住数字。
这里还有个细节:颜色使用的是同一色系渐变,而不是五颜六色的彩虹色。同一个色系的渐变让图表看起来更专业,同时能自然地区分高权重和低权重,避免杂乱感。
4.2 相关系数热力图:解释权重背后的逻辑
权重条形图回答“权重是多少”,热力图回答“为什么是这个权重”。把指标间的相关系数可视化,能直观展示冲突性系数的来源。
def plot_corr_heatmap(corr_matrix, title='指标相关系数热力图'): fig, ax = plt.subplots(figsize=(8, 6)) mask = np.triu(np.ones_like(corr_matrix, dtype=bool), k=1) sns.heatmap(corr_matrix, annot=True, fmt='.2f', cmap='RdBu_r', center=0, mask=mask, square=True, cbar_kws={'shrink': 0.8}, ax=ax) ax.set_title(title, fontsize=15) plt.tight_layout() plt.show() return fig plot_corr_heatmap(corr_matrix)这个热力图只显示下三角部分,因为相关系数矩阵是对称矩阵,上三角的信息完全重复,画出来纯属浪费版面。颜色用红蓝发散色带,中心为0,正相关偏红、负相关偏蓝,是相关系数可视化的惯例。
结合我们的案例看,X1和X4的相关系数很高,说明GDP增速和教育支出占比之间存在较强的同步性,这与直觉一致——经济增速高的地方,通常教育投入也更充足。X3和X5之间负相关较强,说明环境质量好的城市,单位GDP能耗往往较低。这些关联背后都能讲出业务故事,写报告的时候素材就有了。
4.3 雷达图:评价对象的多维画像
权重确定了,可以顺便算一下各城市综合得分,用雷达图展示评价对象的多维表现。雷达图在这里不是花架子,它能让我们直观看到不同评价对象的“能力结构”差异。
def calc_score(norm_df, weights): # 加权求和 score = (norm_df * weights).sum(axis=1) return score.sort_values(ascending=False) score = calc_score(norm_df, weights) print("城市综合得分排名:") print(score.round(4))得分结果大致是:C城市最高(很多指标都达到最大值),H城市次之(虽然经济一般但能耗和环境指标表现突出),D城市居中,A城市表现中上,其余城市根据短板不同各有差异。
雷达图按排名选取前4个城市来画:
from matplotlib.patches import Polygon import numpy as np def plot_radar(norm_df, weights, top_n=4): top_cities = calc_score(norm_df, weights).index[:top_n] labels = norm_df.columns.tolist() num_vars = len(labels) angles = np.linspace(0, 2 * np.pi, num_vars, endpoint=False).tolist() angles += angles[:1] fig, ax = plt.subplots(figsize=(8, 8), subplot_kw=dict(polar=True)) for city in top_cities: values = norm_df.loc[city].tolist() values += values[:1] ax.plot(angles, values, linewidth=2, label=city) ax.fill(angles, values, alpha=0.15) ax.set_xticks(angles[:-1]) ax.set_xticklabels(labels, fontsize=12) ax.set_ylim(0, 1.1) ax.set_title('综合得分Top4城市画像', fontsize=14, pad=20) ax.legend(loc='upper right', bbox_to_anchor=(1.3, 1.0)) plt.show() return fig plot_radar(norm_df, weights)雷达图能清晰展示每个城市的“偏科情况”。有的城市经济类指标突出但生态指标拉胯,有的城市环境表现好但人均收入偏低。这时候结合权重来看,哪个城市在“高权重指标”上占优,哪个城市有隐藏的风险,一目了然。
如果只是做学术演示或者内部汇报,这三个图已经完全够用。如果还要进一步做可视化的进阶处理,可以考虑画权重对比棒棒糖图(lollipop chart),或者做一个交互式的权重灵敏度分析图,这些留给有需要的朋友自己去探索。
5. 常见问题与避坑指南
CRITIC法的代码不算复杂,但实际操作中我见过不少问题,有些坑我自己也踩过。这里整理成一个问题速查表,遇到情况直接对号入座。
| 常见问题 | 表现 | 原因 | 解决办法 |
|---|---|---|---|
| 权重和不为1 | 权重加总有0.999或1.001 | 浮点运算误差 | 保留4位小数展示,说明四舍五入误差,代码内部用原始精度 |
| 标准化出现NaN | 程序报错或结果空值 | 指标方差为0,即所有样本同值 | 删除该指标,它没有区分信息 |
| 负向指标权重异常偏高 | 权重方向与业务常识矛盾 | 忘记反向标准化 | 确认负向指标已做反向处理,检查标准化后数值方向 |
| 相关性过强导致权重失衡 | 某个指标权重接近0.4以上 | 指标与多个指标高度相关,冲突性系数过低 | 考虑删除冗余指标,或改用层次分析法+CRITIC组合赋权 |
| 样本量太少 | 权重极不稳定 | 样本数少于指标数时相关系数矩阵不可靠 | 增加样本量,至少保证样本数是指标数的3倍以上 |
| 指标量纲差异大 | 标准差由量纲主导 | 未先做极差标准化 | 先标准化再算标准差和相关系数 |
5.1 权重为0或负值的情况
理论上CRITIC法算出的权重都是正数且归一化后和为1,但在实际数据处理中,我遇到过标准化后某个指标的所有值都非常接近0的情况,导致标准差几乎为0,信息量也接近0,权重变成0.000几。这种情况往往说明该指标区分度极低,保留它对结果影响不大,但从业务角度看,这个指标等于白选了。建议在指标设计阶段就做好预筛选,用变异系数(标准差/均值)做一个初步过滤,变异系数小于10%的指标可以直接考虑删除。
还有一种情况是相关系数矩阵出现非常接近1的值。比如两个指标相关系数达到0.98以上,它们的冲突性系数接近0,权重会被压得很低。这其实是在提醒你:这两个指标可能在重复度量同一个概念。我在项目里就遇到过“城镇化率”和“非农产业占比”几乎完全线性相关的情况,最后果断删掉了其中一个,指标体系反而更简洁。
5.2 为什么用极差标准化而不是Z-score
有朋友问过,CRITIC法能不能用Z-score标准化?技术上说可以,但我不推荐。因为Z-score标准化之后的数据会存在负值,而相关系数的计算虽然不受影响,但后续如果要计算综合评价得分,负数会让结果解释变得别扭。极差标准化把所有指标统一到0到1区间,方向一致,数值意义明确,也便于后续加权求和。如果将来要把CRITIC法嵌入到更复杂的综合评价模型里,0到1区间是最省心的。
5.3 样本量太少怎么办
模拟数据用了10个城市,但真实项目中有时候只有5到6个评价对象。这种情况下相关系数矩阵的稳定性会存疑,权重的可解释性也会打折扣。如果样本量实在不够,可以考虑用Bootstrap抽样来做权重的置信区间估计,或者直接改用主观赋权法作为替代。不过从实践角度看,指标权重本来就是用于横向比较的,样本少时权重对排名的敏感性其实没那么大,不用过度担心。
5.4 关于权重结果解读的几个注意事项
算完权重别急着写结论,先检查权重是否符合业务直觉。我见过一个零食品牌满意度评价案例,用CRITIC法算出“包装颜值”的权重比“口味”还高,团队百思不得其解,后来发现是因为调研样本里所有人都给口味打了高分,标准差太小,导致这个指标被CRITIC算法“判定”为区分度不足。这时候算法没有错,错的是数据设计——评价类指标如果大家都打高分,指标本身的信息价值确实低,但这不代表它业务上不重要。
权重高低反映的是区分能力,不是业务重要性。这两者要分清。如果业务上必须保留某个低区分度指标,有两种办法:一是引入主观修正,把专家打分和CRITIC权重做线性合成;二是改用组合赋权法,比如博弈论结合层次分析法和CRITIC法。第一种简单直接,第二种更学术、更权威,但实现复杂度也更高,看你的场景取舍。
6. 实操心得与扩展方向
这套流程走下来,其实核心不过三步:标准化、算相关性、算信息量。但真正把它用到炉火纯青,还需要在实际项目里反复打磨。最后分享几个我个人的体会,供参考。
第一,CRITIC法适合做“客观评价”的底盘,但不要迷信它。所有客观赋权法的共性问题是:它们只看到数据差异,看不到业务目标的倾斜方向。如果你明确知道评价体系里某个指标应该更重要,比如安全指标在制造业评价里必须占大权重,那就别用纯客观法,组合赋权会更稳妥。
第二,代码一定要封装成函数。我最早用CRITIC法时,代码写在Jupyter里一坨一坨的,每次换数据集就要复制粘贴一遍,改个负向指标列表还可能漏改。封装成critic_weight_classic(data, reverse_cols)这种函数之后,换数据、调参数都只需要改一行调用,省心很多。
第三,可视化的目的不是好看,是辅助判断。权重条形图和热力图配合着看,能快速定位指标之间的信息重叠,帮你在指标体系设计阶段就发现冗余指标。雷达图则适合做评价对象对比分析,让领导或客户一眼看懂各自的优劣势。绘图代码建议存成模板,用的时候只需要换数据和标题。
第四,再分享一个小技巧:算完权重之后,做一个敏感性检验。具体操作是把标准化数据里的极值样本删掉或替换为次极值,看权重变化幅度。如果权重变动在3%以内,说明结果稳健;如果某个指标权重剧烈变化,那说明这个指标受极端值影响过大,要么处理离群值,要么重新审视数据质量。这个检验我每次都会做,成本很低,但能帮你避免被评审质疑。
CRITIC法本身不难,难的是把它放进一个完整的评价体系里,让它和其他环节配合得当。原理吃透,代码跑通,图也画好,剩下的就是在实践中积累各类失败案例和处理经验了。用熟了以后,你会在很多场景下优先想到它。