Skip to content

Instantly share code, notes, and snippets.

@acbass49
Last active April 8, 2025 06:59
Show Gist options
  • Select an option

  • Save acbass49/496d85fbf5b03921a7bd9adbba2ea223 to your computer and use it in GitHub Desktop.

Select an option

Save acbass49/496d85fbf5b03921a7bd9adbba2ea223 to your computer and use it in GitHub Desktop.
2024 General Conference Update
library(tidyverse)
library(stringr)
library(scales)
library(marquee)
library(ggtext)
library(patchwork)
df <- read.csv("./data/membership.csv")
# dataset downloaded from https://docs.google.com/spreadsheets/d/1ghU8_9CcaW337iUCMoiFDvPV1SMAQCecu2ZfWrx1y9w/edit?gid=0#gid=0
data <- df[20:(nrow(df)-1),c("Year","Missionaries", "Converts", "Members", "New.Children.of.Record")] |>
mutate(across(everything(), \(x) str_remove_all(x, pattern = fixed(",")))) |>
mutate(across(everything(), as.numeric))
# add in 2024 data
yr_2024 <- data.frame(
Year = 2024,
Missionaries = 74127,
Converts = 308682,
Members = 17509781,
New.Children.of.Record = 91617
)
data <- bind_rows(data, yr_2024) |>
arrange(desc(Year))
(p1 <- data |>
mutate(across(everything(), \(x) str_remove_all(x, pattern = fixed(",")))) |>
mutate(across(everything(), as.numeric)) |>
filter(Year>=1977) |>
mutate(
converts_per_missionary = Converts/Missionaries
) |>
select(Year,Missionaries,Converts) |>
ggplot(aes(x=Year, y=Missionaries)) +
geom_line(linewidth = 1.5, color = "grey") +
labs(
title = "<span style='font-size:18pt; font-family:cairo'>Number of <span style='color:grey'>Missionaries</span> Increases</span>",
subtitle = "The missionary count has almost tripled since 1980",
x="Year",
y="Missionary Count")+
theme(axis.ticks = element_blank(),
axis.title = element_text(size = 14),
axis.text = element_text(size = 10),
panel.background = element_blank(),
text = element_text(face = "bold", family = "Cairo"),
plot.title = element_markdown(),
plot.background = element_rect(fill = "grey95"),
plot.subtitle = element_text(hjust = 0, face = "italic"),
panel.grid = element_line(color = "grey95"),
panel.grid.major.y = element_line(color = "lightgrey", linetype = 'solid'),
plot.caption = element_text(hjust = 1, size = 8, face = "italic"))+
scale_x_continuous(
breaks = seq(1975,2020,5)
)+
scale_y_continuous(
breaks = seq(0,500000,25000),
labels = scales::comma_format(),
limits = c(0,100000)
)+
geom_vline(xintercept = 2012) +
geom_text(aes(x = 2008, y = 20000, label = "Age Change ->"), size=3, family = "cairo")+
geom_vline(xintercept = 2020) +
geom_text(aes(x = 2016.5, y = 20000, label = "COVID-19 ->"), size=3, family = "cairo")
)
(p2 <- data |>
mutate(across(everything(), \(x) str_remove_all(x, pattern = fixed(",")))) |>
mutate(across(everything(), as.numeric)) |>
filter(Year>=1977) |>
mutate(
converts_per_missionary = Converts/Missionaries
) |>
select(Year,Missionaries,Converts) |>
ggplot(aes(x=Year, y=Converts)) +
geom_line(linewidth = 1.5, color = "#097969") +
labs(
title = "<span style='font-size:18pt; font-family:cairo'><span style='color:#097969'>Convert Baptisms</span> Recovering Quickly</span>",
subtitle = "Baptisms Haven't Increased At The Same Rate As Missionaries",
x="Year",
y="Convert Baptisms",
caption = "@mormon_metrics\nSource: General Conference")+
theme(axis.ticks = element_blank(),
axis.title = element_text(size = 14),
axis.text = element_text(size = 10),
panel.background = element_blank(),
text = element_text(face = "bold", family = "Cairo"),
plot.title = element_markdown(),
plot.background = element_rect(fill = "grey95"),
plot.subtitle = element_text(hjust = 0, face = "italic"),
panel.grid = element_line(color = "grey95"),
panel.grid.major.y = element_line(color = "lightgrey", linetype = 'solid'),
plot.caption = element_text(hjust = 1, size = 8))+
scale_x_continuous(
breaks = seq(1975,2020,5)
)+
scale_y_continuous(
breaks = seq(0,500000,100000),
labels = scales::comma_format(),
limits = c(0,400000)
)+
geom_vline(xintercept = 2012) +
geom_text(aes(x = 2008, y = 50000, label = "Age Change ->"), size=3, family = "cairo")+
geom_vline(xintercept = 2020) +
geom_text(aes(x = 2016.5, y = 50000, label = "COVID-19 ->"), size=3, family = "cairo"))
(p3 <- p1/p2)
ggsave("./images/3_2024_data_release_1.png", p3, width = 1700, height = 2000, units = "px", dpi = 300)
# possibly do COR baptisms / births to member count total
p4 <- data |>
mutate(across(everything(), \(x) str_remove_all(x, pattern = fixed(",")))) |>
mutate(across(everything(), as.numeric)) |>
filter(Year>=1977) |>
mutate(
converts_per_missionary = Converts/Missionaries
) |>
ggplot(aes(x=Year, y=converts_per_missionary)) +
geom_point(size = 3, alpha = 0.4, color = "goldenrod3") +
geom_smooth(se=FALSE, color = "goldenrod3", method = "lm") +
labs(
title = "Missionaries Today Have Half The Baptisms As The 80s",
subtitle = "From 8 converts per missionary in 1980s to less than 4 converts per missionary in 2024",
x="Year",
y="Converts Per Missionary",
caption = "@mormon_metrics\nSource: General Conference")+
theme(axis.ticks = element_blank(),
axis.title = element_text(size = 14),
axis.text = element_text(size = 10),
panel.background = element_blank(),
text = element_text(face = "bold", family = "Cairo"),
plot.title = element_text(hjust = 0, size = 18, face = "bold"),
legend.title = element_blank(),
legend.position = 'top',
legend.background = element_blank(),
legend.box.background = element_blank(),
plot.background = element_rect(fill = "grey95"),
plot.subtitle = element_text(hjust = 0, face = "italic"),
legend.key = element_blank(),
panel.grid = element_line(color = "grey95"),
panel.grid.major.y = element_line(color = "lightgrey", linetype = 'solid'),
plot.caption = element_text(hjust = 1, size = 8))+
scale_x_continuous(
breaks = seq(1975,2020,5)
)+
scale_fill_manual(values=c("black"))+
scale_y_continuous(
breaks = seq(0,10,2),
limits = c(0,10)
) +
geom_vline(xintercept = 2012) +
geom_text(aes(x = 2008, y = 1, label = "Age Change ->"), size=3, family = "cairo")+
geom_vline(xintercept = 2020) +
geom_text(aes(x = 2016.5, y = 1, label = "COVID-19 ->"), size=3, family = "cairo")
ggsave("./images/3_2024_data_release_2.png", p4, width = 2000, height = 2000, units = "px", dpi = 300)
p5 <- data %>%
mutate(Members = (Members),
Entity = "Mormon") %>%
select(Entity, Year, Members) |>
filter(Year >= 1973) |>
ggplot(aes(x = Year, y = Members)) +
geom_line(size = 1.5, color = "#FF7F0E") +
geom_text(
data = . %>% filter(Year == 2024) %>% mutate(
percent_lbl = format(round(Members), big.mark = ",")
), aes(x=Year, y=Members,label=percent_lbl),
family = "Cairo",
fontface='bold',
size = 5,
nudge_x=4.5,
show.legend = FALSE,
color = "#FF7F0E"
) +
labs(
title = "Total Church Membership Continues To Grow",
y = "Total Church Membership (Official)",
x="Year")+
theme(axis.ticks = element_blank(),
axis.text.y = element_text(size = 16),
panel.background = element_blank(),
text = element_text(face = "bold", family = "Cairo"),
plot.title = element_text(size = 20, face = "bold"),
plot.subtitle = element_text(face = "italic"),
legend.title = element_blank(),
legend.background = element_blank(),
plot.background = element_rect(fill = "grey95"),
legend.box.background = element_blank(),
legend.key = element_blank(),
legend.position = "top",
panel.grid = element_line(color = "grey95"),
panel.grid.major.y = element_line(color = "lightgrey", linetype = 'solid'),
plot.caption = element_text(size = 8, face = "italic"))+
scale_color_manual(values = c('#1D71BA')) +
scale_x_continuous(breaks = seq(1970,2030, 5), limits = c(1970,2030))+
scale_y_continuous(breaks = seq(0,20000000, 5000000), limits = c(0,20000000), labels = scales::label_number(scale_cut = cut_short_scale()))
p6_1 <- data %>%
mutate(
members_lead = lead(Members, 1),
perc_change = round((Members - members_lead)/Members*100,2),
births = (New.Children.of.Record),
Entity = "Mormon") %>%
select(Entity, Year, perc_change) |>
filter(Year >= 1973) |>
ggplot(aes(x = Year, y = perc_change)) +
geom_point(size = 3, alpha = 0.4, color = "black") +
geom_smooth(se=FALSE, color = "black", method = "lm") +
labs(
title = "YoY Percent Change In Membership Has Dropped Over Time",
subtitle = "Percent Change in 2024 Very Similar to 2023",
y = "YoY Membership Growth % (Official)",
x="Year")+
theme(axis.ticks = element_blank(),
axis.text.y = element_text(size = 16),
panel.background = element_blank(),
text = element_text(face = "bold", family = "Cairo"),
plot.title = element_text(size = 20, face = "bold"),
plot.subtitle = element_text(face = "italic"),
legend.title = element_blank(),
legend.background = element_blank(),
panel.grid = element_line(color = "grey95"),
plot.background = element_rect(fill = "grey95"),
legend.box.background = element_blank(),
legend.key = element_blank(),
legend.position = "top",
panel.grid.major.y = element_line(color = "lightgrey", linetype = 'solid'),
plot.caption = element_text(size = 8))+
scale_color_manual(values = c('#1D71BA')) +
scale_x_continuous(breaks = seq(1970,2030, 5), limits = c(1970,2030))+
scale_y_continuous(breaks = seq(1,10, 1))
p6 <- data %>%
mutate(
births = (New.Children.of.Record),
Entity = "Mormon") %>%
select(Entity, Year, births) |>
filter(Year >= 1973) |>
ggplot(aes(x = Year, y = births)) +
geom_line(size = 1.5, color = "#1D71BA") +
geom_text(
data = . %>% filter(Year == 2024) %>% mutate(
percent_lbl = format(round(births), big.mark = ",") # Add commas using format()
), aes(x=Year, y=births,label=percent_lbl),
family = "Cairo",
fontface='bold',
size = 5,
nudge_x=3.5,
show.legend = FALSE,
color = "#1D71BA"
) +
labs(
title = "Children of Record Births Drops Slightly In 2024",
caption = "@mormon_metrics\nSource: General Conference",
subtitle = "Children of Record Births Have Flatlined Despite 3X Increase In Membership",
y = "Children of Record Births (Official)",
x="Year")+
theme(axis.ticks = element_blank(),
axis.text.y = element_text(size = 16),
panel.background = element_blank(),
text = element_text(face = "bold", family = "Cairo"),
plot.title = element_text(size = 20, face = "bold"),
plot.subtitle = element_text(face = "italic"),
legend.title = element_blank(),
legend.background = element_blank(),
panel.grid = element_line(color = "grey95"),
plot.background = element_rect(fill = "grey95"),
legend.box.background = element_blank(),
legend.key = element_blank(),
legend.position = "top",
panel.grid.major.y = element_line(color = "lightgrey", linetype = 'solid'),
plot.caption = element_text(size = 8))+
scale_color_manual(values = c('#1D71BA')) +
scale_x_continuous(breaks = seq(1970,2030, 5), limits = c(1970,2030))+
scale_y_continuous(breaks = seq(0,200000, 25000), limits = c(0,200000), labels = scales::label_number(scale_cut = cut_short_scale()))
p7 <- (p5/p6_1/p6)
ggsave("./images/3_2024_data_release_3.png", p7, width = 2500, height = 3000, units = "px", dpi = 300)
# Births per member
p8 <- data %>%
mutate(
birth_rate = (New.Children.of.Record/(Members/1000)),
Entity = "Mormon") %>%
select(Entity, Year, birth_rate) |>
filter(Year >= 1973) |>
ggplot(aes(x = Year, y = birth_rate)) +
geom_line(size = 1.5, color = "#1D71BA") +
geom_text(
data = . %>% filter(Year == 2024) %>% mutate(
percent_lbl = as.character(round(birth_rate,2)),
percent_lbl = paste0(percent_lbl, ''),
), aes(x=Year, y=birth_rate,label=percent_lbl),
family = "Cairo",
fontface='bold',
size = 5,
nudge_x=1.5,
show.legend = FALSE,
color = "#1D71BA"
) +
labs(
title = "Births Per 1000 Members Has Dropped Over Time ",
caption = "@mormon_metrics\nSource: General Conference",
subtitle = "Births per 1000 members is only 1/4 of what it was in 1980",
y = "Births Per 1000 Members (Official)",
x="Year")+
theme(axis.ticks = element_blank(),
axis.text.y = element_text(size = 16),
panel.background = element_blank(),
text = element_text(face = "bold", family = "Cairo"),
plot.title = element_text(size = 20, face = "bold"),
plot.subtitle = element_text(face = "italic"),
plot.background = element_rect(fill = "grey95"),
legend.title = element_blank(),
legend.background = element_blank(),
legend.box.background = element_blank(),
legend.key = element_blank(),
legend.position = "top",
panel.grid = element_line(color = "grey95"),
panel.grid.major.y = element_line(color = "lightgrey", linetype = 'solid'),
plot.caption = element_text(size = 8))+
scale_color_manual(values = c('#1D71BA')) +
scale_x_continuous(breaks = seq(1970,2025, 5))+
scale_y_continuous(breaks = seq(0,30, 5), limits = c(0,30))
ggsave("./images/3_2024_data_release_4.png", p8, width = 2500, height = 2000, units = "px", dpi = 300)
p8 <- data |>
filter(Year >= 2000) |>
mutate(
lead_members = lead(Members, 1),
lost = (Converts + New.Children.of.Record) - (Members - lead_members),
lost_rate = lost/(Members/1000)
) |>
ggplot(aes(x = Year, y = lost_rate)) +
geom_point(size = 3, alpha = 0.4, color = "#D62728") +
geom_smooth(se=FALSE, color = "#D62728", method = "lm") +
labs(
title = "Exits Per 1000 Members Has Increased Since 2000",
caption = "@mormon_metrics\nSource: General Conference",
subtitle = "Exits per 1000 members Has Doubled Since 2000",
y = "Exits Per 1000 Members (Official)",
x="Year")+
theme(axis.ticks = element_blank(),
axis.text.y = element_text(size = 16),
panel.background = element_blank(),
text = element_text(face = "bold", family = "Cairo"),
plot.title = element_text(size = 20, face = "bold"),
plot.subtitle = element_text(face = "italic"),
plot.background = element_rect(fill = "grey95"),
legend.title = element_blank(),
legend.background = element_blank(),
legend.box.background = element_blank(),
legend.key = element_blank(),
legend.position = "top",
panel.grid = element_line(color = "grey95"),
panel.grid.major.y = element_line(color = "lightgrey", linetype = 'solid'),
plot.caption = element_text(size = 8))+
scale_x_continuous(breaks = seq(1970,2025, 5))+
scale_y_continuous(breaks = seq(0,14, 2), limits = c(0,15))
ggsave("./images/3_2024_data_release_5.png", p8, width = 2000, height = 2000, units = "px", dpi = 300)
# gist: https://gist.github.com/acbass49/496d85fbf5b03921a7bd9adbba2ea223
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment