首页 GIS基础理论 GIS在空间统计学中的应用:聚类与异常值分析(Anselin Local Moran's I)

GIS在空间统计学中的应用:聚类与异常值分析(Anselin Local Moran's I)

作者: GIS研习社 更新时间:2025-12-07 06:00:03 分类:GIS基础理论

为什么你的热力图总被老板说“没灵魂”?

你是不是也遇到过这种情况:辛辛苦苦做出一张空间分布热力图,领导看了一眼就说:“这图看不出重点啊,哪里是热点?哪里是冷点?有没有异常值?”——别慌,这不是你制图技术不行,而是你缺了一把“空间显微镜”:Anselin Local Moran’s I

GIS在空间统计学中的应用:聚类与异常值分析(Anselin Local Moran's I)

我在参与某省国土空间规划项目时,第一次用Local Moran分析城镇人口密度。结果发现一个GDP排名垫底的县,居然和周围高密度区形成显著“高-低异常”,后来一查——原来是政策性移民安置区。这个发现直接改变了区域发展策略。

Local Moran’s I 是什么?它凭什么能当“空间侦探”?

简单说,Local Moran’s I 是一种局部空间自相关指标。它不关心全局趋势,而是挨个检查每个要素(比如每个区县、每个栅格)和它邻居的关系。就像给每个学生发一张“班级社交关系诊断单”:

  • 你是“学霸聚集区”里的学霸吗?→ 高-高聚类(HH)
  • 你是“学渣包围圈”里的学渣吗?→ 低-低聚类(LL)
  • 你是“学霸堆里的吊车尾”?→ 高-低异常(HL)
  • 你是“学渣群里冒尖的天才”?→ 低-高异常(LH)

这个算法的核心思想,是计算某个位置的观测值与其邻域加权平均值之间的协方差。公式看着吓人,其实本质就一句话:“你和你邻居像不像?”

实战教学:在ArcGIS/QGIS中三步揪出空间异常值

我们以全国县级人均GDP数据为例,手把手教你操作(我默认你已准备好带坐标的属性表)。

第一步:定义空间关系权重

这是最容易出错的一步!很多人直接选“反距离”,结果算出来全是噪声。我的经验是:

  • 行政区划数据 → 优先用“邻接”(Contiguity)
  • 点数据或栅格 → 用“固定距离”或“K近邻”

在ArcGIS里:Spatial Statistics Tools → Utilities → Generate Spatial Weights Matrix
在QGIS里:Processing Toolbox → Spatial Statistics → Create spatial weights matrix

第二步:运行 Local Moran’s I

ArcGIS路径:Spatial Statistics Tools → Mapping Clusters → Cluster and Outlier Analysis (Anselin Local Moran's I)
关键参数设置:

  • Input Field:选你要分析的字段,比如“人均GDP”
  • Conceptualization of Spatial Relationships:选上一步生成的权重文件
  • Standardization:建议选“行标准化”(Row)

跑完后你会得到一张新图层,包含四个关键字段:LMi_zscore, LMi_pvalue, COType, Cluster/Outlier

第三步:解读结果与可视化

不要只看颜色!一定要结合统计显著性(p值):

COType 值含义典型配色建议
HH高值被高值包围(热点)深红色
LL低值被低值包围(冷点)深蓝色
HL高值被低值包围(异常高)橙色
LH低值被高值包围(异常低)浅蓝色

我的私藏技巧:在符号系统里用Cluster/Outlier字段做分类渲染,再叠加上原始值的分级色彩,就能做出“既有统计意义又有数值梯度”的高级地图。

避坑指南:三个让结果失效的致命错误

  1. 投影没选对:如果你的数据还在WGS84经纬度下跑分析,距离计算会严重失真!请先投影到等距或等积坐标系(如Albers)。
  2. 邻居数量太少:默认的“邻接”可能让边缘县市邻居数=0。建议至少保证每个要素有3个以上邻居,可用“K最近邻”补足。
  3. 忽略多重比较问题:Local Moran 本质是多次假设检验。p值1.96才靠谱)。

进阶玩法:用Python批量自动化分析

如果你要分析上百个变量,手动点ArcGIS会疯掉。推荐用PySAL库一键搞定:

import libpysal
from esda.moran import Moran_Local
import geopandas as gpd

# 读取数据
gdf = gpd.read_file('china_county.shp')

# 构建空间权重矩阵
w = libpysal.weights.Queen.from_dataframe(gdf)

# 计算Local Moran's I
loc_moran = Moran_Local(gdf['per_gdp'], w)

# 添加结果到原表
gdf['local_moran'] = loc_moran.Is
gdf['p_value'] = loc_moran.p_sim
gdf['cluster_type'] = loc_moran.q

这段代码跑完,你就能在DataFrame里直接筛选p_value<0.05的显著聚类区了。

总结:让数据自己讲故事

Local Moran’s I 的真正价值,不是画出花哨的地图,而是帮你在海量空间数据中定位那些“不合群”的关键节点——它们往往是政策突破口、投资洼地或风险预警区。下次做汇报时,别说“这里颜色深”,要说“这里是通过95%显著性检验的HH聚类区,建议优先配置资源”。

你在项目中用Local Moran发现过哪些意想不到的空间模式?欢迎在评论区晒图+故事,点赞最高的送《空间计量经济学实战手册》电子版!

相关文章