1. 项目概述当城市形态成为居住隔离的“编码器”最近在整理城市数据分析的案例时我反复琢磨一个核心问题我们每天穿行的城市它的物理形态——那些街道的宽窄、建筑的密度、功能的混合程度——究竟在多大程度上以一种近乎“编码”的方式固化和加剧了社会群体的居住隔离这不仅仅是城市规划的理论探讨更是理解社会不平等空间化生成机制的关键。我选择了巴西圣保罗这座典型的全球南方大都市作为实证对象因为它浓缩了极致的贫富分化与复杂的空间形态。而这次分析的核心“解码工具”是信息论中的“熵”。你可能在机器学习里听过“交叉熵损失函数”或者在“熵密杯”这类CTF比赛中见过“排列熵”用于信号突变检测。没错就是同一个“熵”。它衡量的是系统的混乱度或信息量。在城市语境下我们可以用它来量化一个街区内土地利用、建筑类型或人口构成的混合或单一程度。高熵值意味着高度混合与多样性低熵值则指向功能或社会构成的单一与隔离。这个项目就是试图用“基于熵的测度”这把尺子去丈量圣保罗的城市形态并解读它如何“编码”了居住隔离的现实。这项分析适合所有对城市科学、社会地理、数据可视化或复杂系统分析感兴趣的朋友。无论你是城市规划师、社会研究者、数据科学家还是单纯好奇城市运行逻辑的观察者都能从中获得启发。它不满足于简单的相关性描述而是致力于构建一个从微观形态到宏观社会模式的解释框架。接下来我将拆解整个分析流程从数据获取与处理、熵指标的计算与解读到空间分析与统计建模最后分享实操中遇到的坑和独家心得。2. 核心思路与分析方法论为什么是“熵”2.1 从“信息熵”到“城市形态熵”概念迁移与操作化香农的信息熵公式H(X) -Σ p(x) log p(x)是这一切的起点。在通信领域它量化了信息的不确定性。在城市研究中我们可以进行一次巧妙的“概念迁移”将城市的一个基本空间单元如普查小区、街区视为一个“信源”将该单元内不同类型的构成要素如不同土地利用类别、不同收入等级的人口视为不同的“信号”。那么该单元内各类别所占的比例p(x)就决定了这个“信源”的“信息熵”。举个例子假设我们分析一个街区的土地利用。如果这个街区100%都是住宅用地那么它的土地利用熵就是0完全确定无信息量/无混合度。如果它由50%住宅、30%商业和20%绿地构成其熵值就会大于0反映了功能的混合。这种混合度直接关联到城市的活力、可达性以及不同社会群体日常交汇的可能性。低熵的、功能单一的区域如纯居住的封闭社区、纯工业区往往更容易产生社会隔离。在这个项目中我主要计算了两种熵土地利用熵基于土地用途分类住宅、商业、工业、公共设施、绿地等衡量功能混合度。社会经济熵基于家庭收入等级或教育水平等人口普查数据的分类衡量社会构成的混合度。这里需要特别注意计算社会经济熵时分类的设定需要结合本地实际情况例如圣保罗可能按最低工资倍数划分收入层级。2.2 圣保罗案例的典型性与分析框架为什么是圣保罗这座城市是研究居住隔离的“天然实验室”。它有着鲜明的中心-边缘结构存在大量非正规聚居区如贫民窟同时也有高度封闭的精英社区。这种空间分异不仅仅是经济差异的结果其本身也被城市形态如路网密度、地块划分、大型基础设施的布局所塑造和强化。我的整体分析框架是一个“形态-隔离”的关联性检验链条数据层整合多源数据包括土地利用图、建筑轮廓数据、人口普查数据、路网数据。指标计算层在统一的网格单元如500m x 500m或官方普查小区尺度上计算每个单元的“形态熵”如土地利用熵、建筑类型熵和“隔离指数”如基于收入的社会经济熵或经典的差异指数、隔离指数。关联分析层使用空间统计方法如莫兰指数检验空间自相关、多元回归模型等探究形态熵与隔离指数之间的统计关系并控制其他变量如到市中心的距离、平均收入水平。机制解读层结合定性知识和空间可视化解释统计结果背后的社会与空间过程。例如低土地利用熵功能单一且低社会经济熵社会同质的区域可能就是典型的封闭社区而某些高土地利用熵但社会经济熵极低的区域可能是中心城区的低收入混合功能区。3. 数据准备与处理脏活累活里的门道3.1 数据源获取与挑战圣保罗的官方数据相对开放但整合起来颇具挑战。主要数据源包括地理空间数据从圣保罗市地理信息系统门户获取土地利用分类图、行政区划边界。从OpenStreetMap补充路网和建筑足迹数据用于计算建筑密度、街道网络密度等辅助形态指标。社会经济数据巴西IBGE地理统计局的人口普查数据是核心。关键变量包括每个普查小区Setor Censitário的家庭收入分布、教育水平、种族构成等。这些数据通常以聚合表格形式提供需要与地理边界关联。注意不同数据源的空间尺度分辨率和坐标系必须统一。人口普查小区是分析社会经济熵的自然单元但为了与土地利用数据融合有时需要将数据聚合或插值到统一的规则网格上这个过程会引入误差需要谨慎处理。3.2 数据处理的关键步骤与代码片段数据处理在Python的GeoPandas、Pandas和Shapely生态中完成。核心步骤如下步骤1数据读取与初步清洗import geopandas as gpd import pandas as pd import numpy as np # 1. 读取人口普查数据CSV和地理边界Shapefile census_df pd.read_csv(sp_census_data.csv, encodinglatin-1) # 注意编码 census_geo gpd.read_file(sp_census_sectors.shp) # 2. 通过唯一ID如普查小区代码进行关联 census_gdf census_geo.merge(census_df, onsector_id) # 3. 读取土地利用数据 land_use_gdf gpd.read_file(sp_land_use.shp) # 4. 统一坐标系为UTM Zone 23S适用于圣保罗 target_crs EPSG:32723 census_gdf census_gdf.to_crs(target_crs) land_use_gdf land_use_gdf.to_crs(target_crs)步骤2创建统一的分析单元网格为了避免可塑性面积单元问题MAUP我选择创建规则的渔网网格作为分析单元然后将其他数据聚合到网格内。from shapely.geometry import box import matplotlib.pyplot as plt # 定义研究区域边界整个圣保罗市边界 city_boundary census_gdf.unary_union xmin, ymin, xmax, ymax city_boundary.bounds # 创建500m x 500m的网格 grid_size 500 rows int((ymax - ymin) / grid_size) cols int((xmax - xmin) / grid_size) grid_cells [] for i in range(cols): for j in range(rows): x0 xmin i * grid_size y0 ymin j * grid_size x1 xmin (i1) * grid_size y1 ymin (j1) * grid_size grid_cells.append(box(x0, y0, x1, y1)) # 转换为GeoDataFrame grid_gdf gpd.GeoDataFrame(grid_cells, columns[geometry], crstarget_crs) # 裁剪出研究区域内的网格 grid_gdf grid_gdf[grid_gdf.intersects(city_boundary)].reset_index(dropTrue) grid_gdf[grid_id] range(len(grid_gdf))步骤3空间连接与属性聚合这是计算每个网格单元内各类别比例的关键。# 将土地利用数据与网格进行空间连接计算每个网格内各类土地利用的面积比例 land_use_in_grid gpd.sjoin(land_use_gdf, grid_gdf, howinner, predicateintersects) # 计算相交面积需要将几何图形转换为投影坐标系以计算面积 land_use_in_grid[intersection_area] land_use_in_grid.geometry.intersection( grid_gdf.loc[land_use_in_grid.index_right].geometry).area # 按网格ID和土地利用类型分组计算面积 land_use_area land_use_in_grid.groupby([grid_id, land_use_type])[intersection_area].sum().reset_index() # 透视表行为网格列为土地利用类型值为面积 land_use_pivot land_use_area.pivot(indexgrid_id, columnsland_use_type, valuesintersection_area).fillna(0) # 计算每个网格的总面积可能因边界裁剪而小于25万平方米 grid_areas grid_gdf.set_index(grid_id).area land_use_pivot land_use_pivot.div(grid_areas, axis0) # 得到比例矩阵4. 熵指标的计算、可视化与空间模式解读4.1 计算土地利用熵与社会经济熵有了每个网格内各类别的比例矩阵计算熵就变得直接。def calculate_entropy(proportion_df): 计算每个单元行的香农熵。 proportion_df: DataFrame每行是一个空间单元每列是一个类别值为该类别在该单元中的比例。 # 避免log(0)的情况将0比例替换为一个极小值 p proportion_df.replace(0, 1e-10) entropy_series -np.sum(p * np.log2(p), axis1) return entropy_series # 计算土地利用熵 land_use_entropy calculate_entropy(land_use_pivot) grid_gdf[land_use_entropy] land_use_entropy # 计算社会经济熵以收入为例 # 假设census_income_pivot是每个网格内不同收入等级家庭户数的比例 # 获取每个网格内的人口普查数据通过面积加权或点包含的方式聚合 # ... (此处省略具体的普查数据空间聚合代码方法与土地利用类似) income_entropy calculate_entropy(census_income_pivot) grid_gdf[income_entropy] income_entropy4.2 空间可视化与初步发现使用geopandas的.plot()方法或contextily添加底图可以直观看到熵值的空间分布。import contextily as ctx fig, axes plt.subplots(1, 2, figsize(16, 8)) # 绘制土地利用熵 grid_gdf.plot(columnland_use_entropy, axaxes[0], legendTrue, cmapviridis, schemequantiles, edgecolornone, alpha0.8) ctx.add_basemap(axes[0], crsgrid_gdf.crs.to_string(), sourcectx.providers.CartoDB.Positron) axes[0].set_title(Land Use Entropy in São Paulo) axes[0].axis(off) # 绘制社会经济熵收入熵 grid_gdf.plot(columnincome_entropy, axaxes[1], legendTrue, cmapplasma, schemequantiles, edgecolornone, alpha0.8) ctx.add_basemap(axes[1], crsgrid_gdf.crs.to_string(), sourcectx.providers.CartoDB.Positron) axes[1].set_title(Income Entropy in São Paulo) axes[1].axis(off) plt.show()可视化解读土地利用熵预计市中心历史区域、一些混合用途的走廊地带会呈现高熵值颜色偏黄/白表明功能高度混合。而外围的纯居住区、大型工业区或封闭式社区会呈现低熵值颜色偏蓝/紫。社会经济熵其空间模式可能更加破碎。一些传统的工人居住区或正在绅士化的过渡区可能表现出中等熵值。而极富或极贫的社区熵值会非常低。将两张图对比可以直观寻找形态熵与社会熵在空间上耦合或背离的区域。4.3 从“排列熵”获得的启发测度形态的动力学网络热词中的“排列熵”给了我额外的灵感。排列熵常用于时间序列分析检测动力学的突变。虽然本项目主要用香农熵但我们可以借鉴其思想思考城市形态的“序列”特征。例如沿着一条主要交通走廊观察土地利用类型的序列变化其排列熵可能揭示了城市扩张或发展的阶段性。这是一个可以深挖的方向用于分析城市生长轴线的形态复杂性。5. 统计建模量化形态与隔离的关联5.1 变量构建与模型设定为了检验“城市形态编码居住隔离”的假设我构建了一个多元线性回归模型OLS并以空间误差模型SEM或空间滞后模型SLM作为补充以处理普遍存在的空间自相关。因变量income_entropy社会经济熵作为居住隔离的反向指标熵越低隔离越严重。核心自变量land_use_entropy土地利用熵。控制变量dist_to_center: 到市中心如保利斯塔大道的距离。avg_income: 网格内平均家庭收入对数转换。pop_density: 人口密度。road_density: 道路网络密度来自OSM数据。slope: 平均坡度地形可能影响开发模式。import statsmodels.api as sm from libpysal.weights import Queen from spreg import GM_Lag, GM_Error # 使用pysal的空间计量经济学模块 # 准备数据 model_df grid_gdf[[income_entropy, land_use_entropy, dist_to_center, avg_income_log, pop_density, road_density, slope]].dropna() Y model_df[income_entropy] X sm.add_constant(model_df[[land_use_entropy, dist_to_center, avg_income_log, pop_density, road_density, slope]]) # 1. 首先运行OLS ols_model sm.OLS(Y, X).fit() print(ols_model.summary()) # 2. 检验空间自相关莫兰指数 w Queen.from_dataframe(grid_gdf.dropna(subsetmodel_df.index.tolist())) # 创建空间权重矩阵 from esda.moran import Moran moran Moran(ols_model.resid, w) print(fMorans I for residuals: {moran.I}, p-value: {moran.p_sim}) # 3. 如果存在空间自相关拟合空间误差模型(SEM) if moran.p_sim 0.05: # 需要将数据与权重矩阵对齐 aligned_ids list(set(model_df.index) set(w.neighbors.keys())) w_subset w.subset(aligned_ids) Y_aligned Y.loc[aligned_ids] X_aligned X.loc[aligned_ids] sem_model GM_Error(Y_aligned.values, X_aligned.values, ww_subset) print(sem_model.summary)5.2 结果解读与机制分析假设回归结果显示在控制了收入、距离等因素后land_use_entropy的系数显著为正。这意味着土地利用混合度越高功能越多样的街区其社会经济构成也倾向于更加混合收入熵更高居住隔离程度更低。这背后的机制可能是就业-居住平衡功能混合的社区能提供本地就业机会减少长距离通勤使得不同收入群体有可能在同一个社区内生活和工作。公共服务共享混合社区中的公共空间、设施和服务如公园、市场、公交站被更多样的人群使用促进了日常接触。住房市场分化功能单一的低熵区域如纯高端住宅区往往通过 zoning分区法规、房价和市场力量主动排斥其他收入群体。而高熵区域可能提供更多样化的住房类型公寓、联排、老旧住宅容纳了不同经济能力的居民。历史路径依赖圣保罗某些高熵的市中心区域其混合形态是历史长期发展的结果这种形态本身可能延缓了绅士化导致的单一化进程。如果系数不显著或为负则需要深入分析。可能的原因包括“混合”的假象统计上的土地利用混合可能实际是垂直方向上的隔离底商高端公寓社会交往依然有限。尺度问题500米网格可能太大掩盖了微观隔离。需要尝试更小的网格或基于街道段的分析。存在强烈的调节变量例如在平均收入极高的区域即使功能混合社会隔离依然严重门禁社区内的混合功能只服务于内部居民。6. 实操陷阱、心得与扩展方向6.1 踩过的坑与解决方案数据尺度不一致的灾难最初试图将普查数据直接与土地利用多边形叠加计算结果因尺度悬殊导致大量信息丢失。解决方案统一使用规则网格作为“中间容器”将所有矢量数据面、线通过面积加权或长度加权的方式聚合到网格中。对于点状人口数据假设均匀分布则使用网格包含的普查小区数据进行面积加权平均。熵值对分类体系的敏感性土地利用分类是10类还是5类计算结果差异巨大。心得分类应基于理论意义和数据质量。我参考了当地城市规划标准并进行了敏感性测试最终采用了一个7分类体系居住、商业、工业、公共服务、绿地、交通、其他确保每个类别都有明确的社会空间含义。空间自相关的忽视最初的OLS模型残差存在强烈的空间自相关违背了独立同分布假设导致标准误低估可能产生伪显著。必须进行莫兰指数检验并选用空间计量模型进行校正。SEM模型的结果通常更可靠。“边界效应”处理位于市边界的网格其数据可能不完整因为数据只覆盖本市。处理方式分析时只保留完全在研究区域内的网格或使用缓冲区分析但需明确说明局限性。6.2 项目扩展的更多可能性引入“交叉熵”概念机器学习中的交叉熵衡量两个分布的差异。我们可以计算每个街区实际的社会经济构成与“理想”混合分布如城市整体分布之间的交叉熵作为衡量其偏离“城市平均多样性”的指标这可能比香农熵更具政策参考意义。动态分析如果有多期数据如2000 2010 2020年普查可以计算熵值的时间变化观察哪些区域在走向“隔离”或“融合”并与城市重大事件如奥运会、经济危机关联。结合街景图像与深度学习使用预训练的CNN模型分析街景图片提取视觉特征熵如建筑风格、街道家具的混乱度将其作为形态熵的补充并与社会熵进行关联分析。网络分析增强不仅计算网格内部的熵还计算每个网格在街道网络中的“可达性熵”——即从该网格出发在一定出行时间内能到达的各类POI兴趣点的混合度。这能将静态形态与动态活动联系起来。这个基于熵的圣保罗实证分析就像是为城市做了一次“CT扫描”量化了其肌理的“纹理”与社会“血脉”之间的关联。它告诉我们城市规划不仅仅是绘制蓝图更是在编写一套影响深远的空间代码。促进功能适度混合、提升空间的可达性与包容性或许是破解居住隔离这一顽疾的重要空间手段。数据分析的价值就在于让这些隐藏的编码规则变得清晰可见为更公正的城市设计提供证据基石。
用信息熵解码城市形态:圣保罗居住隔离的空间量化分析
发布时间:2026/6/26 10:29:02
1. 项目概述当城市形态成为居住隔离的“编码器”最近在整理城市数据分析的案例时我反复琢磨一个核心问题我们每天穿行的城市它的物理形态——那些街道的宽窄、建筑的密度、功能的混合程度——究竟在多大程度上以一种近乎“编码”的方式固化和加剧了社会群体的居住隔离这不仅仅是城市规划的理论探讨更是理解社会不平等空间化生成机制的关键。我选择了巴西圣保罗这座典型的全球南方大都市作为实证对象因为它浓缩了极致的贫富分化与复杂的空间形态。而这次分析的核心“解码工具”是信息论中的“熵”。你可能在机器学习里听过“交叉熵损失函数”或者在“熵密杯”这类CTF比赛中见过“排列熵”用于信号突变检测。没错就是同一个“熵”。它衡量的是系统的混乱度或信息量。在城市语境下我们可以用它来量化一个街区内土地利用、建筑类型或人口构成的混合或单一程度。高熵值意味着高度混合与多样性低熵值则指向功能或社会构成的单一与隔离。这个项目就是试图用“基于熵的测度”这把尺子去丈量圣保罗的城市形态并解读它如何“编码”了居住隔离的现实。这项分析适合所有对城市科学、社会地理、数据可视化或复杂系统分析感兴趣的朋友。无论你是城市规划师、社会研究者、数据科学家还是单纯好奇城市运行逻辑的观察者都能从中获得启发。它不满足于简单的相关性描述而是致力于构建一个从微观形态到宏观社会模式的解释框架。接下来我将拆解整个分析流程从数据获取与处理、熵指标的计算与解读到空间分析与统计建模最后分享实操中遇到的坑和独家心得。2. 核心思路与分析方法论为什么是“熵”2.1 从“信息熵”到“城市形态熵”概念迁移与操作化香农的信息熵公式H(X) -Σ p(x) log p(x)是这一切的起点。在通信领域它量化了信息的不确定性。在城市研究中我们可以进行一次巧妙的“概念迁移”将城市的一个基本空间单元如普查小区、街区视为一个“信源”将该单元内不同类型的构成要素如不同土地利用类别、不同收入等级的人口视为不同的“信号”。那么该单元内各类别所占的比例p(x)就决定了这个“信源”的“信息熵”。举个例子假设我们分析一个街区的土地利用。如果这个街区100%都是住宅用地那么它的土地利用熵就是0完全确定无信息量/无混合度。如果它由50%住宅、30%商业和20%绿地构成其熵值就会大于0反映了功能的混合。这种混合度直接关联到城市的活力、可达性以及不同社会群体日常交汇的可能性。低熵的、功能单一的区域如纯居住的封闭社区、纯工业区往往更容易产生社会隔离。在这个项目中我主要计算了两种熵土地利用熵基于土地用途分类住宅、商业、工业、公共设施、绿地等衡量功能混合度。社会经济熵基于家庭收入等级或教育水平等人口普查数据的分类衡量社会构成的混合度。这里需要特别注意计算社会经济熵时分类的设定需要结合本地实际情况例如圣保罗可能按最低工资倍数划分收入层级。2.2 圣保罗案例的典型性与分析框架为什么是圣保罗这座城市是研究居住隔离的“天然实验室”。它有着鲜明的中心-边缘结构存在大量非正规聚居区如贫民窟同时也有高度封闭的精英社区。这种空间分异不仅仅是经济差异的结果其本身也被城市形态如路网密度、地块划分、大型基础设施的布局所塑造和强化。我的整体分析框架是一个“形态-隔离”的关联性检验链条数据层整合多源数据包括土地利用图、建筑轮廓数据、人口普查数据、路网数据。指标计算层在统一的网格单元如500m x 500m或官方普查小区尺度上计算每个单元的“形态熵”如土地利用熵、建筑类型熵和“隔离指数”如基于收入的社会经济熵或经典的差异指数、隔离指数。关联分析层使用空间统计方法如莫兰指数检验空间自相关、多元回归模型等探究形态熵与隔离指数之间的统计关系并控制其他变量如到市中心的距离、平均收入水平。机制解读层结合定性知识和空间可视化解释统计结果背后的社会与空间过程。例如低土地利用熵功能单一且低社会经济熵社会同质的区域可能就是典型的封闭社区而某些高土地利用熵但社会经济熵极低的区域可能是中心城区的低收入混合功能区。3. 数据准备与处理脏活累活里的门道3.1 数据源获取与挑战圣保罗的官方数据相对开放但整合起来颇具挑战。主要数据源包括地理空间数据从圣保罗市地理信息系统门户获取土地利用分类图、行政区划边界。从OpenStreetMap补充路网和建筑足迹数据用于计算建筑密度、街道网络密度等辅助形态指标。社会经济数据巴西IBGE地理统计局的人口普查数据是核心。关键变量包括每个普查小区Setor Censitário的家庭收入分布、教育水平、种族构成等。这些数据通常以聚合表格形式提供需要与地理边界关联。注意不同数据源的空间尺度分辨率和坐标系必须统一。人口普查小区是分析社会经济熵的自然单元但为了与土地利用数据融合有时需要将数据聚合或插值到统一的规则网格上这个过程会引入误差需要谨慎处理。3.2 数据处理的关键步骤与代码片段数据处理在Python的GeoPandas、Pandas和Shapely生态中完成。核心步骤如下步骤1数据读取与初步清洗import geopandas as gpd import pandas as pd import numpy as np # 1. 读取人口普查数据CSV和地理边界Shapefile census_df pd.read_csv(sp_census_data.csv, encodinglatin-1) # 注意编码 census_geo gpd.read_file(sp_census_sectors.shp) # 2. 通过唯一ID如普查小区代码进行关联 census_gdf census_geo.merge(census_df, onsector_id) # 3. 读取土地利用数据 land_use_gdf gpd.read_file(sp_land_use.shp) # 4. 统一坐标系为UTM Zone 23S适用于圣保罗 target_crs EPSG:32723 census_gdf census_gdf.to_crs(target_crs) land_use_gdf land_use_gdf.to_crs(target_crs)步骤2创建统一的分析单元网格为了避免可塑性面积单元问题MAUP我选择创建规则的渔网网格作为分析单元然后将其他数据聚合到网格内。from shapely.geometry import box import matplotlib.pyplot as plt # 定义研究区域边界整个圣保罗市边界 city_boundary census_gdf.unary_union xmin, ymin, xmax, ymax city_boundary.bounds # 创建500m x 500m的网格 grid_size 500 rows int((ymax - ymin) / grid_size) cols int((xmax - xmin) / grid_size) grid_cells [] for i in range(cols): for j in range(rows): x0 xmin i * grid_size y0 ymin j * grid_size x1 xmin (i1) * grid_size y1 ymin (j1) * grid_size grid_cells.append(box(x0, y0, x1, y1)) # 转换为GeoDataFrame grid_gdf gpd.GeoDataFrame(grid_cells, columns[geometry], crstarget_crs) # 裁剪出研究区域内的网格 grid_gdf grid_gdf[grid_gdf.intersects(city_boundary)].reset_index(dropTrue) grid_gdf[grid_id] range(len(grid_gdf))步骤3空间连接与属性聚合这是计算每个网格单元内各类别比例的关键。# 将土地利用数据与网格进行空间连接计算每个网格内各类土地利用的面积比例 land_use_in_grid gpd.sjoin(land_use_gdf, grid_gdf, howinner, predicateintersects) # 计算相交面积需要将几何图形转换为投影坐标系以计算面积 land_use_in_grid[intersection_area] land_use_in_grid.geometry.intersection( grid_gdf.loc[land_use_in_grid.index_right].geometry).area # 按网格ID和土地利用类型分组计算面积 land_use_area land_use_in_grid.groupby([grid_id, land_use_type])[intersection_area].sum().reset_index() # 透视表行为网格列为土地利用类型值为面积 land_use_pivot land_use_area.pivot(indexgrid_id, columnsland_use_type, valuesintersection_area).fillna(0) # 计算每个网格的总面积可能因边界裁剪而小于25万平方米 grid_areas grid_gdf.set_index(grid_id).area land_use_pivot land_use_pivot.div(grid_areas, axis0) # 得到比例矩阵4. 熵指标的计算、可视化与空间模式解读4.1 计算土地利用熵与社会经济熵有了每个网格内各类别的比例矩阵计算熵就变得直接。def calculate_entropy(proportion_df): 计算每个单元行的香农熵。 proportion_df: DataFrame每行是一个空间单元每列是一个类别值为该类别在该单元中的比例。 # 避免log(0)的情况将0比例替换为一个极小值 p proportion_df.replace(0, 1e-10) entropy_series -np.sum(p * np.log2(p), axis1) return entropy_series # 计算土地利用熵 land_use_entropy calculate_entropy(land_use_pivot) grid_gdf[land_use_entropy] land_use_entropy # 计算社会经济熵以收入为例 # 假设census_income_pivot是每个网格内不同收入等级家庭户数的比例 # 获取每个网格内的人口普查数据通过面积加权或点包含的方式聚合 # ... (此处省略具体的普查数据空间聚合代码方法与土地利用类似) income_entropy calculate_entropy(census_income_pivot) grid_gdf[income_entropy] income_entropy4.2 空间可视化与初步发现使用geopandas的.plot()方法或contextily添加底图可以直观看到熵值的空间分布。import contextily as ctx fig, axes plt.subplots(1, 2, figsize(16, 8)) # 绘制土地利用熵 grid_gdf.plot(columnland_use_entropy, axaxes[0], legendTrue, cmapviridis, schemequantiles, edgecolornone, alpha0.8) ctx.add_basemap(axes[0], crsgrid_gdf.crs.to_string(), sourcectx.providers.CartoDB.Positron) axes[0].set_title(Land Use Entropy in São Paulo) axes[0].axis(off) # 绘制社会经济熵收入熵 grid_gdf.plot(columnincome_entropy, axaxes[1], legendTrue, cmapplasma, schemequantiles, edgecolornone, alpha0.8) ctx.add_basemap(axes[1], crsgrid_gdf.crs.to_string(), sourcectx.providers.CartoDB.Positron) axes[1].set_title(Income Entropy in São Paulo) axes[1].axis(off) plt.show()可视化解读土地利用熵预计市中心历史区域、一些混合用途的走廊地带会呈现高熵值颜色偏黄/白表明功能高度混合。而外围的纯居住区、大型工业区或封闭式社区会呈现低熵值颜色偏蓝/紫。社会经济熵其空间模式可能更加破碎。一些传统的工人居住区或正在绅士化的过渡区可能表现出中等熵值。而极富或极贫的社区熵值会非常低。将两张图对比可以直观寻找形态熵与社会熵在空间上耦合或背离的区域。4.3 从“排列熵”获得的启发测度形态的动力学网络热词中的“排列熵”给了我额外的灵感。排列熵常用于时间序列分析检测动力学的突变。虽然本项目主要用香农熵但我们可以借鉴其思想思考城市形态的“序列”特征。例如沿着一条主要交通走廊观察土地利用类型的序列变化其排列熵可能揭示了城市扩张或发展的阶段性。这是一个可以深挖的方向用于分析城市生长轴线的形态复杂性。5. 统计建模量化形态与隔离的关联5.1 变量构建与模型设定为了检验“城市形态编码居住隔离”的假设我构建了一个多元线性回归模型OLS并以空间误差模型SEM或空间滞后模型SLM作为补充以处理普遍存在的空间自相关。因变量income_entropy社会经济熵作为居住隔离的反向指标熵越低隔离越严重。核心自变量land_use_entropy土地利用熵。控制变量dist_to_center: 到市中心如保利斯塔大道的距离。avg_income: 网格内平均家庭收入对数转换。pop_density: 人口密度。road_density: 道路网络密度来自OSM数据。slope: 平均坡度地形可能影响开发模式。import statsmodels.api as sm from libpysal.weights import Queen from spreg import GM_Lag, GM_Error # 使用pysal的空间计量经济学模块 # 准备数据 model_df grid_gdf[[income_entropy, land_use_entropy, dist_to_center, avg_income_log, pop_density, road_density, slope]].dropna() Y model_df[income_entropy] X sm.add_constant(model_df[[land_use_entropy, dist_to_center, avg_income_log, pop_density, road_density, slope]]) # 1. 首先运行OLS ols_model sm.OLS(Y, X).fit() print(ols_model.summary()) # 2. 检验空间自相关莫兰指数 w Queen.from_dataframe(grid_gdf.dropna(subsetmodel_df.index.tolist())) # 创建空间权重矩阵 from esda.moran import Moran moran Moran(ols_model.resid, w) print(fMorans I for residuals: {moran.I}, p-value: {moran.p_sim}) # 3. 如果存在空间自相关拟合空间误差模型(SEM) if moran.p_sim 0.05: # 需要将数据与权重矩阵对齐 aligned_ids list(set(model_df.index) set(w.neighbors.keys())) w_subset w.subset(aligned_ids) Y_aligned Y.loc[aligned_ids] X_aligned X.loc[aligned_ids] sem_model GM_Error(Y_aligned.values, X_aligned.values, ww_subset) print(sem_model.summary)5.2 结果解读与机制分析假设回归结果显示在控制了收入、距离等因素后land_use_entropy的系数显著为正。这意味着土地利用混合度越高功能越多样的街区其社会经济构成也倾向于更加混合收入熵更高居住隔离程度更低。这背后的机制可能是就业-居住平衡功能混合的社区能提供本地就业机会减少长距离通勤使得不同收入群体有可能在同一个社区内生活和工作。公共服务共享混合社区中的公共空间、设施和服务如公园、市场、公交站被更多样的人群使用促进了日常接触。住房市场分化功能单一的低熵区域如纯高端住宅区往往通过 zoning分区法规、房价和市场力量主动排斥其他收入群体。而高熵区域可能提供更多样化的住房类型公寓、联排、老旧住宅容纳了不同经济能力的居民。历史路径依赖圣保罗某些高熵的市中心区域其混合形态是历史长期发展的结果这种形态本身可能延缓了绅士化导致的单一化进程。如果系数不显著或为负则需要深入分析。可能的原因包括“混合”的假象统计上的土地利用混合可能实际是垂直方向上的隔离底商高端公寓社会交往依然有限。尺度问题500米网格可能太大掩盖了微观隔离。需要尝试更小的网格或基于街道段的分析。存在强烈的调节变量例如在平均收入极高的区域即使功能混合社会隔离依然严重门禁社区内的混合功能只服务于内部居民。6. 实操陷阱、心得与扩展方向6.1 踩过的坑与解决方案数据尺度不一致的灾难最初试图将普查数据直接与土地利用多边形叠加计算结果因尺度悬殊导致大量信息丢失。解决方案统一使用规则网格作为“中间容器”将所有矢量数据面、线通过面积加权或长度加权的方式聚合到网格中。对于点状人口数据假设均匀分布则使用网格包含的普查小区数据进行面积加权平均。熵值对分类体系的敏感性土地利用分类是10类还是5类计算结果差异巨大。心得分类应基于理论意义和数据质量。我参考了当地城市规划标准并进行了敏感性测试最终采用了一个7分类体系居住、商业、工业、公共服务、绿地、交通、其他确保每个类别都有明确的社会空间含义。空间自相关的忽视最初的OLS模型残差存在强烈的空间自相关违背了独立同分布假设导致标准误低估可能产生伪显著。必须进行莫兰指数检验并选用空间计量模型进行校正。SEM模型的结果通常更可靠。“边界效应”处理位于市边界的网格其数据可能不完整因为数据只覆盖本市。处理方式分析时只保留完全在研究区域内的网格或使用缓冲区分析但需明确说明局限性。6.2 项目扩展的更多可能性引入“交叉熵”概念机器学习中的交叉熵衡量两个分布的差异。我们可以计算每个街区实际的社会经济构成与“理想”混合分布如城市整体分布之间的交叉熵作为衡量其偏离“城市平均多样性”的指标这可能比香农熵更具政策参考意义。动态分析如果有多期数据如2000 2010 2020年普查可以计算熵值的时间变化观察哪些区域在走向“隔离”或“融合”并与城市重大事件如奥运会、经济危机关联。结合街景图像与深度学习使用预训练的CNN模型分析街景图片提取视觉特征熵如建筑风格、街道家具的混乱度将其作为形态熵的补充并与社会熵进行关联分析。网络分析增强不仅计算网格内部的熵还计算每个网格在街道网络中的“可达性熵”——即从该网格出发在一定出行时间内能到达的各类POI兴趣点的混合度。这能将静态形态与动态活动联系起来。这个基于熵的圣保罗实证分析就像是为城市做了一次“CT扫描”量化了其肌理的“纹理”与社会“血脉”之间的关联。它告诉我们城市规划不仅仅是绘制蓝图更是在编写一套影响深远的空间代码。促进功能适度混合、提升空间的可达性与包容性或许是破解居住隔离这一顽疾的重要空间手段。数据分析的价值就在于让这些隐藏的编码规则变得清晰可见为更公正的城市设计提供证据基石。