1 Topic Introduction & Background

1.1 Project Goals

It is the intent of this study to strengthen existing theories and models on food deserts, food accessibility, public and private food access programs, urban agriculture, and equity. This study utilizes a quasi-experimental design, as non-random criteria are used to assign groups. Specifically, matched pairs are assigned to community areas—pre-existing groups—based on non-random criteria including household incomes, property values, employment, and proportion of minority residents.

This is an exploratory study to identify what factors might be related to access in Chicago. To make the assessment, a preliminary matching criteria model for all 77 neighborhoods (community areas) was conducted at the ends of the scales for household incomes, property values, employment, and proportion of minority residents. Surprisingly, 66 of the neighborhoods (33 pairs) were matched and will be used in the proximity analysis.

1.2 What is the public relevance of the project?

I aim to explore how Chicago can address food insecurities among residents—particularly under resourced, low-income communities and communities of color. Community-level factors to explore include crime rate, walkability, access to public transit, per capita grocery store availability, and other socioeconomic factors of Chicago residents.

1.3 Research Question

What community-level factors are associated with geographic access to nutrient dense food for low-income residents of Chicago?

1.4 Policy Implications

The findings of the study can aid the City of Chicago to develop strategies and programming that addresses inequitable access to healthy foods among Chicagoans.

2 Existing Research

Despite considerable reform efforts involving food accessibility for minorities across US cities, not much research into understanding healthy food access appears to be done from a public administration viewpoint. Notably, there is a lack of focus on research into the local government’s role and impacts on food accessibility; instead, there is an emphasis on the finances of local government rather than the public services provided to citizens. The lack of public administration literature on this topic is surprising given its prevalence in urban planning, political science, and sociology.

2.1 Detroit Metropolitan Area

The Detroit Metropolitan Area has been the focus of numerous studies on food access and food security. After the Great Recession, the Detroit Metropolitan Area saw food insecurity rates rise to 18.2% (Danzinger et al., 2014). Through an emphasis on low-income households, the use of private and public service programs to combat food insecurity was analyzed to determine the impact.

Allard et al. (2017) explored whether food retailer access is associated with food insecurity. They found no association between greater food security and access to food retailers. This was an interesting conclusion, as they found vulnerable populations have comparable special access to food retailers in the Detroit metro area.

Current US Surgeon General, Vivek Murthy, visited Detroit to see the Double Up Food Bucks nonprofit program in action. Referred to as Double Up, the program gives Supplemental Nutrition Assistance Program (SNAP) participants double value to spend on fruits and vegetables at participating Detroit food retailers (Murthy, 2016). As Surgeon General, Murthy (2016) stresses the national importance of food insecurity, as it “places a substantial burden on our society through health care and social costs” (p. 655). He continues “People experiencing food insecurity often consume a nutrient-poor diet, which may contribute to the development of obesity, heart disease, hypertension, diabetes, and other chronic diseases” (Murthy, 2016, p. 655).

2.2 Neighborhood Infrastructure & Food Availability

Another piece of research in the field of food availability is by Allard et al. (2017) who investigated local food resource infrastructure, referred to through spatial proximity to food retailers. Of interest for the proposed research is Allard et al.’s (2017) conclusion that “all things being equal, living closer to a food retailer should translate into lower transaction costs associated with shopping” (p. 570). Racial and ethnic minorities were found to be disproportionately more likely to be poor, live in high-poverty areas, and be at risk for low access to food retailers compared to white residents.

Across the US, areas with higher proportions of Black residents have half as many chain grocery stores, and in Chicago Black neighborhoods find residents travel 40% further to reach a chain grocery store (Allard et al., 2017). Taylor and Ard (2015) mirrored this sentiment, as they discussed that increased effort is needed to build new supermarkets in underserved neighborhoods. For the time being, the independent grocery stores that dominate the Austin neighborhood in Chicago are found to offer competitive prices for fresh items (if carried) and are located within walking distance for most residents (Block & Kouba, 2006).

2.3 Predictors of Food Insecurity

One important result from research on healthy food accessibility for minority and low-income residents is that certain measures account for an increased association with food security and access. Commonly utilized measures to study food insecurity and access include distance to the nearest retailer, commute times, mode of transit, type of retailer, and socioeconomic figures of a neighborhood (Allard et al., 2017). Danzinger et al. (2014) found statistically significant risk factors for food insecurity including low income, low educational attainment, health limitations, and financial hardships.

Block and Kouba (2006) found store type to be a statistically significant predictor for food offerings for the following food classes: fresh fruits and vegetables, canned fruits and vegetables, frozen fruits and vegetables, bread and grain, dairy, meats and protein, fats and oils, baby food and formula, sugars and sweets, and spices and baking supplies.

Hunt et al. (2019) included acculturation and social risk factors as predictors of food insecurity in Predictors of food insecurity. Primary language and loneliness were introduced as statistically significant predictors of food insecurity (Hunt et al., 2019).

2.4 Food Deserts & Dietary Habits

In a review of the predominantly Black and low-income Austin neighborhood on the west side of Chicago, Block and Kouba (2006) discovered poor-quality produce was found at most food retailers, with owners citing logistical issues and the risk of produce spoiling before sold are key issues in why fresh produce is not commonly offered. This finding mirrors the assertion by Kolak et al. (2018) that there are persistently low food access areas on the west and south sides of Chicago, mirroring residential segregation which disproportionately burdens racial minorities and low-income households.

Accessibility to large-scale food retailers (ie. supermarkets) contributes to the poor dietary habits of many low-income and minority residents. In Detroit, there is a “challenge of getting more healthy foods into retailers such as small groceries, corner stores, mini marts, convenience stores, liquor, and party stores, dollar and variety stores, pharmacies, and gas stations” which are near many low-income residents (Taylor & Ard, 2015, p. 128). Access to grocery stores must be complemented with policy changes and interventions to urge low-income and minority households to produce desired changes in food purchasing and consumption patterns (Cummins, et al., 2014).

2.5 Local Government & Food Accessibility

Danzinger et al. (2014) discussed the use of public and private food assistance programs for low-income and food-insecure households in the Detroit Metropolitan Area. It was surprising to hear both food-insecure and food-secure low-income households use SNAP (public) and charity (private) food assistance programs. For food-secure low-income households, 45.6% received SNAP and 13.7% received private charitable food assistance; while the rates were 60.4% SNAP and 34.9% private charity for food-insecure low-income households (Danzinger, et al., 2014).

Michigan’s Food Policy Council prioritizes improved access to healthy foods for residents and sees farmer’s markets as a key market to target. Farmer’s markets are of interest to the council as they can be transitioned to accept public assistance program funds (ie. SNAP and EBT), increase access to healthy foods for low-income residents, and offer technical assistance programs to train farmers and employ low-income residents (Taylor & Ard, 2015).

Cummins et al. (2014) stressed the importance of not only implementing public programs to address food access but that the local government needs to then to study the policy and program interventions designed to address the negative food environments where poor-quality food is most accessible.

3 Expected Outcomes & Implications

In review of existing research, the expected outcome is various social, socioeconomic, and demographic factors will serve as statistically significant predictors in resident healthy food access in Chicago. These outcomes will help scholars and government officials have a direction to recommend programs and policy initiatives that will increase healthy food access across low-income and minority neighborhoods.

4 Import & Tidy the Data

## Run Packages
library(readxl)
library(MatchIt)
library(tidyverse)
library(patchwork)
library(tidycensus)
library("gt")
library(sf)
library(tmap)
library(mapview)
library(leaflet)
library(leaflet.extras)
library(janitor)
library(summarytools)
library(sjmisc)
library(hrbrthemes)
library(ggplot2)
library(viridis)
library(scales)
library(dplyr)
library(knitr)
library(tigris)
options(tigris_use_cache = TRUE)

4.1 Load Data

setwd("/Users/michelesantana/Documents/Fall 2022 Courses/PA 434 Data Analytics/R Code/Final Project") 
food_access = read_csv("FoodAccessResearchAtlasData2019.csv")
cook_la = read_csv("CookLAFoodAccessResearchAtlasData2019.csv")
soc_dis_chi = read_csv("Socioeconomically_Disadvantaged_Areas.csv")
grocery_stores_chi = read_csv("Grocery_Store_Status.csv")

This study will utilize secondary data which is publicly available from government surveys, reports, and previous studies. The raw data will be used to complete new analyses and expand the scope of research by combining samples.

Four csv files are uploaded into R to use in the data analysis. The files are as follows:

  1. 2019 Food Access Research Atlas Data from the USDA Presents an overview of food access indicators for low-income and other census tracts using different measures of supermarket accessibility; Provides food access data for populations within census tracts; and Offers census-tract-level data on food access that can be downloaded for community planning or research purposes.

  2. 2019 Cook County, IL Food Access Research Atlas Data from the USDA Presents an overview of food access indicators for low-income and other census tracts using different measures of supermarket accessibility; Provides food access data for populations within census tracts; and Offers census-tract-level data on food access that can be downloaded for community planning or research purposes.

  3. October 2022 Socioeconmically Disadvantaged Areas in Chicago Areas of Chicago, based on census tracts, that are the most socioeconomically disadvantaged, for the purpose of promoting equitable hiring within areas of economic need. Qualifying areas were identified using three criteria, based on data from the 2014 American Community Survey: household income, poverty rate, and unemployment rate.

  4. 2020 Grocery Stores Status in Chicago A list of grocery stores in Chicago and last known status (open or closed).

4.1.1 View Data

2019 Food Access Research Atlas Data from the USDA

print(food_access)
## # A tibble: 72,531 × 147
##    CensusTr…¹ State County Urban Pop2010 OHU2010 Group…² NUMGQ…³ PCTGQ…⁴ LILAT…⁵
##    <chr>      <chr> <chr>  <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>
##  1 010010201… Alab… Autau…     1    1912     693       0       0    0          0
##  2 010010202… Alab… Autau…     1    2170     743       0     181    8.34       1
##  3 010010203… Alab… Autau…     1    3373    1256       0       0    0          0
##  4 010010204… Alab… Autau…     1    4386    1722       0       0    0          0
##  5 010010205… Alab… Autau…     1   10766    4082       0     181    1.68       0
##  6 010010206… Alab… Autau…     1    3668    1311       0       0    0          1
##  7 010010207… Alab… Autau…     1    2891    1188       0      36    1.25       1
##  8 010010208… Alab… Autau…     0    3081    1074       0       0    0          0
##  9 010010208… Alab… Autau…     0   10435    3694       0       0    0          0
## 10 010010209… Alab… Autau…     0    5675    2067       0      14    0.25       0
## # … with 72,521 more rows, 137 more variables: LILATracts_halfAnd10 <dbl>,
## #   LILATracts_1And20 <dbl>, LILATracts_Vehicle <dbl>, HUNVFlag <dbl>,
## #   LowIncomeTracts <dbl>, PovertyRate <dbl>, MedianFamilyIncome <chr>,
## #   LA1and10 <dbl>, LAhalfand10 <dbl>, LA1and20 <dbl>, LATracts_half <dbl>,
## #   LATracts1 <dbl>, LATracts10 <dbl>, LATracts20 <dbl>,
## #   LATractsVehicle_20 <dbl>, LAPOP1_10 <chr>, LAPOP05_10 <chr>,
## #   LAPOP1_20 <chr>, LALOWI1_10 <chr>, LALOWI05_10 <chr>, LALOWI1_20 <chr>, …

2019 Cook County, IL Food Access Research Atlas Data from the USDA

print(cook_la)
## # A tibble: 1,314 × 36
##    CensusTract Pop2010 OHU2010 GroupQu…¹ NUMGQ…² PCTGQ…³ Pover…⁴ Media…⁵ LILAT…⁶
##          <dbl>   <dbl>   <dbl>     <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>
##  1 17031010100    4854    2302         0     218    4.49    35.8   62177       1
##  2 17031010201    6450    2463         0     163    2.53    36.8   47411       0
##  3 17031010202    2818    1115         0     315   11.2     18.5   51719       0
##  4 17031010300    6236    2826         0     791   12.7     16.2   66875       1
##  5 17031010400    5042    2098         0    1349   26.8     19.1   59861       0
##  6 17031010501    4091    2293         0       7    0.17    20.7   50266       0
##  7 17031010502    3101    1684         0       3    0.1     30.0   37500       0
##  8 17031010503    2290    1184         0     163    7.12    48.0   43654       0
##  9 17031010600    6097    2943         0     175    2.87    24.4   87545       0
## 10 17031010701    3864    1535         0       0    0       20.8   72500       0
## # … with 1,304 more rows, 27 more variables: lapophalf <dbl>, lalowihalf <dbl>,
## #   lakidshalf <dbl>, laseniorshalf <dbl>, lawhitehalf <dbl>,
## #   lablackhalf <dbl>, laasianhalf <dbl>, lanhopihalf <dbl>, laaianhalf <dbl>,
## #   laomultirhalf <dbl>, lahisphalf <dbl>, lahunvhalf <dbl>, lasnaphalf <dbl>,
## #   TractLOWI <dbl>, TractKids <dbl>, TractSeniors <dbl>, TractWhite <dbl>,
## #   PerWhite <dbl>, MinorityTract <dbl>, TractBlack <dbl>, TractAsian <dbl>,
## #   TractNHOPI <dbl>, TractAIAN <dbl>, TractOMultir <dbl>, …

October 2022 Socioeconmically Disadvantaged Areas in Chicago

print(soc_dis_chi)
## # A tibble: 280 × 1
##    the_geom                                                                     
##    <chr>                                                                        
##  1 MULTIPOLYGON (((-87.57366299996758 41.707966000031426, -87.57267600000398 41…
##  2 MULTIPOLYGON (((-87.60151899995586 41.68632499999862, -87.60151999997004 41.…
##  3 MULTIPOLYGON (((-87.60036199996543 41.69284299996604, -87.6005940000136 41.6…
##  4 MULTIPOLYGON (((-87.62032800000847 41.69942700001048, -87.61966799999583 41.…
##  5 MULTIPOLYGON (((-87.66036699995497 41.75771799998948, -87.65943299997954 41.…
##  6 MULTIPOLYGON (((-87.63331600002981 41.71614000002365, -87.63331699996012 41.…
##  7 MULTIPOLYGON (((-87.62324799997862 41.69759100000175, -87.62324000002828 41.…
##  8 MULTIPOLYGON (((-87.63190199996502 41.70705800002893, -87.63212200002383 41.…
##  9 MULTIPOLYGON (((-87.65598799999609 41.69948600003235, -87.65625100003074 41.…
## 10 MULTIPOLYGON (((-87.66120200000485 41.689285999996486, -87.66141199999755 41…
## # … with 270 more rows

2020 Grocery Stores Status in Chicago

print(grocery_stores_chi)
## # A tibble: 264 × 7
##    `Store Name`           Address           Zip   Status Last …¹ Longi…² Latit…³
##    <chr>                  <chr>             <chr> <chr>  <chr>     <dbl>   <dbl>
##  1 Jewel - Osco           87 W 87th St      60620 OPEN   06/03/…   -87.6    41.7
##  2 Farm on Ogden          3555 W OGDEN AVE  60623 OPEN   06/10/…   -87.7    41.9
##  3 Jewel - Osco           5343 N Broadway … 6064… OPEN   06/03/…   -87.7    42.0
##  4 International Foods NW 4404 W FULLERTON… 60639 OPEN   06/10/…   -87.7    41.9
##  5 Jewel - Osco           2520 N Narragans… 6063… OPEN   06/03/…   -87.8    41.9
##  6 Mariano's Fresh Market 40 S Halsted St   6066… OPEN   <NA>      -87.6    41.9
##  7 Mariano's Fresh Market 3145 South Ashla… 60608 OPEN   06/05/…   -87.7    41.8
##  8 Aldi                   7800 S South Chi… 6061… OPEN   06/05/…   -87.6    41.8
##  9 Food 4 Less            7030 S Ashland A… 6063… OPEN   06/05/…   -87.7    41.8
## 10 Whole Foods Market     1 N Halsted St    6066… OPEN   06/04/…   -87.6    41.9
## # … with 254 more rows, and abbreviated variable names ¹​`Last updated`,
## #   ²​Longitude, ³​Latitude

4.1.2 Data Wrangling

For the “food_access” dataframe, select only entries from Cook County, IL, where Chicago is located.

food_access_cook =
  food_access %>%
  filter(State == "Illinois") %>%
  filter(County == "Cook County")
print(food_access_cook)
## # A tibble: 1,314 × 147
##    CensusTr…¹ State County Urban Pop2010 OHU2010 Group…² NUMGQ…³ PCTGQ…⁴ LILAT…⁵
##    <chr>      <chr> <chr>  <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>
##  1 170310101… Illi… Cook …     1    4854    2302       0     218    4.49       0
##  2 170310102… Illi… Cook …     1    6450    2463       0     163    2.53       0
##  3 170310102… Illi… Cook …     1    2818    1115       0     315   11.2        0
##  4 170310103… Illi… Cook …     1    6236    2826       0     791   12.7        0
##  5 170310104… Illi… Cook …     1    5042    2098       0    1349   26.8        0
##  6 170310105… Illi… Cook …     1    4091    2293       0       7    0.17       0
##  7 170310105… Illi… Cook …     1    3101    1684       0       3    0.1        0
##  8 170310105… Illi… Cook …     1    2290    1184       0     163    7.12       0
##  9 170310106… Illi… Cook …     1    6097    2943       0     175    2.87       0
## 10 170310107… Illi… Cook …     1    3864    1535       0       0    0          0
## # … with 1,304 more rows, 137 more variables: LILATracts_halfAnd10 <dbl>,
## #   LILATracts_1And20 <dbl>, LILATracts_Vehicle <dbl>, HUNVFlag <dbl>,
## #   LowIncomeTracts <dbl>, PovertyRate <dbl>, MedianFamilyIncome <chr>,
## #   LA1and10 <dbl>, LAhalfand10 <dbl>, LA1and20 <dbl>, LATracts_half <dbl>,
## #   LATracts1 <dbl>, LATracts10 <dbl>, LATracts20 <dbl>,
## #   LATractsVehicle_20 <dbl>, LAPOP1_10 <chr>, LAPOP05_10 <chr>,
## #   LAPOP1_20 <chr>, LALOWI1_10 <chr>, LALOWI05_10 <chr>, LALOWI1_20 <chr>, …

Change the class of “soc_dis_chi” dataframe to include the geometry.

class(soc_dis_chi$the_geom)
soc_dis_chi <- soc_dis_chi %>% 
  st_as_sf(wkt = "the_geom", 
           crs = 4326)
class(soc_dis_chi$the_geom)

Select only open grocery stores in Chicago to include on the maps.

grocery_stores_chi =
  grocery_stores_chi %>%
  filter(Status == "OPEN")
print(grocery_stores_chi)
## # A tibble: 253 × 7
##    `Store Name`           Address           Zip   Status Last …¹ Longi…² Latit…³
##    <chr>                  <chr>             <chr> <chr>  <chr>     <dbl>   <dbl>
##  1 Jewel - Osco           87 W 87th St      60620 OPEN   06/03/…   -87.6    41.7
##  2 Farm on Ogden          3555 W OGDEN AVE  60623 OPEN   06/10/…   -87.7    41.9
##  3 Jewel - Osco           5343 N Broadway … 6064… OPEN   06/03/…   -87.7    42.0
##  4 International Foods NW 4404 W FULLERTON… 60639 OPEN   06/10/…   -87.7    41.9
##  5 Jewel - Osco           2520 N Narragans… 6063… OPEN   06/03/…   -87.8    41.9
##  6 Mariano's Fresh Market 40 S Halsted St   6066… OPEN   <NA>      -87.6    41.9
##  7 Mariano's Fresh Market 3145 South Ashla… 60608 OPEN   06/05/…   -87.7    41.8
##  8 Aldi                   7800 S South Chi… 6061… OPEN   06/05/…   -87.6    41.8
##  9 Food 4 Less            7030 S Ashland A… 6063… OPEN   06/05/…   -87.7    41.8
## 10 Whole Foods Market     1 N Halsted St    6066… OPEN   06/04/…   -87.6    41.9
## # … with 243 more rows, and abbreviated variable names ¹​`Last updated`,
## #   ²​Longitude, ³​Latitude

Change class of “CensusTract” from dbl to character.

class(cook_la$CensusTract)
cook_la$CensusTract = as.character(cook_la$CensusTract)
class(cook_la$CensusTract)

4.2 Load Shapefiles

  1. City of Chicago Community Areas 2022 Shapefile
  2. State of Illinois Census Tracts
chi_shp <- st_read("Boundaries - Community Areas (current)/geo_export_a7eab40e-dd17-4f85-bb38-76a4443c7431.shp")
chi_shp <- sf::st_transform(chi_shp, 4326)
il_ct <- st_read("il_2021_500k_shapefile/cb_2021_17_place_500k.shp")
il_ct <- sf::st_transform(il_ct, 4326)

4.3 Load ACS Data

4.3.1 Cook County Population

v17 <- load_variables(2020, "acs5", cache = TRUE)

cook_pop <- get_acs(
  geography = "tract", 
  variables = "B01003_001",
  state = "IL", 
  county = "Cook",
  year = 2020,
  geometry = TRUE
) %>%
  select(GEOID, NAME, estimate, moe) %>%
  st_transform(4326)

# split column
cook_pop = separate(cook_pop, "NAME", into = c("tract", "county", "state"), sep = ",", convert = T)

# rename columns
cook_pop <-
  rename(cook_pop,
         "census_tract" = "GEOID",
          "pop_2020" = "estimate",
         "moe_2020" = "moe")
print(cook_pop)
## Simple feature collection with 1332 features and 6 fields (with 1 geometry empty)
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -88.26364 ymin: 41.46971 xmax: -87.52416 ymax: 42.15426
## Geodetic CRS:  WGS 84
## First 10 features:
##    census_tract                tract       county     state pop_2020 moe_2020
## 1   17031824702 Census Tract 8247.02  Cook County  Illinois     5653      718
## 2   17031820604 Census Tract 8206.04  Cook County  Illinois     3670      511
## 3   17031827300    Census Tract 8273  Cook County  Illinois     2794      696
## 4   17031828701 Census Tract 8287.01  Cook County  Illinois     4571      505
## 5   17031829800    Census Tract 8298  Cook County  Illinois     5399      819
## 6   17031827200    Census Tract 8272  Cook County  Illinois     3838      568
## 7   17031829000    Census Tract 8290  Cook County  Illinois     1305      348
## 8   17031826901 Census Tract 8269.01  Cook County  Illinois     2081      405
## 9   17031826000    Census Tract 8260  Cook County  Illinois     2888      716
## 10  17031821700    Census Tract 8217  Cook County  Illinois     4694      469
##                          geometry
## 1  MULTIPOLYGON (((-87.71756 4...
## 2  MULTIPOLYGON (((-87.84352 4...
## 3  MULTIPOLYGON (((-87.65595 4...
## 4  MULTIPOLYGON (((-87.64095 4...
## 5  MULTIPOLYGON (((-87.6942 41...
## 6  MULTIPOLYGON (((-87.63712 4...
## 7  MULTIPOLYGON (((-87.63445 4...
## 8  MULTIPOLYGON (((-87.67542 4...
## 9  MULTIPOLYGON (((-87.54807 4...
## 10 MULTIPOLYGON (((-87.72165 4...

4.3.2 Unemployment Rate

cook_unemp <- get_acs(
  geography = "tract", 
  variables = "S2301_C04_001E",
  state = "IL", 
  county = "Cook",
  year = 2020,
  geometry = TRUE
) %>%
  select(GEOID, NAME, estimate, moe) %>%
  st_transform(4326)

# split column
cook_unemp = separate(cook_unemp, "NAME", into = c("tract", "county", "state"), sep = ",", convert = T)

# rename columns
cook_unemp <-
  rename(cook_unemp,
         "census_tract" = "GEOID",
          "unemp_rate_2020" = "estimate",
         "unemp_mmoe_2020" = "moe")
print(cook_unemp)
## Simple feature collection with 1332 features and 6 fields (with 1 geometry empty)
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -88.26364 ymin: 41.46971 xmax: -87.52416 ymax: 42.15426
## Geodetic CRS:  WGS 84
## First 10 features:
##    census_tract                tract       county     state unemp_rate_2020
## 1   17031824702 Census Tract 8247.02  Cook County  Illinois             1.7
## 2   17031820604 Census Tract 8206.04  Cook County  Illinois             2.2
## 3   17031827300    Census Tract 8273  Cook County  Illinois             8.5
## 4   17031828701 Census Tract 8287.01  Cook County  Illinois            14.7
## 5   17031829800    Census Tract 8298  Cook County  Illinois             3.5
## 6   17031827200    Census Tract 8272  Cook County  Illinois            14.0
## 7   17031829000    Census Tract 8290  Cook County  Illinois            37.4
## 8   17031826901 Census Tract 8269.01  Cook County  Illinois            14.7
## 9   17031826000    Census Tract 8260  Cook County  Illinois            12.8
## 10  17031821700    Census Tract 8217  Cook County  Illinois             2.2
##    unemp_mmoe_2020                       geometry
## 1              1.4 MULTIPOLYGON (((-87.71756 4...
## 2              2.2 MULTIPOLYGON (((-87.84352 4...
## 3              5.4 MULTIPOLYGON (((-87.65595 4...
## 4              7.8 MULTIPOLYGON (((-87.64095 4...
## 5              3.0 MULTIPOLYGON (((-87.6942 41...
## 6              5.8 MULTIPOLYGON (((-87.63712 4...
## 7             21.4 MULTIPOLYGON (((-87.63445 4...
## 8              7.9 MULTIPOLYGON (((-87.67542 4...
## 9              9.2 MULTIPOLYGON (((-87.54807 4...
## 10             2.0 MULTIPOLYGON (((-87.72165 4...

4.4 Joining Dataframes

Join the dataframes “cook_pop” and “food_access_cook” to merge 20202 ACS population data with the 2019 food atlas metrics. This will be called “data_joined”.

data_joined =
  full_join(cook_pop, food_access_cook, by = c("census_tract" = "CensusTract"))
print(data_joined)
## Simple feature collection with 1362 features and 152 fields (with 31 geometries empty)
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -88.26364 ymin: 41.46971 xmax: -87.52416 ymax: 42.15426
## Geodetic CRS:  WGS 84
## First 10 features:
##    census_tract                tract       county     state pop_2020 moe_2020
## 1   17031824702 Census Tract 8247.02  Cook County  Illinois     5653      718
## 2   17031820604 Census Tract 8206.04  Cook County  Illinois     3670      511
## 3   17031827300    Census Tract 8273  Cook County  Illinois     2794      696
## 4   17031828701 Census Tract 8287.01  Cook County  Illinois     4571      505
## 5   17031829800    Census Tract 8298  Cook County  Illinois     5399      819
## 6   17031827200    Census Tract 8272  Cook County  Illinois     3838      568
## 7   17031829000    Census Tract 8290  Cook County  Illinois     1305      348
## 8   17031826901 Census Tract 8269.01  Cook County  Illinois     2081      405
## 9   17031826000    Census Tract 8260  Cook County  Illinois     2888      716
## 10  17031821700    Census Tract 8217  Cook County  Illinois     4694      469
##       State      County Urban Pop2010 OHU2010 GroupQuartersFlag NUMGQTRS
## 1  Illinois Cook County     1    5607    1889                 0      101
## 2  Illinois Cook County     1    3839    1457                 0        0
## 3  Illinois Cook County     1    2947     977                 0        0
## 4  Illinois Cook County     1    4071    1431                 0      188
## 5  Illinois Cook County     1    6820    2586                 0       15
## 6  Illinois Cook County     1    4140    1392                 0        0
## 7  Illinois Cook County     1    1327     450                 0       13
## 8  Illinois Cook County     1    1894     618                 0        0
## 9  Illinois Cook County     1    3334    1070                 0        0
## 10 Illinois Cook County     1    4889    1771                 0        0
##    PCTGQTRS LILATracts_1And10 LILATracts_halfAnd10 LILATracts_1And20
## 1      1.80                 0                    0                 0
## 2      0.00                 0                    1                 0
## 3      0.00                 0                    0                 0
## 4      4.62                 0                    0                 0
## 5      0.22                 0                    0                 0
## 6      0.00                 0                    1                 0
## 7      0.98                 0                    1                 0
## 8      0.00                 0                    1                 0
## 9      0.00                 0                    0                 0
## 10     0.00                 0                    0                 0
##    LILATracts_Vehicle HUNVFlag LowIncomeTracts PovertyRate MedianFamilyIncome
## 1                   0        1               0        12.3              77143
## 2                   0        0               1        19.0              41366
## 3                   0        0               1        36.1              28393
## 4                   0        0               0        10.5              83893
## 5                   0        1               0         3.9             118457
## 6                   1        1               1        27.2              51570
## 7                   1        1               1        53.2              21667
## 8                   0        0               1        39.3              26100
## 9                   0        0               1        16.2              47500
## 10                  0        0               0         3.1             105863
##    LA1and10 LAhalfand10 LA1and20 LATracts_half LATracts1 LATracts10 LATracts20
## 1         1           1        1             1         1          0          0
## 2         0           1        0             1         0          0          0
## 3         0           0        0             0         0          0          0
## 4         0           1        0             1         0          0          0
## 5         0           1        0             1         0          0          0
## 6         0           1        0             1         0          0          0
## 7         0           1        0             1         0          0          0
## 8         0           1        0             1         0          0          0
## 9         0           0        0             0         0          0          0
## 10        0           1        0             1         0          0          0
##    LATractsVehicle_20 LAPOP1_10 LAPOP05_10 LAPOP1_20 LALOWI1_10 LALOWI05_10
## 1                   1       620       4870       620        143        1495
## 2                   0        25        985        25         16         612
## 3                   0      NULL          2      NULL       NULL           2
## 4                   0       201       1946       201         27         455
## 5                   1        29       3093        29          1         238
## 6                   1        58       2800        58         19        1121
## 7                   1       392       1176       392        309         898
## 8                   0      NULL       1170      NULL       NULL         804
## 9                   0         0        398         0          0         247
## 10                  0      NULL        642      NULL       NULL          87
##    LALOWI1_20 lapophalf lapophalfshare lalowihalf lalowihalfshare lakidshalf
## 1         143      4870          86.85       1495           26.65       1306
## 2          16       985          25.65        612           15.95        202
## 3        NULL         2           0.07          2            0.07          1
## 4          27      1946          47.79        455           11.17        618
## 5           1      3093          45.35        238            3.48        781
## 6          19      2800          67.62       1121           27.08        790
## 7         309      1176          88.61        898           67.68        393
## 8        NULL      1170          61.80        804           42.43        384
## 9           0       398          11.94        247            7.40        135
## 10       NULL       642          13.14         87            1.77        146
##    lakidshalfshare laseniorshalf laseniorshalfshare lawhitehalf
## 1            23.30           498               8.88        3274
## 2             5.26           100               2.60         879
## 3             0.02             0               0.00           0
## 4            15.17           218               5.35         655
## 5            11.46           527               7.73        1887
## 6            19.08           354               8.56         215
## 7            29.62           116               8.76          28
## 8            20.28           117               6.20          33
## 9             4.05            25               0.74         112
## 10            2.99            99               2.03         517
##    lawhitehalfshare lablackhalf lablackhalfshare laasianhalf laasianhalfshare
## 1             58.38         779            13.90          35             0.62
## 2             22.90          33             0.87           9             0.24
## 3              0.00           2             0.07           0             0.00
## 4             16.10        1118            27.47          12             0.29
## 5             27.66        1046            15.34          51             0.75
## 6              5.20        2442            58.99           8             0.19
## 7              2.08        1094            82.47           0             0.00
## 8              1.74        1099            58.03           0             0.00
## 9              3.36         204             6.12           0             0.01
## 10            10.58          79             1.62           3             0.07
##    lanhopihalf lanhopihalfshare laaianhalf laaianhalfshare laomultirhalf
## 1            0             0.00         17            0.30           766
## 2            0             0.00          7            0.18            56
## 3            0             0.00          0            0.00             0
## 4            0             0.00          6            0.14           154
## 5            1             0.01          2            0.03           105
## 6            0             0.00         17            0.40           118
## 7            0             0.00          0            0.00            54
## 8            0             0.00          0            0.00            38
## 9            0             0.01          7            0.21            75
## 10           0             0.00          1            0.01            42
##    laomultirhalfshare lahisphalf lahisphalfshare lahunvhalf lahunvhalfshare
## 1               13.66       1231           21.96        101            5.35
## 2                1.46        145            3.78         10            0.71
## 3                0.00          0            0.00          0            0.04
## 4                3.79        171            4.21         73            5.08
## 5                1.54         77            1.13        115            4.43
## 6                2.84        138            3.33        106            7.61
## 7                4.07         65            4.90        147           32.60
## 8                2.03         45            2.40         57            9.27
## 9                2.24        117            3.50         20            1.86
## 10               0.85         83            1.69          9            0.52
##    lasnaphalf lasnaphalfshare lapop1 lapop1share lalowi1 lalowi1share lakids1
## 1         278           14.70    620       11.05     143         2.54     145
## 2          91            6.22     25        0.64      16         0.40       4
## 3           0            0.03   NULL        NULL    NULL         NULL    NULL
## 4          63            4.39    201        4.94      27         0.67      53
## 5          46            1.79     29        0.43       1         0.02       6
## 6         323           23.20     58        1.41      19         0.45      21
## 7         229           50.85    392       29.53     309        23.27     158
## 8         160           25.91   NULL        NULL    NULL         NULL    NULL
## 9          36            3.33      0        0.00       0         0.00       0
## 10          7            0.41   NULL        NULL    NULL         NULL    NULL
##    lakids1share laseniors1 laseniors1share lawhite1 lawhite1share lablack1
## 1          2.58         93            1.65      485          8.65       36
## 2          0.09          2            0.05       23          0.59        2
## 3          NULL       NULL            NULL     NULL          NULL     NULL
## 4          1.30         21            0.51       73          1.78       99
## 5          0.09          5            0.07       17          0.26       11
## 6          0.51          4            0.09        5          0.13       45
## 7         11.88         25            1.90        4          0.27      371
## 8          NULL       NULL            NULL     NULL          NULL     NULL
## 9          0.00          0            0.00        0          0.00        0
## 10         NULL       NULL            NULL     NULL          NULL     NULL
##    lablack1share laasian1 laasian1share lanhopi1 lanhopi1share laaian1
## 1           0.63        7          0.12        0          0.00       2
## 2           0.05        0          0.00        0          0.00       0
## 3           NULL     NULL          NULL     NULL          NULL    NULL
## 4           2.44        6          0.14        0          0.00       0
## 5           0.15        0          0.01        0          0.00       0
## 6           1.08        0          0.00        0          0.00       0
## 7          27.99        0          0.00        0          0.00       0
## 8           NULL     NULL          NULL     NULL          NULL    NULL
## 9           0.00        0          0.00        0          0.00       0
## 10          NULL     NULL          NULL     NULL          NULL    NULL
##    laaian1share laomultir1 laomultir1share lahisp1 lahisp1share lahunv1
## 1          0.04         90            1.61     142         2.53      11
## 2          0.00          0            0.00       0         0.00       0
## 3          NULL       NULL            NULL    NULL         NULL    NULL
## 4          0.00         23            0.57      16         0.40       7
## 5          0.00          1            0.02       1         0.01       1
## 6          0.01          8            0.19       9         0.22       2
## 7          0.00         17            1.27      12         0.91      42
## 8          NULL       NULL            NULL    NULL         NULL    NULL
## 9          0.00          0            0.00       0         0.00       0
## 10         NULL       NULL            NULL    NULL         NULL    NULL
##    lahunv1share lasnap1 lasnap1share lapop10 lapop10share lalowi10
## 1          0.57      38         2.00    NULL         NULL     NULL
## 2          0.01       2         0.16    NULL         NULL     NULL
## 3          NULL    NULL         NULL    NULL         NULL     NULL
## 4          0.50       7         0.50    NULL         NULL     NULL
## 5          0.06       0         0.02    NULL         NULL     NULL
## 6          0.11       5         0.37    NULL         NULL     NULL
## 7          9.43      78        17.42    NULL         NULL     NULL
## 8          NULL    NULL         NULL    NULL         NULL     NULL
## 9          0.00       0         0.00    NULL         NULL     NULL
## 10         NULL    NULL         NULL    NULL         NULL     NULL
##    lalowi10share lakids10 lakids10share laseniors10 laseniors10share lawhite10
## 1           NULL     NULL          NULL        NULL             NULL      NULL
## 2           NULL     NULL          NULL        NULL             NULL      NULL
## 3           NULL     NULL          NULL        NULL             NULL      NULL
## 4           NULL     NULL          NULL        NULL             NULL      NULL
## 5           NULL     NULL          NULL        NULL             NULL      NULL
## 6           NULL     NULL          NULL        NULL             NULL      NULL
## 7           NULL     NULL          NULL        NULL             NULL      NULL
## 8           NULL     NULL          NULL        NULL             NULL      NULL
## 9           NULL     NULL          NULL        NULL             NULL      NULL
## 10          NULL     NULL          NULL        NULL             NULL      NULL
##    lawhite10share lablack10 lablack10share laasian10 laasian10share lanhopi10
## 1            NULL      NULL           NULL      NULL           NULL      NULL
## 2            NULL      NULL           NULL      NULL           NULL      NULL
## 3            NULL      NULL           NULL      NULL           NULL      NULL
## 4            NULL      NULL           NULL      NULL           NULL      NULL
## 5            NULL      NULL           NULL      NULL           NULL      NULL
## 6            NULL      NULL           NULL      NULL           NULL      NULL
## 7            NULL      NULL           NULL      NULL           NULL      NULL
## 8            NULL      NULL           NULL      NULL           NULL      NULL
## 9            NULL      NULL           NULL      NULL           NULL      NULL
## 10           NULL      NULL           NULL      NULL           NULL      NULL
##    lanhopi10share laaian10 laaian10share laomultir10 laomultir10share lahisp10
## 1            NULL     NULL          NULL        NULL             NULL     NULL
## 2            NULL     NULL          NULL        NULL             NULL     NULL
## 3            NULL     NULL          NULL        NULL             NULL     NULL
## 4            NULL     NULL          NULL        NULL             NULL     NULL
## 5            NULL     NULL          NULL        NULL             NULL     NULL
## 6            NULL     NULL          NULL        NULL             NULL     NULL
## 7            NULL     NULL          NULL        NULL             NULL     NULL
## 8            NULL     NULL          NULL        NULL             NULL     NULL
## 9            NULL     NULL          NULL        NULL             NULL     NULL
## 10           NULL     NULL          NULL        NULL             NULL     NULL
##    lahisp10share lahunv10 lahunv10share lasnap10 lasnap10share lapop20
## 1           NULL     NULL          NULL     NULL          NULL    NULL
## 2           NULL     NULL          NULL     NULL          NULL    NULL
## 3           NULL     NULL          NULL     NULL          NULL    NULL
## 4           NULL     NULL          NULL     NULL          NULL    NULL
## 5           NULL     NULL          NULL     NULL          NULL    NULL
## 6           NULL     NULL          NULL     NULL          NULL    NULL
## 7           NULL     NULL          NULL     NULL          NULL    NULL
## 8           NULL     NULL          NULL     NULL          NULL    NULL
## 9           NULL     NULL          NULL     NULL          NULL    NULL
## 10          NULL     NULL          NULL     NULL          NULL    NULL
##    lapop20share lalowi20 lalowi20share lakids20 lakids20share laseniors20
## 1          NULL     NULL          NULL     NULL          NULL        NULL
## 2          NULL     NULL          NULL     NULL          NULL        NULL
## 3          NULL     NULL          NULL     NULL          NULL        NULL
## 4          NULL     NULL          NULL     NULL          NULL        NULL
## 5          NULL     NULL          NULL     NULL          NULL        NULL
## 6          NULL     NULL          NULL     NULL          NULL        NULL
## 7          NULL     NULL          NULL     NULL          NULL        NULL
## 8          NULL     NULL          NULL     NULL          NULL        NULL
## 9          NULL     NULL          NULL     NULL          NULL        NULL
## 10         NULL     NULL          NULL     NULL          NULL        NULL
##    laseniors20share lawhite20 lawhite20share lablack20 lablack20share laasian20
## 1              NULL      NULL           NULL      NULL           NULL      NULL
## 2              NULL      NULL           NULL      NULL           NULL      NULL
## 3              NULL      NULL           NULL      NULL           NULL      NULL
## 4              NULL      NULL           NULL      NULL           NULL      NULL
## 5              NULL      NULL           NULL      NULL           NULL      NULL
## 6              NULL      NULL           NULL      NULL           NULL      NULL
## 7              NULL      NULL           NULL      NULL           NULL      NULL
## 8              NULL      NULL           NULL      NULL           NULL      NULL
## 9              NULL      NULL           NULL      NULL           NULL      NULL
## 10             NULL      NULL           NULL      NULL           NULL      NULL
##    laasian20share lanhopi20 lanhopi20share laaian20 laaian20share laomultir20
## 1            NULL      NULL           NULL     NULL          NULL        NULL
## 2            NULL      NULL           NULL     NULL          NULL        NULL
## 3            NULL      NULL           NULL     NULL          NULL        NULL
## 4            NULL      NULL           NULL     NULL          NULL        NULL
## 5            NULL      NULL           NULL     NULL          NULL        NULL
## 6            NULL      NULL           NULL     NULL          NULL        NULL
## 7            NULL      NULL           NULL     NULL          NULL        NULL
## 8            NULL      NULL           NULL     NULL          NULL        NULL
## 9            NULL      NULL           NULL     NULL          NULL        NULL
## 10           NULL      NULL           NULL     NULL          NULL        NULL
##    laomultir20share lahisp20 lahisp20share lahunv20 lahunv20share lasnap20
## 1              NULL     NULL          NULL     NULL          NULL     NULL
## 2              NULL     NULL          NULL     NULL          NULL     NULL
## 3              NULL     NULL          NULL     NULL          NULL     NULL
## 4              NULL     NULL          NULL     NULL          NULL     NULL
## 5              NULL     NULL          NULL     NULL          NULL     NULL
## 6              NULL     NULL          NULL     NULL          NULL     NULL
## 7              NULL     NULL          NULL     NULL          NULL     NULL
## 8              NULL     NULL          NULL     NULL          NULL     NULL
## 9              NULL     NULL          NULL     NULL          NULL     NULL
## 10             NULL     NULL          NULL     NULL          NULL     NULL
##    lasnap20share TractLOWI TractKids TractSeniors TractWhite TractBlack
## 1           NULL      1729      1541          544       3680        957
## 2           NULL      2450       964          318       3372        146
## 3           NULL      1899       980          289        166       2376
## 4           NULL       849      1225          482       1359       2423
## 5           NULL       799      1742         1071       3595       2794
## 6           NULL      2020      1208          502        486       2979
## 7           NULL      1048       447          133         40       1223
## 8           NULL      1271       570          213         57       1705
## 9           NULL      1502      1159          178        714       2019
## 10          NULL       765      1269          642       4139        526
##    TractAsian TractNHOPI TractAIAN TractOMultir TractHispanic TractHUNV
## 1          46          0        27          897          1441       131
## 2          62          5        13          241           469        70
## 3         109          0        13          283           385       243
## 4          21          2        12          254           331        95
## 5         160          1         7          263           221       144
## 6          23          0        24          628           818       146
## 7           0          0         0           64            84       159
## 8           0          0         7          125           142       107
## 9          13          5        42          541           906       133
## 10         32          0         8          184           345        80
##    TractSNAP                       geometry
## 1        340 MULTIPOLYGON (((-87.71756 4...
## 2        355 MULTIPOLYGON (((-87.84352 4...
## 3        395 MULTIPOLYGON (((-87.65595 4...
## 4        113 MULTIPOLYGON (((-87.64095 4...
## 5         96 MULTIPOLYGON (((-87.6942 41...
## 6        472 MULTIPOLYGON (((-87.63712 4...
## 7        255 MULTIPOLYGON (((-87.63445 4...
## 8        299 MULTIPOLYGON (((-87.67542 4...
## 9        240 MULTIPOLYGON (((-87.54807 4...
## 10        51 MULTIPOLYGON (((-87.72165 4...

Use a spatial join to combine the “data_joined” dataframe (UOA = census tract) with the Cook County unemployment rates.

data_joined5 =
  st_join(
    st_make_valid(st_sf(cook_unemp)),
  st_make_valid(st_sf(data_joined)),
  left = F,
  largest = T,
  join = st_within)
print(as_tibble(data_joined5))
## # A tibble: 1,331 × 159
##    census_trac…¹ tract.x count…² state.x unemp…³ unemp…⁴ censu…⁵ tract.y count…⁶
##    <chr>         <chr>   <chr>   <chr>     <dbl>   <dbl> <chr>   <chr>   <chr>  
##  1 17031824702   Census… " Cook… " Illi…     1.7     1.4 170318… Census… " Cook…
##  2 17031820604   Census… " Cook… " Illi…     2.2     2.2 170318… Census… " Cook…
##  3 17031827300   Census… " Cook… " Illi…     8.5     5.4 170318… Census… " Cook…
##  4 17031828701   Census… " Cook… " Illi…    14.7     7.8 170318… Census… " Cook…
##  5 17031829800   Census… " Cook… " Illi…     3.5     3   170318… Census… " Cook…
##  6 17031827200   Census… " Cook… " Illi…    14       5.8 170318… Census… " Cook…
##  7 17031829000   Census… " Cook… " Illi…    37.4    21.4 170318… Census… " Cook…
##  8 17031826901   Census… " Cook… " Illi…    14.7     7.9 170318… Census… " Cook…
##  9 17031826000   Census… " Cook… " Illi…    12.8     9.2 170318… Census… " Cook…
## 10 17031821700   Census… " Cook… " Illi…     2.2     2   170318… Census… " Cook…
## # … with 1,321 more rows, 150 more variables: state.y <chr>, pop_2020 <dbl>,
## #   moe_2020 <dbl>, State <chr>, County <chr>, Urban <dbl>, Pop2010 <dbl>,
## #   OHU2010 <dbl>, GroupQuartersFlag <dbl>, NUMGQTRS <dbl>, PCTGQTRS <dbl>,
## #   LILATracts_1And10 <dbl>, LILATracts_halfAnd10 <dbl>,
## #   LILATracts_1And20 <dbl>, LILATracts_Vehicle <dbl>, HUNVFlag <dbl>,
## #   LowIncomeTracts <dbl>, PovertyRate <dbl>, MedianFamilyIncome <chr>,
## #   LA1and10 <dbl>, LAhalfand10 <dbl>, LA1and20 <dbl>, LATracts_half <dbl>, …

Use a spatial join to combine the “data_joined5” dataframe (UOA = census tract) with the Chicago community area shapefile to get the data all on the same unit of analysis–community area in the City of Chicago. The resulting dataframe is “data_joined2”

data_joined2 <- 
  st_join(
  st_make_valid(st_sf(chi_shp)),
  st_make_valid(st_sf(data_joined5)),
  left = F,
  largest = T,
  join = st_within)
print(as_tibble(data_joined2))
## # A tibble: 77 × 168
##     area area_…¹ area_…² comarea comar…³ commu…⁴ perim…⁵ shape…⁶ shape…⁷ censu…⁸
##    <dbl> <chr>   <chr>     <dbl>   <dbl> <chr>     <dbl>   <dbl>   <dbl> <chr>  
##  1     0 35      35            0       0 DOUGLAS       0  4.60e7  31027. 170313…
##  2     0 36      36            0       0 OAKLAND       0  1.69e7  19566. 170318…
##  3     0 37      37            0       0 FULLER…       0  1.99e7  25339. 170318…
##  4     0 38      38            0       0 GRAND …       0  4.85e7  28197. 170313…
##  5     0 39      39            0       0 KENWOOD       0  2.91e7  23325. 170313…
##  6     0 4       4             0       0 LINCOL…       0  7.14e7  36625. 170310…
##  7     0 40      40            0       0 WASHIN…       0  4.24e7  28175. 170314…
##  8     0 41      41            0       0 HYDE P…       0  4.51e7  29747. 170314…
##  9     0 42      42            0       0 WOODLA…       0  5.78e7  46937. 170318…
## 10     0 1       1             0       0 ROGERS…       0  5.13e7  34052. 170318…
## # … with 67 more rows, 158 more variables: tract.x <chr>, county.x <chr>,
## #   state.x <chr>, unemp_rate_2020 <dbl>, unemp_mmoe_2020 <dbl>,
## #   census_tract.y <chr>, tract.y <chr>, county.y <chr>, state.y <chr>,
## #   pop_2020 <dbl>, moe_2020 <dbl>, State <chr>, County <chr>, Urban <dbl>,
## #   Pop2010 <dbl>, OHU2010 <dbl>, GroupQuartersFlag <dbl>, NUMGQTRS <dbl>,
## #   PCTGQTRS <dbl>, LILATracts_1And10 <dbl>, LILATracts_halfAnd10 <dbl>,
## #   LILATracts_1And20 <dbl>, LILATracts_Vehicle <dbl>, HUNVFlag <dbl>, …

Join the low-access to food supply data with unemployment data in Cook County.

data_joined3 =
  full_join(cook_la, cook_unemp, by = c("CensusTract" = "census_tract"))
print(as_tibble(data_joined3))
## # A tibble: 1,362 × 42
##    CensusTract Pop2010 OHU2010 GroupQu…¹ NUMGQ…² PCTGQ…³ Pover…⁴ Media…⁵ LILAT…⁶
##    <chr>         <dbl>   <dbl>     <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>
##  1 17031010100    4854    2302         0     218    4.49    35.8   62177       1
##  2 17031010201    6450    2463         0     163    2.53    36.8   47411       0
##  3 17031010202    2818    1115         0     315   11.2     18.5   51719       0
##  4 17031010300    6236    2826         0     791   12.7     16.2   66875       1
##  5 17031010400    5042    2098         0    1349   26.8     19.1   59861       0
##  6 17031010501    4091    2293         0       7    0.17    20.7   50266       0
##  7 17031010502    3101    1684         0       3    0.1     30.0   37500       0
##  8 17031010503    2290    1184         0     163    7.12    48.0   43654       0
##  9 17031010600    6097    2943         0     175    2.87    24.4   87545       0
## 10 17031010701    3864    1535         0       0    0       20.8   72500       0
## # … with 1,352 more rows, 33 more variables: lapophalf <dbl>, lalowihalf <dbl>,
## #   lakidshalf <dbl>, laseniorshalf <dbl>, lawhitehalf <dbl>,
## #   lablackhalf <dbl>, laasianhalf <dbl>, lanhopihalf <dbl>, laaianhalf <dbl>,
## #   laomultirhalf <dbl>, lahisphalf <dbl>, lahunvhalf <dbl>, lasnaphalf <dbl>,
## #   TractLOWI <dbl>, TractKids <dbl>, TractSeniors <dbl>, TractWhite <dbl>,
## #   PerWhite <dbl>, MinorityTract <dbl>, TractBlack <dbl>, TractAsian <dbl>,
## #   TractNHOPI <dbl>, TractAIAN <dbl>, TractOMultir <dbl>, …

Next, add in the 2020 ACS population data.

data_joined3 =
  full_join(cook_pop, data_joined3, by = c("census_tract" = "CensusTract"))
print(as_tibble(data_joined3))
## # A tibble: 1,362 × 48
##    census_tract tract.x  count…¹ state.x pop_2…² moe_2…³ Pop2010 OHU2010 Group…⁴
##    <chr>        <chr>    <chr>   <chr>     <dbl>   <dbl>   <dbl>   <dbl>   <dbl>
##  1 17031824702  Census … " Cook… " Illi…    5653     718    5607    1889       0
##  2 17031820604  Census … " Cook… " Illi…    3670     511    3839    1457       0
##  3 17031827300  Census … " Cook… " Illi…    2794     696    2947     977       0
##  4 17031828701  Census … " Cook… " Illi…    4571     505    4071    1431       0
##  5 17031829800  Census … " Cook… " Illi…    5399     819    6820    2586       0
##  6 17031827200  Census … " Cook… " Illi…    3838     568    4140    1392       0
##  7 17031829000  Census … " Cook… " Illi…    1305     348    1327     450       0
##  8 17031826901  Census … " Cook… " Illi…    2081     405    1894     618       0
##  9 17031826000  Census … " Cook… " Illi…    2888     716    3334    1070       0
## 10 17031821700  Census … " Cook… " Illi…    4694     469    4889    1771       0
## # … with 1,352 more rows, 39 more variables: NUMGQTRS <dbl>, PCTGQTRS <dbl>,
## #   PovertyRate <dbl>, MedianFamilyIncome <dbl>, LILATracts_halfAnd10 <dbl>,
## #   lapophalf <dbl>, lalowihalf <dbl>, lakidshalf <dbl>, laseniorshalf <dbl>,
## #   lawhitehalf <dbl>, lablackhalf <dbl>, laasianhalf <dbl>, lanhopihalf <dbl>,
## #   laaianhalf <dbl>, laomultirhalf <dbl>, lahisphalf <dbl>, lahunvhalf <dbl>,
## #   lasnaphalf <dbl>, TractLOWI <dbl>, TractKids <dbl>, TractSeniors <dbl>,
## #   TractWhite <dbl>, PerWhite <dbl>, MinorityTract <dbl>, TractBlack <dbl>, …

Use a spatial join to combine the “cook_la” dataframe (UOA = census tract) with the Chicago community area shapefile to get the data all on the same unit of analysis–community area in the City of Chicago.

cook_la2 <- 
  st_join(
  st_make_valid(st_sf(chi_shp)),
  st_make_valid(st_sf(data_joined3)),
  left = F,
  largest = T,
  join = st_within)
print(as_tibble(cook_la2))
## # A tibble: 77 × 57
##     area area_…¹ area_…² comarea comar…³ commu…⁴ perim…⁵ shape…⁶ shape…⁷ censu…⁸
##    <dbl> <chr>   <chr>     <dbl>   <dbl> <chr>     <dbl>   <dbl>   <dbl> <chr>  
##  1     0 35      35            0       0 DOUGLAS       0  4.60e7  31027. 170313…
##  2     0 36      36            0       0 OAKLAND       0  1.69e7  19566. 170318…
##  3     0 37      37            0       0 FULLER…       0  1.99e7  25339. 170318…
##  4     0 38      38            0       0 GRAND …       0  4.85e7  28197. 170313…
##  5     0 39      39            0       0 KENWOOD       0  2.91e7  23325. 170313…
##  6     0 4       4             0       0 LINCOL…       0  7.14e7  36625. 170310…
##  7     0 40      40            0       0 WASHIN…       0  4.24e7  28175. 170314…
##  8     0 41      41            0       0 HYDE P…       0  4.51e7  29747. 170314…
##  9     0 42      42            0       0 WOODLA…       0  5.78e7  46937. 170318…
## 10     0 1       1             0       0 ROGERS…       0  5.13e7  34052. 170318…
## # … with 67 more rows, 47 more variables: tract.x <chr>, county.x <chr>,
## #   state.x <chr>, pop_2020 <dbl>, moe_2020 <dbl>, Pop2010 <dbl>,
## #   OHU2010 <dbl>, GroupQuartersFlag <dbl>, NUMGQTRS <dbl>, PCTGQTRS <dbl>,
## #   PovertyRate <dbl>, MedianFamilyIncome <dbl>, LILATracts_halfAnd10 <dbl>,
## #   lapophalf <dbl>, lalowihalf <dbl>, lakidshalf <dbl>, laseniorshalf <dbl>,
## #   lawhitehalf <dbl>, lablackhalf <dbl>, laasianhalf <dbl>, lanhopihalf <dbl>,
## #   laaianhalf <dbl>, laomultirhalf <dbl>, lahisphalf <dbl>, …

Next, I created a new dataframe for the selected variables of interest for the new UOA called “data_comm”.

data_comm <- data_joined2 %>% 
  group_by(area_numbe) %>% 
  select(area_numbe, community, perimeter, shape_area, 
         shape_len, census_tract.x, county.x, state.x, pop_2020, 
         moe_2020, Pop2010, OHU2010, LA1and10, PovertyRate, MedianFamilyIncome, unemp_rate_2020,
         unemp_mmoe_2020, lablackhalf, lablackhalfshare, laasianhalf,laasianhalfshare, lanhopihalf,
         lanhopihalfshare, laaianhalf, laaianhalfshare, laomultirhalf, laomultirhalfshare, 
         lahisphalf, lahisphalfshare, TractLOWI, TractKids, TractSeniors, TractWhite, TractBlack,
         TractAsian, TractNHOPI, TractAIAN, TractOMultir, TractHispanic, TractHUNV, 
         TractSNAP, geometry) 
print(as_tibble(data_comm))
## # A tibble: 77 × 42
##    area_numbe community  perim…¹ shape…² shape…³ censu…⁴ count…⁵ state.x pop_2…⁶
##    <chr>      <chr>        <dbl>   <dbl>   <dbl> <chr>   <chr>   <chr>     <dbl>
##  1 35         DOUGLAS          0  4.60e7  31027. 170313… " Cook… " Illi…    3197
##  2 36         OAKLAND          0  1.69e7  19566. 170318… " Cook… " Illi…    3726
##  3 37         FULLER PA…       0  1.99e7  25339. 170318… " Cook… " Illi…     793
##  4 38         GRAND BOU…       0  4.85e7  28197. 170313… " Cook… " Illi…    3764
##  5 39         KENWOOD          0  2.91e7  23325. 170313… " Cook… " Illi…    5555
##  6 4          LINCOLN S…       0  7.14e7  36625. 170310… " Cook… " Illi…    3934
##  7 40         WASHINGTO…       0  4.24e7  28175. 170314… " Cook… " Illi…    1274
##  8 41         HYDE PARK        0  4.51e7  29747. 170314… " Cook… " Illi…    3428
##  9 42         WOODLAWN         0  5.78e7  46937. 170318… " Cook… " Illi…    3433
## 10 1          ROGERS PA…       0  5.13e7  34052. 170318… " Cook… " Illi…    4923
## # … with 67 more rows, 33 more variables: moe_2020 <dbl>, Pop2010 <dbl>,
## #   OHU2010 <dbl>, LA1and10 <dbl>, PovertyRate <dbl>, MedianFamilyIncome <chr>,
## #   unemp_rate_2020 <dbl>, unemp_mmoe_2020 <dbl>, lablackhalf <chr>,
## #   lablackhalfshare <chr>, laasianhalf <chr>, laasianhalfshare <chr>,
## #   lanhopihalf <chr>, lanhopihalfshare <chr>, laaianhalf <chr>,
## #   laaianhalfshare <chr>, laomultirhalf <chr>, laomultirhalfshare <chr>,
## #   lahisphalf <chr>, lahisphalfshare <chr>, TractLOWI <dbl>, …

4.5 Create New Dataframes for Variables of Interest

4.5.1 Poverty Rate

Community areas in Chicago with the highest poverty rates

data_comm_table = 
  data_comm %>% 
  arrange(desc(PovertyRate)) %>% 
  rename("Area Number" = "area_numbe",
          "Community Area" = "community",
         "2020 Population" = "pop_2020",
         "la_black" = "lablackhalf",
         "la_asian" = "laasianhalf",
         "la_hopi" = "lanhopihalf",
         "la_multi" = "laomultirhalf",
         "la_hispanic" = "lahisphalf",
         "Poverty Rate" = "PovertyRate",
         "Median Family Income" = "MedianFamilyIncome") %>% 
  select("Area Number", "Community Area", "Poverty Rate", "2020 Population")
print(as_tibble(data_comm_table))
## # A tibble: 77 × 5
##    `Area Number` `Community Area`   Poverty …¹ 2020 …²                  geometry
##    <chr>         <chr>                   <dbl>   <dbl>        <MULTIPOLYGON [°]>
##  1 27            EAST GARFIELD PARK       68.5    2149 (((-87.69501 41.88816, -…
##  2 54            RIVERDALE                64.2    3195 (((-87.60168 41.68621, -…
##  3 29            NORTH LAWNDALE           42.5    2494 (((-87.72023 41.86969, -…
##  4 51            SOUTH DEERING            42.5    3033 (((-87.546 41.72279, -87…
##  5 40            WASHINGTON PARK          41      1274 (((-87.60604 41.78604, -…
##  6 68            ENGLEWOOD                40.2    1683 (((-87.62825 41.78326, -…
##  7 43            SOUTH SHORE              39.8    7068 (((-87.54398 41.75517, -…
##  8 58            BRIGHTON PARK            39.5    6916 (((-87.68443 41.823, -87…
##  9 46            SOUTH CHICAGO            37.5    2784 (((-87.544 41.75516, -87…
## 10 66            CHICAGO LAWN             36      4883 (((-87.67837 41.76111, -…
## # … with 67 more rows, and abbreviated variable names ¹​`Poverty Rate`,
## #   ²​`2020 Population`

Community areas in Chicago with the lowest poverty rates

data_comm_table2 = 
  data_comm %>% 
  arrange((PovertyRate)) %>% 
  rename("Area Number" = "area_numbe",
          "Community Area" = "community",
         "2020 Population" = "pop_2020",
         "la_black" = "lablackhalf",
         "la_asian" = "laasianhalf",
         "la_hopi" = "lanhopihalf",
         "la_multi" = "laomultirhalf",
         "la_hispanic" = "lahisphalf",
         "Poverty Rate" = "PovertyRate",
         "Median Family Income" = "MedianFamilyIncome") %>% 
  select("Area Number", "Community Area", "Poverty Rate", "2020 Population")
print(as_tibble(data_comm_table2))
## # A tibble: 77 × 5
##    `Area Number` `Community Area` Poverty Ra…¹ 2020 …²                  geometry
##    <chr>         <chr>                   <dbl>   <dbl>        <MULTIPOLYGON [°]>
##  1 72            BEVERLY                   0.3    3357 (((-87.67337 41.73566, -…
##  2 9             EDISON PARK               2.1    6166 (((-87.80676 42.00085, -…
##  3 12            FOREST GLEN               2.5    4515 (((-87.76919 42.00489, -…
##  4 5             NORTH CENTER              3.7    2376 (((-87.67338 41.9334, -8…
##  5 74            MOUNT GREENWOOD           3.8    4440 (((-87.69668 41.70714, -…
##  6 10            NORWOOD PARK              4      6343 (((-87.78002 41.99742, -…
##  7 7             LINCOLN PARK              4.7    6157 (((-87.632 41.9326, -87.…
##  8 13            NORTH PARK                5.2    1658 (((-87.70693 41.98315, -…
##  9 22            LOGAN SQUARE              5.5    2754 (((-87.68284 41.93223, -…
## 10 24            WEST TOWN                 5.6    3123 (((-87.65693 41.91108, -…
## # … with 67 more rows, and abbreviated variable names ¹​`Poverty Rate`,
## #   ²​`2020 Population`

4.5.2 Median Family Income (MFI)

Data Wrangling Change class of variable to use in data visualizations.

class(data_comm$MedianFamilyIncome)
data_comm$MedianFamilyIncome = as.numeric(data_comm$MedianFamilyIncome)
class(data_comm$MedianFamilyIncome)

New dataframe: Chicago Community areas in order of lowest MFI

data_table_mfi = 
  data_comm %>% 
  arrange(MedianFamilyIncome) %>% 
  rename("Area Number" = "area_numbe",
          "Community Area" = "community",
         "2020 Population" = "pop_2020",
         "la_black" = "lablackhalf",
         "la_asian" = "laasianhalf",
         "la_hopi" = "lanhopihalf",
         "la_multi" = "laomultirhalf",
         "la_hispanic" = "lahisphalf",
         "Poverty Rate" = "PovertyRate",
         "Median Family Income" = "MedianFamilyIncome") %>% 
  select("Area Number", "Community Area", "Median Family Income", "2020 Population", la_black, la_asian, la_hopi, la_multi, la_hispanic)
print(as_tibble(data_table_mfi))
## # A tibble: 77 × 10
##    `Area Number` Commu…¹ Media…² 2020 …³ la_bl…⁴ la_as…⁵ la_hopi la_mu…⁶ la_hi…⁷
##    <chr>         <chr>     <dbl>   <dbl> <chr>   <chr>   <chr>   <chr>   <chr>  
##  1 54            RIVERD…   17122    3195 3076    0       0       26      20     
##  2 27            EAST G…   19125    2149 1919    5       0       37      55     
##  3 29            NORTH …   25188    2494 58      0       0       0       0      
##  4 35            DOUGLAS   25230    3197 0       0       0       0       0      
##  5 51            SOUTH …   27083    3033 1772    3       0       756     1331   
##  6 43            SOUTH …   31345    7068 6050    32      0       139     97     
##  7 46            SOUTH …   32500    2784 536     2       0       77      129    
##  8 58            BRIGHT…   33064    6916 35      10      0       965     1751   
##  9 66            CHICAG…   34226    4883 912     1       0       61      73     
## 10 68            ENGLEW…   34602    1683 2269    0       0       24      25     
## # … with 67 more rows, 1 more variable: geometry <MULTIPOLYGON [°]>, and
## #   abbreviated variable names ¹​`Community Area`, ²​`Median Family Income`,
## #   ³​`2020 Population`, ⁴​la_black, ⁵​la_asian, ⁶​la_multi, ⁷​la_hispanic

New dataframe: Chicago Community areas in order of highest MFI

data_table_mfi2 = 
  data_comm %>% 
  arrange(desc(MedianFamilyIncome)) %>% 
  rename("Area Number" = "area_numbe",
          "Community Area" = "community",
         "2020 Population" = "pop_2020",
         "la_black" = "lablackhalf",
         "la_asian" = "laasianhalf",
         "la_hopi" = "lanhopihalf",
         "la_multi" = "laomultirhalf",
         "la_hispanic" = "lahisphalf",
         "Poverty Rate" = "PovertyRate",
         "Median Family Income" = "MedianFamilyIncome") %>% 
  select("Area Number", "Community Area", "Median Family Income", "2020 Population", la_black, la_asian, la_hopi, la_multi, la_hispanic)
print(as_tibble(data_table_mfi2))
## # A tibble: 77 × 10
##    `Area Number` Commu…¹ Media…² 2020 …³ la_bl…⁴ la_as…⁵ la_hopi la_mu…⁶ la_hi…⁷
##    <chr>         <chr>     <dbl>   <dbl> <chr>   <chr>   <chr>   <chr>   <chr>  
##  1 7             LINCOL…  187841    6157 0       0       0       0       0      
##  2 72            BEVERLY  168281    3357 30      0       0       4       4      
##  3 24            WEST T…  165761    3123 12      15      3       10      26     
##  4 32            LOOP     155383    7916 NULL    NULL    NULL    NULL    NULL   
##  5 12            FOREST…  154141    4515 6       20      0       9       34     
##  6 9             EDISON…  151204    6166 5       59      0       90      166    
##  7 5             NORTH …  143000    2376 11      21      0       29      72     
##  8 3             UPTOWN   132694    4840 0       0       0       0       0      
##  9 10            NORWOO…  127876    6343 28      215     0       210     589    
## 10 28            NEAR W…  127500    6391 64      132     1       51      68     
## # … with 67 more rows, 1 more variable: geometry <MULTIPOLYGON [°]>, and
## #   abbreviated variable names ¹​`Community Area`, ²​`Median Family Income`,
## #   ³​`2020 Population`, ⁴​la_black, ⁵​la_asian, ⁶​la_multi, ⁷​la_hispanic

4.5.3 Unemployment Rate

Data Wrangling

When looking at this data point, it is clear that the community area “Near North Side” was erroneously given a 0% unemployment rate which should be reported as NA. I have replaced the values of 0 with NA in the appropriate column.

data_comm$unemp_rate_2020[data_comm$unemp_rate_2020 == 0] <- NA

New dataframe: Chicago community areas in descending order of unemployment rate.

data_unemp_table = 
  data_comm %>% 
  arrange(desc(unemp_rate_2020)) %>% 
  rename("Area Number" = "area_numbe",
          "Community Area" = "community",
         "2020 Population" = "pop_2020",
         "la_black" = "lablackhalf",
         "la_asian" = "laasianhalf",
         "la_hopi" = "lanhopihalf",
         "la_multi" = "laomultirhalf",
         "la_hispanic" = "lahisphalf",
         "Unemployment Rate" = "unemp_rate_2020") %>% 
  select("Area Number", "Community Area", "Unemployment Rate", "2020 Population")
print(as_tibble(data_unemp_table))
## # A tibble: 77 × 5
##    `Area Number` `Community Area`   Unemploy…¹ 2020 …²                  geometry
##    <chr>         <chr>                   <dbl>   <dbl>        <MULTIPOLYGON [°]>
##  1 37            FULLER PARK              28.2     793 (((-87.62881 41.80225, -…
##  2 53            WEST PULLMAN             28      5192 (((-87.61767 41.66172, -…
##  3 54            RIVERDALE                26.9    3195 (((-87.60168 41.68621, -…
##  4 67            WEST ENGLEWOOD           26.3    3584 (((-87.65499 41.79417, -…
##  5 27            EAST GARFIELD PARK       24.5    2149 (((-87.69501 41.88816, -…
##  6 36            OAKLAND                  22.4    3726 (((-87.59216 41.81697, -…
##  7 40            WASHINGTON PARK          21.9    1274 (((-87.60604 41.78604, -…
##  8 46            SOUTH CHICAGO            21.6    2784 (((-87.544 41.75516, -87…
##  9 68            ENGLEWOOD                20.6    1683 (((-87.62825 41.78326, -…
## 10 45            AVALON PARK              18.5    6294 (((-87.58582 41.75151, -…
## # … with 67 more rows, and abbreviated variable names ¹​`Unemployment Rate`,
## #   ²​`2020 Population`

New dataframe: Chicago community areas in ascending order of unemployment rate.

data_unemp_table2 = 
  data_comm %>% 
  arrange((unemp_rate_2020)) %>% 
  rename("Area Number" = "area_numbe",
          "Community Area" = "community",
         "2020 Population" = "pop_2020",
         "la_black" = "lablackhalf",
         "la_asian" = "laasianhalf",
         "la_hopi" = "lanhopihalf",
         "la_multi" = "laomultirhalf",
         "la_hispanic" = "lahisphalf",
         "Unemployment Rate" = "unemp_rate_2020") %>% 
  select("Area Number", "Community Area", "Unemployment Rate", "2020 Population")
print(as_tibble(data_unemp_table2))
## # A tibble: 77 × 5
##    `Area Number` `Community Area` Unemployme…¹ 2020 …²                  geometry
##    <chr>         <chr>                   <dbl>   <dbl>        <MULTIPOLYGON [°]>
##  1 22            LOGAN SQUARE              0.9    2754 (((-87.68284 41.93223, -…
##  2 10            NORWOOD PARK              0.9    6343 (((-87.78002 41.99742, -…
##  3 4             LINCOLN SQUARE            1.3    3934 (((-87.67441 41.9762, -8…
##  4 3             UPTOWN                    1.5    4840 (((-87.64103 41.95483, -…
##  5 17            DUNNING                   1.7    5339 (((-87.77622 41.93875, -…
##  6 9             EDISON PARK               1.7    6166 (((-87.80676 42.00085, -…
##  7 13            NORTH PARK                2.2    1658 (((-87.70693 41.98315, -…
##  8 11            JEFFERSON PARK            2.5    5686 (((-87.75263 41.9682, -8…
##  9 42            WOODLAWN                  3.1    3433 (((-87.57745 41.7861, -8…
## 10 31            LOWER WEST SIDE           3.2    2251 (((-87.63602 41.85773, -…
## # … with 67 more rows, and abbreviated variable names ¹​`Unemployment Rate`,
## #   ²​`2020 Population`

4.5.4 Minorities & Low Access to Food

This is particularly looking at Black or African American population, and low-access is considered beyond 1/2 mile from supermarket.

Data Wrangling Mutate the data to create new minority total and prevalence variables.

data_la = cook_la2
data_la_t = data_la %>%
  group_by(area_numbe) %>%
  mutate(tot_minority = sum(TractBlack, TractAsian, TractNHOPI, TractAIAN, TractOMultir, 
                            TractHispanic),
         tot_minority_la = sum(lablackhalf, laasianhalf, lanhopihalf, laomultirhalf, lahisphalf),
         la_minority_prev = (tot_minority_la/Pop2010) * 100000
         ) %>%
  select(area_numbe, community, la_minority_prev, tot_minority_la, tot_minority, Pop2010, pop_2020)

New dataframe: Chicago Community Areas in descending order of prevalence of minority residents with low food access.

data_la_table1 = 
  data_la_t %>% 
  arrange(desc(la_minority_prev)) %>% 
  rename("Area Number" = "area_numbe",
          "Community Area" = "community",
         "Prevalence Minorities LA" = "la_minority_prev",
         "Minority LA Population 2019" = "tot_minority_la",
          "Minority Population 2010" = "tot_minority",
         "2010 Population" = "Pop2010",
         "2020 Population" = "pop_2020") %>% 
  select("Area Number", "Community Area", "Prevalence Minorities LA", "Minority LA Population 2019", "Minority Population 2010", "2010 Population")
print(as_tibble(data_la_table1))
## # A tibble: 77 × 7
##    Area Numb…¹ Commu…² Preva…³ Minor…⁴ Minor…⁵ 2010 …⁶                  geometry
##    <chr>       <chr>     <dbl>   <dbl>   <dbl>   <dbl>        <MULTIPOLYGON [°]>
##  1 51          SOUTH … 119456.   3862     3879    3233 (((-87.546 41.72279, -87…
##  2 70          ASHBURN 116125.   3980.    4009    3427 (((-87.71278 41.75739, -…
##  3 37          FULLER… 106505.   1277     1277    1199 (((-87.62881 41.80225, -…
##  4 40          WASHIN… 100574.   1576     1578    1567 (((-87.60604 41.78604, -…
##  5 53          WEST P… 100524.   5373     5377    5345 (((-87.61767 41.66172, -…
##  6 54          RIVERD… 100418.   3122     3125    3109 (((-87.60168 41.68621, -…
##  7 73          WASHIN… 100296.   4401     4423    4388 (((-87.63497 41.72886, -…
##  8 43          SOUTH …  98442.   6318     6351    6418 (((-87.54398 41.75517, -…
##  9 42          WOODLA…  97736.   3453     3467    3533 (((-87.57745 41.7861, -8…
## 10 50          PULLMAN  97126.   3539.    3656    3644 (((-87.60157 41.68622, -…
## # … with 67 more rows, and abbreviated variable names ¹​`Area Number`,
## #   ²​`Community Area`, ³​`Prevalence Minorities LA`,
## #   ⁴​`Minority LA Population 2019`, ⁵​`Minority Population 2010`,
## #   ⁶​`2010 Population`

New dataframe: Chicago Community Areas in ascending order of prevalence of minority residents with low food access.

data_la_table2 = 
  data_la_t %>% 
  arrange((la_minority_prev)) %>% 
  rename("Area Number" = "area_numbe",
          "Community Area" = "community",
         "Prevalence Minorities LA" = "la_minority_prev",
         "Minority LA Population 2019" = "tot_minority_la",
          "Minority Population 2010" = "tot_minority",
         "2010 Population" = "Pop2010",
         "2020 Population" = "pop_2020") %>% 
  select("Area Number", "Community Area", "Prevalence Minorities LA", "Minority LA Population 2019", "Minority Population 2010", "2010 Population")
print(as_tibble(data_la_table2))
## # A tibble: 77 × 7
##    Area Numb…¹ Commu…² Preva…³ Minor…⁴ Minor…⁵ 2010 …⁶                  geometry
##    <chr>       <chr>     <dbl>   <dbl>   <dbl>   <dbl>        <MULTIPOLYGON [°]>
##  1 35          DOUGLAS       0       0    3176    3267 (((-87.60938 41.84515, -…
##  2 39          KENWOOD       0       0    4353    5592 (((-87.59231 41.81693, -…
##  3 1           ROGERS…       0       0    4706    5005 (((-87.65456 41.99818, -…
##  4 14          ALBANY…       0       0    5004    6805 (((-87.70454 41.97382, -…
##  5 18          MONTCL…       0       0    7700    7270 (((-87.78942 41.91751, -…
##  6 19          BELMON…       0       0    4107    4079 (((-87.74135 41.91422, -…
##  7 20          HERMOSA       0       0    7804    5427 (((-87.73175 41.93229, -…
##  8 21          AVONDA…       0       0    7655    7453 (((-87.688 41.93611, -87…
##  9 22          LOGAN …       0       0    2091    2877 (((-87.68284 41.93223, -…
## 10 26          WEST G…       0       0    2337    2319 (((-87.72025 41.87008, -…
## # … with 67 more rows, and abbreviated variable names ¹​`Area Number`,
## #   ²​`Community Area`, ³​`Prevalence Minorities LA`,
## #   ⁴​`Minority LA Population 2019`, ⁵​`Minority Population 2010`,
## #   ⁶​`2010 Population`

5 Descriptive Statistics

5.1 Poverty Rate

print(descr(data_comm$PovertyRate))
## 
## ## Basic descriptive statistics
## 
##  var    type label  n NA.prc  mean    sd   se   md trimmed           range  iqr
##   dd numeric    dd 71   7.79 19.62 13.75 1.63 17.5   18.12 68.2 (0.3-68.5) 16.9
##  skew
##  1.26

For the poverty rate variable, there are 71 observations, as 6 community areas do not have data reported for this metric. In these results, the standard deviation is 13.75, meaning the observations are very spread out from the mean, 19.62%. The range of poverty rate among the community areas is from 0.3% to 68.5%. The data is skewed to the right.

5.2 Median Family Income (MFI)

print(descr(data_comm$MedianFamilyIncome))
## 
## ## Basic descriptive statistics
## 
##  var    type label  n NA.prc     mean       sd      se    md  trimmed
##   dd numeric    dd 71   7.79 74429.14 41170.08 4885.99 62389 69846.75
##                  range   iqr skew
##  170719 (17122-187841) 59577 0.88

For the MFI variable, there are 71 observations, as 6 community areas do not have data reported for this metric. In these results, the standard deviation is 41170, meaning the observations are extremely spread out from the mean, $74,429.14. The range of MFI among the community areas is from $17,122 to $187,841. The data is skewed to the right.

5.3 Unemployment Rate

print(descr(data_comm$unemp_rate_2020))
## 
## ## Basic descriptive statistics
## 
##  var    type label  n NA.prc mean   sd   se  md trimmed           range  iqr
##   dd numeric    dd 73   5.19  9.7 7.41 0.87 7.2     8.8 27.3 (0.9-28.2) 10.9
##  skew
##  0.96

For the unemployment rate variable, there are 73 observations, as 4 community areas do not have data reported for this metric. In these results, the standard deviation is 7.41, meaning the observations are slighly more spread out from the mean (9.7%) than a normal distribution. The range of unemployment rate among the community areas is from 0.9%-28.2%. The data is skewed to the right.

5.4 Minorities & Low Access to Food

print(descr(data_la_t$la_minority_prev))
## 
## ## Basic descriptive statistics
## 
##  var    type label  n NA.prc     mean       sd      se       md  trimmed
##   dd numeric    dd 71   7.79 32216.16 38876.42 4613.78 16421.28 27078.04
##                    range      iqr skew
##  119455.61 (0-119455.61) 60477.16 0.96

For the minority low-access to food variable, there are 71 observations, as 6 community areas do not have data reported for this metric. In these results, the standard deviation is 38876, meaning the observations are extremely spread out from the mean, 32,216. The range of prevalence per 100,000 residents of minority low-access to food retailers among the community areas is from 0 to 100,000 residents (the data shows higher than 100k due to inconsistencies in reporting on population metrics from the original data). The data is skewed to the right.

6 Data Visualizations

A preliminary review of the data in the datasets used in the research design is available in the sections below. Maps and tables are used to describe variables of interest in the study: household incomes, property values, employment, and proportion minority residents.

6.1 Poverty Rate

6.1.1 Maps

Map of poverty rate by community area in Chicago The above map visibly demonstrates that higher poverty rates are seen in community areas on the south and west sides of Chicago.

Add grocery stores on the map. The pink dots are open grocery stores in Chicago.

The above map visibly demonstrates that communities with higher poverty rates see less food retailers (the pink dots).

6.1.2 Tables

Community areas in Chicago with the highest poverty rates

knitr::kable(head(st_drop_geometry(data_comm_table[1:5,])), "simple", caption = "Top 5 Poverty Rates in Chicago by Community Area, 2020", align = "llll", format.args = list(big.mark = ","), digits=2)
Top 5 Poverty Rates in Chicago by Community Area, 2020
Area Number Community Area Poverty Rate 2020 Population
27 EAST GARFIELD PARK 68.5 2,149
54 RIVERDALE 64.2 3,195
29 NORTH LAWNDALE 42.5 2,494
51 SOUTH DEERING 42.5 3,033
40 WASHINGTON PARK 41.0 1,274

Community areas in Chicago with the lowest poverty rates

knitr::kable(head(st_drop_geometry(data_comm_table2[1:5,])), "simple", caption = "Lowest 5 Poverty Rates in Chicago by Community Area, 2020", align = "llll", format.args = list(big.mark = ","), digits=2)
Lowest 5 Poverty Rates in Chicago by Community Area, 2020
Area Number Community Area Poverty Rate 2020 Population
72 BEVERLY 0.3 3,357
9 EDISON PARK 2.1 6,166
12 FOREST GLEN 2.5 4,515
5 NORTH CENTER 3.7 2,376
74 MOUNT GREENWOOD 3.8 4,440

6.2 Median Family Income (MFI)

6.2.1 Map

MFI of Chicago Community Areas in 2019 The above map visibly demonstrates that communities with lower MFIs see less food retailers (the pink dots) and are largely found on on Chicago’s south and west sides.

6.2.2 Tables

Lowest 5 Average Median Family Income in Chicago by Community Area, 2020

knitr::kable(head(st_drop_geometry(data_table_mfi[1:5, 1:4])), "simple", caption = "Lowest 5 Average Median Family Income in Chicago by Community Area, 2020", align = "llll", format.args = list(big.mark = ","), digits=2)
Lowest 5 Average Median Family Income in Chicago by Community Area, 2020
Area Number Community Area Median Family Income 2020 Population
54 RIVERDALE 17,122 3,195
27 EAST GARFIELD PARK 19,125 2,149
29 NORTH LAWNDALE 25,188 2,494
35 DOUGLAS 25,230 3,197
51 SOUTH DEERING 27,083 3,033

Top 5 Average Median Family Income in Chicago by Community Area, 2020

knitr::kable(head(st_drop_geometry(data_table_mfi2[1:5, 1:4])), "simple", caption = "Top 5 Average Median Family Income in Chicago by Community Area, 2020", align = "llll", format.args = list(big.mark = ","), digits=2)
Top 5 Average Median Family Income in Chicago by Community Area, 2020
Area Number Community Area Median Family Income 2020 Population
7 LINCOLN PARK 187,841 6,157
72 BEVERLY 168,281 3,357
24 WEST TOWN 165,761 3,123
32 LOOP 155,383 7,916
12 FOREST GLEN 154,141 4,515

6.3 Unemployment Rate

6.3.1 Map

The above map visibly demonstrates that higher unemployment rates are seen in community areas on the south side of Chicago.

6.3.2 Tables

Chicago community areas with the highest unemployment rates.

knitr::kable(head(st_drop_geometry(data_unemp_table[1:5,])), "simple", caption = "Top 5 Unemployment Rates in Chicago by Community Area, 2020", align = "llll", format.args = list(big.mark = ","), digits=2)
Top 5 Unemployment Rates in Chicago by Community Area, 2020
Area Number Community Area Unemployment Rate 2020 Population
37 FULLER PARK 28.2 793
53 WEST PULLMAN 28.0 5,192
54 RIVERDALE 26.9 3,195
67 WEST ENGLEWOOD 26.3 3,584
27 EAST GARFIELD PARK 24.5 2,149

Chicago community areas with the lowest unemployment rates.

knitr::kable(head(st_drop_geometry(data_unemp_table2[1:5,])), "simple", caption = "Lowest 5 Unemployment Rates in Chicago by Community Area, 2020", align = "llll", format.args = list(big.mark = ","), digits=2) 
Lowest 5 Unemployment Rates in Chicago by Community Area, 2020
Area Number Community Area Unemployment Rate 2020 Population
22 LOGAN SQUARE 0.9 2,754
10 NORWOOD PARK 0.9 6,343
4 LINCOLN SQUARE 1.3 3,934
3 UPTOWN 1.5 4,840
17 DUNNING 1.7 5,339

6.4 Minorities & Low Access to Food

This is particularly looking at Black or African American population, and low-access is considered beyond 1/2 mile from supermarket.

6.4.1 Map

View on a map the prevalence of minorities to have low access to food–defined as beyond 1/2 mile from supermarket.

ggplot(data = data_la_t, aes(fill = la_minority_prev)) +
  geom_sf() +
  geom_point(data=grocery_stores_chi, 
             aes(x=Longitude, y=Latitude), colour="Deep Pink", 
             fill="Pink",pch=21, size=1, alpha=I(0.7)) + 
  labs(title = "Chicago Minority Low Access to Food in 2019",
       subtitle = "by City of Chicago Community Area per 100,000 Residents",
       caption = "Data Source: 2020 American Community Survey (ACS) & 2019 USDA Food Atlas",
       fill = "Prevelence per 100k Residents") +
  theme(plot.title = element_text(face = "bold", size = 16),
        plot.subtitle = element_text(face = "italic", size = 14),
        plot.caption = element_text(hjust = 10),
        legend.title = element_text(size = 10, face = "bold", color = "black"),
        legend.text = element_text(size = 8, face = "bold", color = "black")) +
  theme_void() +
  theme(axis.title = element_blank(),
        axis.ticks = element_blank(),
        axis.text = element_blank()) +
  scale_fill_viridis(discrete = FALSE, direction = -1) 

The above map demonstrates that communities with low-access to food retailers for minority residents are largely found on on Chicago’s south side.

6.4.2 Tables

Chicago community areas with the highest prevalence of minority residents with low food access.

knitr::kable(head(st_drop_geometry(data_la_table1[1:5,])), "simple", caption = "Community Areas with Lowest Food Access for Minorities in Chicago, 2019", align = "lllll", format.args = list(big.mark = ","), digits=0)
Community Areas with Lowest Food Access for Minorities in Chicago, 2019
Area Number Community Area Prevalence Minorities LA Minority LA Population 2019 Minority Population 2010 2010 Population
51 SOUTH DEERING 119,456 3,862 3,879 3,233
70 ASHBURN 116,125 3,980 4,009 3,427
37 FULLER PARK 106,505 1,277 1,277 1,199
40 WASHINGTON PARK 100,574 1,576 1,578 1,567
53 WEST PULLMAN 100,524 5,373 5,377 5,345

Chicago community areas with the lowest prevalence of minority residents with low food access.

st_drop_geometry(data_la_table2[1:5,]) %>%
  kable(align = "lllll", 
        caption = "Community Areas with Lowest Food Access for Minorities in Chicago, 2019", 
        format.args = list(big.mark = ","),
        digits = 0)
Community Areas with Lowest Food Access for Minorities in Chicago, 2019
Area Number Community Area Prevalence Minorities LA Minority LA Population 2019 Minority Population 2010 2010 Population
35 DOUGLAS 0 0 3,176 3,267
39 KENWOOD 0 0 4,353 5,592
1 ROGERS PARK 0 0 4,706 5,005
14 ALBANY PARK 0 0 5,004 6,805
18 MONTCLARE 0 0 7,700 7,270

7 Data Analysis

For this study, we would like to look for the impact of various factors on access to food at the community level (geography level) rather than the individual user level. Since this is a small study, using only a sample of the population of 77 community areas in the city of Chicago, we would like to use propensity score matching to select the matched pairs.

7.1 Matched Pairs

Using 2020 ACS data, each community area was matched based on the following data: total population, minority population, median family income, poverty rate, and employment status. The measure of similarity (aka propensity score matching) was calculated through a linear regression to create matched pairs of the 77 community areas of Chicago, as appropriate. Specifically, the linear regression looked at the effect of minority status, as opposed to being white, on access to food supply–defined as beyond 1/2 mile from supermarket. Because minority residents, on average, are different from white residents, we will use propensity score matching to get more credible causal estimates of access to food supply.

To examine the effect of being a minority (“Treated” = 1) versus white (“Control” = 0) on access to food supply using matching we will go through the following steps: 1. Estimate the propensity score. 2. Examine the region of common support. 3. Choose and execute a matching algorithm. 4. Examine covariate balance after matching. 5. Estimate treatment effects.

7.1.1 Data Wrangling

data_cov <- c("PovertyRate", "MedianFamilyIncome", "LILATracts_halfAnd10", "unemp_rate_2020")
data_la3 = data_la

data_la3$MinTract2 = ifelse(data_la3$PerWhite<=0.50, "1", "0")
data_la3$MinTract2[is.na(data_la3$MinTract2)] <- 0
class(data_la3$MinTract2)
data_la3$MinTract2 = as.numeric(data_la3$MinTract2)
class(data_la3$MinTract2)

Look at if majority minority residents in a community area has an impact on other variables of interest.

st_drop_geometry(data_la3) %>%
  group_by(MinTract2) %>%
  select(one_of(data_cov)) %>%
  summarise_all(funs(mean(., na.rm = T)))
## # A tibble: 2 × 5
##   MinTract2 PovertyRate MedianFamilyIncome LILATracts_halfAnd10 unemp_rate_2020
##       <dbl>       <dbl>              <dbl>                <dbl>           <dbl>
## 1         0        10.3            104297.                0.121            5.62
## 2         1        27.7             48491.                0.553           13.3

In the resulting table, if the tract is designated a minority track (by a 1), residents are likely to experience 28% poverty rate, MFI of $48,491, and an unemployment rate of 13%.

7.1.2 Propensity Score Estimation

We estimate the propensity score by running a logit model (probit also works) where the outcome variable is a binary variable indicating treatment status.

fd_ps <- glm(MinTract2 ~ PovertyRate + MedianFamilyIncome + unemp_rate_2020 + lapophalf + LILATracts_halfAnd10, family = binomial(), data = st_drop_geometry(data_la3))
print(summary(fd_ps))
## 
## Call:
## glm(formula = MinTract2 ~ PovertyRate + MedianFamilyIncome + 
##     unemp_rate_2020 + lapophalf + LILATracts_halfAnd10, family = binomial(), 
##     data = st_drop_geometry(data_la3))
## 
## Deviance Residuals: 
##      Min        1Q    Median        3Q       Max  
## -2.19789  -0.42994   0.05859   0.42709   2.53038  
## 
## Coefficients:
##                        Estimate Std. Error z value Pr(>|z|)  
## (Intercept)          -7.499e-01  2.261e+00  -0.332   0.7402  
## PovertyRate           1.169e-01  6.647e-02   1.759   0.0786 .
## MedianFamilyIncome   -3.306e-05  1.987e-05  -1.664   0.0961 .
## unemp_rate_2020       1.686e-01  9.004e-02   1.873   0.0611 .
## lapophalf            -6.979e-05  3.224e-04  -0.216   0.8286  
## LILATracts_halfAnd10 -9.362e-02  1.111e+00  -0.084   0.9328  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 98.074  on 70  degrees of freedom
## Residual deviance: 42.865  on 65  degrees of freedom
##   (6 observations deleted due to missingness)
## AIC: 54.865
## 
## Number of Fisher Scoring iterations: 6

The regression above examines the effect of being a minority (“Treated” = 1) versus white (“Control” = 0) on access to food supply, considering poverty rate, MFI, unemployment rate, and distance from a food retailer.

prs_df <- data.frame(pr_score = predict(fd_ps, type = "response"),
                     minority_tract = fd_ps$model$MinTract2)
head(prs_df)
##     pr_score minority_tract
## 1 0.95381780              1
## 2 0.99263674              1
## 3 0.97771585              1
## 5 0.13917290              1
## 6 0.04277905              0
## 7 0.99828486              1

7.1.3 Execute a Matching Algorithm

data_fd_nomiss = data_la3 %>%
  na.omit()

mod_match <- matchit(MinTract2 ~ PovertyRate + MedianFamilyIncome + unemp_rate_2020 + lapophalf + LILATracts_halfAnd10 + PerWhite, method = "nearest", data = data_fd_nomiss)

7.1.4 View the matches in a dataframe

dta_m <- match.data(mod_match)
dim(dta_m)
## [1] 66 61
print(as_tibble(dta_m))
## # A tibble: 66 × 61
##     area area_…¹ area_…² comarea comar…³ commu…⁴ perim…⁵ shape…⁶ shape…⁷ censu…⁸
##    <dbl> <chr>   <chr>     <dbl>   <dbl> <chr>     <dbl>   <dbl>   <dbl> <chr>  
##  1     0 35      35            0       0 DOUGLAS       0  4.60e7  31027. 170313…
##  2     0 36      36            0       0 OAKLAND       0  1.69e7  19566. 170318…
##  3     0 37      37            0       0 FULLER…       0  1.99e7  25339. 170318…
##  4     0 39      39            0       0 KENWOOD       0  2.91e7  23325. 170313…
##  5     0 4       4             0       0 LINCOL…       0  7.14e7  36625. 170310…
##  6     0 40      40            0       0 WASHIN…       0  4.24e7  28175. 170314…
##  7     0 41      41            0       0 HYDE P…       0  4.51e7  29747. 170314…
##  8     0 42      42            0       0 WOODLA…       0  5.78e7  46937. 170318…
##  9     0 11      11            0       0 JEFFER…       0  6.49e7  44012. 170311…
## 10     0 12      12            0       0 FOREST…       0  8.91e7  74494. 170311…
## # … with 56 more rows, 51 more variables: tract.x <chr>, county.x <chr>,
## #   state.x <chr>, pop_2020 <dbl>, moe_2020 <dbl>, Pop2010 <dbl>,
## #   OHU2010 <dbl>, GroupQuartersFlag <dbl>, NUMGQTRS <dbl>, PCTGQTRS <dbl>,
## #   PovertyRate <dbl>, MedianFamilyIncome <dbl>, LILATracts_halfAnd10 <dbl>,
## #   lapophalf <dbl>, lalowihalf <dbl>, lakidshalf <dbl>, laseniorshalf <dbl>,
## #   lawhitehalf <dbl>, lablackhalf <dbl>, laasianhalf <dbl>, lanhopihalf <dbl>,
## #   laaianhalf <dbl>, laomultirhalf <dbl>, lahisphalf <dbl>, …

This new dataset has matched 33 community areas into pairs (n = 66). The pairs are indicated in the new column “subclass”.

Arrange data by matched pairs

dta_m_t = 
  dta_m %>%
  select("area_numbe", "community", "subclass", "MinTract2", "LILATracts_halfAnd10", "PovertyRate",          "MedianFamilyIncome", "unemp_rate_2020") %>%
  mutate("min_tract" = ifelse(dta_m$MinTract2==0, "No", "Yes"),
         "lila_tract" = ifelse(dta_m$LILATracts_halfAnd10==0, "No", "Yes")) %>%
  select("subclass", "community", "min_tract", "lila_tract", "MedianFamilyIncome", 
         "PovertyRate", "unemp_rate_2020") %>%
  arrange(subclass)
print(as_tibble(dta_m_t))
## # A tibble: 66 × 8
##    subclass community      min_tract lila_tract MedianFamilyIn…¹ Pover…² unemp…³
##    <fct>    <chr>          <chr>     <chr>                 <dbl>   <dbl>   <dbl>
##  1 1        DOUGLAS        Yes       No                    25230   29.8      6.7
##  2 1        ARCHER HEIGHTS No        No                    72973   22.7      3.9
##  3 2        OAKLAND        Yes       No                    47163   29.7     22.4
##  4 2        MONTCLARE      No        No                    58555    8.74     4.2
##  5 3        HYDE PARK      No        No                   100990    9.35    13.8
##  6 3        HERMOSA        Yes       No                    54804   21.4      3.3
##  7 4        JEFFERSON PARK No        No                   100682   12.1      2.5
##  8 4        HUMBOLDT PARK  Yes       Yes                   34861   27.2     10  
##  9 5        FOREST GLEN    No        No                   154141    2.54     7.7
## 10 5        AUSTIN         Yes       No                    35556   23.9      6.8
## # … with 56 more rows, 1 more variable: geometry <MULTIPOLYGON [°]>, and
## #   abbreviated variable names ¹​MedianFamilyIncome, ²​PovertyRate,
## #   ³​unemp_rate_2020

7.2 Table of Matched Pairs

library(kableExtra)
st_drop_geometry(dta_m_t) %>%
  arrange(subclass) %>%
  kable(align = "cllllll", 
        col.names = c("Matched Pair #", "Community Area", "Minority Tract", 
                "Low Income Tract", "MFI", "Poverty Rate", "Unemployment Rate"),
        caption = "Matched Pairs of Community Areas in Chicago", 
        format.args = list(big.mark = ","),
        digits = 0) %>%
  column_spec(1, bold = T) %>%
  row_spec(0, bold = T) %>%
  row_spec(3, background = "#edede9") %>%
  row_spec(4, background = "#edede9") %>%
  row_spec(7, background = "#edede9") %>%
  row_spec(8, background = "#edede9") %>%
  row_spec(11, background = "#edede9") %>%
  row_spec(12, background = "#edede9") %>%
  row_spec(15, background = "#edede9") %>%
  row_spec(16, background = "#edede9") %>%
  row_spec(19, background = "#edede9") %>%
  row_spec(20, background = "#edede9") %>%
  row_spec(23, background = "#edede9") %>%
  row_spec(24, background = "#edede9") %>%
  row_spec(27, background = "#edede9") %>%
  row_spec(28, background = "#edede9") %>%
  row_spec(31, background = "#edede9") %>%
  row_spec(32, background = "#edede9") %>%
  row_spec(35, background = "#edede9") %>%
  row_spec(36, background = "#edede9") %>%
  row_spec(39, background = "#edede9") %>%
  row_spec(40, background = "#edede9") %>%
  row_spec(43, background = "#edede9") %>%
  row_spec(44, background = "#edede9") %>%
  row_spec(47, background = "#edede9") %>%
  row_spec(48, background = "#edede9") %>%
  row_spec(51, background = "#edede9") %>%
  row_spec(52, background = "#edede9") %>%
  row_spec(55, background = "#edede9") %>%
  row_spec(56, background = "#edede9") %>%
  row_spec(59, background = "#edede9") %>%
  row_spec(60, background = "#edede9") %>%
  row_spec(63, background = "#edede9") %>%
  row_spec(64, background = "#edede9") %>%
  kable_classic(font_size = 12,
                full_width = F,
                html_font = "Cambria")
Matched Pairs of Community Areas in Chicago
Matched Pair # Community Area Minority Tract Low Income Tract MFI Poverty Rate Unemployment Rate
1 DOUGLAS Yes No 25,230 30 7
1 ARCHER HEIGHTS No No 72,973 23 4
2 OAKLAND Yes No 47,163 30 22
2 MONTCLARE No No 58,555 9 4
3 HYDE PARK No No 100,990 9 14
3 HERMOSA Yes No 54,804 21 3
4 JEFFERSON PARK No No 100,682 12 2
4 HUMBOLDT PARK Yes Yes 34,861 27 10
5 FOREST GLEN No No 154,141 3 8
5 AUSTIN Yes No 35,556 24 7
6 NORTH PARK No No 106,607 5 2
6 WEST GARFIELD PARK Yes No 36,780 29 16
7 ALBANY PARK No No 96,319 6 5
7 EAST GARFIELD PARK Yes Yes 19,125 69 24
8 PORTAGE PARK No No 92,218 13 7
8 NORTH LAWNDALE Yes No 25,188 43 8
9 FULLER PARK Yes Yes 42,396 12 28
9 NEAR WEST SIDE No No 127,500 18 13
10 IRVING PARK No No 107,407 7 8
10 ARMOUR SQUARE Yes No 34,613 31 4
11 DUNNING No No 94,907 6 2
11 SOUTH SHORE Yes Yes 31,345 40 12
12 WEST RIDGE No No 71,300 14 3
12 CHATHAM Yes No 49,659 27 18
13 LOGAN SQUARE No No 104,583 6 1
13 AVALON PARK Yes No 74,340 18 18
14 KENWOOD Yes No 114,474 18 4
14 BELMONT CRAGIN No No 59,960 12 5
15 WEST TOWN No No 165,761 6 8
15 SOUTH CHICAGO Yes Yes 32,500 38 22
16 UPTOWN No No 132,694 11 2
16 BURNSIDE Yes Yes 49,259 18 16
17 SOUTH LAWNDALE No Yes 40,132 31 6
17 MCKINLEY PARK Yes No 55,357 22 6
18 NORWOOD PARK No No 127,876 4 1
18 CALUMET HEIGHTS Yes Yes 55,087 12 5
19 LOOP No No 155,383 11 4
19 ROSELAND Yes No 68,400 20 18
20 LAKE VIEW No No 88,155 9 6
20 PULLMAN Yes Yes 66,324 11 8
21 NORTH CENTER No No 143,000 4 4
21 SOUTH DEERING Yes Yes 27,083 43 8
22 EAST SIDE Yes Yes 46,620 14 8
22 HEGEWISCH No Yes 66,318 25 12
23 WEST PULLMAN Yes Yes 45,952 29 28
23 BRIDGEPORT No No 87,656 15 5
24 RIVERDALE Yes Yes 17,122 64 27
24 NEW CITY No Yes 59,510 12 4
25 WEST ELSDON No Yes 58,297 12 10
25 CHICAGO LAWN Yes Yes 34,226 36 17
26 WASHINGTON PARK Yes Yes 35,313 41 22
26 AVONDALE No No 62,389 10 5
27 WEST LAWN No No 71,128 12 4
27 WEST ENGLEWOOD Yes Yes 48,100 21 26
28 ENGLEWOOD Yes Yes 34,602 40 21
28 LINCOLN PARK No No 187,841 5 4
29 GREATER GRAND CROSSING Yes No 42,279 26 16
29 BEVERLY No No 168,281 0 14
30 AUBURN GRESHAM Yes Yes 66,159 17 15
30 MOUNT GREENWOOD No No 107,365 4 4
31 WASHINGTON HEIGHTS Yes Yes 62,164 20 18
31 EDGEWATER No No 107,411 14 4
32 MORGAN PARK Yes Yes 66,359 24 16
32 EDISON PARK No No 151,204 2 2
33 LINCOLN SQUARE No No 113,250 11 1
33 WOODLAWN Yes Yes 44,023 28 3

7.3 Matched Pairs on Map

ggplot(data = dta_m_t, aes(fill = subclass)) +
  geom_sf(data = chi_shp, fill = "grey") + 
  geom_sf() +
  geom_point(data=grocery_stores_chi, 
             aes(x=Longitude, y=Latitude), colour="Deep Pink", 
             fill="Pink",pch=21, size=1, alpha=I(0.7)) + 
  labs(title = "Chicago Community Area Matched Pairs",
       subtitle = "on minority access to sources of nutrient-dense food",
       caption = "Data Source: 2020 American Community Survey (ACS) & 2019 USDA Food Atlas",
       fill = "Matched Pair #", size = 16) +
  theme(plot.title = element_text(face = "bold", size = 16),
        plot.subtitle = element_text(face = "italic", size = 14),
        plot.caption = element_text(hjust = 10),
        legend.title = element_text(size = 10, face = "bold", color = "black"),
        legend.text = element_text(size = 8, face = "bold", color = "black")) +
  geom_sf_label(data = dta_m_t, aes(geometry = geometry, label = community), label.size = NA, size = 1, show.legend = FALSE) +
  theme_void() +
  theme(axis.title = element_blank(),
        axis.ticks = element_blank(),
        axis.text = element_blank()) 

8 Results

The resulting matching algorithm of the proximity analysis selected 66 total community areas to use in 33 matched pairs. All 33 matched pairs will be used in the study design to describe access to sources of nutrient-dense food.

The researcher’s contextual knowledge of Chicago can be helpful to conduct analyses and suggesting future research areas to consider. Based on the results of the preliminary matching criteria, it is interesting that the median household income of some neighborhoods is misaligned with poverty rates. Contextual knowledge of gentrification and other neighborhood transition factors should be incorporated to explain such contradictions in the data.

9 References

  • Allard, S. W., Wathen, M. V., Shaefer, H. L., & Danziger, S. K. (2017). Neighborhood food infrastructure and food security in metropolitan Detroit. Journal of Consumer Affairs, 51(3), 566-597.
  • Block, D., & Kouba, J. (2006). A comparison of the availability and affordability of a market basket in two communities in the Chicago area. Public health nutrition, 9(7), 837-845.
  • Cummins, S., Flint, E., & Matthews, S. A. (2014). New neighborhood grocery store increased awareness of food access but did not alter dietary habits or obesity. Health affairs, 33(2), 283-291.
  • Danziger, S. K., Allard, S. W., Wathen, M. V., Michigan, R. R., & Cohen, A. (2014). Food Insecurity in the Detroit Metropolitan Area Following the Great Recession. Univ Mich Natl Poverty Cent Policy Brief.
  • Hatchett, L., Brown, L., Hopkins, J., Larsen, K., & Fournier, E. (2015). “Something good can grow here”: Chicago urban agriculture food projects. Journal of prevention & intervention in the community, 43(2), 135-147.
  • Hunt, B. R., Benjamins, M. R., Khan, S., & Hirschtick, J. L. (2019). Predictors of food insecurity in selected Chicago community areas. Journal of nutrition education and behavior, 51(3), 287-299.
  • Kersten, M., Carrazco, L., Rosing, H., Swenski, T., Russell, D., Idrovo, J., & Lofton, S. (2022). Evaluation of the Grow Your Groceries Home Gardening Program in Chicago, Illinois. Journal of Community Health, 1-10.
  • Klijn, E. H., & Koppenjan, J. (2014). Complexity in governance network theory. Complexity, Governance & Networks, 1(1), 61-70.
  • Kolak, M., Bradley, M., Block, D. R., Pool, L., Garg, G., Toman, C. K., … & Wolf, M. (2018). Urban foodscape trends: Disparities in healthy food access in Chicago, 2007–2014. Health & place, 52, 231-239.
  • Leib, E. M. (2013). All (food) politics is local: Increasing food access through local government action. Harv. L. & Pol’y Rev., 7, 321.
  • Murthy, V. H. (2016). Food insecurity: a public health issue. Public Health Reports (1974-), 131(5), 655-657.
  • Taylor, D. E., & Ard, K. J. (2015). Food availability and the food desert frame in Detroit: An overview of the city’s food system. Environmental Practice, 17(2), 102-133.
  • White, M. M. (2011). Sisters of the soil: Urban gardening as resistance in Detroit. Race/ethnicity: Multidisciplinary global contexts, 5(1), 13-28.