别再只用熵权法了!用Python实战CRITIC权重法,搞定多指标评价(附完整代码与数据)

张开发
2026/4/17 1:34:29 15 分钟阅读

分享文章

别再只用熵权法了!用Python实战CRITIC权重法,搞定多指标评价(附完整代码与数据)
CRITIC权重法实战用Python实现多指标科学赋权当我们面对包含GDP、就业率、财政收入等多个指标的城市数据集时如何科学地确定各指标权重这直接影响到最终评价结果的客观性。今天我要分享的CRITIC权重法正是解决这一问题的利器——它不仅考虑指标自身的波动性还兼顾指标间的相关性比传统的熵权法更能反映数据本质特征。1. 为什么选择CRITIC权重法在数据分析领域指标赋权方法主要分为主观赋权如AHP和客观赋权两大类。客观赋权法中熵权法虽然应用广泛但它只考虑了指标的信息量而忽略了指标间的相互关系。这就是CRITIC法的优势所在双重考量同时分析指标变异程度标准差和冲突性相关系数动态平衡自动调整高相关性指标的权重避免信息重复计算无需先验完全基于数据本身特性计算权重排除主观干扰我曾在一个省级经济发展评估项目中对比过两种方法当使用熵权法时三个高度相关的经济指标合计权重超过60%而CRITIC法则自动降低了这些相关指标的权重最终结果更符合专家预期。2. 环境准备与数据加载开始前需要准备以下Python环境# 必需库安装如未安装 !pip install numpy pandas scipy假设我们有一个包含2023年四个城市经济指标的数据集city_data.csv城市,GDP(亿元),就业人数(万),财政收入(亿元),人均可支配收入(元) 北京,40269,1276,5923,77415 上海,43214,1378,6542,79610 广州,28839,985,3452,68853 深圳,32387,1124,4125,70847加载和处理数据的完整代码import numpy as np import pandas as pd from scipy.stats import pearsonr # 读取数据 df pd.read_csv(city_data.csv, index_col城市) print(原始数据\n, df) # 区分指标类型1为正向指标-1为逆向指标 indicator_type { GDP(亿元): 1, 就业人数(万): 1, 财政收入(亿元): 1, 人均可支配收入(元): 1 }3. 数据标准化处理CRITIC法对数据标准化有特殊要求——不能使用Z-score标准化会消除标准差差异而应采用极差标准化def data_normalization(df, indicator_type): normalized_df df.copy() for col in df.columns: if indicator_type[col] 1: # 正向指标 min_val df[col].min() max_val df[col].max() normalized_df[col] (df[col] - min_val) / (max_val - min_val) else: # 逆向指标 max_val df[col].max() min_val df[col].min() normalized_df[col] (max_val - df[col]) / (max_val - min_val) return normalized_df normalized_data data_normalization(df, indicator_type) print(\n标准化后数据\n, normalized_data)注意如果数据中存在负值需要先进行适当平移处理确保所有值为正标准化后的数据范围在0-1之间保持了原始数据的变异程度。这是CRITIC法与熵权法处理的关键区别之一。4. CRITIC核心计算流程完整的CRITIC权重计算可分为四个步骤4.1 计算指标变异性标准差# 计算标准差 std_values normalized_data.std() print(\n各指标标准差\n, std_values)标准差结果示例GDP(亿元) 0.421 就业人数(万) 0.392 财政收入(亿元) 0.487 人均可支配收入(元) 0.3724.2 计算指标冲突性相关系数# 计算相关系数矩阵 corr_matrix normalized_data.corr() print(\n相关系数矩阵\n, corr_matrix) # 计算冲突性指标 conflict [] for col in normalized_data.columns: r_col corr_matrix[col].sum() - 1 # 减去自身的1 conflict.append(1 - r_col / (len(normalized_data.columns)-1)) conflict_series pd.Series(conflict, indexnormalized_data.columns) print(\n冲突性指标\n, conflict_series)4.3 计算信息量# 计算信息量 information std_values * conflict_series print(\n信息量\n, information)4.4 计算最终权重# 计算权重 weights information / information.sum() print(\n最终权重\n, weights.round(4))典型输出结果可能如下指标权重GDP(亿元)0.283就业人数(万)0.217财政收入(亿元)0.331人均可支配收入(元)0.1695. 结果分析与对比将CRITIC法与熵权法结果对比from sklearn.preprocessing import MinMaxScaler # 熵权法计算 def entropy_weight(df): df df.apply(lambda x: (x - x.min()) / (x.max() - x.min())) df df.replace(0, 1e-10) # 避免log(0) p df / df.sum() entropy (-p * np.log(p)).sum() diversity 1 - entropy / np.log(len(df)) weights diversity / diversity.sum() return weights entropy_weights entropy_weight(df) print(\n熵权法权重\n, entropy_weights.round(4))对比表格指标CRITIC权重熵权法权重GDP(亿元)0.2830.251就业人数(万)0.2170.249财政收入(亿元)0.3310.302人均可支配收入(元)0.1690.198可以看到由于CRITIC法考虑了指标相关性它对高度相关的就业人数和GDP赋予了相对更低的权重而熵权法则可能高估这些相关指标的重要性。6. 实战应用与优化建议在实际项目中应用CRITIC法时有几个关键点需要注意指标预处理检查数据分布对偏态严重指标考虑对数变换处理缺失值建议用中位数而非均值填充结果验证# 综合得分计算 composite_score (normalized_data * weights).sum(axis1) print(城市综合得分\n, composite_score.sort_values(ascendingFalse))动态更新当新增数据时应重新计算权重可设置阈值仅当数据变化超过阈值时才重新计算可视化分析import matplotlib.pyplot as plt weights.plot(kindbar, title指标权重分布) plt.ylabel(权重值) plt.xticks(rotation45) plt.show()一个实际案例在某金融机构的客户信用评估中我们使用CRITIC法对30多个财务指标进行赋权发现传统方法中高度相关的流动比率和速动比率被CRITIC法自动降低了权重最终模型在测试集上的准确率提升了8%。

更多文章