Massachusetts Courthouse Locations & Public Transportation Infrastructure: The Implications of Transit on Courthouse Access
Barriers are central to discussions surrounding the criminal justice system and system-involved individuals. A key topic faced is transportation. The “five A’s” describe the primary factors related to transportation that present issues for individuals: “affordability, accessibility, applicability, availability, and awareness”.
Transportation is a significant consideration for employment, healthcare, groceries/products, and access to government locations like courthouses. Massachusetts comprises of 7 types of trial courts, including Superior Court, District Court, Boston Municipal Court, Housing Court, Juvenile Court, Land Court, and Probate and Family Court. This research initially began as an inquiry into the accessibility of courthouses for system-involved individuals – attempting to identify barriers to compliance with court dates/appointments. It evolved into a state-wide examination of general public access to courthouses via the state’s public transit infrastructure.
Primary Goals:
Establish a comprehensive understanding of MA public transportation coverage across counties
Evaluate how courthouse locations and public transit options differ across counties
Shape Files:
From the Massachusetts Bureau of Geographic Information through MassGIS and the Massachusetts Department of Transportation Open Data Portal through massDOT
Data Sets:
From the United States Census Bureau through census.gov and MA Court Data, Metrics, and Reports through Mass.gov
The Regional Transit Authority (RTA) provides public transportation systems across Massachusetts. The RTA has 15 defined coverage areas.
Steps in ArcGIS Pro:
# import data table
RTA_Coverage <- read_excel("RTA_coverage_data.xls")
RTA_Coverage <- select(RTA_Coverage, "COUNTY", "MiSQ", "MiSQExcl")
# Calculate percentage without coverage in each county
RTA_Coverage <- RTA_Coverage %>%
group_by(COUNTY) %>%
mutate(Percentage=paste0(round(MiSQExcl/MiSQ*100, 1),"%"))
kable(RTA_Coverage, col.names = c("County", "Area (sq mi)",
"Area w/o RTA Coverage (sq mi)",
"Percentage of County w/o RTA Coverage"),
align = c('c', 'c', 'c', 'c')) %>%
add_header_above(c("Percentage of Area per County not Covered by an RTA System" = 4)) %>%
kable_styling() %>%
scroll_box(height = "100%", width = "100%")
| County | Area (sq mi) | Area w/o RTA Coverage (sq mi) | Percentage of County w/o RTA Coverage |
|---|---|---|---|
| BARNSTABLE | 411.9740 | 0.1448718 | 0% |
| BERKSHIRE | 946.3420 | 174.1378326 | 18.4% |
| BRISTOL | 571.7110 | 0.9371677 | 0.2% |
| DUKES | 106.4660 | 13.4747152 | 12.7% |
| ESSEX | 513.2210 | 141.8912659 | 27.6% |
| FRANKLIN | 724.4930 | 10.8300152 | 1.5% |
| HAMPDEN | 634.1160 | 77.5864792 | 12.2% |
| MIDDLESEX | 846.4100 | 163.2825623 | 19.3% |
| NANTUCKET | 48.9112 | 0.0213758 | 0% |
| NORFOLK | 409.4450 | 214.5567932 | 52.4% |
| PLYMOUTH | 689.5540 | 129.9457397 | 18.8% |
| SUFFOLK | 60.9833 | 2.9424100 | 4.8% |
| WORCESTER | 1579.1600 | 86.1403275 | 5.5% |
From this, we can see that Norfolk County is the least covered county by the RTA, with 52.4% of the county excluded from RTA’s defined boundaries.
Next, I imported county populations and evaluated the proportion of courthouses in each county based on population and based on county area.
Steps to calculate distance from closest stop to courthouse in ArcGIS Pro:
# Import data
Courthouse_Stops <- read_excel("../Samples/courthouse_stops.xls")
Courthouse_Stops <- select(Courthouse_Stops, "NAME", "CITY", "COUNTY", "NEAR_DIST")
# Convert from Meters to Miles
Courthouse_Stops$NEAR_DIST <- Courthouse_Stops$NEAR_DIST*0.00062137
# Calculate summary stats for entire state
round(summary(Courthouse_Stops$NEAR_DIST), digits = 2)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.01 0.04 0.07 0.21 0.14 2.69
Across the state, the average distance from the closest bus/train stop to courthouse is 0.21 miles, and the longest distance is 2.69 miles.
# Summary stats by county
Stops_Summary <- Courthouse_Stops %>%
group_by(COUNTY) %>%
summarize(min = min(NEAR_DIST),
med = median(NEAR_DIST),
mean = mean(NEAR_DIST),
max = max(NEAR_DIST))
Stops_Summary <- data.frame(lapply(Stops_Summary,
function(x) if(is.numeric(x)) round(x, 2) else x))
kable(Stops_Summary, col.names = c("County", "Min", "Median", "Mean", "Max"), align = c('c', 'c', 'c', 'c', 'c')) %>% add_header_above(c("Summary Statistics for Distance from Closest Stop to Courthouse by County" = 5)) %>% kable_styling() %>% scroll_box(height = "100%", width = "100%")
| County | Min | Median | Mean | Max |
|---|---|---|---|---|
| Barnstable | 0.02 | 0.07 | 0.10 | 0.24 |
| Berkshire | 0.04 | 0.08 | 0.10 | 0.18 |
| Bristol | 0.03 | 0.04 | 0.08 | 0.26 |
| Dukes | 0.04 | 0.05 | 0.05 | 0.06 |
| Essex | 0.01 | 0.05 | 0.06 | 0.18 |
| Franklin | 0.10 | 0.14 | 0.14 | 0.17 |
| Hampden | 0.03 | 0.13 | 0.19 | 0.70 |
| Hampshire | 0.03 | 0.05 | 0.35 | 1.27 |
| Middlesex | 0.02 | 0.05 | 0.13 | 0.83 |
| Nantucket | 0.03 | 0.03 | 0.03 | 0.03 |
| Norfolk | 0.05 | 0.12 | 0.27 | 1.35 |
| Plymouth | 0.02 | 0.07 | 0.15 | 0.37 |
| Suffolk | 0.02 | 0.05 | 0.06 | 0.12 |
| Worcester | 0.01 | 0.79 | 0.91 | 2.69 |
It looks like Worcester County has the courthouse that is 2.69 miles from the closest bus or train stop.
# Restructure data to plot
Long_Stops_Summary <- Stops_Summary %>%
pivot_longer(c(min, med, mean, max), names_to = "Summary_Type", values_to = "Value")
# Plot summary stats by county
Vec <- c("min", "med", "mean", "max")
DSgg <- ggplot(data = Long_Stops_Summary,
mapping = aes(x = factor(Summary_Type,
levels = unique(Vec)),
y = Value)) +
geom_point(color = "darkblue", size = 2) +
facet_wrap(vars(COUNTY), ncol = 5) +
labs(title = "Distance from Closest Bus or Train Stop to Courthouse",
subtitle = "Summary Statistics by County",
x = "Summary Statistics Type",
y = "Distance to Courthouse") +
theme_bw(base_size = 12) +
theme(text=element_text(family="serif"))+
theme(axis.text.x = element_text(angle = 90))
DSgg
Most counties have a bus or train stop on average below 0.5 miles from their courthouses.
Let’s see which counties have more and less coverage based on county area and bus/train stop dispersion.
Steps to calculate in ArcGIS Pro:
Outside5 <- read_excel("Counties_5miles.xls")
Outside5 <- select(Outside5, "COUNTIES_POLYM.COUNTY",
"COUNTIES_POLYM.area_mi",
"5mille_stp_cnty.mil5_area") %>%
rename("County" = "COUNTIES_POLYM.COUNTY",
"Area" = "COUNTIES_POLYM.area_mi",
"Outside_Area" = "5mille_stp_cnty.mil5_area")
Outside5$Outside_Area[is.na(Outside5$Outside_Area)] <- 0
Outside5 <- Outside5 %>%
mutate(Percentage=paste0(round(Outside_Area/Area*100, 1),"%"))
kable(Outside5, col.names = c("County", "Area (sq mi)",
"Area Outside 5 Miles of Stop",
"% of County Outside 5 Miles of a Stop"),
align = c('c', 'c', 'c', 'c')) %>%
add_header_above(c("Percentage of Area per County Outside 5 Miles of a Bus or Train Stop" = 4)) %>%
kable_styling() %>%
scroll_box(height = "100%", width = "100%")
| County | Area (sq mi) | Area Outside 5 Miles of Stop | % of County Outside 5 Miles of a Stop |
|---|---|---|---|
| BERKSHIRE | 946.3980 | 442.98901 | 46.8% |
| BRISTOL | 571.8640 | 72.11630 | 12.6% |
| DUKES | 109.8960 | 11.99290 | 10.9% |
| ESSEX | 514.9040 | 36.17110 | 7% |
| BARNSTABLE | 412.4770 | 6.57529 | 1.6% |
| HAMPSHIRE | 545.2690 | 243.94200 | 44.7% |
| MIDDLESEX | 846.5920 | 91.96370 | 10.9% |
| FRANKLIN | 724.5880 | 195.54900 | 27% |
| HAMPDEN | 634.0580 | 324.04599 | 51.1% |
| NANTUCKET | 49.0269 | 5.18355 | 10.6% |
| NORFOLK | 408.5400 | 3.73558 | 0.9% |
| PLYMOUTH | 689.7700 | 17.02720 | 2.5% |
| SUFFOLK | 59.7386 | 0.00000 | 0% |
| WORCESTER | 1579.2100 | 486.16901 | 30.8% |