Python实战:用GeoPandas和MGWR库分析南京房价影响因素(附完整代码)
Python实战用GeoPandas和MGWR库构建房价分析模型地理加权回归GWR和多尺度地理加权回归MGWR是分析空间异质性的强大工具。不同于传统回归方法假设空间均质这两种技术允许回归系数随地理位置变化更贴近现实世界的复杂情况。本文将手把手带你用Python实现完整的分析流程从数据准备到模型解释。1. 环境准备与数据加载在开始之前确保已安装以下Python库pip install geopandas mgwr matplotlib contextily numpy pandas地理空间数据分析离不开合适的数据格式。我们使用GeoPandas处理ESRI Shapefile.shp文件这是GIS领域最常用的矢量数据格式之一。假设我们有一个包含南京房价相关数据的shapefileimport geopandas as gpd import matplotlib.pyplot as plt import contextily as ctx # 加载shapefile并转换到Web墨卡托投影 nj_data gpd.read_file(nanjing_housing.shp).to_crs(epsg3857) # 可视化数据 fig, ax plt.subplots(figsize(12, 12)) nj_data.plot(axax, alpha0.5, edgecolork) ctx.add_basemap(ax, sourcectx.providers.OpenStreetMap.Mapnik) plt.title(南京市住宅小区分布) plt.axis(off) plt.show()注意确保shapefile包含必要的字段如房价、周边设施数量等解释变量。2. 数据预处理与探索高质量的数据预处理是模型成功的关键。我们需要处理缺失值和异常值标准化变量检查空间自相关import numpy as np from mgwr.utils import standardize # 选择解释变量和目标变量 variables [government, entertainment, retail, medical, park, dining, hotel] X nj_data[variables].values y nj_data[price].values.reshape(-1, 1) # 标准化数据 X_std standardize(X) y_std standardize(y) # 获取坐标数据 coords list(zip(nj_data[longitude], nj_data[latitude]))常见问题排查坐标系统不一致会导致分析错误解释变量间高度相关多重共线性会影响模型稳定性空间数据聚类可能导致结果偏差3. 构建GWR模型地理加权回归GWR是传统线性回归的空间扩展允许参数随空间位置变化。from mgwr.gwr import GWR from mgwr.sel_bw import Sel_BW import time # 选择最佳带宽 start_time time.time() gwr_selector Sel_BW(coords, y_std, X_std) gwr_bw gwr_selector.search() print(f最优带宽: {gwr_bw}) # 拟合GWR模型 gwr_model GWR(coords, y_std, X_std, gwr_bw) gwr_results gwr_model.fit() print(f模型拟合耗时: {time.time() - start_time:.2f}秒)模型输出解读指标说明R²模型解释的方差比例AICc校正的赤池信息准则用于模型比较带宽空间影响范围值越大表示空间依赖性越强4. 进阶MGWR建模多尺度地理加权回归MGWR是GWR的改进允许不同变量有不同的空间尺度。from mgwr.gwr import MGWR # 选择MGWR带宽 start_time time.time() mgwr_selector Sel_BW(coords, y_std, X_std, multiTrue) mgwr_bw mgwr_selector.search() print(f各变量带宽: {mgwr_bw}) # 拟合MGWR模型 mgwr_model MGWR(coords, y_std, X_std, mgwr_selector) mgwr_results mgwr_model.fit() print(f模型拟合耗时: {time.time() - start_time:.2f}秒)MGWR优势对比特征GWRMGWR带宽全局统一变量特定计算效率较高较低解释能力一般更强适用场景简单空间异质性复杂多尺度过程5. 结果可视化与分析将模型结果可视化是理解空间模式的关键步骤。# 将系数添加到原始数据 for i, var in enumerate(variables): nj_data[fgwr_{var}] gwr_results.params[:, i] nj_data[fmgwr_{var}] mgwr_results.params[:, i] # 绘制政府机关设施影响的比较 fig, (ax1, ax2) plt.subplots(1, 2, figsize(20, 10)) nj_data.plot(columngwr_government, axax1, legendTrue, cmapcoolwarm, schemequantiles, legend_kwds{loc: upper left}) ax1.set_title(GWR政府机关影响系数) nj_data.plot(columnmgwr_government, axax2, legendTrue, cmapcoolwarm, schemequantiles, legend_kwds{loc: upper left}) ax2.set_title(MGWR政府机关影响系数) ctx.add_basemap(ax1) ctx.add_basemap(ax2) plt.show()实际案例发现教育设施对房价的影响呈现明显的距离衰减商业设施影响具有多中心结构公园绿地的影响范围比预期更广6. 模型比较与选择科学评估模型性能是研究的重要环节。# 收集模型指标 model_metrics { OLS: {R2: 0.65, AICc: 1200, BIC: 1250}, GWR: {R2: gwr_results.R2, AICc: gwr_results.aicc, BIC: gwr_results.bic}, MGWR: {R2: mgwr_results.R2, AICc: mgwr_results.aicc, BIC: mgwr_results.bic} } # 比较表 print(f{模型:10}{R²:10}{AICc:10}{BIC:10}) for model, metrics in model_metrics.items(): print(f{model:10}{metrics[R2]:10.3f}{metrics[AICc]:10.1f}{metrics[BIC]:10.1f})选择建议当空间异质性简单时GWR是高效选择面对复杂多尺度过程MGWR更合适计算资源有限时可考虑GWR7. 实战技巧与优化提高模型性能的实用方法数据层面确保空间单元大小一致处理极端值影响考虑空间自相关结构技术实现使用Jupyter Notebook便于交互大数据集考虑并行计算保存中间结果避免重复计算# 示例并行计算设置 from mgwr.utils import Pool pool Pool(processes4) # 使用4个CPU核心 mgwr_selector Sel_BW(coords, y_std, X_std, multiTrue, poolpool)在南京房价分析项目中MGWR揭示了不同设施对房价影响的空间异质性模式。商业设施表现出500-800米的影响半径而教育资源的影响范围可达1.5公里这种差异用传统GWR无法捕捉。