Age at the Nobel Prize: Literature vs. Other Categories

Author

Esra Dogan

Approach

Motivation

The Nobel Prize in Literature is often described as a reward for a lifetime of work. In this assignment, I want to see what the data says about that: at what age do writers receive the prize, and how does this compare to the other Nobel categories?

Questions

  1. On average, at what age do laureates win the Nobel Prize in Literature?
  2. Has the age of Literature laureates changed over the decades?
  3. Are Literature laureates older than laureates in other categories?
  4. Who are the youngest and oldest laureates in each category?

Steps

  1. Use the Nobel Prize API v2.1 laureates endpoint (https://api.nobelprize.org/2.1/laureates) and request all laureates in JSON format with httr2.
  2. Convert the JSON response into a tibble. Each laureate has a list of prizes (nobelPrizes), so I will use unnest_longer() to get one row per prize.
  3. Keep only the columns I need: name, birth date, award year and category. I will take the birth year from the birth date.
  4. Calculate age at the time of the award (award year minus birth year).
  5. Answer each question with a simple table or plot.

Anticipated Challenges

  • Organizations (such as the Red Cross) are also listed as laureates but have no birth date, so I will filter them out.
  • Some laureates have won more than one prize (such as Marie Curie), so they will appear in more than one row after unnesting.
  • The API returns a limited number of results per request by default, so I will set a higher limit (or use offset) to make sure I get all laureates.
  • Some birth dates may be missing or incomplete, so I will only use the year.

Data

I requested all laureates from the Nobel Prize API in a single request. The data is saved to a local file so it doesn’t have to be downloaded again each time the report is rendered.

library(httr2)
library(tidyverse)
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.2.1     ✔ readr     2.2.0
✔ forcats   1.0.1     ✔ stringr   1.6.0
✔ ggplot2   4.0.3     ✔ tibble    3.3.1
✔ lubridate 1.9.5     ✔ tidyr     1.3.2
✔ purrr     1.2.2     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
if (file.exists("laureates.rds")) {
  laureates_raw <- readRDS("laureates.rds")
} else {
  resp <- request("https://api.nobelprize.org/2.1/laureates") |>
    req_url_query(limit = 1100) |>
    req_perform() |>
    resp_body_json()
  laureates_raw <- resp$laureates
  saveRDS(laureates_raw, "laureates.rds")
}

length(laureates_raw)
[1] 1028
laureates <- tibble(laureate = laureates_raw) |>
  hoist(laureate,
        name       = c("knownName", "en"),
        gender     = "gender",
        birth_date = c("birth", "date"),
        prizes     = "nobelPrizes") |>
  select(-laureate) |>
  unnest_longer(prizes) |>
  hoist(prizes,
        award_year = "awardYear",
        category   = c("category", "en")) |>
  select(-prizes)

glimpse(laureates)
Rows: 1,036
Columns: 5
$ name       <chr> "A. Michael Spence", "Aage N. Bohr", "Aaron Ciechanover", "…
$ gender     <chr> "male", "male", "male", "male", "male", "male", "male", "ma…
$ birth_date <chr> "1943-11-07", "1922-06-19", "1947-10-01", "1926-08-11", "19…
$ award_year <chr> "2001", "1975", "2004", "1982", "2021", "1979", "2019", "20…
$ category   <chr> "Economic Sciences", "Physics", "Chemistry", "Chemistry", "…

The JSON data is nested, so I used hoist() to pull out only the fields I need: name, gender, birth date and prizes. Because some laureates have won more than one prize, I used unnest_longer() to get one row per prize, and then extracted the award year and category.

Organizations have no birth date, so I removed them. Some birth dates are incomplete (for example, “1948-00-00”), so I only used the birth year. Age is calculated as award year minus birth year.

laureates_age <- laureates |>
  filter(!is.na(birth_date)) |>
  mutate(
    birth_year = as.integer(str_sub(birth_date, 1, 4)),
    award_year = as.integer(award_year),
    age        = award_year - birth_year
  ) |>
  filter(!is.na(age))

nrow(laureates_age)
[1] 1005
summary(laureates_age$age)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  17.00   52.00   61.00   60.61   70.00   97.00 

After cleaning, the data has 1,005 rows. The ages range from 17 to 97, with an average of about 61.

Question 1: On average, at what age do laureates win the Nobel Prize in Literature?

literature <- laureates_age |>
  filter(category == "Literature")

literature |>
  summarise(
    laureates  = n(),
    mean_age   = round(mean(age), 1),
    median_age = median(age),
    youngest   = min(age),
    oldest     = max(age)
  )
# A tibble: 1 × 5
  laureates mean_age median_age youngest oldest
      <int>    <dbl>      <int>    <int>  <int>
1       123       65         67       42     88

Literature laureates receive the prize at an average age of 65 (median 67). The youngest was Rudyard Kipling at 42 (1907) and the oldest was Doris Lessing at 88 (2007). This supports the idea that the prize usually comes late in a writer’s career.

Question 2: Has the age of Literature laureates changed over the decades?

ggplot(literature, aes(x = award_year, y = age)) +
  geom_point(alpha = 0.5) +
  geom_smooth(method = "loess", se = FALSE) +
  labs(title = "Age of Literature laureates at the time of the award",
       x = "Award year", y = "Age") +
  theme_minimal()
`geom_smooth()` using formula = 'y ~ x'

Each point is one Literature laureate, and the blue line shows the overall trend. Ages vary a lot from year to year, but the trend is clear: after a dip to around 60 in the 1920s–1930s, the age of Literature laureates has steadily increased and is now around 70.

Question 3: Are Literature laureates older than laureates in other categories?

laureates_age |>
  group_by(category) |>
  summarise(mean_age = round(mean(age), 1),
            median_age = median(age),
            laureates = n()) |>
  arrange(desc(mean_age))
# A tibble: 6 × 4
  category               mean_age median_age laureates
  <chr>                     <dbl>      <dbl>     <int>
1 Economic Sciences          67.2         67       101
2 Literature                 65           67       123
3 Peace                      61           62       113
4 Chemistry                  59.5         58       202
5 Physiology or Medicine     59           58       235
6 Physics                    57.8         56       231
ggplot(laureates_age, aes(x = reorder(category, age, median), y = age)) +
  geom_boxplot() +
  coord_flip() +
  labs(title = "Age at award by category", x = NULL, y = "Age") +
  theme_minimal()

Literature laureates are among the oldest: their average age (65.0) is second only to Economic Sciences (67.2). Science laureates are younger, with Physics having the youngest average age (57.8). One possible reason is that economics and literature prizes often reward a lifetime of work.

Question 4: Who are the youngest and oldest laureates in each category?

youngest <- laureates_age |>
  group_by(category) |>
  slice_min(age, n = 1, with_ties = FALSE) |>
  mutate(type = "Youngest")

oldest <- laureates_age |>
  group_by(category) |>
  slice_max(age, n = 1, with_ties = FALSE) |>
  mutate(type = "Oldest")

bind_rows(youngest, oldest) |>
  ungroup() |>
  select(category, type, name, age, award_year) |>
  arrange(category, type)
# A tibble: 12 × 5
   category               type     name                   age award_year
   <chr>                  <chr>    <chr>                <int>      <int>
 1 Chemistry              Oldest   John B. Goodenough      97       2019
 2 Chemistry              Youngest Frédéric Joliot         35       1935
 3 Economic Sciences      Oldest   Leonid Hurwicz          90       2007
 4 Economic Sciences      Youngest Esther Duflo            47       2019
 5 Literature             Oldest   Doris Lessing           88       2007
 6 Literature             Youngest Rudyard Kipling         42       1907
 7 Peace                  Oldest   Joseph Rotblat          87       1995
 8 Peace                  Youngest Malala Yousafzai        17       2014
 9 Physics                Oldest   Arthur Ashkin           96       2018
10 Physics                Youngest Lawrence Bragg          25       1915
11 Physiology or Medicine Oldest   Karl von Frisch         87       1973
12 Physiology or Medicine Youngest Frederick G. Banting    32       1923

The youngest laureate overall is Malala Yousafzai, who won the Peace Prize at 17 in 2014. The oldest is John B. Goodenough, who won the Chemistry Prize at 97 in 2019.

Looking at the oldest laureate in each category, most of them won recently: five of the six received the prize after 1990. This supports the finding in Question 2 that laureates are getting older over time.

Conclusion

The data supports the idea that the Nobel Prize in Literature rewards a lifetime of work. Writers receive the prize at an average age of 65, older than laureates in most other categories, and the average age of Literature laureates has increased over time.

Use of AI

I used Claude (Anthropic) as a tutor for planning the questions, writing and troubleshooting the R code, and wording the interpretations.

References