告别全局平均!用Python+MGWR库实战空间异质性分析(附南京房价数据案例)
空间数据分析中,传统OLS回归常被诟病为"一刀切"的全局平均模型。当数据存在空间依赖性时(比如相邻区域的房价会相互影响),这种忽略地理位置的建模方式往往导致结果失真。本文将带你用Python的mgwr库,从零实现多尺度地理加权回归(MGWR),通过南京房价数据案例,揭示不同区位影响因素的差异化作用规律。
1. 空间异质性分析的核心工具
地理加权回归(GWR)系列模型的核心突破在于:允许回归系数随空间位置变化。这意味着在分析房价影响因素时,超市、学校等配套设施的贡献度可以因区域不同而动态调整。以下是关键概念对比:
| 模型类型 | 带宽特征 | 适用场景 | 计算复杂度 |
|---|---|---|---|
| OLS | 全局统一 | 空间无关数据 | 低 |
| GWR | 单一带宽 | 中等空间异质性 | 中 |
| MGWR | 多尺度带宽 | 强空间异质性 | 高 |
带宽选择是模型效果的关键:过大会退化为OLS,过小则导致过拟合。MGWR通过为每个变量独立优化带宽,实现了更精细的空间尺度捕捉。
2. 环境配置与数据准备
2.1 安装必备库
推荐使用conda创建独立环境:
conda create -n spatial python=3.8 conda activate spatial conda install -c conda-forge mgwr geopandas libpysal contextily pip install keplergl2.2 数据预处理实战
假设已获取南京市六城区(玄武、秦淮、建邺、鼓楼、栖霞、雨花台)的房价与POI数据,需进行以下处理:
- 格网化处理:将研究区域划分为1km×1km网格
- 变量标准化:
import geopandas as gpd from sklearn.preprocessing import StandardScaler data = gpd.read_file('nanjing.shp') scaler = StandardScaler() variables = ['school','mall','hospital','park'] data[variables] = scaler.fit_transform(data[variables])- 空间可视化检查:
import contextily as ctx ax = data.plot(figsize=(10,10), column='price', legend=True) ctx.add_basemap(ax, crs=data.crs, source=ctx.providers.Stamen.TonerLite)3. MGWR建模全流程解析
3.1 模型参数初始化
from mgwr.sel_bw import Sel_BW from mgwr.gwr import MGWR # 准备数据矩阵 y = data['price'].values.reshape(-1,1) X = data[variables].values coords = list(zip(data['center_x'], data['center_y'])) # 带宽选择 selector = Sel_BW(coords, y, X, multi=True) bandwidths = selector.search(verbose=True)3.2 模型拟合与诊断
model = MGWR(coords, y, X, selector) results = model.fit() # 模型诊断指标 print(f""" R-squared: {results.R2} Adjusted R-squared: {results.adj_R2} AICc: {results.aicc} """)典型输出示例:
Variable-specific bandwidths: intercept: 43 school: 184 mall: 271 hospital: 51 park: 633.3 结果空间可视化
将系数映射到地理空间:
import matplotlib.pyplot as plt fig, axs = plt.subplots(2, 2, figsize=(15,12)) for i, var in enumerate(variables): data.plot(ax=axs[i//2,i%2], column=f'mgwr_{var}', legend=True, cmap='coolwarm', scheme='quantiles', edgecolor='white') axs[i//2,i%2].set_title(var)4. 业务解读与模型优化
4.1 空间异质性模式识别
通过分析各变量带宽值,可以发现:
- mall(271)影响范围最大,说明商业配套具有区域级影响力
- hospital(51)作用范围最小,呈现高度本地化特征
- school(184)表现出中等影响半径,反映学区房效应范围
4.2 常见问题解决方案
内存不足报错:
- 减少网格分辨率
- 使用
kernel='gaussian'替代默认bi-square核
selector = Sel_BW(coords, y, X, multi=True, kernel='gaussian')系数可视化优化技巧:
# 动态调整色阶范围 vmin = data[variables].min().min() vmax = data[variables].max().max() data.plot(column='mgwr_school', vmin=vmin, vmax=vmax)模型对比决策矩阵:
| 指标 | OLS | GWR | MGWR |
|---|---|---|---|
| R² | 0.62 | 0.78 | 0.85 |
| AICc | 1523.4 | 1387.2 | 1276.5 |
| 运行时间(s) | 0.3 | 58.7 | 213.4 |
4.3 进阶应用方向
- 时空加权回归:结合时间维度分析房价演变
- 机器学习融合:用随机森林筛选重要变量后再进行MGWR
- 三维可视化:使用kepler.gl展示系数空间分布
from keplergl import KeplerGl map_config = {'config': {'version': 'v1'}} mgwr_map = KeplerGl(data=data, config=map_config) mgwr_map.save_to_html(file_name='mgwr_result.html')