☰
基于AHP的城市竞争力评价:判断矩阵、权重计算与一致性检验
2026/11/2 13:44:00 网站建设 项目流程

简介:这份文档围绕层次分析法(AHP)在城市竞争力评价中的应用展开,适合经济学、统计学、城市规划与系统工程等方向的学习者,以及需要构建综合评价指标体系的课程研究者参考。资源以单一 doc 文件交付,压缩包约 832KB,内容集中为一份课程学习报告,便于直接查阅与整篇研读。已有 140 人学习,说明其在方法入门与案例理解上具有一定参考价值。文档从 AHP 的基本思想入手,梳理目标层、准则层、要素层与指标层的建模过程,并结合判断矩阵构造、1—9 标度、层次单排序、权重计算与一致性检验展开说明;后半部分以城市竞争力评价为实例,展示指标筛选、权重赋值和综合评价思路。读者可据此理解多因素评价的完整分析链条,也可将层次化建模与权重计算思路迁移到其他综合评估场景。

1. 一份交不出标准答案的排名表

层次分析法用在一座城市的竞争力评价上,最先遇到的往往不是数学问题,而是资料问题:手边只有一本统计年鉴和几位专家的口头判断,却要交出一张能解释得通的排名表。城市竞争力评价的指标一抓七十多项,GDP、财政收入、科研投入、绿化覆盖率、城乡收入比全在里面,量纲从亿元到百分比,方向有正有负。等权叠加省事,可没人信;主成分分析能算,算出来的成分却没法翻译成评委听得懂的话。这套方案走的是另一条路:把七十多项指标压进四层结构,让专家判断变成可检验的权重,再用一致性检验来约束主观随意性。它适合正在做城市评价类课程设计、需要一套完整可复现流程的人,也适合手里已经有指标数据、只缺一套赋权方法的人。

2. 需求拆解与技术选型:为什么落在 AHP 而不是 PCA 或熵权法

2.1 评价任务的真实约束:指标多、方向杂、数据还缺

城市竞争力评价的任务书通常长这样:给定一组城市,用统计年鉴里的公开数据排出名次,并且说清名次背后的原因。指标层摊开之后,麻烦才开始显形——经济实力下面是 GDP 总量、人均 GDP、财政收入、固定资产投资;政府作用下面是财政支出结构、行政管理费用占比;对外开放下面是进出口总额、实际利用外资;环境水平下面是建成区绿化覆盖率、污水处理率、空气质量优良天数。七十多项指标,量纲从亿元跨到百分比再到天数,方向有正有负,还有一批指标根本拿不到连续年份的数据。

更难的是权重。等权叠加是最省事的做法,但等权意味着「空气质量优良天数」和「GDP 总量」对城市竞争力的贡献完全一样,这个假设在任何答辩现场都站不住脚。主成分分析能给出方差贡献率,可它的主成分是原始指标的线性组合,很难翻译成「经济实力占 41.62%」这种评委能直接听懂的话。熵权法完全跟着数据离散程度走,某个指标在所有城市之间差异极小,权重就趋近于零,可这个指标在理论上恰恰很重要,比如「政府作用」——各城市财政支出结构本来就差不多,熵权法会把它判成无关变量。

所以这套方案要的不是一个「最先进」的算法,而是一条能把理论框架、专家判断和统计数据串起来、并且每一步都能被追问的赋权链路。AHP 正好落在这个位置上:它把「哪个维度更重要」这种本来只能靠争论解决的问题,变成一组可以被一致性检验约束的数字,而且每一层的权重都能单独拎出来汇报。

2.2 四类赋权方法的横向对比

选型不能凭感觉,得摆在台面上比。下面这张表是这类评价任务里最常被拿来比较的四种方法,评价维度按「能不能支撑一次完整的答辩」来定,而不是按算法复杂度。

方法权重来源对样本量要求结果可解释性在本场景的适配度
AHP专家两两比较低,单城市截面也能算高,每一层权重可单独汇报高,天然适配分层指标体系
主成分分析方差贡献率与载荷中高,样本数少于指标数时结果不稳中,主成分含义需要二次解释中,更适合降维而非赋权
熵权法指标离散程度中,城市数量少时权重跳动明显中,权重可能与理论重要性冲突中,适合做客观修正项
DEA投入产出效率中,对异常值敏感中,评的是效率而不是水平低,与综合竞争力不是一个概念

主成分分析的问题不在算法本身,在于它回答的是「哪些指标一起变动」,而不是「哪个指标更重要」。因子分析同理,旋转之后载荷矩阵确实漂亮,可要把载荷翻译成权重,还得再做一次人为归一化,绕了一圈又回到主观判断。熵权法的优点是客观,缺点是太客观——完全无视指标在实际评价体系里的地位,只要数据离散度不够,权重就掉下去,最后算出来的排名往往和常识打架。

DEA 更偏题。它衡量的是给定投入下产出能达到多高,评的是效率,而城市竞争力评价要的是综合水平。一个中小城市资源利用效率可能很高,但综合竞争力排不到前面,这两件事不能混。

AHP 也不是没有代价。它的权重来自专家对两两重要性的判断,主观性是内建的,一致性检验只能保证判断之间不打架,不能保证判断本身正确。这一点必须在报告里写清楚,而不是藏起来。

2.3 选择 AHP 之后要接受的三个代价

第一个代价是主观性消不掉。能做的是用一致性比率把它压到可接受范围,再用敏感性分析说明结论稳不稳。指望 AHP 给出一个「客观真理」式的权重,方向就错了。判断矩阵改了,权重要变,这是特性不是缺陷。

第二个代价是每层元素数量有上限。1-9 标度的语义上限就是 9,一层挂十几个元素,专家填到后面全靠猜。所以指标必须分层,这也是下一章四层结构的由来。

第三个代价是指标相关性会被重复计权。GDP 总量和人均 GDP 高度相关,同时挂在经济实力下面,等于给经济实力加了两次权。处理办法是事前人工筛一遍,把相关系数超过 0.9 的一对指标留一个,或者各降一半权重,并在附录里写清楚删了哪个、为什么删。

提示:如果导师追问「为什么不用组合赋权」,可以答「AHP 定序、熵权法定量修正」,但组合之前要先证明两套权重排序不冲突,否则组合出来的结果谁都解释不了。

3. 指标体系设计:四层骨架与 71 项指标的归位规则

3.1 四层结构的必要性:从 153 次比较降到可操作

如果把 71 项指标直接挂在 4 个准则层下面,每个准则要带 17 到 18 个指标,专家得完成 C(18,2)=153 次两两比较。这不只是工作量的问题,人的一致性根本撑不住——比到第四十对的时候,专家已经记不住前面填过什么,一致性比率必然崩,最后只能靠回头硬改矩阵凑数,那份矩阵也就失去意义了。

四层结构解决的就是这件事。目标层只有 1 个元素,即城市综合竞争力,它是最终要算出来的那个指数,不参与比较。准则层是第一刀,切成动力、阻力、相互影响、环境水平四块。要素层是第二刀,比如动力再拆成经济实力、政府作用、消费水平、人力资源、科技实力五项。指标层是最底层,能直接从年鉴里查到数字。这样每一层的分支数都被控制在 2 到 9 之间,单次比较任务最重的一层只有 9 个元素、36 次比较,专家半小时内能填完,一致性也稳。

层次结构的另一个好处是错位可查。最终排名出来,某个城市总分低,可以顺着树往下看是哪一层拖的后腿——是动力不足,还是环境水平太差。这种可追溯性是扁平指标表给不了的。

3.2 准则层四个维度的划分逻辑

动力和阻力是一对。动力指推动城市竞争力上升的因素,经济实力、政府作用、消费水平、人力资源、科技实力都归在这里。阻力指拖住竞争力的因素,报告里只放了贫富分化一项。这种数量上的不对称是有意为之:阻力维度本身就是一个提醒,城市竞争力不是所有指标都越大越好,贫富差距拉大,竞争力要往下走,指标方向必须单独处理。

相互影响维度下面挂对外开放和依存度,本质描述的是城市与外部的关系。环境水平维度下面挂基础设施和环境水平两个要素。这里有个容易踩的细节:准则层叫「环境水平」,要素层里也有一个叫「环境水平」,同名节点在代码里做字典索引时会互相覆盖,权重直接串行。工程实现时给每个节点加唯一 id,比如C4、F4-2,名字只用于展示,索引一律走 id。

下面这张表是四层结构在指标层的落地样子,方向一栏是后面无量纲化的依据,建模阶段就要定死。

准则层要素层指标层举例指标方向
动力经济实力GDP 总量、人均 GDP、地方财政收入正向
动力政府作用财政支出占 GDP 比重、行政管理费用占比正向 / 适度
动力消费水平社会消费品零售总额、居民人均消费支出正向
动力人力资源每万人高等学校在校生数、从业人员占比正向
动力科技实力R&D 经费支出、专利授权量正向
阻力贫富分化城乡收入比、基尼系数负向
相互影响对外开放进出口总额、实际利用外资正向
相互影响依存度外贸依存度适度
环境水平基础设施人均道路面积、万人拥有公交车辆数正向
环境水平环境水平建成区绿化覆盖率、污水处理率正向

3.3 指标筛选、方向标注与数据来源处理

71 项指标不是都得进模型。筛选盯三条:数据可得,连续三年能查到;口径一致,同一本年鉴、同一个指标名,不能今年叫「实际利用外资」明年叫「实际使用外资」;区分度够,所有城市取值几乎一样的指标直接删,它进模型只会稀释权重。共线性要人工过一眼,GDP 总量和人均 GDP 同时保留,等于给经济实力重复计权,通常留一个,或者两个各降一半。

方向标注必须在建模阶段完成,分正向、负向、适度三类。城乡收入比越高越差,负向;外贸依存度不是越高越好,适度。这个标注直接决定后面无量纲化用哪个公式,标错了排名会整体反过来,而且是那种「流程全跑通了、结果怎么都不对」的错,排查起来极其费时间。

数据来源以统计年鉴和城市统计公报为主,缺失值不要填 0。常用做法是用同一城市相邻年份的均值补,或者用同省同类城市的均值补,并在附录里列出每一个补值位置和补值依据。评委问起来,能说清哪几个数不是原始值,比假装数据完整要稳得多。原始数据最好单独存一张宽表,行是城市、列是指标编码,编码和层次结构里的 id 一一对应,后面写脚本时直接按编码取列,避免手工对表出错。

4. 判断矩阵与权重计算:从 1-9 标度到全局权重

4.1 1-9 标度与判断矩阵的构造规则

AHP 把「哪个更重要」量化成 1 到 9 的整数及其倒数。这套标度的语义边界很清晰,超出 9 就没有语言能对应了,这也是每层元素不能超过 9 个的根本原因。

标度含义
1两个元素同等重要
3前者比后者稍重要
5前者比后者明显重要
7前者比后者强烈重要
9前者比后者极端重要
2、4、6、8上述相邻判断的中间值
倒数若 i 对 j 的标度为 a,则 j 对 i 为 1/a

判断矩阵 A 是 n×n 方阵,元素 a_ij 表示「相对于上一层某个元素,本层第 i 个元素比第 j 个元素重要多少」。它有三条硬约束:对角线全为 1,因为自己跟自己同等重要;a_ij × a_ji = 1,互反性;所有元素为正。第三条一般不会错,前两条是后面一致性检验能不能通过的前提,也是代码里最该写断言的地方。

以准则层为例,动力、阻力、相互影响、环境水平四个元素,专家给出的判断是:动力比阻力明显重要(5),动力比相互影响稍重要(3),动力比环境水平稍重要(3),相互影响比环境水平稍重要(2),阻力和相互影响、环境水平相比都略次要(1/3)。填成矩阵就是下面这样,行是「比较方」,列是「被比较方」,顺序一旦定下来就不能中途换。

动力 阻力 相互影响 环境水平 动力 1 5 3 3 阻力 1/5 1 1/3 1/3 相互影响 1/3 3 1 2 环境水平 1/3 3 1/2 1

4.2 两种求权重的方法与可运行实现

求权重的主流做法有两种。算术平均法先按列归一化,再按行取均值,直观、手算可复现,课程报告里最常被要求用这一种。特征值法求判断矩阵最大特征值对应的特征向量,再归一化,理论上更严谨,也是大多数软件包的默认实现。矩阵阶数不大的时候两者结果差异通常在千分位,用哪种都不影响结论,但报告里要写明用了哪种。

import numpy as np # Saaty 随机一致性指标,键为矩阵阶数 RI_TABLE = {1: 0.00, 2: 0.00, 3: 0.58, 4: 0.90, 5: 1.12, 6: 1.24, 7: 1.32, 8: 1.41, 9: 1.45} def ahp_weight(A, method="eigen"): """计算判断矩阵的权重向量与一致性指标。 A : 判断矩阵,二维 list 或 ndarray,必须为正互反矩阵 method : "eigen" 特征值法;"mean" 算术平均法 返回 : (权重向量, 最大特征值, CI, CR) """ A = np.array(A, dtype=float) n = A.shape[0] # 两条硬约束,错了后面全白算 assert np.allclose(np.diag(A), 1.0), "对角线必须全为 1" assert np.allclose(A * A.T, 1.0), "必须满足互反性 a_ij * a_ji = 1" if method == "eigen": vals, vecs = np.linalg.eig(A) k = int(np.argmax(vals.real)) # 最大特征值所在位置 lam = float(vals.real[k]) w = np.abs(vecs[:, k].real) # 特征向量取实部并取正 else: col_sum = A.sum(axis=0) # 按列求和 w = (A / col_sum).mean(axis=1) # 列归一化后按行取均值 lam = float(np.mean((A @ w) / w)) # 由 Aw = λw 反推 λ w = w / w.sum() # 归一化,权重和必须为 1 CI = (lam - n) / (n - 1) if n > 1 else 0.0 CR = CI / RI_TABLE[n] if RI_TABLE.get(n, 0) > 0 else 0.0 return w, lam, CI, CR

代码里两个断言看着不起眼,实际能省掉大量返工。互反性写成A * A.T是逐元素相乘再判断是否全为 1,比手写双重循环快得多,也更容易在答辩现场解释。method参数留着是方便对照:同一份矩阵分别用两种方法跑一遍,如果权重差了 5% 以上,多半是矩阵本身有问题,而不是方法选错了。

拿 4.1 的准则层矩阵跑一遍,得到的权重约是 0.525、0.072、0.234、0.169,最大特征值约 4.082,CI 约 0.027,CR 约 0.030。和报告里给出的 0.4883、0.0893、0.2328、0.1896 同向同量级,差异来自专家打分本身的浮动,属于正常范围。CR 远小于 0.1,这一层的一致性可以接受。

4.3 全局权重的合成与无量纲化打分

每一层算出来的都是局部权重——相对于上一层某个父节点的权重,不能直接拿去加权求和。全局权重得沿着树往下乘:某个指标层的全局权重 = 它所属准则层权重 × 所属要素层权重 × 它自身的局部权重。

import numpy as np # 三个层次的局部权重(示例,实际由 ahp_weight 逐层算出) w_criteria = np.array([0.5254, 0.0724, 0.2338, 0.1685]) # 动力/阻力/相互影响/环境水平 w_factor = np.array([0.4162, 0.2618, 0.0624, 0.0986, 0.1611]) # 动力下五个要素 w_index = np.array([0.4000, 0.3000, 0.2000, 0.1000]) # 经济实力下四个指标 # 沿路径相乘:准则 0 -> 要素 0 -> 四个指标 w_global = w_criteria[0] * w_factor[0] * w_index print(np.round(w_global, 6), round(float(w_global.sum()), 6))

乘完之后必须做一次自检:把整棵树上所有叶子节点的全局权重加起来,结果应当等于 1(浮点误差内)。如果加起来是 0.87 或者 1.13,说明某一层的权重没归一化,或者漏了某个分支——这是跑完整套流程后最容易出现的错,而且不看求和根本发现不了。

权重有了,指标值还得先变成可加的分数。极差标准化是最常用的做法,正向指标越大越好,负向指标越小越好,适度指标离中心越近越好。

import numpy as np def normalize(x, direction="positive"): """极差标准化,把不同量纲的指标压到 [0, 1] 区间。 x : 一维数组,某个指标在各城市上的取值 direction : positive 正向 / negative 负向 / moderate 适度 """ x = np.asarray(x, dtype=float) lo, hi = x.min(), x.max() if hi == lo: # 所有城市取值相同,给中性分 return np.full_like(x, 0.5) if direction == "positive": return (x - lo) / (hi - lo) if direction == "negative": return (hi - x) / (hi - lo) mid = (hi + lo) / 2 # 适度指标:偏离中心越远扣分越多 return 1 - np.abs(x - mid) / (hi - lo) # 综合指数 = 全局权重向量与标准化指标向量的内积 # score = float(np.dot(w_all, x_norm))

标准化这一步有两个参数要留心。direction必须和 3.3 的指标方向表严格对应,标错一个,那个指标的打分就整体翻转,排名跟着乱。hi == lo的分支是防止除零,顺手给个 0.5 的中性分,比直接报错要稳——真实数据里总有一两个指标在所有样本城市上取值完全相同,比如某些年份的污水处理率。

指标标准化完之后,加权求和得到城市综合得分,按得分降序排列就是竞争力排名。分维度再算一遍,还能得到每个城市在动力、阻力、相互影响、环境水平四个维度上的分项得分,用来解释「这个城市为什么排在这儿」,比只给一个总分有用得多。

5. 常见问题排查:一致性检验和权重汇总里最容易翻的五个点

5.1 矩阵构造阶段:互反性写反与专家打分趋同

最容易翻车的是互反性写反。现象是脚本跑得通、CR 也正常,可算出来的权重和预期完全相反——本想表达「动力比阻力重要」,结果权重跑到了阻力那边。原因基本都出在行列方向上:填表时按「列是前者、行是后者」的习惯写,代码却按「行是前者、列是后者」解读,两个约定没对齐。解决方式很土但有效:在填表模板的表头明确写上「行相对列」,矩阵填完立刻检查一遍A[0][1] * A[1][0]是否等于 1,每一对都过一遍,两分钟能省掉一下午。

第二个坑是专家打分趋同。现象是算出来的权重几乎均等,每个维度都在 0.25 上下浮动,排名基本等于等权叠加。原因是专家为了避免判断出错,下意识全填 1、3 这类安全值,或者干脆所有格子都填同一个数。这种矩阵的一致性比率会好得出奇(CR 接近 0),但信息量为零。解决办法是在打分表里加一条强制规则:同一层里至少要有两组判断的标度差达到 3 以上,否则退回重填;同时在报告里说明专家人数和打分轮次,一轮定稿的专家打分说服力有限。

5.2 计算与数据处理阶段:RI 取错阶数与负向指标漏处理

第三个坑是随机一致性指标取错。现象是 CR 算出来忽大忽小,有时候 4 阶矩阵的 CR 突然低于 0.01,好得不像真的。原因通常是 RI 表按元素个数索引时错位了一位,或者公式里分母用了 n 而不是 n-1。CI 的分母是 n-1,这是自由度;RI 的

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询