Grouping residential parcels by land value and analyzing their distance to shelters reveals a distinct pattern of exposure disparity. Lower-value parcels, particularly those below 200 USD per square meter, are located farther from designated shelters, with many exceeding distances of 2,500 to 4,000 meters. This suggests that lower-income communities require longer travel times during emergencies, resulting in higher evacuation costs and slower response capabilities.
A second pattern emerges when considering flood susceptibility. High and very high susceptibility parcels are disproportionately concentrated within the lower land value range. This indicates a spatial overlap between economic disadvantage and hazard exposure—a condition often associated with environmental and climate justice inequities, where the communities least able to mitigate risks are the most exposed to them.
Conversely, parcels of higher land value are generally located closer to shelters, as reflected in the downward trend in the plot. These areas are more likely to benefit from better infrastructure, public services, and emergency facilities, underscoring structural unevenness in the distribution of safety-related resources.
Code
import altair as alt# Palette for susceptibilitysuscept_order = ["Very Low", "Low", "Moderate", "High", "Very High"]colors = ["#2ca25f", "#99d8c9", "#fed98e", "#f46d43", "#bd0026"] # match legendalt.data_transformers.disable_max_rows()# Drop rows missing key fieldsdf_raw = bld_with_access.dropna(subset=["land_value_per_m2", "dist_to_shelter_m", "suscept_class"]).copy()# Remove extreme outliers (99th percentile cap)upper_cap = df_raw["land_value_per_m2"].quantile(0.99)df = df_raw[df_raw["land_value_per_m2"] <= upper_cap]# Base scatter with custom colorsbase = ( alt.Chart(df) .mark_circle(size=60, opacity=0.6) .encode( x=alt.X("land_value_per_m2:Q", scale=alt.Scale(zero=False), title="Land Value per m² (USD)"), y=alt.Y("dist_to_shelter_m:Q", scale=alt.Scale(zero=False), title="Distance to Shelter (m)"), color=alt.Color("suscept_class:N", title="Flood Susceptibility", scale=alt.Scale(domain=suscept_order, range=colors), ), tooltip=[ alt.Tooltip("land_value_per_m2:Q", title="Land Value per m²"), alt.Tooltip("dist_to_shelter_m:Q", title="Distance to Shelter (m)"), alt.Tooltip("suscept_class:N", title="Susceptibility"), ], ))# Regression line trend = ( alt.Chart(df) .transform_regression("land_value_per_m2", "dist_to_shelter_m") .mark_line(color="#1f4e63") .encode( x=alt.X("land_value_per_m2:Q", scale=alt.Scale(zero=False)), y=alt.Y("dist_to_shelter_m:Q", scale=alt.Scale(zero=False)), ))chart = ( (base + trend) .properties( width=600, height=400, ) .interactive())chart
Figure 1: Land Value per m² vs. Distance to Shelter