Which County did you choose?
I chose Bergen County, New Jersey as that’s where I grew up. It’s the state’s most populous county and sits directly across the Hudson River from New York City.
Which ACS variable did you analyze?
I analyzed median household income (DP03_0062) from the 2020-2024 ACS five year estimates. I felt this was a strong place to analyze because the household incomes in this county are very high compared to the counties around it.
How did your county compare with neighboring counties?
Bergen’s median household income was $124,884, it is the highest of the four counties that border it. Hudson county is the second highest with $91,795, followed by Passaic County at $87,522, then finally Essex county is at $80,789 which is about $44,000 less than Bergen County.
Did anything interest you, surprise you, or confirm your expectations?
The map confirmed what I expected, Bergen County has a reputation as an affluent commuter suburb of NYC. What really surprised me was the stark difference in household incomes between the counties which are right next to each other. I knew some of the towns in these counties were less affluent, but I didn’t realize to such a difference.
The variation within Bergen County was substantial. I mapped 70 municipalities, and the media household income ranged from $24,904, all the way up to >$250,000 a year. 25 townships fell below the countywide median.
The highest income towns were Upper Saddle River and Ho-Ho-Kus which were both >$250,000, then Alpine, Haworth, and Franklin Lakes which averaged around $240,000 a year. The lowest income towns were Hackensack, Garfield, and Fairview which average around $75,766. The poorest town is Teterboro at $24,904.
What Geographic patterns did I notice?
The wealthiest towns cluster in the northern part of the county along the New York State border as well as along the Hudson River which makes sense because most of the towns inhabitants work in NYC. The lower income towns are concentrated in the south and center of the county, near the Passaic and Hackensack rivers. They also border Passaic and Hudson counties.
What factors might explain the pattern?
Several factors may explain this. The northern towns are mostly large lot, single family neighborhoods, and the they’re zoned in ways where lower income households, can’t afford it. For example, my hometown barely had zoning for apartment complexes, and then when the town proposed an apartment complex, people got up in arms about it. And like I said before, commuters who work in NYC often live in these towns in New Jersey.
Many Southern towns developed earlier on around factories, rail lines, and highways. They were designed to be more densely populated. These towns were the wealthy townships earlier on, but as manufacturing moved out of these areas, the townships didn’t get much nicer.
Reflection
I expected Bergen county to have a higher median income than its neighbors and expected some difference between the northern and southern parts of the county.
The county level results matched my expectations although the size of the gap inside the count challenged them.
The county map shows one wealthy one county with a single median of $124,884. Then the town map shows that this figure is averaging very different medians together. While the median seems high, there’s some towns with a media income over 250k a year and one town around 25k a year. In theory there are basically two Bergen county’s, the county level map hides the less affluent one.
Role: Journalist
As a journalist, I would pursue a story about the divide between the nicer areas and the poorer areas and what it means for housing. I would compare where the county’s lower income residents live now with where new affordable units are planned. Then I would interview officials and residents in towns at both ends of the spectrum, framing the story around one question: who gets to live in Bergen County? Is it the rich and wealthy or is it open to everyone.
library(tidycensus)
library(tidyverse)
library(sf)
library(leaflet)
library(scales)
options(tigris_use_cache = TRUE)
# Bergen and the NJ counties that border it
county_list <- c("Bergen", "Passaic", "Essex", "Hudson")
# Median household income (ACS 5-year, Profile variable DP03_0062)
county_data <- get_acs(
geography = "county",
state = "NJ",
county = county_list,
variables = "DP03_0062",
year = 2024,
survey = "acs5",
geometry = TRUE
) %>%
st_transform(4326) %>%
mutate(
County = str_remove(NAME, "[,;] New Jersey$"),
Popup = paste0("<strong>", County, "</strong><br>",
"Median household income: ", dollar(estimate), "<br>",
"Margin of error: ±", dollar(moe))
)
# Color palette
county_pal <- colorNumeric("YlGnBu", domain = county_data$estimate)
# Interactive map (Bergen outlined in black)
leaflet(county_data) %>%
addProviderTiles(providers$Esri.WorldGrayCanvas) %>%
addPolygons(
fillColor = ~county_pal(estimate),
fillOpacity = 0.75,
color = ~ifelse(County == "Bergen County", "black", "white"),
weight = ~ifelse(County == "Bergen County", 3, 1),
label = ~County,
popup = ~Popup
) %>%
addLegend(
pal = county_pal,
values = ~estimate,
title = "Median household income",
labFormat = labelFormat(prefix = "$"),
position = "bottomright"
)
# Table of the values, highest to lowest
county_data %>%
st_drop_geometry() %>%
select(County, estimate, moe) %>%
arrange(desc(estimate))
library(tidycensus)
library(tidyverse)
library(sf)
library(leaflet)
library(scales)
options(tigris_use_cache = TRUE)
# Median household income for every town in Bergen County
town_data <- get_acs(
geography = "county subdivision",
state = "NJ",
county = "Bergen",
variables = "DP03_0062",
year = 2024,
survey = "acs5",
geometry = TRUE
) %>%
st_transform(4326) %>%
mutate(
Town = str_remove(NAME, "[,;] Bergen County.*$"),
Display = case_when(
is.na(estimate) ~ "Not available",
estimate >= 250001 ~ "$250,000+",
TRUE ~ dollar(estimate)
),
Popup = paste0("<strong>", Town, "</strong><br>",
"Median household income: ", Display, "<br>",
"Margin of error: ±", dollar(moe))
)
# Color palette
town_pal <- colorNumeric("YlGnBu", domain = town_data$estimate, na.color = "#cccccc")
# Interactive map
leaflet(town_data) %>%
addProviderTiles(providers$Esri.WorldGrayCanvas) %>%
addPolygons(
fillColor = ~town_pal(estimate),
fillOpacity = 0.75,
color = "white",
weight = 1,
label = ~Town,
popup = ~Popup
) %>%
addLegend(
pal = town_pal,
values = ~estimate,
title = "Median household income",
labFormat = labelFormat(prefix = "$"),
na.label = "Not available",
position = "bottomright"
)
# Every town ranked, highest to lowest
town_data %>%
st_drop_geometry() %>%
as_tibble() %>%
arrange(desc(estimate)) %>%
select(Town, Display, moe) %>%
print(n = Inf)