June 2019 | 8 minute read

Bible Babies: Exploring Biblically-Inspired Baby Names over Time

Use {gganimate} to easily create animated plots


The goal of this post is to explore how baby names have changed over time.

More specifically, I’m focusing on the decision to name one’s baby after a Biblical figure. I’m curious if the popularity of Biblically-inspired baby names has changed over time. We’re able to explore this question using the babynames package in R, which contains historical data from the U.S. Social Security Administration ranging back to 1880. It contains information on the number of babies born with a certain name in a given year, the sex of those babies, the year they were born, and their name (obviously).

library(babynames)
library(knitr)
library(readxl)
library(tidyverse)
library(ggplot2)
library(cr)
conflicted::conflict_prefer("filter", "dplyr")

set_cr_theme(font = "IBM Plex Sans")

In order to determine the popularity of “Bible babies,” we need a list of names found in the Bible in order to search the babynames dataset. I pulled a random list of Bible baby names from babycentre.co.uk. The list likely doesn’t include all names found in the Bible (only popular baby names), but that’s probably no big deal considering few, if any, parents name their child Athaliah.

biblenames <- read_excel("data/biblebabynames.xlsx")

boybible <- biblenames %>%
  select(boynames) %>%
  rename(names = boynames)

girlbible <- biblenames %>%
  filter(!is.na(girlnames)) %>%
  select(girlnames) %>%
  rename(names = girlnames)

biblenamesbind <- rbind(boybible, girlbible)

# use the %in% operator to match names with those in biblenamesbind
babynames <- babynames %>%
  mutate(biblepercent = ifelse(name %in% biblenamesbind$names, prop, 0))

Popularity of Biblical Baby Names over Time

One initial question is whether the popularity of “Bible babies” has declined over time. Given that Christian identity and religiosity more generally have experienced declines in recent years, one may assume that the decision to name one’s baby after a Biblical figure has also become less popular.

babynames %>%
  group_by(year) %>%
  summarise(sum = sum(biblepercent)) %>%
  ggplot(aes(x=year, y=sum)) +
    geom_line() +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
  labs(title = "Bible Babies over Time",
       subtitle="Percent of babies born with names found in the Bible",
       x="Year",
       y="Percent",
       caption = "Source: U.S. Social Security Administration
       \n Design: www.connorrothschild.com")
A line chart showcasing a decline in the proportion of Bible-affiliated baby names over time (between 1880, at 38%, and 2018, at 18%).

Biblical names have become significantly less popular over time. We can split up the trend by sex to see if it is primarily driven by one group of babies.

babynames %>%
  group_by(year, sex) %>%
  summarise(sum = sum(biblepercent)) %>%
  ungroup %>%
  group_by(sex) %>%
  ggplot(aes(x=year, y=sum, col=sex)) +
  geom_line() +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
  labs(title = "Bible Babies over Time",
       subtitle="Percent of babies born with names found in the Bible",
       x="Year",
       y="Percent",
       color="Sex",
       caption = "Source: U.S. Social Security Administration
       \n Design: www.connorrothschild.com")
A line chart showcasing a decline in the proportion of Bible-affiliated baby names over time between 1880 and 2018, for both boys and girls.

Indeed, much of the departure from Biblically-inspired baby names has been driven by girls. While 13% of boys born in 2017 shared a name with some biblical figure, the same was true of only 4% of girls.

Finally, we can incorporate Thomas Lin Pedersen’s gganimate package to explore the popularity of specific Bible names over time. This was inspired by Kieran Healy’s similar visualization depicting changes in the structure of babies’ names over time. The below code creates a GIF showing the shifting popularity of boys’ names over time.

library(gganimate)

# make male rank variable
malebabynames <- babynames %>%
  filter(sex=="M") %>%
  group_by(year) %>%
  mutate(rank = min_rank(-biblepercent) * 1) %>%
  filter(rank <= 10) %>%
  ungroup()

# plot male animation
maleanimation <- malebabynames %>%
  filter(sex=="M") %>%
  ggplot(aes(rank, group = name,
                fill = as.factor(name), color = as.factor(name))) +
  geom_tile(aes(y = biblepercent/2,
                height = biblepercent,
                width = 0.9), alpha = 0.8, color = NA) +
  geom_text(aes(y = 0, label = paste(name, " ")), vjust = 0.2, hjust = 1) +
  coord_flip(clip = "off", expand = FALSE) +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
  scale_x_reverse() +
  guides(color = FALSE, fill = FALSE) +
  labs(title="Most Popular Biblical Baby Names for Males",
       subtitle='in {closest_state}', x = element_blank(), y = "Percent of Names",
       caption = "Source: U.S. Social Security Administration
       \n Design: www.connorrothschild.com") +
  theme(plot.title = element_text(hjust = 0, size = 22),
        plot.subtitle = element_text(hjust = 0, size = 16),
        axis.ticks.y = element_blank(),
        axis.text.y  = element_blank(),
        plot.margin = margin(1,1,1,4, "cm")) +
  transition_states(year, transition_length = 4, state_length = 1) +
  ease_aes('cubic-in-out')

animate(maleanimation, fps = 25, nframes = 500, width = 800, height = 600)
A gif showing the most popular Biblical boy baby names over time. It is an animated barchart race where each bar's length corresponds to the proportion of boys with that name, and the bars shift for each year.

Replicating that code with minor tweaks creates the same animation for girls’ names:

# make rank variable
femalebabynames <- babynames %>%
  filter(sex=="F") %>%
  group_by(year) %>%
  mutate(rank = min_rank(-biblepercent) * 1) %>%
  filter(rank <= 10) %>%
  ungroup()

# plot animation
femaleanimation <- femalebabynames %>%
  filter(sex=="F") %>%
  ggplot(aes(rank, group = name,
             fill = as.factor(name), color = as.factor(name))) +
  geom_tile(aes(y = biblepercent/2,
                height = biblepercent,
                width = 0.9), alpha = 0.8, color = NA) +
  geom_text(aes(y = 0, label = paste(name, " ")), vjust = 0.2, hjust = 1) +
  coord_flip(clip = "off", expand = FALSE) +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
  scale_x_reverse() +
  guides(color = FALSE, fill = FALSE) +
  labs(title="Most Popular Biblical Baby Names for Females",
       subtitle='in {closest_state}', x = element_blank(), y = "Percent of Names",
       caption = "Source: U.S. Social Security Administration\n Design: www.connorrothschild.com") +
  theme(plot.title = element_text(hjust = 0, size = 22),
        plot.subtitle = element_text(hjust = 0, size = 16),
        axis.ticks.y = element_blank(),
        axis.text.y  = element_blank(),
        plot.margin = margin(1,1,1,4, "cm")) +
  transition_states(year, transition_length = 4, state_length = 1) +
  ease_aes('cubic-in-out')

animate(femaleanimation, fps = 25, nframes = 500, width = 800, height = 600)
A gif showing the most popular Biblical girl baby names over time. It is an animated barchart race where each bar's length corresponds to the proportion of girls with that name, and the bars shift for each year.

Finally, we can combine some of the insights from our earlier plot (depicting the popularity of Biblical names by sex) to show which boys’ names are responsible for their sex’s relative dominance over girls’ Biblically-inspired names.

# make rank variable
babynamesrank <- babynames %>%
  group_by(year) %>%
  mutate(rank = min_rank(-biblepercent) * 1) %>%
  filter(rank <= 10) %>%
  ungroup()

# plot animation
babyanimation <- babynamesrank %>%
  ggplot(aes(rank, group = name,
             fill = as.factor(sex), color = as.factor(sex))) +
  geom_tile(aes(y = biblepercent/2,
                height = biblepercent,
                width = 0.9), alpha = 0.8, color = NA) +
  geom_text(aes(y = 0, label = paste(name, " ")), vjust = 0.2, hjust = 1) +
  coord_flip(clip = "off", expand = FALSE) +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
  scale_x_reverse() +
  guides(color = FALSE, fill = FALSE) +
  labs(title="Most Popular Biblical Baby Names",
       subtitle='in {closest_state}', x = element_blank(), y = "Percent of Names",
       caption = "Source: U.S. Social Security Administration
       \n Design: www.connorrothschild.com") +
  theme(plot.title = element_text(hjust = 0, size = 22),
        plot.subtitle = element_text(hjust = 0, size = 16),
        axis.ticks.y = element_blank(),
        axis.text.y  = element_blank(),
        plot.margin = margin(1,1,1,4, "cm")) +
  transition_states(year, transition_length = 4, state_length = 1) +
  ease_aes('cubic-in-out')

animate(babyanimation, fps = 25, nframes = 500, width = 800, height = 600)
A gif showing the most popular Biblical baby names over time. It is an animated barchart race where each bar's length corresponds to the proportion of babies with that name, and the bars shift for each year.