About the Data

From the EPA: “The National Walkability Index is a nationwide geographic data resource that ranks block groups according to their relative walkability. The national dataset includes walkability scores for all block groups as well as the underlying attributes that are used to rank the block groups.”

National Walkability Index

The Walkability Index is based on measures of the built environment derived from EPA’s Smart Location Database. The Index is calculated as a function of block rankings on a series of indicators:

\[ Walkability \space Index = \left(\frac{w}{3}\right) + \left(\frac{x}{3}\right) + \left(\frac{y}{3}\right) + \left(\frac{z}{6}\right)\]

Where

  • \(w\) = block group’s ranked score for intersection density
  • \(x\) = block group’s ranked score for proximity to transit stops
  • \(y\) = block group’s ranked score for employment mix
  • \(z\) = block group’s ranked score for employment and household mix

For more, see the EPA’s “National Walkability Index Methodology and User Guide”.

Variable Description

glimpse(walk)
## Rows: 155
## Columns: 16
## $ FIPS_TRACT           <dbl> 51540000502, 51540000502, 51540000502, 5154000050…
## $ FIPS_BLKGP           <chr> "515400005022", "515400005023", "515400005024", "…
## $ STATEFP              <dbl> 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 5…
## $ COUNTYFP             <chr> "540", "540", "540", "540", "540", "540", "540", …
## $ TRACTCE              <chr> "000502", "000502", "000502", "000502", "000600",…
## $ BLKGRPCE             <dbl> 2, 3, 4, 5, 1, 2, 3, 2, 3, 4, 1, 5, 3, 3, 1, 4, 2…
## $ intersection_density <dbl> 75.554437, 52.477706, 64.177938, 60.630232, 146.6…
## $ proximity_transit    <dbl> 527.06, 325.89, 236.04, 544.49, 319.19, 693.36, 8…
## $ employment_mix       <dbl> 0.53865306, 0.51282003, 0.10395780, 0.66573695, 0…
## $ emp_housing_mix      <dbl> 0.1937425, 0.3625699, 0.5550809, 0.8216670, 0.175…
## $ emp_hou_mix_rank     <dbl> 3, 6, 12, 19, 2, 16, 10, 15, 17, 10, 17, 7, 19, 5…
## $ emp_mix_rank         <dbl> 9, 9, 2, 14, 1, 3, 3, 12, 14, 17, 20, 9, 14, 9, 2…
## $ int_density_rank     <dbl> 12, 10, 11, 11, 17, 18, 12, 15, 5, 4, 5, 6, 6, 2,…
## $ prox_transit_rank    <dbl> 15, 17, 19, 15, 17, 14, 13, 14, 1, 1, 1, 1, 1, 1,…
## $ walkability_index    <dbl> 11.000000, 11.500000, 12.333333, 14.166667, 11.83…
## $ walkability_bins     <chr> "Above Average Walkable", "Above Average Walkable…
  • walkability_index: National Walkability Index score
  • walkability_bins: National Walkability Index Bins; 1-5.75 = Least Walkable, 5.76-10.5 = Below Average Walkable, 10.51-15.25 = Above Average Walkable, 15.26-20 = Most Walkable
  • intersection_density: Street intersection density (pedestrian-oriented intersections); Higher intersection density is correlated with more walk trips
  • int_density_rank: Resulting rank of block group for intersection_density within all block groups; range from 1-20, higher ranks indicate more walk trip likelihood
  • proximity_transit: Proximity to transit stops, measured in meters from population-weighted centroid of block group to nearest transit stop (areas with no transit stops are missing)
  • prox_transit_rank: Resulting rank of block group for prox_transit_rank within all block groups; range from 1-20,higher ranks indicate more walk trip likelihood (areas with no transit access are ranked the lowest)
  • employment_mix: The mix of employment types in a block group (such as retail, office, or industrial); higher values correlate with more walk trips
  • emp_mix_rank: Resulting rank of block group for employment_mix within all block groups; range from 1-20, higher ranks indicate more walk trip likelihood
  • emp_housing_mix: The mix of employment types and occupied housing; A block group with a diverse set of employment types (such as office, retail, and service) plus a large quantity of occupied housing units will have a relatively high value. Higher values correlate with more walk trips
  • emp_hou_mix_rank: Resulting rank of block group for emp_housing_mix within all block groups; range from 1-20, higher ranks indicate more walk trip likelihood
  • FIPS_TRACT: Combined Tract FIPS code (11 characters)
  • FIPS_BLKGP: Combined Block Group FIPS code (11 characters)
  • STATEFP: State FIPS code (2 characters)
  • COUNTYFP: County FIPS code (3 characters)
  • TRACTCE: TractFIPS code (6 characters)
  • BLKGRPCE: Block Group FIPS code (1 character)

Summaries

Five-number summaries of all variables:

walk %>% select(intersection_density:walkability_bins) %>% 
  as.data.frame() %>% 
  stargazer(., type = "text", title = "Summary Statistics", digits = 0,
            summary.stat = c("mean", "sd", "min", "median", "max"))
## 
## Summary Statistics
## ===================================================
## Statistic            Mean St. Dev. Min Median  Max 
## ---------------------------------------------------
## intersection_density  48     78     1    12    601 
## proximity_transit    448    262     0   386   1,140
## employment_mix        1      0      0    1      1  
## emp_housing_mix       1      0      0    1      1  
## emp_hou_mix_rank      11     5      1    11    20  
## emp_mix_rank          11     6      1    11    20  
## int_density_rank      8      5      1    5     20  
## prox_transit_rank     7      8      1    1     20  
## walkability_index     8      4      3    7     20  
## ---------------------------------------------------

Visual Distributions

walk %>% 
  select(FIPS_BLKGP, walkability_index, intersection_density, proximity_transit, employment_mix, emp_housing_mix) %>% 
  pivot_longer(-FIPS_BLKGP, names_to = "measure", values_to = "value") %>% 
  ggplot(aes(x = value, fill = measure)) + 
  geom_histogram() + 
  facet_wrap(~measure, scales = "free")  +
  guides(fill = "none")

meta %>% 
  filter(varname %in% c("walkability_index", "intersection_density",
                        "proximity_transit", "employment_mix", 
                        "emp_housing_mix")) %>%
  mutate(label = paste0(varname, ": ", description)) %>% 
  select(label) %>% 
  as.list()
## $label
## [1] "intersection_density: Street intersection density, measured in street intersections per acre. Higher intersection density is correlated with more walk trips (derived from 2018 HERE maps NAVSTREETS)"                                                                                                                                       
## [2] "proximity_transit: Proximity to transit stops, measured in meters from population-weighted centroid of block group to nearest transit stop. Distance from population center to nearest transit stop in meters. Shorter distances correlate with more walk trips (areas with no transit stops are missing; dervied from 2020 GTFS, 2020 COTD)"
## [3] "employment_mix: The mix of employment types in a block group (such as retail, office, or industrial). Higher values correlate with more walk trips (derived from 2017 LEHD WAC)"                                                                                                                                                             
## [4] "emp_housing_mix: The mix of employment types and occupied housing. A block group with a diverse set of employment types (such as office, retail, and service) plus a large quantity of occupied housing units will have a relatively high value. Higher values correlate with more walk trips (derived from 2017 LEHD WAC)"                  
## [5] "walkability_index: Calculated by weighted formula using results of indicator rank scores."

Walkability by Locality

walk %>% 
  ggplot(aes(x = walkability_index, fill = COUNTYFP)) + 
  geom_histogram() + 
  facet_wrap(~COUNTYFP)  +
  guides(fill = "none")

Block Group Distributions

Walkability

pal <- colorNumeric("plasma", reverse = TRUE, domain = cville_maps$walkability_index)

leaflet(cville_maps) %>%
  addProviderTiles("CartoDB.Positron") %>%
  addPolygons(data = cville_maps,
              fillColor = ~pal(walkability_index),
              weight = 1,
              opacity = 1,
              color = "white",
              fillOpacity = 0.6,
              highlight = highlightOptions(weight = 2, fillOpacity = 0.8, bringToFront = T),
              popup = paste0("Tract Number: ", cville_maps$GEOID, "<br>",
                             "Walkability Index: ", round(cville_maps$walkability_index, 2))) %>%
  addLegend("bottomright", pal = pal, values = cville_maps$walkability_index,
            title = "Walkability Index", opacity = 0.7)

Intersection Density

pal <- colorNumeric("plasma", reverse = TRUE, domain = cville_maps$intersection_density)

leaflet(cville_maps) %>%
  addProviderTiles("CartoDB.Positron") %>%
  addPolygons(data = cville_maps,
              fillColor = ~pal(intersection_density),
              weight = 1,
              opacity = 1,
              color = "white",
              fillOpacity = 0.6,
              highlight = highlightOptions(weight = 2, fillOpacity = 0.8, bringToFront = T),
              popup = paste0("Tract Number: ", cville_maps$GEOID, "<br>",
                             "Intersection Density: ", round(cville_maps$intersection_density, 2))) %>%
  addLegend("bottomright", pal = pal, values = cville_maps$intersection_density,
            title = "Intersection Density", opacity = 0.7)

Employment Mix

pal <- colorNumeric("plasma", reverse = TRUE, domain = cville_maps$employment_mix)

leaflet(cville_maps) %>%
  addProviderTiles("CartoDB.Positron") %>%
  addPolygons(data = cville_maps,
              fillColor = ~pal(employment_mix),
              weight = 1,
              opacity = 1,
              color = "white",
              fillOpacity = 0.6,
              highlight = highlightOptions(weight = 2, fillOpacity = 0.8, bringToFront = T),
              popup = paste0("Tract Number: ", cville_maps$GEOID, "<br>",
                             "Employment Mix: ", round(cville_maps$employment_mix, 2))) %>%
  addLegend("bottomright", pal = pal, values = cville_maps$employment_mix,
            title = "Employment Mix", opacity = 0.7)

Employment-Housing Mix

pal <- colorNumeric("plasma", reverse = TRUE, domain = cville_maps$emp_housing_mix)

leaflet(cville_maps) %>%
  addProviderTiles("CartoDB.Positron") %>%
  addPolygons(data = cville_maps,
              fillColor = ~pal(emp_housing_mix),
              weight = 1,
              opacity = 1,
              color = "white",
              fillOpacity = 0.6,
              highlight = highlightOptions(weight = 2, fillOpacity = 0.8, bringToFront = T),
              popup = paste0("Tract Number: ", cville_maps$GEOID, "<br>",
                             "Employment-Housing Mix: ", round(cville_maps$emp_housing_mix, 2))) %>%
  addLegend("bottomright", pal = pal, values = cville_maps$emp_housing_mix,
            title = "Employment-Housing Mix", opacity = 0.7)

Proximity to transit

  • Note: The proximity to transit values for the block groups outside Charlottesville City are NA’s because the EPA’s National Walkability index does not recognize any public transportation stops in these areas from which to calculate distances. However, the Charlottesville Area Transit’s service area does include some areas outside of Charlottesville City, so these are not entirely accurate calculations.
pal <- colorNumeric("plasma", reverse = TRUE, domain = cville_maps$proximity_transit)

leaflet(cville_maps) %>%
  addProviderTiles("CartoDB.Positron") %>%
  addPolygons(data = cville_maps,
              fillColor = ~pal(proximity_transit),
              weight = 1,
              opacity = 1,
              color = "white",
              fillOpacity = 0.6,
              highlight = highlightOptions(weight = 2, fillOpacity = 0.8, bringToFront = T),
              popup = paste0("Tract Number: ", cville_maps$GEOID, "<br>",
                             "Proximity to Transit: ", round(cville_maps$proximity_transit, 2))) %>%
  addLegend("bottomright", pal = pal, values = cville_maps$proximity_transit,
            title = "Proximity to Transit", opacity = 0.7)

Tract Distributions

  • Values shown here are based on averages of the block groups within each tract.

Walkability

pal <- colorNumeric("plasma", reverse = TRUE, domain = cville_maps2$avg_walkability_index)

leaflet(cville_maps2) %>%
  addProviderTiles("CartoDB.Positron") %>%
  addPolygons(data = cville_maps2,
              fillColor = ~pal(avg_walkability_index),
              weight = 1,
              opacity = 1,
              color = "white",
              fillOpacity = 0.6,
              highlight = highlightOptions(weight = 2, fillOpacity = 0.8, bringToFront = T),
              popup = paste0("Tract Number: ", cville_maps2$GEOID, "<br>",
                             "Average Walkability Index: ", round(cville_maps2$avg_walkability_index, 2))) %>%
  addLegend("bottomright", pal = pal, values = cville_maps2$avg_walkability_index,
            title = "Average <br> Walkability <br> Index", opacity = 0.7)

Intersection Density

pal <- colorNumeric("plasma", reverse = TRUE, domain = cville_maps2$avg_intersection_density)

leaflet(cville_maps2) %>%
  addProviderTiles("CartoDB.Positron") %>%
  addPolygons(data = cville_maps2,
              fillColor = ~pal(avg_intersection_density),
              weight = 1,
              opacity = 1,
              color = "white",
              fillOpacity = 0.6,
              highlight = highlightOptions(weight = 2, fillOpacity = 0.8, bringToFront = T),
              popup = paste0("Tract Number: ", cville_maps2$GEOID, "<br>",
                             "Intersection Density: ", round(cville_maps2$avg_intersection_density, 2))) %>%
  addLegend("bottomright", pal = pal, values = cville_maps2$avg_intersection_density,
            title = "Intersection Density", opacity = 0.7)

Employment Mix

pal <- colorNumeric("plasma", reverse = TRUE, domain = cville_maps2$avg_employment_mix)

leaflet(cville_maps2) %>%
  addProviderTiles("CartoDB.Positron") %>%
  addPolygons(data = cville_maps2,
              fillColor = ~pal(avg_employment_mix),
              weight = 1,
              opacity = 1,
              color = "white",
              fillOpacity = 0.6,
              highlight = highlightOptions(weight = 2, fillOpacity = 0.8, bringToFront = T),
              popup = paste0("Tract Number: ", cville_maps2$GEOID, "<br>",
                             " Average Employment-Housing Mix: ", round(cville_maps2$avg_employment_mix, 2))) %>%
  addLegend("bottomright", pal = pal, values = cville_maps2$avg_employment_mix,
            title = "Average <br> Employment-Housing <br> Mix", opacity = 0.7)

Employment-Housing Mix

pal <- colorNumeric("plasma", reverse = TRUE, domain = cville_maps2$avg_emp_housing_mix)

leaflet(cville_maps2) %>%
  addProviderTiles("CartoDB.Positron") %>%
  addPolygons(data = cville_maps2,
              fillColor = ~pal(avg_emp_housing_mix),
              weight = 1,
              opacity = 1,
              color = "white",
              fillOpacity = 0.6,
              highlight = highlightOptions(weight = 2, fillOpacity = 0.8, bringToFront = T),
              popup = paste0("Tract Number: ", cville_maps2$GEOID, "<br>",
                             " Average Employment-Housing Mix: ", round(cville_maps2$avg_emp_housing_mix, 2))) %>%
  addLegend("bottomright", pal = pal, values = cville_maps2$avg_emp_housing_mix,
            title = "Average <br> Employment-Housing <br> Mix", opacity = 0.7)

Proximity to transit

  • Note: The proximity to transit values for the block groups outside Charlottesville City are NA’s because the EPA’s National Walkability index does not recognize any public transportation stops in these areas from which to calculate distances. However, the Charlottesville Area Transit’s service area does include some areas outside of Charlottesville City, so these are not entirely accurate calculations.
pal <- colorNumeric("plasma", reverse = TRUE, domain = cville_maps2$proximity_transit)

leaflet(cville_maps2) %>%
  addProviderTiles("CartoDB.Positron") %>%
  addPolygons(data = cville_maps2,
              fillColor = ~pal(avg_proximity_transit),
              weight = 1,
              opacity = 1,
              color = "white",
              fillOpacity = 0.6,
              highlight = highlightOptions(weight = 2, fillOpacity = 0.8, bringToFront = T),
              popup = paste0("Tract Number: ", cville_maps2$GEOID, "<br>",
                             " Average Proximity to Transit: ", round(cville_maps2$avg_proximity_transit, 2))) %>%
  addLegend("bottomright", pal = pal, values = cville_maps2$avg_proximity_transit,
            title = "Average <br> Proximity to Transit", opacity = 0.7)