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.
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()
)
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()
)
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()
)
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)
)
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)
)
Food insecurity rate has been increasing in recent years. Household with children has a higher food insecurity percentage than those with no child.
household <- read.csv("https://raw.githubusercontent.com/suswong/DATA-608/refs/heads/main/foodsecurity_all_households_2023.csv")
trend_data <- household %>%
filter(Category == "Household composition")
trend_data <- trend_data %>%
filter(is.na(`Sub.subcategory`) | `Sub.subcategory` == "") %>%
select(Year, Subcategory, `Food.insecure.percent`) %>%
filter(!is.na(`Food.insecure.percent`))
ggplot(trend_data, aes(x = Year, y = `Food.insecure.percent`, color = Subcategory, group = Subcategory)) +
geom_line() +
geom_point()+
labs(title = "Food insecurity is consistently higher in households with children.",
x = "Year",
y = "Food Insecure Percent (%)") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) # Rotate x-axis labels for readability
## Food Insecurity Trends by Gender
Food insecurity is consistently higher in single-parent households led by women
trend_data <- household %>%
filter(Sub.subcategory == "Female head, no spouse"|Sub.subcategory == "Male head, no spouse") %>%
select(Year, Sub.subcategory, `Food.insecure.percent`) %>%
filter(!is.na(`Food.insecure.percent`))
ggplot(trend_data, aes(x = Year, y = `Food.insecure.percent`, color = Sub.subcategory, group = Sub.subcategory)) +
geom_line() +
geom_point()+
labs(title = "Food insecurity is consistently higher in single-parent households led by women",
x = "Year",
y = "Food Insecure Percent (%)") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) # Rotate x-axis labels for readability
Food insecurity is consistently higher in Black and Hispanic households.
trend_data <- household %>%
filter(Category == "Race/ethnicity of households") %>%
select(Year, Subcategory, `Food.insecure.percent`) %>%
filter(!is.na(`Food.insecure.percent`))
ggplot(trend_data, aes(x = Year, y = `Food.insecure.percent`, color = Subcategory, group = Subcategory)) +
geom_line() +
geom_point()+
labs(title = "Food insecurity is consistently higher in Black and hispanic households",
x = "Year",
y = "Food Insecure Percent (%)") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) # Rotate x-axis labels for readability