简介:面向经济学、统计学、城市规划与系统工程等专业学习者的一份课程学习报告,围绕层次分析法(AHP)在城市竞争力评价中的建模与应用展开,适合用作课程作业、方法入门或综合评价案例参考。文档系统梳理AHP的基本思想与操作流程,包括目标层、准则层、要素层和指标层四层结构模型的搭建,1—9标度判断矩阵的构造,层次单排序中特征值与特征向量的计算,以及一致性指标与CR<0.1的检验标准;并结合中国城市竞争力评价实例,展示71项指标的筛选归层、权重赋值和结果分析思路。资源包为1个doc文件,约832KB,内容集中、便于检索,已有139人学习。读者可从中获得较完整的AHP评价框架、指标分层示例和判断矩阵演算过程,用于理解城市竞争力综合评价的量化路径,也可为相关课程报告和论文写作提供结构参照。
1. 先看地图:AHP 做城市竞争力评价,重心其实不在算特征向量
多数人第一次接触层次分析法(AHP),注意力都放在最大特征值和特征向量怎么算上,觉得那才是硬骨头。真把一套四层指标体系铺开、把 71 项指标逐个塞进叶子节点、再请专家把两两比较填完,就会发现矩阵求特征值反而是全流程里最省事的一步,几行代码就出结果。真正决定这套城市竞争力评价能不能站住的是另外三件事:指标怎么分层、两两比较怎么打分、一致性怎么兜底。下面按这条主线走:先给四层结构的分工地图,再拆判断矩阵与 1-9 标度,然后攻权重计算与一致性检验,最后落到易错点和复习清单。
2. 四层结构怎么搭:目标、准则、要素、指标各管一段
城市竞争力是个典型的“多因子、缺硬数据、还要排名”的问题。指标从统计年鉴里能扒出几十上百项,但哪项更重要、怎么合成一个指数,年鉴不会告诉你。这也是为什么在综合评价这一族方法里,AHP 常被拿来干“赋权 + 排序”这最后一公里。
先把可选方法的边界摆清楚,选型时不容易跑偏:
| 方法 | 擅长的事 | 明显的短板 |
|---|---|---|
| 主成分分析 / 因子分析 | 降维、消除指标间相关性 | 权重由数据方差决定,解释性弱,说清“为什么这项重要”很难 |
| 聚类分析 | 把相似城市归堆 | 只分组不给权重,排不出名次 |
| 数据包络分析 | 投入产出效率测算 | 要求明确界定投入与产出,城市竞争力边界模糊 |
| AHP | 分层拆解、权重可解释、无数据也能先搭框架 | 主观性强,指标一多判断矩阵数量爆炸 |
选 AHP 的真正理由,不是它更“科学”,而是它把“专家怎么想”这件事显式写进了模型里。城市竞争力评价里,“经济实力比消费水平重要”这种判断本来就存在,藏起来不如摊开。关键是把摊开的过程做规范,这就是四层结构要解决的问题。
2.1 四层的分工:上层定方向,下层定数据
四层分别回答四个不同的问题,混在一起就会搭出一棵逻辑打架的树。
目标层只有一个元素,通常是“城市综合竞争力”。它回答的是“最后要产出一个什么东西”——一个可比较的指数,或者一份排名。目标层不出数据,只出方向。
准则层是分解总目标所遵循的准则,回答“从哪几个大维度看这件事”。这套体系里准则层只有三项:动力、阻力、相互影响。数量少是刻意的,准则层元素一多,专家两两比较的次数就压不住。
要素层是把每个准则再往下切一层,回答“这个维度由哪几种子能力构成”。比如动力下面切成经济实力、政府作用、消费水平、人力资源、科技实力五块。要素层是整棵树里最容易被搭歪的一层——切得太细会和指标层重复,切得太粗又失去解释力。
指标层是可直接采集数据的最基层指标,回答“具体拿哪个数字去算”。这一层不再有判断,只有数值。
一句话记住分工:目标层是终点,准则层是岔路口,要素层是路标,指标层是脚下的砖。递进规则只有一条硬的——同一父节点下的子元素,合起来要能完整解释父节点,彼此之间尽量不重叠。比如“经济实力”下面同时挂“GDP 总量”和“人均 GDP”,这两项高度相关,属于典型的半重叠,权重会被重复计入两次。
2.2 准则层三大板块:动力、阻力与相互影响
这套体系最值得琢磨的设计,是准则层没有一股脑全用正向指标,而是切成了动力、阻力、相互影响三块,权重分别是 0.4883、0.0893、0.2328。
动力板块权重最高,接近一半,是城市竞争力的主引擎。它下面五个要素的权重分布很说明问题:经济实力 0.4162、政府作用 0.2618、消费水平 0.0624、人力资源 0.0986、科技实力 0.1611,五项加起来约等于 1。经济实力排第一不意外,真正的信息量在第二位——政府作用被单独拎出来给了 0.2618,说明在这套专家判断里,城市治理能力不是附属项,而是和 GDP 同一量级的影响因素。反过来,消费水平只有 0.0624,是五项里最低的,这个结果应该在讨论环节被解释,而不是算完就接受。
阻力板块权重 0.0893,下面只挂了贫富分化。权重低不代表不重要,它承担的是“负向指标”的角色——别的指标越大越好,它越大越差。这一块的存在提醒了一件事:AHP 本身不区分正向负向,方向问题要在无量纲化阶段单独处理,漏掉就会把“贫富差距大”算成“竞争力强”。
相互影响板块权重 0.2328,排在第二,下面是对外开放(含依存度 0.3333)、基础设施、环境水平。这一块的名字就透露了设计意图:城市不是孤岛,它和外部的人才、资本、货物存在交换关系,这种耦合强度本身构成竞争力的一部分。对外开放下面再分出一层“依存度”,就是把“开放程度”和“对外部市场的依赖程度”拆开看。
2.3 指标层落地与权重表读法
指标层在这套体系里初步统计了 71 项,来源是各类统计年鉴。落到这一层,判断标准从“重不重要”切换成“能不能采到、能不能比”。三个实操门槛:数据是否每年公布、口径是否跨城市一致、缺失年份怎么补。任何一项过不了,指标再重要也只能降级或替换。
把各层权重拼成一张表之后,第一件事不是拿去算指数,而是做逐层校验:
| 层级 | 元素 | 权重 | 所属父节点 |
|---|---|---|---|
| 准则层 | 动力 | 0.4883 | 总目标 |
| 准则层 | 阻力 | 0.0893 | 总目标 |
| 准则层 | 相互影响 | 0.2328 | 总目标 |
| 要素层 | 经济实力 | 0.4162 | 动力 |
| 要素层 | 政府作用 | 0.2618 | 动力 |
| 要素层 | 消费水平 | 0.0624 | 动力 |
| 要素层 | 人力资源 | 0.0986 | 动力 |
| 要素层 | 科技实力 | 0.1611 | 动力 |
动力下面五项相加是 1.0001,正常。但准则层三项相加只有 0.8104,缺了 0.1896。梳理下来会发现,这个缺口恰好等于表里“基础设施”后面跟着的那个数字,大概率是排版时把要素层的某一格挤到了准则层的位置。这种错位在手工整理的四层大表里非常常见,肉眼扫一遍很难发现,必须靠“同一父节点下子权重之和为 1”这条硬规则去卡。
提示:拿到任何一张 AHP 权重表,先做加法再做别的。加法过不去,后面所有指数都是错的。
3. 判断矩阵怎么造:1-9 标度、互反性与专家打分的边界
四层结构定完,接下来要把“经济实力比消费水平重要多少”这种模糊判断变成数字。这一步是 AHP 的精华,也是主观性最集中的地方,做得好不好直接决定结果可信度。
3.1 1-9 标度在量化什么
判断矩阵的元素取 1 到 9 以及它们的倒数,含义是固定的:
| 标度 | 含义 |
|---|---|
| 1 | 两个因素相比,同等重要 |
| 3 | 前者比后者稍重要 |
| 5 | 前者比后者明显重要 |
| 7 | 前者比后者强烈重要 |
| 9 | 前者比后者极端重要 |
| 2、4、6、8 | 上述相邻判断的中间值 |
| 倒数 | 若 i 对 j 的标度为 a,则 j 对 i 为 1/a |
为什么上限是 9 而不是 100?常见的解释是人的同时分辨能力大约在 7 级上下,再细分下去,专家自己也分不清 8 和 9 的差别,填出来的数字只是噪声。这个上限还有个副作用限制:同一层元素最好不要超过 9 个,否则比较次数和判断噪声都会失控。
标度是“相对”的,不是“绝对”的。给“经济实力 vs 消费水平”打 5,不代表经济实力值 5 分,只代表在这一层里它比对方明显重要。这一点在给专家发问卷时必须写清楚,否则很容易收到一堆“给每项指标打绝对分”的表格。
3.2 判断矩阵的三个性质
n 个元素两两比较,形成一个 n×n 的矩阵 A,元素 a_ij 表示第 i 项相对第 j 项的重要程度。这个矩阵必须满足三条:
对角线全为 1,因为自己和自己同等重要;互反性 a_ij = 1/a_ji,正向填了 5,反向就必须是 1/5;传递性 a_ij · a_jk = a_ik,满足这条的矩阵叫完全一致性矩阵。第三条现实中几乎不可能完全满足,AHP 只要求“满意的一致性”,这是后面一致性检验存在的全部理由。
用前两章提到的三个准则搭一个最小例子:
import numpy as np # 准则层判断矩阵,行列顺序固定为 [动力, 阻力, 相互影响] # A[i][j] 的语义:第 i 项相对第 j 项的重要程度,取值 1-9 或其倒数 A = np.array([ [1.0, 5.0, 3.0], [1/5, 1.0, 1/3], [1/3, 3.0, 1.0], ]) # 互反性校验:a_ij * a_ji 必须约等于 1 assert np.allclose(A * A.T, np.ones_like(A)), "判断矩阵不满足互反性" # 对角线校验:自己和自己比必须为 1 assert np.allclose(np.diag(A), 1.0), "对角线元素必须为 1" # 比较次数:n 个元素需要 n(n-1)/2 次两两比较 n = A.shape[0] print(f"{n} 个元素,共需 {n * (n - 1) // 2} 次比较")这段代码不计算结果,只做两件事:把语义写死在注释里,以及在算权重之前先挡住手工填表的低级错误。参数说明:A 的行列顺序必须和后续权重输出的顺序严格一致,中途调换顺序等于把权重张冠李戴;两个 assert 是廉价保险,跑一次不到一毫秒,却能拦住“填了 5 又填了 4”这类前后矛盾的输入。
3.3 专家打分最容易出现的两种失败
第一种是方向反了。问卷上写“请比较 A 与 B 的重要性”,专家按自己的习惯理解成“B 比 A 重要就打高分”,收回来的矩阵整体转置。最后算出的权重完全颠倒,而且因为一致性检验照样能过,这个错误极难在结果层被发现。防的办法只有一个:在矩阵上方用注释固定语义,并在汇总时抽查一对已知关系的元素,看方向对不对。
第二种是所有人打中庸分。为了避免担责,专家倾向全填 1、2、3,矩阵趋近于全 1 矩阵,算出来的权重全都接近 1/n,评价失去区分度。这时候 CR 会非常漂亮,可惜是“假合格”。识别方法很简单:看权重向量是不是一条水平线,最大权重和最小权重之比小于 1.5 就要警惕。
第三种偏操作层面:一次让专家比较十几个元素,收到一堆自己都记不住填了什么的问卷。n 个元素需要 n(n-1)/2 次比较,5 个元素 10 次,9 个元素 36 次,10 个元素直接跳到 45 次。这就是为什么要控制每层元素个数,也是为什么四层结构要把 71 项指标拆散挂到不同要素下面——每个小矩阵只管三五个元素,专家还能保持判断质量。
4. 权重计算与一致性检验:从特征向量到 CR
矩阵造好,进入计算环节。这块是考试和实操都最爱考的地方,公式不难,难在每个中间量的含义和判定阈值的用法。
4.1 层次单排序:三种算法与手算对照
层次单排序的任务是:由判断矩阵算出同一层元素相对于上一层某个元素的权重。数学上归结为求矩阵的最大特征值 λmax 和对应的特征向量,特征向量归一化后就是权重。
常用三种算法。幂法是原始材料里给出的思路:任取一个正初始向量,反复用 A 去乘并归一化,直到相邻两次结果之差小于给定精度,收敛后的向量即特征向量,λmax 由 Aw/w 的分量平均求得。方根法先按行求几何平均再归一化,手算最友好。算术平均法先把每列归一化,再按行求平均,写代码最短。
用 3.2 那个矩阵跑一遍后两种:
import numpy as np def ahp_weights(A): n = A.shape[0] # 方根法:先按行求几何平均 gm = np.prod(A, axis=1) ** (1 / n) w = gm / gm.sum() # 最大特征值:用 (Aw)_i / w_i 的均值估计 lam = float(np.mean((A @ w) / w)) # 一致性指标 CI = (λmax - n) / (n - 1) ci = (lam - n) / (n - 1) if n > 1 else 0.0 return w, lam, ci A = np.array([[1.0, 5.0, 3.0], [1/5, 1.0, 1/3], [1/3, 3.0, 1.0]]) w, lam, ci = ahp_weights(A) print("权重:", np.round(w, 4)) # [0.6370 0.1047 0.2583] print("λmax:", round(lam, 4)) # 3.0385 print("CI :", round(ci, 4)) # 0.0193函数返回三个量,含义分别是:w 是归一化权重向量,三个分量对应动力、阻力、相互影响;lam 是最大特征值,用来判断矩阵偏离一致性的程度;ci 是一致性指标,下一步换算出 CR 要用。方根法和算术平均法算出来的结果几乎一样,本例算术平均法得到 0.6334、0.1061、0.2605,差异在小数点后第二位,选哪种都不影响排序,写论文时说明用了哪种即可。
4.2 一致性检验:CI、RI、CR 三个数字的关系
判断矩阵是人填的,前后矛盾几乎是必然。一致性检验就是给这种矛盾设一个容忍上限。
CI 由 λmax 和阶数算出:CI = (λmax − n) / (n − 1)。完全一致时 λmax = n,CI = 0;偏离越远,CI 越大。但 CI 本身没有绝对标尺,3 阶矩阵和 8 阶矩阵的“正常偏差”不是一个量级,所以要除以一个随机一致性指标 RI——它是随机填 1-9 及其倒数时算出的 CI 平均值,只和阶数有关:
| n | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|---|---|---|---|---|---|---|---|---|---|---|
| RI | 0.00 | 0.00 | 0.58 | 0.90 | 1.12 | 1.24 | 1.32 | 1.41 | 1.45 | 1.49 |
最终判据是一致性比率 CR = CI / RI。CR < 0.1 视为满意的一致性,权重可用;CR ≥ 0.1 必须回头调整判断矩阵。上例 CI = 0.0193,n = 3 时 RI = 0.58,CR = 0.0332,远小于 0.1,合格。
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, 10: 1.49} def consistency(A): n = A.shape[0] _, lam, ci = ahp_weights(A) ri = RI_TABLE[n] # n<=2 时 RI 为 0,CR 无定义,约定视为完全一致 cr = 0.0 if ri == 0 else ci / ri return {"n": n, "lambda": round(lam, 4), "CI": round(ci, 4), "RI": ri, "CR": round(cr, 4), "pass": cr < 0.1} print(consistency(A)) # {'n': 3, 'lambda': 3.0385, 'CI': 0.0193, 'RI': 0.58, 'CR': 0.0332, 'pass': True}这里有个容易漏的分支:n = 2 时 RI = 0,CR 在数学上无定义。代码里显式返回 0.0 并标记通过,是为了避免除零报错,也避免把“无定义”误读成“不合格”。三层结构里 2×2 的小矩阵会很多,这个分支一定会被踩到。
CR 不过关时的调整策略,比“随便改改再算”要有章法:先定位对 CI 贡献最大的那个元素,通常是某一行里偏离整体比例最远的一格;再回到专家那里确认这一对比较是不是填错了;确认无误就小步调整,一次只动一格,改完重算。直接凑数把 CR 压到 0.1 以下,指标是过了,信息也丢了。
4.3 层次总排序:权重一路乘到底
单排序只给出“相对于上一层”的权重,最终要的是每个指标相对于总目标的全局权重。做法是逐层连乘:
全局权重 = 指标对要素层的权重 × 要素对准则层的权重 × 准则对总目标的权重。
举例:假设“人均 GDP”对“经济实力”的权重是 0.3,经济实力对动力的权重是 0.4162,动力对总目标的权重是 0.4883,那么这个指标的全局权重约为 0.3 × 0.4162 × 0.4883 ≈ 0.0610。71 项指标各自算出全局权重后,全部相加应该接近 1——这是总排序阶段唯一的校验点,不接近就说明某一层漏乘或错乘了。
# 全局权重 = 指标权重 × 要素权重 × 准则权重 w_global = { "人均GDP": 0.30 * 0.4162 * 0.4883, # ≈ 0.0610 "科研经费占比": 0.40 * 0.1611 * 0.4883, # ≈ 0.0315 "外贸依存度": 0.3333 * 0.6667 * 0.2328, # ≈ 0.0517 } print("全局权重合计:", round(sum(w_global.values()), 4)) # 仅示例,非全部指标 print("全局权重:", {k: round(v, 4) for k, v in w_global.items()})参数说明:连乘的顺序可以换,结果不变,但三层缺一不可;字典的键是指标名,值是该指标的全局权重;这里只列三项做演示,实际项目要把 71 项全部列全再求和。求和结果偏离 1 超过 0.001,就要回头逐层核对权重表,而不是调某个指标去凑。
最后一步是合成综合指数。先对指标层的原始数据做无量纲化,最常用的是极差标准化,把每项指标压到 0-1 区间;负向指标(比如贫富分化)要用 1 减去标准化值,把方向掰正。然后与全局权重做加权求和,得到的数就是该城市的综合竞争力指数,指数越大排名越靠前。原始材料里因为 71 项指标的数据量太大、部分指标短期拿不到,最终没有算出具体城市的排名——这一步其实卡在数据采集,不是卡在方法。
5. 易错点:AHP 落地时最容易翻车的五处
公式和代码都不长,真正让人返工的是流程里几个不起眼的位置。下面五条,每一条都在实际项目里出现过,按“易漏点 → 为什么漏 → 怎么补”拆开写。
5.1 五个高频坑逐条拆
归一化没做全。易漏点:权重算完就往下走,不检查同一父节点下子权重之和。为什么漏:算法输出的特征向量本身是归一化的,容易让人以为“归一化这一步已经自动完成了”,可一旦中间做过手工删改、或者从几张不同的表里拼权重,和就不再是 1。前一章那张权重表就是活例子,准则层三项加起来只有 0.8104,缺口 0.1896。怎么补:写一个校验函数,按父节点分组求和并打印,任何一组偏离 1 超过 0.001 就中断。
一致性只查了顶层。易漏点:准则层那个 3×3 矩阵 CR 合格,就默认整棵树都合格。为什么漏:指标层有几十个 2×2、3×3 的小矩阵,批量生成之后没人逐个看,而且 2×2 矩阵 RI 为 0、CR 恒定为“通过”,很容易混在结果里造成“全部合格”的错觉。怎么补:把所有判断矩阵放进一个列表,循环跑一致性检验,输出一张包含矩阵名、阶数、λmax、CI、CR、是否通过的表,CR ≥ 0.1 的单独挑出来重做。
标度方向搞反。易漏点:矩阵建好了,但 a_ij 到底是“i 比 j 重要”还是“j 比 i 重要”,填表的人和算权重的人理解不一致,最后权重整体倒置。为什么漏:一致性检验对这个错误完全不敏感,转置矩阵的 λmax、CI、CR 和原矩阵一模一样,结果层看不出任何异常。怎么补:在矩阵定义处写死语义注释,加一条互反性断言,再挑一对关系确定的元素(比如经济实力必然重于消费水平)做方向抽查。
没做无量纲化就直接加权。易漏点:权重一算完,直接拿原始数据乘权重求和。为什么漏:AHP 只负责赋权,合成是独立的一步,两件事在代码里常常分开写,中间就断了。GDP 以亿元计、比例以百分数计、人口以万人计,量纲差几个数量级,直接加权等于让数值大的指标单方面决定结果。怎么补:合成前先做极差标准化压到 0-1,并且对负向指标取反,把这两步封成一个函数,任何指标进来都必须过一遍。
把一次专家打分当成客观事实。易漏点:权重是一串小数,看起来很像客观计算结果,写完就不再质疑。为什么漏:数字的外形掩盖了它的来源——这些权重本质上是若干位专家的主观判断经过数学加工后的产物,换个专家组,权重会变,排名也可能变。怎么补:多专家分别构阵后聚合(常用几何平均,能保持互反性),再对关键权重做敏感性分析,把某一项权重上下调 20%,看排名是否翻转;翻转了就说明结论不稳,需要在报告里说明,而不是藏起来。
5.2 一张自查表
| 检查项 | 快速判断方法 | 不合格的信号 |
|---|---|---|
| 权重归一化 | 按父节点分组求和 | 某组和为 0.81 这类明显缺口 |
| 一致性覆盖 | 统计参与检验的矩阵个数 | 只检了准则层,指标层没跑 |
| 标度方向 | 抽查一对已知关系的元素 | 权重排序和常识相反 |
| 无量纲化 | 检查指标值域 | 输入值有上亿也有 0.35 |
| 负向指标 | 查贫富分化这类指标的处理分支 | 用的是同一个标准化函数 |
| 术语统一 | 全文检索 | “层析分析法”和“层次分析法”混用 |
最后一行不是凑数。标题写“层析分析法”、正文写“层次分析法”、英文缩写写 AHP,三种写法同时出现在一份材料里,检索时会漏,答辩时会被追问,统一成“层次分析法(AHP)”最省事。
6. 复习清单:一条主线、三次校验、一张对照表
这套东西复起来其实不复杂,主线只有八步,按顺序走一遍就能把整条链路串起来:分层 → 定标度 → 构判断矩阵 → 层次单排序 → 一致性检验 → 层次总排序 → 无量纲化 → 加权合成排名。八步里任何一步跳过,后面的结果都不可信,而且错误会以“看起来正常的数字”形式藏起来,这是 AHP 最坑的地方。
复习时不要平铺着看,抓三次校验就够覆盖大部分失分点。第一次校验在分层之后:同一父节点下的子元素是否互斥、是否可采集,指标有没有被挂到两个父节点下面。第二次校验在单排序之后:每组权重之和是否为 1,CR 是否全部小于 0.1,2×2 矩阵的特殊分支有没有处理。第三次校验在合成之前:无量纲化做了没有,负向指标取反了没有,全局权重加起来是不是 1。
| 环节 | 必查项 | 合格标准 | 常见异常 |
|---|---|---|---|
| 分层 | 子元素互斥且可采集 | 无重叠、无重复挂载 | 同一指标挂在两个父节点下 |
| 构阵 | 互反性与对角线 | a_ij · a_ji = 1,a_ii = 1 | 手工填表前后矛盾 |
| 单排序 | 权重和 | ≈ 1.000 | 0.81 这类缺口 |
| 一致性 | 全部矩阵的 CR | 均 < 0.1 | 只查了准则层 |
| 无量纲化 | 值域与方向 | 落在 [0,1],负向已取反 | 用同一个函数处理正负指标 |
| 总排序 | 全局权重和 | ≈ 1.000 | 三层连乘漏乘一层 |
两道最值得单独记的公式:CI = (λmax − n) / (n − 1),CR = CI / RI。这两行在考卷上出现的频率极高,而且经常配套问“CR = 0.08 说明什么”——答案是判断矩阵具有满意的一致性,权重可以采用,不是“完全一致”。完全一致的矩阵 CR 恒为 0,现实中几乎不会出现。
还有一道容易被忽略的判断题:n = 2 时 RI = 0,CR 无定义。标准答案通常是“视为完全一致”,代码里要显式处理这个分支,别让除零异常把整批检验打断。
从那以后我每搭一套评价体系,第一件事不是打开编辑器算特征值,而是在纸上把每一层的权重和写成 1.000,再开始填矩阵。这个习惯救过我好几次——有一次要素层少挂了一个指标,加法当场就露馅了,要是等到指数算完再回头查,那才叫没有后悔药。希望帮到你。
本文还有配套的精品资源,点击获取