Food Security Matters for Education

Author

Manuela Parra Echeverri

Published

February 11, 2025

Food Security Matters for Education

For a long time, I have been interested in understanding how students access the school system, the conditions under which they learn, and how their backgrounds and daily experiences outside of school shape their overall learning journeys. I was a teacher for 2 years in La Guajira, Colombia, and often saw students arriving at school without having had a meal and relying on the school meal as their source of nourishment.

This is why I was interested to see how food insecurity impacts academic performance. In the PISA study (OECD 2022), food insecurity was measured by asking students: In the past 30 days, how often did you not eat because there was not enough money to buy food? While these are self-reported responses and may have limitations, they can still provide meaningful insights.

I focused on analyzing data from six countries, selected based on the 2022 Global Food Security Index, which scores countries on food affordability and availability. Three of these countries (Finland, Ireland, and France) had high food security scores above 80 points, while the other three (Philippines, Paraguay, and Uzbekistan) had lower scores below 60 points.

library(arrow)
library(tidyverse)
PISA_2022 <- read_parquet("/Users/k1765032/Library/CloudStorage/GoogleDrive-richardandrewbrock@gmail.com/.shortcut-targets-by-id/1c3CkaEBOICzepArDfjQUP34W2BYhFjM4/PISR/Data/PISA/2022/PISA_student_2022_subset.parquet")


PISA_2022 <- PISA_2022 %>%
  #Average reading, math and science scores for each student
  mutate(Average_Score = rowMeans(select(., PV1MATH, PV1SCIE, PV1READ), na.rm = TRUE))
 
#Main plot data
 
plot_data <- PISA_2022 %>%
  select(Country = CNT, Food_Insecurity = ST258Q01JA, Average_Score) %>% #Renaming columns
  filter(Country %in% c("Finland", "Ireland", "France", "Uzbekistan", "Paraguay", "Philippines")) %>%
  #Changing x axis labels
  mutate(Food_Insecurity = case_when(
    Food_Insecurity == "Never or almost never" ~ "Never/rarely",
    Food_Insecurity == "About once a week" ~ "≈1/week",
    Food_Insecurity == "2 to 3 times a week" ~ "2-3  xWeek",
    Food_Insecurity == "4 to 5 times a week" ~ "4-5  xWeek",
    Food_Insecurity == "Every day or almost every day" ~ "Always/≈always",
    TRUE ~ Food_Insecurity  # Keep other values unchanged
  ))%>%
  na.omit()
 
# Calculate percentage counts
perc_count <- plot_data %>%
  filter(!is.na(Food_Insecurity)) %>%  # Exclude NA in food insecurity question
  group_by(Country, Food_Insecurity) %>%
  summarise(Count = n(), .groups = 'drop') %>%
  left_join(
    plot_data %>%
      filter(!is.na(Food_Insecurity)) %>%
      group_by(Country) %>%
      summarise(Total_respondents = n(), .groups = 'drop'),
    by = "Country"
  ) %>%
  #Calculate percentage of students en each level of food insecurity FOR EACH COUNTRY (just considering those who responded the question on food insecurity!)
  mutate(percent = Count / Total_respondents * 100) %>%
  replace_na(list(percent = 0))
 
#check how many respondents in total and per level, per country
print(perc_count, n = 50)
# A tibble: 30 × 5
   Country     Food_Insecurity Count Total_respondents percent
   <fct>       <chr>           <int>             <int>   <dbl>
 1 Finland     2-3  xWeek         84              9923   0.847
 2 Finland     4-5  xWeek         18              9923   0.181
 3 Finland     Always/≈always     55              9923   0.554
 4 Finland     Never/rarely     9592              9923  96.7  
 5 Finland     ≈1/week           174              9923   1.75 
 6 France      2-3  xWeek         85              6480   1.31 
 7 France      4-5  xWeek         42              6480   0.648
 8 France      Always/≈always    313              6480   4.83 
 9 France      Never/rarely     5825              6480  89.9  
10 France      ≈1/week           215              6480   3.32 
11 Ireland     2-3  xWeek         40              5518   0.725
12 Ireland     4-5  xWeek          7              5518   0.127
13 Ireland     Always/≈always    204              5518   3.70 
14 Ireland     Never/rarely     5143              5518  93.2  
15 Ireland     ≈1/week           124              5518   2.25 
16 Philippines 2-3  xWeek        623              7096   8.78 
17 Philippines 4-5  xWeek        232              7096   3.27 
18 Philippines Always/≈always    850              7096  12.0  
19 Philippines Never/rarely     4350              7096  61.3  
20 Philippines ≈1/week          1041              7096  14.7  
21 Paraguay    2-3  xWeek        123              4987   2.47 
22 Paraguay    4-5  xWeek         36              4987   0.722
23 Paraguay    Always/≈always     89              4987   1.78 
24 Paraguay    Never/rarely     4397              4987  88.2  
25 Paraguay    ≈1/week           342              4987   6.86 
26 Uzbekistan  2-3  xWeek        339              7053   4.81 
27 Uzbekistan  4-5  xWeek        142              7053   2.01 
28 Uzbekistan  Always/≈always    846              7053  12.0  
29 Uzbekistan  Never/rarely     5128              7053  72.7  
30 Uzbekistan  ≈1/week           598              7053   8.48 
#Reorder the plots per country according to Food Security Level
plot_data$Country <- factor(plot_data$Country, levels = c("Finland", "Ireland", "France", "Philippines", "Paraguay","Uzbekistan"))
 
#Reorder the levels of "Food_Insecurity", so that they are organized from higher level of food security to lower levels of food security
plot_data$Food_Insecurity <- factor(plot_data$Food_Insecurity, levels = c("Never/rarely", "≈1/week", "2-3  xWeek", "4-5  xWeek", "Always/≈always"))
# Plot with percentage labels and gradient fill
ggplot(plot_data, aes(x = Food_Insecurity, y = Average_Score, fill = Food_Insecurity)) +
  geom_violin() +
  theme_minimal() +
  labs(
    title = "Food Insecurity and Academic Performance by Country", 
    x = "Food Insecurity Level", 
    y = "Average Academic Score"
  ) +
  facet_wrap(~Country, scales = "free") +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust = 1)) +

  #Apply color gradient form yellow to red for "Food Insecurity"
  scale_fill_manual(values = c("Never/rarely" = "lightgoldenrod", 
                               "≈1/week" = "sandybrown", 
                               "2-3  xWeek" = "salmon2", 
                               "4-5  xWeek" = "orangered", 
                               "Always/≈always" = "orangered4")) +

  #Add percentage labels above each violin plot
  geom_text(
    data = perc_count, 
    size = 2,
    aes(x = Food_Insecurity, y = max(plot_data$Average_Score, na.rm = TRUE) + 5, 
        label = paste0(round(percent, 1), "%")), 
    inherit.aes = FALSE,
    vjust = 0
  ) +
  #Set y-axis limits
  lims(y = c(200, 900))
Warning: Removed 72 rows containing non-finite outside the scale range
(`stat_ydensity()`).

Across all countries, students who reported never skipping meals generally had higher academic scores. For instance, in Finland, there is a clear decline in scores as food insecurity increases. However, in countries with lower food security, the relationship between food insecurity and academic performance is less straightforward, although we do see lower scores as food insecurity gets worse. Moreover, students in Finland, Ireland, and France who reported never skipping meals often had higher scores than students who reported never skipping meals in the Philippines, Paraguay and Uzbekistan. If we zoom in on the students who answered never or almost never to the food insecurity question we see that in the first set of countries, the majority of these students had scores clustered around 500 points. By contrast, in the second set, many students in this category had scores below 400 points. Additionally, it is important to highlight that while nearly 97% of Finnish students reported never or rarely skipping meals, only 62% of students in the Philippines said the same.

The larger proportion of students experiencing food insecurity in countries like the Philippines, Paraguay, and Uzbekistan correlates with generally lower academic outcomes. These findings build on previous studies, such as MacKelvie et al.’s research in New Zealand. By comparing datasets from different years, they demonstrated that food insecurity is linked to “higher rates of missed school, increased bullying, reduced cognitive abilities, poorer memory, and long-term impacts on brain development” (McKelvie Sebileau, Swinburn, and De Seymour 2025, 1–2). Similarly, Canbolat et al. (2024) explored food insecurity in the U.S., highlighting its connection to illnesses, fatigue, and even stress and anxiety—all factors that can affect attendance, socio-emotional well-being, and ultimately, educational outcomes.

What these findings make clear is that education policy cannot be limited to what happens within the walls of the classroom. Addressing educational inequalities requires tackling broader social and economic disparities. To truly drive systemic change and improve educational outcomes, we must ensure that every student has access to their basic needs, such as having their food secured.

References

Canbolat, Yusuf, Leslie Rutkowski, and David Rutkowski. 2024. “Empty Plates, Empty Seats: Food Insecurity and Student Absence in the US and Across the Globe (EdWorkingPaper: 24 -1106).” https://edworkingpapers.com/sites/default/files/ai24-1106.pdf.
McKelvie Sebileau, Pippa, Boyd Swinburn, and Jamie De Seymour. 2025. “The Impact of Food Poverty on Educational Achievement: A New Zealand Case Study in Global Context.” In Frontiers in Education, 9:1520654. Frontiers Media SA.
OECD. 2022. “Programme for International Student Assessment (PISA) 2022 Database. [Data Set].” OECD. https://www.oecd.org/pisa/data/2022database/ .