告别全局平均!用Python+MGWR库实战空间异质性分析(附南京房价数据案例)
·
告别全局平均!用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数据,需进行以下处理:
- 格网化处理:将研究区域划分为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: 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 常见问题解决方案
-
内存不足报错:
- 减少网格分辨率
- 使用
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')
更多推荐



所有评论(0)