Feeding the World: How Global Calorie Supply Has Evolved Since 1961

Dhanush Kattaiyan (s4135587)

2025-10-30

Introduction and Data description

Hey everyone,
This presentation is all about how people around the world are eating more today than ever before but not everyone eats the same.
Some countries have plenty of food, while others still struggle to meet basic needs.

I wanted to explore how daily calorie supply per person has changed from 1961 to 2021
The goal is to clearly show which countries improved, which fell behind, and what that says about global food inequality.

This is not about blame it’s about understanding the story behind the data.

” Data Description”

The data comes from Our World in Data, which uses official numbers from the Food and Agriculture Organization (FAO).
It shows the average number of calories available per person per day for over 150 countries between 1961 and 2021.

Unit: kcal per person per day
It measures food availability, not exact intake.
I cleaned the data, removed regional totals, and added each country’s continent for comparison.

This dataset is open, reliable, and updated regularly, which makes it perfect for studying long-term nutrition trends.

Setup and Packages and Load and Clean Data

knitr::opts_chunk$set(
  echo = TRUE, message = FALSE, warning = FALSE,
  fig.width = 10, fig.height = 6, fig.align = "center"
)

# Install and load required packages
libs <- c("tidyverse","readr","janitor","countrycode","scales","forcats","RColorBrewer")
new  <- setdiff(libs, rownames(installed.packages()))
if (length(new)) install.packages(new, dependencies = TRUE)
invisible(lapply(libs, library, character.only = TRUE))
# Read dataset
cal_raw <- read_csv("daily-per-capita-caloric-supply.csv", show_col_types = FALSE)

# Clean and prepare
cal <- cal_raw %>%
  janitor::clean_names() %>%
  rename(
    country         = entity,
    iso3            = code,
    year            = year,
    kcal_per_person = daily_calorie_supply_per_person
  ) %>%
  filter(!is.na(iso3)) %>%  # remove regional aggregates
  mutate(continent = countrycode(country, "country.name", "continent", warn = FALSE))

# Save latest year for later
latest_year <- max(cal$year, na.rm = TRUE)

Global Calorie Supply Trend

global_trend <- cal %>%
  group_by(year) %>%
  summarise(global_avg = mean(kcal_per_person, na.rm = TRUE), .groups = "drop")

ggplot(global_trend, aes(year, global_avg)) +
  geom_line(linewidth = 1, colour = "#2C7FB8") +
  geom_smooth(method = "loess", se = FALSE, linetype = "dashed", colour = "#253494") +
  scale_y_continuous(labels = scales::comma) +
  labs(title = "Global average daily calorie supply (1961–2021)",
       subtitle = "Mean across countries, kcal/person/day",
       x = NULL, y = "kcal/person/day")

# Key Insights

Global calorie availability has grown steadily over the past 60 years.
The gap between countries has narrowed slightly but still remains wide.
Africa and South Asia lag behind other regions.
China has made big improvements since the 1990s.
Some countries like the U.S. and Australia already had high supply and stayed there.

It’s clear the world eats more now but not equally.

Inequality Band (10th–90th Percentile)

band <- cal %>%
  group_by(year) %>%
  summarise(
    p10 = quantile(kcal_per_person, 0.10, na.rm = TRUE),
    p90 = quantile(kcal_per_person, 0.90, na.rm = TRUE),
    .groups = "drop"
  )

ggplot(band, aes(year)) +
  geom_ribbon(aes(ymin = p10, ymax = p90), alpha = 0.25, fill = "#9ECAE1") +
  geom_line(aes(y = p10), colour = "#2B8CBE") +
  geom_line(aes(y = p90), colour = "#2B8CBE") +
  labs(title = "Inequality band: 10th–90th percentile",
       subtitle = "Country calorie supply, kcal/person/day",
       x = NULL, y = "kcal/person/day")

Continental Comparison Over Time

cont_trend <- cal %>%
  filter(!is.na(continent)) %>%
  group_by(continent, year) %>%
  summarise(avg_kcal = mean(kcal_per_person, na.rm = TRUE), .groups = "drop")

ggplot(cont_trend, aes(year, avg_kcal, colour = continent)) +
  geom_line(linewidth = 1) +
  scale_colour_brewer(palette = "Set2") +
  labs(title = "Continental averages over time",
       subtitle = "Average calorie supply per continent",
       x = NULL, y = "kcal/person/day", colour = NULL)

Top 15 vs Bottom 15 Countries (Latest Year)

tb <- cal %>%
  filter(year == latest_year) %>%
  arrange(desc(kcal_per_person))

top15 <- tb %>% slice_head(n = 15) %>% mutate(group = "Top 15")
bot15 <- tb %>% slice_tail(n = 15) %>% mutate(group = "Bottom 15")

tb_plot <- bind_rows(top15, bot15) %>%
  mutate(country = fct_reorder(country, kcal_per_person))

ggplot(tb_plot, aes(kcal_per_person, country, fill = group)) +
  geom_col(width = 0.7) +
  facet_wrap(~group, scales = "free_y") +
  scale_x_continuous(labels = scales::comma) +
  scale_fill_brewer(palette = "Set2") +
  labs(title = paste0("Top vs Bottom countries in ", latest_year),
       subtitle = "Daily calorie supply per person",
       x = "kcal/person/day", y = NULL, fill = NULL)

Country Trajectories (Spotlight Countries)

focus <- c("Australia","India","China","United States","Brazil","Nigeria")
spot <- cal %>% filter(country %in% focus)

ggplot(spot, aes(year, kcal_per_person, colour = country)) +
  geom_line(linewidth = 1) +
  scale_colour_brewer(palette = "Set2") +
  labs(title = "Country trajectories: diet transition and divergence",
       subtitle = "Comparison of six countries (1961–2021)",
       x = NULL, y = "kcal/person/day", colour = NULL)

Summary Plot (Optional: Density by Decade)

cal_dec <- cal %>%
  mutate(decade = paste0(floor(year/10)*10, "s")) %>%
  filter(year %% 10 == 0)

ggplot(cal_dec, aes(kcal_per_person, fill = decade)) +
  geom_density(alpha = 0.35) +
  scale_fill_brewer(palette = "Set3") +
  labs(title = "Distribution of country calorie supply by decade",
       subtitle = "Smoothed density across countries",
       x = "kcal/person/day", y = "density", fill = NULL)

# Conclusion

The data tells a hopeful but uneven story.
Yes, food availability has improved worldwide but many people still don’t get enough.
The next big challenge isn’t just providing food; it’s making sure everyone can access healthy and affordable diets.

For me, this project was a reminder that data isn’t just numbers it’s people’s lives behind the charts.

Reference

1.Daily supply of calories per person. (2024). Our World in Data. https://ourworldindata.org/grapher/daily-per-capita-caloric-supply#research-and-writing 2.Basic to Advanced. GeeksforGeeks. https://www.geeksforgeeks.org/data-visualization/types-of-data-visualization/ 3.[1]G. Grolemund, “2.8 Interactive documents | R Markdown: The Definitive Guide,” Bookdown.org, Dec. 30, 2023. https://bookdown.org/yihui/rmarkdown/interactive-documents.html (accessed Oct. 30, 2025).