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.
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.
What community-level factors are associated with geographic access to nutrient dense food for low-income residents of Chicago?
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.
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.
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).
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).
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).
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).
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.
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.
## 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)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:
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.
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.
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.
2020 Grocery Stores Status in Chicago A list of grocery stores in Chicago and last known status (open or closed).
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
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)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)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...
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...
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>, …
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`
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
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] <- NANew 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`
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`
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.
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.
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.
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.
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.
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).
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)| 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)| 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 |
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.
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)| 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)| 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 |
The above map visibly demonstrates that higher unemployment rates are
seen in community areas on the south side of Chicago.
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)| 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) | 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 |
This is particularly looking at Black or African American population, and low-access is considered beyond 1/2 mile from supermarket.
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.
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)| 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)| 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 |
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.
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.
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%.
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
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)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
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 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 |
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()) 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.