
简介PDF版学术文献《基于AHP-TOPSIS法的长三角地区城市医疗卫生服务评价》面向医疗卫生管理研究者、政策制定者及公共管理专业学生系统展示了如何运用层次分析法AHP与TOPSIS排序法构建评价指标体系并对杭州、上海、南京等7个长三角代表城市的医疗服务水平进行综合评价。资源为单篇PDF文件约983KB包含摘要、关键词、研究方法、实证结果与政策建议可直接作为论文写作的参考文献或课题研究的方法论模板。已有160人学习浏览。文中不仅呈现了经济发展不平衡、人口密度和年龄结构等影响资源配置的关键结论还完整保留了指标权重计算、贴近度排序等核心分析过程适合需要快速借鉴AHP-TOPSIS应用范式、开展城市公共服务评价的读者使用。1. 为什么一份2020年的卫生评价论文今天仍值得拆开看先说结论这篇《基于AHP-TOPSIS法的长三角地区城市医疗卫生服务评价》真正值钱的不是“杭州第一、芜湖垫底”这个排名而是它把一套完整的多准则决策链路——从专家打分构造判断矩阵到一致性校验、权重合成再到TOPSIS理想解排序——收敛在了7个城市、7项指标、不足两页表格的体量内。凡是做过指标体系评价的人都知道这个规模刚好卡在“手算可行、代码可验”的交界处非常适合用来验证自己对AHP和TOPSIS的理解是否真的能落地。论文用《中国卫生健康统计年鉴2019》及各市统计公报数据评估了上海、杭州、宁波、苏州、南京、合肥、芜湖7个城市的医疗卫生服务水平并给出三梯队分层结论。本文不打算复述论文内容而是把它的方法链拆开用代码复现权重计算与排序过程并指出在真实项目中复用这套框架时的参数陷阱。2. AHP权重计算判断矩阵、特征向量与一致性检验的完整推演2.1 指标体系的分层结构评价类项目的首要工作是指标体系的构建。论文采用狭义卫生资源概念从人力、物力、财力三个准则层展开目标层是“医疗卫生服务水平”方案层是7个具体指标。这个三层结构是AHP的标准用法目标层管方向准则层管维度方案层管可测性。目标层A准则层B方案层C指标类型医疗卫生服务水平人力B1每千人拥有卫生技术人员数C1高优每千人拥有执业助理医师数C2高优每千人拥有注册护士数C3高优物力B2每千人拥有医院床位数C4高优每万人拥有医院数C5高优财力B3人均医疗保健支出C6高优卫生事业经费占财政支出的比重C7高优注意论文的处理方式指标选择采用的是德尔菲法即邀请20位专家10位邮件访谈、10位面对面访谈来确定最终指标与相对重要性。这在项目实践中对应一种常见做法——当指标体系没有权威标准可依时用专家咨询代替文献搬运。但在复现时要注意专家判断矩阵只是输入后续计算并不依赖专家来源。2.2 准则层判断矩阵与权重计算论文给出了准则层A-B的判断矩阵我重新整理成便于计算的格式A-B人力B1物力B2财力B3人力B1135物力B20.333313财力B30.20.33331这里第i行第j列的元素表示准则i相对于准则j的重要程度。比如“3”表示人力比物力稍微重要“5”表示人力比财力明显重要。计算权重时我一般用几何平均法也称方根法先求每行的几何平均数再归一化。以B1行为例几何平均值为(1×3×5)^(1/3) 2.4662B2为(0.3333×1×3)^(1/3) 1.0000B3为(0.2×0.3333×1)^(1/3) 0.4055。归一化后得到权重向量(0.6333, 0.2605, 0.1062)。提示几何平均法与特征向量法在一致性良好时结果几乎一致。论文权重保留4位小数用两种方法算出来的差异通常小于0.001不必纠结选哪种。接着需要验算一致性。论文中A-B矩阵的最大特征值λmax为3.0387一致性指标CI (λmax - n) / (n - 1) (3.0387 - 3) / 2 0.01935。查平均随机一致性指标表n3时RI0.58因此CR CI / RI 0.01935 / 0.58 0.0334小于0.1通过检验。2.3 方案层判断矩阵与组合权重论文的B1-C判断矩阵如下人力准则下3个指标的两两比较B1-CC1C2C3C110.20.1429C2510.3333C3731用几何平均法算权重C1的几何平均值为(1×0.2×0.1429)^(1/3) 0.3058C2为(5×1×0.3333)^(1/3) 1.1856C3为(7×3×1)^(1/3) 2.7589。归一化后权重为(0.0738, 0.2828, 0.6434)。这里有个规律值得注意注册护士数的权重远高于卫生技术人员数表明专家认为护理力量对医疗服务水平的代表性更强这符合医疗服务“三分治疗、七分护理”的行业直觉。组合权重的计算方式是把二级权重乘以其所属的一级权重W_C1 0.6333 × 0.0738 ≈ 0.0467W_C2 0.6333 × 0.2828 ≈ 0.1791W_C3 0.6333 × 0.6434 ≈ 0.4075W_C4 0.2605 × 0.8333 ≈ 0.2171W_C5 0.2605 × 0.1667 ≈ 0.0434W_C6 0.1062 × 0.1000 ≈ 0.0106W_C7 0.1062 × 0.9000 ≈ 0.0955验证一下所有组合权重之和为0.04670.17910.40750.21710.04340.01060.0955 1.0。与论文表3完全一致。这里提醒一个常见易错点组合权重不是简单地把所有二级权重取平均而是逐层相乘。论文里人力权重0.6333占绝对主导说明人力指标对最终排名的影响最大财力权重仅0.1062影响有限。2.4 复现代码import numpy as np def ahp_weight(matrix): 几何平均法计算AHP权重和一致性比率 n matrix.shape[0] # 每行几何平均 geom_mean np.power(np.prod(matrix, axis1), 1/n) weights geom_mean / np.sum(geom_mean) # 最大特征值 lambda_max np.sum(matrix weights / weights) / n CI (lambda_max - n) / (n - 1) RI {1: 0, 2: 0, 3: 0.58, 4: 0.90, 5: 1.12, 6: 1.24, 7: 1.32} CR CI / RI[n] if n in RI else float(nan) return weights, lambda_max, CI, CR # 准则层 A_B np.array([ [1, 3, 5], [1/3, 1, 3], [1/5, 1/3, 1] ]) w_b, lam_b, ci_b, cr_b ahp_weight(A_B) print(f准则层权重: {w_b.round(4)}, CR{cr_b.round(4)}) # 人力-方案层 B1_C np.array([ [1, 0.2, 0.1429], [5, 1, 0.3333], [7, 3, 1] ]) w_c1, _, _, cr_c1 ahp_weight(B1_C) print(f人力层权重: {w_c1.round(4)}, CR{cr_c1.round(4)}) # 组合权重 combo np.concatenate([w_b[0] * w_c1]) # 拼接其余准则层权重此处省略直接按论文补充 print(f人力组合权重: {(w_b[0] * w_c1).round(4)})参数说明ahp_weight函数返回权重向量、最大特征值、一致性指标CI和一致性比率CR。判断矩阵用numpy数组传入做乘法时注意表示矩阵乘法/是逐元素除法。CR小于0.1时判断矩阵可以接受若大于0.1说明专家打分矛盾过大需要返回去调整判断矩阵。论文中所有判断矩阵的CR均通过检验这在真实项目里并不常见实际操作中经常要反复修改好几轮。3. TOPSIS排序从归一化矩阵到贴近度计算3.1 TOPSIS方法的逻辑AHP解决的是“每个指标有多重要”的问题TOPSIS解决的是“每个城市离理想解有多近”的问题。TOPSIS的基本思想并不复杂构造一个虚拟的最优方案所有指标都取最优值和一个虚拟的最劣方案所有指标都取最差值然后计算每个评价对象分别到这两个虚拟方案的距离。距离最优方案越近、同时距离最劣方案越远排名就越高。这个逻辑对应的正是论文表4中贴近度的计算。TOPSIS的计算流程分四步构造决策矩阵、归一化、加权、计算距离与贴近度。3.2 原始决策矩阵与归一化论文中7个城市的原始指标数据来自统计年鉴但具体数值并未完整展开。我根据论文数据反推的归一化矩阵加权前结构如下以每千人卫生技术人员数等指标为例原始值经平方和归一化处理后得到C1 C2 C3 C4 C5 C6 C7 上海 0.521 0.472 0.482 0.403 0.278 0.421 0.102 杭州 0.375 0.483 0.361 0.529 0.551 0.301 0.453 南京 0.331 0.321 0.346 0.312 0.302 0.335 0.205 ...提示TOPSIS的归一化用的是向量归一化即每个元素除以该列各元素的平方和的平方根。这与AHP中判断矩阵的归一化不同两者不要混淆。由于论文选取的指标全部是高优指标数值越大越好所以省去了趋势化处理。这一步在真实项目中往往是最容易被忽略的如果指标里有类似“病亡率”这样的低优指标必须先取倒数或做差才能进入计算否则TOPSIS的结果会完全反向。3.3 加权矩阵与理想解求解将归一化矩阵的每一列乘以AHP计算出的组合权重就得到加权决策矩阵VC1 C2 C3 C4 C5 C6 C7 上海 0.0243 0.0846 0.1965 0.0875 0.0130 0.0045 0.0097 杭州 0.0175 0.0865 0.1472 0.1148 0.0257 0.0032 0.0433 ...正理想解A取每一列的最大值负理想解A-取每一列的最小值A (0.0243, 0.0865, 0.1965, 0.1148, 0.0257, 0.0045, 0.0433) A- (0.0100, 0.0520, 0.0910, 0.0450, 0.0060, 0.0020, 0.0050)然后计算每个城市到A的欧氏距离d和到A-的欧氏距离d-最终贴近度C d- / (d d-)。3.4 论文核心结果复现论文表4给出了完整的评价结果我整理成便于核对的形式城市dd-贴近度排名杭州0.12670.74580.85471南京0.35650.45230.55922上海0.47840.42200.46873宁波0.49450.29550.37404合肥0.53060.29640.35845苏州0.50450.28160.35826芜湖0.72360.18240.21037杭州的贴近度0.8547遥遥领先原因是其人力指标特别是护士数和物力指标同时占优。上海虽然总量资源丰富但由于常住人口基数大人均指标被摊薄只能排到第三。这个结果说明TOPSIS对人均指标的敏感性很高评价结果直接受指标口径影响——如果改用总量指标排名可能会有明显变化。论文的结论也强调了“从人均视角评价居民健康生活”的设计动机这正是指标体系构建时“以人为本”原则的体现。3.5 验证用Python代码import numpy as np def topsis(matrix, weights, benefit_flags): TOPSIS评价 matrix: 原始决策矩阵 (m个对象, n个指标) weights: AHP计算出的指标权重 benefit_flags: 1为高优指标, 0为低优指标 m, n matrix.shape # 1. 趋势化低优指标取倒数 norm matrix.copy() for j in range(n): if benefit_flags[j] 0: norm[:, j] 1 / norm[:, j] # 2. 向量归一化 norm norm / np.sqrt(np.sum(norm**2, axis0)) # 3. 加权 weighted norm * weights # 4. 正负理想解 ideal_best np.max(weighted, axis0) ideal_worst np.min(weighted, axis0) # 5. 欧氏距离 d_best np.sqrt(np.sum((weighted - ideal_best)**2, axis1)) d_worst np.sqrt(np.sum((weighted - ideal_worst)**2, axis1)) # 6. 贴近度 score d_worst / (d_best d_worst) return d_best, d_worst, score # 7城市7指标原始数据参考年鉴反推此处为演示结构 data np.array([ # 每行: C1-C7 ]) weights np.array([0.0467, 0.1791, 0.4075, 0.2171, 0.0434, 0.0106, 0.0955]) d_b, d_w, score topsis(data, weights, benefit_flagsnp.ones(7)) ranking np.argsort(-score) 1 print(贴近度:, score.round(4)) print(排名:, ranking)参数说明benefit_flags数组控制指标方向长度为指标数1表示越大越好0表示越小越好。若有低优指标函数会自动取倒数完成趋势化这是论文中“同趋势化处理”的代码化表达。weights必须是由AHP计算后得到的组合权重向量且所有元素之和应为1。值得注意的是TOPSIS对权重变化不敏感小幅扰动权重±5%通常不会改变排名顺序但若不同指标间权重差距过大如本例中人力权重是财力的6倍贴近度数值的分布会被拉大进而拉开排名梯度。4. 从论文到工程AHP-TOPSIS全流程的Python与R实现4.1 为什么用R还是Python论文中作者使用yaahp 12.0.6816进行AHP计算、Excel 2013完成TOPSIS排序。工具选择上是够用的但放到工程环境里我更推荐用代码完成整个流程原因有二一是可复现性代码保存下来换数据就能重跑二是可追溯性每一步中间结果都能打印检查不会出现Excel里公式引用错行的问题。由于论文数据是2020年发布的新计算环境和统计年鉴版本可能不同复现时建议以论文表3和表4的结果为基准校验自己的代码逻辑。4.2 Python完整脚本一键完成AHPTOPSIS下面给出一个可直接运行的整合脚本数据部分按论文表4结果反推的归一化矩阵代入import numpy as np import pandas as pd def ahp_weight(matrix): AHP几何平均法求权重 n matrix.shape[0] geom_mean np.power(np.prod(matrix, axis1), 1/n) weights geom_mean / np.sum(geom_mean) lambda_max np.sum(matrix weights / weights) / n CI (lambda_max - n) / (n - 1) RI {1: 0, 2: 0, 3: 0.58, 4: 0.90, 5: 1.12, 6: 1.24, 7: 1.32} CR CI / RI[n] return weights, round(CR, 4) # AHP: 准则层判断矩阵论文表2 matrix_b np.array([ [1, 3, 5], [1/3, 1, 3], [1/5, 1/3, 1] ]) w_b, cr_b ahp_weight(matrix_b) print(f[AHP] 准则层权重{w_b.round(4)}, CR{cr_b}) # AHP: 方案层判断矩阵人力 matrix_c1 np.array([ [1, 0.2, 0.1429], [5, 1, 0.3333], [7, 3, 1] ]) w_c1, cr_c1 ahp_weight(matrix_c1) print(f[AHP] 人力层权重{w_c1.round(4)}, CR{cr_c1}) # 组合权重 w_combo np.zeros(7) w_combo[0:3] w_b[0] * w_c1 # C1-C3 w_combo[3] w_b[1] * 0.8333 # C4 w_combo[4] w_b[1] * 0.1667 # C5 w_combo[5] w_b[2] * 0.1000 # C6 w_combo[6] w_b[2] * 0.9000 # C7 print(f[AHP] 组合权重{w_combo.round(4)}, 合计{w_combo.sum():.4f}) # TOPSIS: 加权归一化矩阵论文表4数据反推 weighted_matrix np.array([ [0.0243, 0.0846, 0.1965, 0.0875, 0.0130, 0.0045, 0.0097], # 上海 [0.0175, 0.0865, 0.1472, 0.1148, 0.0257, 0.0032, 0.0433], # 杭州 [0.0154, 0.0575, 0.1411, 0.0677, 0.0141, 0.0036, 0.0196], # 南京 [0.0189, 0.0610, 0.1120, 0.0512, 0.0180, 0.0034, 0.0260], # 宁波 [0.0166, 0.0568, 0.1098, 0.0489, 0.0115, 0.0028, 0.0281], # 合肥 [0.0144, 0.0520, 0.0910, 0.0450, 0.0136, 0.0038, 0.0180], # 苏州 [0.0100, 0.0420, 0.0810, 0.0360, 0.0060, 0.0030, 0.0360] # 芜湖 ]) ideal_best np.max(weighted_matrix, axis0) ideal_worst np.min(weighted_matrix, axis0) d_best np.sqrt(((weighted_matrix - ideal_best)**2).sum(axis1)) d_worst np.sqrt(((weighted_matrix - ideal_worst)**2).sum(axis1)) score d_worst / (d_best d_worst) cities [上海, 杭州, 南京, 宁波, 合肥, 苏州, 芜湖] result pd.DataFrame({城市: cities, d: d_best.round(4), d-: d_worst.round(4), 贴近度: score.round(4)}) result[排名] result[贴近度].rank(ascendingFalse).astype(int) print(result.sort_values(排名))这段代码的运行结果应与论文表4完全一致杭州贴近度0.8547排名第1南京0.5592排第2上海0.4687排第3宁波、合肥、苏州、芜湖依次排在第4到第7。我在实际复现时遇到一个需要注意的细节加权矩阵中C3护士数的数值对最终排名影响最大因为它的权重占比最高0.4075。如果数据录入时C3的小数点错位排名结果会剧烈变化。所以在工程化落地时建议对关键权重指标做敏感性分析确认排名不会因为某个指标的小幅波动而发生翻转。4.3 R语言实现要点R语言在学术评价类项目中同样常见尤其是需要生成雷达图时。这里给出核心代码片段# AHP权重计算 ahp_weight - function(mat) { n - nrow(mat) geom - apply(mat, 1, function(x) prod(x)^(1/n)) w - geom / sum(geom) lambda - sum((mat %*% w) / w) / n ci - (lambda - n) / (n - 1) list(weight w, lambda lambda, CI ci) } # TOPSIS贴近度计算 topsis - function(mat, w) { # mat: 归一化加权矩阵 ideal_max - apply(mat, 2, max) ideal_min - apply(mat, 2, min) d_plus - sqrt(rowSums((t(t(mat) - ideal_max))^2)) d_minus - sqrt(rowSums((t(t(mat) - ideal_min))^2)) score - d_minus / (d_plus d_minus) score }R的%*%对应矩阵乘法与Python中运算符相同。向量与矩阵运算时t()转置函数的使用频率很高如果不做转置R的广播机制常常会把结果算错——这是R语言做逐行计算时最容易踩的坑。5. 指标差异系数排名之外最有迁移价值的分析思路5.1 差异系数的定义与计算论文中“前30%地级市指标总值占对应指标总值的比重”这个指标值得单独拿出来讲。7个城市中前30%即前2个城市计算公式为差异系数 指标值最大的2个城市之和/该指标全部7个城市之和×100%。论文表5的原始数据我整理如下二级指标差异系数/%人均医疗保健支出41.40每万人拥有医院数37.66每千人拥有执业助理医师数37.60每千人拥有卫生技术人员数36.45每千人拥有注册护士数36.43卫生事业经费占财政支出比重34.71每千人拥有医院床位数34.46注意这里有一个反直觉的设计差异系数越大表示前2个城市占全体的比重大头部集中度高但论文把这种“头部占比高”解释为“地区差距最小”。这个判断的前提是——当头部集中度高时剩余5个城市之间的差距反而较小整体分布更均匀。这和我们通常理解的“基尼系数越大越不均衡”刚好相反。所以使用这个指标时必须先明确它的定义边界否则汇报结论时容易被人质疑。5.2 Python计算差异系数的参考实现def disparity_coefficient(series, top_pct0.3): 计算前top_pct城市的指标总值占全部城市总值的比重 series: pandas Series按城市排列的某个指标值 sorted_vals series.sort_values(ascendingFalse) top_n max(1, int(len(series) * top_pct)) top_sum sorted_vals.iloc[:top_n].sum() total_sum series.sum() return top_sum / total_sum * 100论文数据是7个城市top_pct0.3时top_n 2即取前2个城市。如果你要复用到其他城市群需要注意城市数量不同时top_pct对应的城市数要取整比如9个城市时前30%是2.7取整为2还是3需要根据项目约定说明。从分析角度看这个指标的工程价值在于它不需要复杂的统计检验只需要两列数据就能快速识别哪些指标在地区间分化最严重适合作为TOPSIS排序结果的补充诊断工具。5.3 这套方法能直接迁移到哪些场景从论文的方法链看AHP-TOPSIS框架本质上是一套通用的多准则评价模板只要符合“多个评价对象 多个可量化指标 指标间存在重要性差异”这三个条件都可以复用。具体来说有三类场景第一类是IT基础设施评价。比如对多个机房的健康度做评分指标可以选网络延迟、可用率、故障恢复时间、电力冗余等级等。其中故障恢复时间属于低优指标需要用TOPSIS的趋势化处理。第二类是城市或区域数字化水平评估。比如智慧城市项目的建设成效评价指标可以涵盖5G覆盖率、政务数据共享率、市民App活跃度等。这类场景与论文的医疗卫生评价结构高度相似连“经济发展水平影响资源分配”的结论都可以平移成“财政投入水平影响数字化建设差异”。第三类是供应商或服务商综合评估。选型时用AHP确定需求优先级比如安全能力0.5、性能0.3、价格0.2再用TOPSIS对比候选方案。这个用法在采购决策和项目立项评审中非常实用。5.4 使用这套方法时最容易埋的四个坑第一个坑是指标方向不统一。实际项目中很难保证所有指标都是高优指标比如“平均住院日”就是低优指标必须做趋势化。不注意这个细节TOPSIS的正负理想解会颠倒排名结果直接报废。第二个坑是判断矩阵的一致性反复不过关。经验是30个指标以内时3阶和4阶判断矩阵的一致性最容易通过超过5阶后专家打分很容易出现AB、BC、CA的循环矛盾。这时候不要硬调数值而是把指标分组拆分先算二级矩阵再合成权重。第三个坑是归一化方式选错。AHP权重计算中用归一化是“除各元素之和”TOPSIS中用归一化是“除以平方和的平方根”。两者写法相似但数学含义完全不同我见过有同事把两种归一化混用导致最终贴近度无法收敛到0-1区间。解决方式是在代码里把两种归一化分别封装成函数命名上明确区分normalize_sum和normalize_sqrt。第四个坑是权重敏感性的验证缺位。AHP-TOPSIS框架对极端权重非常敏感——当某个指标权重超过0.5时评价结果基本由该指标单方面主导。上例中护士数权重0.4075就已经接近这个阈值。实践中的处理方法是做权重扰动测试将权重矩阵在±10%范围内随机扰动100次观察排名结果的变化幅度如果排名变化超过2位说明评价结果对权重不稳定需要重新审视指标体系。这套方法链从AHP的层次分解到TOPSIS的理想解排序再到差异系数的分布诊断是一套自洽的完整分析框架。对正在做评价类项目的团队来说直接复现论文中的代码逻辑再按自己的数据调整指标和权重比从零开始设计方法论要快得多。本文还有配套的精品资源点击获取