library(tidyverse)
library(sf)
library(janitor)
library(scales)
library(knitr)
options(scipen = 999)Mitchell-Lama Housing, Income, and Urban Change in NYC
1 Introduction & Research Question
This project examines the spatial relationship between Mitchell-Lama housing developments and neighborhood income levels across New York City Public Use Microdata Areas (PUMAs). As housing markets in many NYC neighborhoods have intensified over recent decades, long-standing forms of regulated and publicly supported housing have become increasingly important for preserving affordability for middle-income residents.
The guiding research question is:
How are Mitchell-Lama housing developments spatially distributed across NYC neighborhoods, and what do neighborhood income patterns reveal about their role in a changing urban environment?
Rather than making causal claims, this analysis situates Mitchell-Lama housing within the broader geography of income, urban change, and neighborhood transformation.
2 Conceptual Framing: Space, Housing, and Urban Change
Urban space is not neutral. As David Harvey argues, space is actively produced through political, economic, and social processes rather than merely serving as a passive container for them. In the context of capitalist urbanization, land values, housing markets, and state policy interact to reshape neighborhoods over time, often producing uneven development and displacement pressures.
Mitchell-Lama housing can be understood as an intervention within this process. By providing long-term, regulated housing for middle-income households, Mitchell-Lama developments function as stabilizing anchors in neighborhoods experiencing rising land values and demographic change. Their spatial persistence complicates narratives of gentrification that treat displacement as inevitable, instead highlighting how policy-mediated housing forms can shape who is able to remain in place as urban space is restructured.
3 Data Sources
- NYC PUMA boundaries and socioeconomic attributes:
data/nyc_pumas_final.geojson - Mitchell-Lama building locations:
data/mitchell_lama.csv
4 Setup
5 Load Data (PATH 1: No External Income Joins)
pumas <- sf::st_read("data/nyc_pumas_final.geojson", quiet = TRUE)
stopifnot("PUMACE10" %in% names(pumas))
stopifnot("median_income" %in% names(pumas))
pumas <- sf::st_make_valid(pumas)
ml_raw <- readr::read_csv("data/mitchell_lama.csv", show_col_types = FALSE) |>
janitor::clean_names()
ml_sf <- ml_raw |>
sf::st_as_sf(coords = c("longitude", "latitude"), crs = 4326, remove = FALSE) |>
sf::st_transform(sf::st_crs(pumas))6 Spatial Join and Aggregation
ml_joined <- sf::st_join(
ml_sf,
pumas |> select(PUMACE10),
left = FALSE
)
ml_counts <- ml_joined |>
sf::st_drop_geometry() |>
count(PUMACE10, name = "ml_buildings")
pumas_map <- pumas |>
left_join(ml_counts, by = "PUMACE10") |>
mutate(
ml_buildings = replace_na(ml_buildings, 0L),
has_ml = ml_buildings > 0
)7 Descriptive Analysis with Percentage Differences
eda <- pumas_map |>
sf::st_drop_geometry() |>
transmute(
PUMACE10,
puma_name = NAMELSAD10,
median_income = as.numeric(median_income),
ml_buildings,
has_ml
)
mean_with_ml <- mean(eda$median_income[eda$has_ml], na.rm = TRUE)
mean_without_ml <- mean(eda$median_income[!eda$has_ml], na.rm = TRUE)
median_with_ml <- median(eda$median_income[eda$has_ml], na.rm = TRUE)
median_without_ml <- median(eda$median_income[!eda$has_ml], na.rm = TRUE)
pct_diff_mean <- (mean_with_ml - mean_without_ml) / mean_without_ml
pct_diff_median <- (median_with_ml - median_without_ml) / median_without_ml
summary_tbl <- tibble(
metric = c(
"Total NYC PUMAs",
"PUMAs with ≥1 Mitchell-Lama development",
"Share of PUMAs with Mitchell-Lama",
"Mean median income (with Mitchell-Lama)",
"Mean median income (without Mitchell-Lama)",
"Percent difference in mean income",
"Median income (with Mitchell-Lama)",
"Median income (without Mitchell-Lama)",
"Percent difference in median income"
),
value = c(
nrow(eda),
sum(eda$has_ml),
percent(mean(eda$has_ml), accuracy = 0.1),
dollar(mean_with_ml),
dollar(mean_without_ml),
percent(pct_diff_mean, accuracy = 0.1),
dollar(median_with_ml),
dollar(median_without_ml),
percent(pct_diff_median, accuracy = 0.1)
)
)
knitr::kable(summary_tbl, align = c("l", "l"))| metric | value |
|---|---|
| Total NYC PUMAs | 63 |
| PUMAs with ≥1 Mitchell-Lama development | 24 |
| Share of PUMAs with Mitchell-Lama | 38.1% |
| Mean median income (with Mitchell-Lama) | $81,614.36 |
| Mean median income (without Mitchell-Lama) | $91,815.22 |
| Percent difference in mean income | -11.1% |
| Median income (with Mitchell-Lama) | $71,942.50 |
| Median income (without Mitchell-Lama) | $92,486.50 |
| Percent difference in median income | -22.2% |
8 Map 1: Median Household Income by NYC PUMA
ggplot(pumas_map) +
geom_sf(aes(fill = median_income), color = NA) +
scale_fill_viridis_c(
name = "Median household income",
labels = dollar
) +
labs(
title = "Median Household Income by NYC PUMA",
subtitle = "Income values embedded in nyc_pumas_final.geojson"
) +
theme_minimal()
9 Map 2: Number of Mitchell-Lama Buildings by PUMA
ggplot(pumas_map) +
geom_sf(aes(fill = ml_buildings), color = NA) +
scale_fill_viridis_c(
name = "Mitchell-Lama buildings"
) +
labs(
title = "Distribution of Mitchell-Lama Housing by NYC PUMA"
) +
theme_minimal()
10 Map 3: Individual Mitchell-Lama Building Locations
ggplot() +
geom_sf(data = pumas_map, fill = "grey90", color = "white") +
geom_sf(
data = ml_sf,
aes(color = "Mitchell-Lama building"),
size = 1,
alpha = 0.8
) +
scale_color_manual(
name = "",
values = c("Mitchell-Lama building" = "red")
) +
labs(
title = "Locations of Individual Mitchell-Lama Housing Developments in NYC",
subtitle = "Each point represents a Mitchell-Lama building"
) +
theme_minimal()
11 Interpretation & Implications
Taken together, the descriptive statistics and maps show that Mitchell-Lama housing is disproportionately located in neighborhoods with moderately lower median incomes relative to the citywide PUMA distribution. Median household income in PUMAs with Mitchell-Lama housing is lower by a measurable percentage compared to PUMAs without such housing.
This pattern reinforces the interpretation that Mitchell-Lama housing functions as a durable middle-income housing strategy within an urban system shaped by uneven development. As neighborhoods gentrify and housing markets intensify, Mitchell-Lama developments help preserve access to urban space for households that would otherwise be priced out, shaping the social geography of the city in ways consistent with David Harvey’s theorization of urban space as a contested and actively produced terrain.