告别全局平均!用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 keplergl

2.2 数据预处理实战

假设已获取南京市六城区(玄武、秦淮、建邺、鼓楼、栖霞、雨花台)的房价与POI数据,需进行以下处理:

  1. 格网化处理:将研究区域划分为1km×1km网格
  2. 变量标准化
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])
  1. 空间可视化检查
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: 63

3.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 常见问题解决方案

  1. 内存不足报错

    • 减少网格分辨率
    • 使用kernel='gaussian'替代默认bi-square核
    selector = Sel_BW(coords, y, X, multi=True, kernel='gaussian')
    
  2. 系数可视化优化技巧

    # 动态调整色阶范围
    vmin = data[variables].min().min()
    vmax = data[variables].max().max()
    data.plot(column='mgwr_school', vmin=vmin, vmax=vmax)
    
  3. 模型对比决策矩阵

指标 OLS GWR MGWR
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')

更多推荐