Story 6: “What Is The State of Food Security and Nutrition in the US?”

Food insecurity affects millions of Americans, including children, with severe long-term impacts. This analysis examines food insecurity across states, its link to poverty, and its effects on children’s futures. Data for this analysis was sourced from poverty data provided by the U.S. Census Bureau, food insecurity data from Feeding America, and insights from the U.S. Department of Agriculture’s Economic Research Service. By presenting clear data and visualizations, it aims to inform policymakers and drive action to address this critical issue.

Overall Food Insecurity Rate by State (2022)

Food security varies significantly between states, highlighting notable disparities. Overall Food Insecurity was much higher in the southern states, especially in Arkansas, and Mississippi.

library(dplyr)
library(ggplot2)
library(sf)
library(tigris)
library(tidyverse)

df <- read.csv("https://raw.githubusercontent.com/suswong/DATA-608/refs/heads/main/Copy%20of%20MMG2024_2019-2022_Data_ToShare_v3.csv", header = TRUE, stringsAsFactors = FALSE)

poverty <- read.csv("https://raw.githubusercontent.com/suswong/DATA-608/refs/heads/main/poverty.csv")

colnames(df) <- gsub("\\.", " ", colnames(df))
data_2022o <- df %>%
  filter(Year == 2022) %>%
  mutate(Overall_Food_Insecurity_Rate = as.numeric(gsub("%", "", `Overall Food Insecurity Rate`))) %>%
  select(State, `State Name`, Overall_Food_Insecurity_Rate)

us_states <- tigris::states(cb = TRUE, year = 2022) %>%
  filter(STUSPS != "PR" & STUSPS != "HI" & STUSPS != "AK")

map_data <- us_states %>%
  left_join(data_2022o, by = c("STUSPS" = "State"))

ggplot(data = map_data) +
  geom_sf(aes(fill = Overall_Food_Insecurity_Rate), color = "white", size = 0.2) +
  scale_fill_gradient(low = "#FFCCCC", high = "#990000", na.value = "grey90", 
                      name = "Overall Food Insecurity Rate (%)") +
  labs(title = "Overall Food Insecurity Rate by State (2022)") +
  theme_minimal() +
  coord_sf(xlim = c(-125, -65), ylim = c(25, 50), expand = FALSE) +
  theme(
    axis.text = element_blank(),
    axis.ticks = element_blank(),
    panel.grid = element_blank()
  )

Child Food Insecurity Rate by State (2022)

data_2022 <- df %>%
  filter(Year == 2022) %>%
  mutate(Child_Food_Insecurity_Rate = as.numeric(gsub("%", "", `Child Food Insecurity Rate`))) %>%
  select(State, Child_Food_Insecurity_Rate)

us_states <- tigris::states(cb = TRUE, year = 2022) %>%
  filter(STUSPS != "PR" & STUSPS != "HI" & STUSPS != "AK")

map_data <- us_states %>%
  left_join(data_2022, by = c("STUSPS" = "State"))

ggplot(data = map_data) +
  geom_sf(aes(fill = Child_Food_Insecurity_Rate), color = "white", size = 0.2) +
  scale_fill_gradient(low = "#FFCCCC", high = "#990000", na.value = "grey90", 
                      name = "Child Food Insecurity Rate (%)") +
  labs(title = "Child Food Insecurity Rate by State (2022)") +
  theme_minimal() +
  coord_sf(xlim = c(-125, -65), ylim = c(25, 50), expand = FALSE) +
  theme(
    axis.text = element_blank(),
    axis.ticks = element_blank(),
    panel.grid = element_blank()
  )

Older Adult Food Insecurity Rate by State (2022)

data_2022 <- df %>%
  filter(Year == 2022) %>%
  mutate(Older_Adult_Food_Insecurity_Rate = as.numeric(gsub("%", "", `Older Adult Food Insecurity Rate`))) %>%
  select(State, Older_Adult_Food_Insecurity_Rate)

us_states <- tigris::states(cb = TRUE, year = 2022) %>%
  filter(STUSPS != "PR" & STUSPS != "HI" & STUSPS != "AK")

map_data <- us_states %>%
  left_join(data_2022, by = c("STUSPS" = "State"))

ggplot(data = map_data) +
  geom_sf(aes(fill = Older_Adult_Food_Insecurity_Rate), color = "white", size = 0.2) +
  scale_fill_gradient(low = "#FFCCCC", high = "#990000", na.value = "grey90", 
                      name = "Older Adult Food Insecurity Rate (%)") +
  labs(title = "Older Adult Food Insecurity Rate by State (2022)") +
  theme_minimal() +
  coord_sf(xlim = c(-125, -65), ylim = c(25, 50), expand = FALSE) +
  theme(
    axis.text = element_blank(),
    axis.ticks = element_blank(),
    panel.grid = element_blank()
  )

Proverty Rate by State (2022)

merged_data <- left_join(data_2022o, poverty, by = c("State Name" = "state"))
map_data <- us_states %>%
  left_join(merged_data, by = c("STUSPS" = "State"))

# Plot the heatmap
ggplot(data = map_data) +
  geom_sf(aes(fill = povertyPercentage), color = "white", size = 0.2) +  # Map states and fill based on poverty rate
  scale_fill_gradient(low = "white", high = "red", na.value = "grey90", name = "Poverty Rate (%)") +  # Red color scale
  labs(
    title = "Poverty Rates by State (2022)") +
  theme_minimal() +
  coord_sf(xlim = c(-125, -65), ylim = c(25, 50), expand = FALSE) +  # Adjust for U.S. map
  theme(
    axis.text = element_blank(),  
    axis.ticks = element_blank(),
    panel.grid = element_blank(),
    plot.title = element_text(size = 16, face = "bold"),
    plot.subtitle = element_text(size = 14)
  )

Correlation between Food Security and Poverty

ggplot(merged_data, aes(x = povertyPercentage, y = Overall_Food_Insecurity_Rate)) +
  geom_point(color = "red", size = 3) +  # Scatter plot with red points
  geom_smooth(method = "lm", color = "blue", linetype = "dashed") +  # Add a regression line
  labs(
    title = "Correlation between Food Insecurity and Poverty Rates (2022)",
    x = "Poverty Rate",
    y = "Overall Food Insecurity Rate (%)"
  ) +
  theme_minimal() +
  theme(
    axis.text = element_text(size = 12),
    axis.title = element_text(size = 14),
    plot.title = element_text(size = 16, face = "bold"),
    plot.caption = element_text(size = 10)
  )