Birth is scheduled: calendar effects in 15 years of US births

TidyTuesday 2018-10-02 · Daily US births, 2000–2014

Published

June 9, 2026

TipSession 1 · co-developed

This page came out of a live, turn-by-turn conversation between Jon Minton and Claude (Fable 5) — questions, plots and interpretation built together in real time. The Session 2 pages were instead produced by Claude working autonomously.

Every daily birth count in the United States from 2000 to 2014 — 5,479 days. Births feel like the most natural, least controllable of events, yet at the population scale the calendar’s fingerprints are everywhere. This dataset is really about obstetric scheduling: the modern machinery of inductions and planned caesareans, which bends the timing of birth toward the working week and away from holidays.

Code
library(tidyverse)

dow_names <- c("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun")

births <- read_csv("data/us_births.csv", show_col_types = FALSE) |>
  mutate(
    date = as.Date(sprintf("%d-%02d-%02d", year, month, date_of_month)),
    dow = factor(dow_names[day_of_week], levels = dow_names),
    weekend = day_of_week >= 6
  )

theme_set(theme_minimal(base_size = 13))

The working-week birth

The single largest signal in the data isn’t seasonal — it’s weekly. Average daily births collapse at the weekend, because elective inductions and caesareans are booked Monday to Friday.

Code
births |>
  summarise(mean_births = mean(births), .by = dow) |>
  ggplot(aes(dow, mean_births, fill = dow %in% c("Sat", "Sun"))) +
  geom_col(width = 0.7) +
  geom_text(aes(label = scales::comma(round(mean_births))),
            vjust = -0.5, size = 3.4, colour = "grey25") +
  scale_fill_manual(values = c("#3b7dd8", "#cf5c36"), guide = "none") +
  scale_y_continuous(expand = expansion(c(0, 0.12))) +
  labs(
    title = "A baby born on the weekend is, increasingly, a baby that couldn't wait",
    subtitle = "Saturday and Sunday births run ~35% below the Tuesday peak — the signature of scheduled delivery",
    x = NULL, y = "Mean births per day"
  )

Average daily births by day of week, 2000–2014. Weekend births run roughly a third below weekday births.

A year of births, day by day

Averaging each calendar date across the 15 years reveals the holidays as sharp troughs — and a few telling spikes.

Code
doy <- births |>
  mutate(md = format(date, "%m-%d")) |>
  filter(md != "02-29") |>
  summarise(mean_births = mean(births), .by = md) |>
  mutate(doy = row_number())

marks <- tibble::tribble(
  ~md,      ~label,
  "01-01",  "New Year's Day",
  "07-04",  "Independence Day",
  "12-25",  "Christmas Day",
  "11-27",  "Thanksgiving (approx.)",
  "09-09",  "Early-Sept peak"
) |>
  left_join(doy, by = "md")

ggplot(doy, aes(doy, mean_births)) +
  geom_line(colour = "grey60", linewidth = 0.4) +
  geom_smooth(se = FALSE, colour = "#2c7a4d", span = 0.18, linewidth = 1) +
  geom_point(data = marks, colour = "#cf5c36", size = 2.3) +
  geom_text(
    data = marks, aes(label = label), size = 3.1, colour = "grey20",
    vjust = -1, hjust = c(0, 0.5, 1, 0.5, 0.5)
  ) +
  scale_x_continuous(
    breaks = cumsum(c(1, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30)),
    labels = month.abb
  ) +
  labs(
    title = "Births dip on every major holiday and peak in early September",
    subtitle = "Mean daily births by calendar date; holidays empty the delivery suite",
    x = NULL, y = "Mean births"
  )

Mean births by day of the year (averaged 2000–2014). Notable dates annotated.

The early-September peak is real and recurring (a December–January conception window, much debated). But the troughs are the cleaner story: Christmas, New Year, Independence Day and Thanksgiving all show steep dips — the same scheduling hand as the weekend effect, pulling planned deliveries away from public holidays.

The unluckiest day to be born

If birth timing is partly chosen, do people avoid unlucky dates? The 13th of the month lets us test it — and Friday the 13th most of all.

Code
f13 <- births |>
  mutate(is13 = date_of_month == 13) |>
  summarise(m = mean(births), .by = c(dow, is13)) |>
  pivot_wider(names_from = is13, values_from = m,
              names_prefix = "x") |>
  mutate(pct = 100 * (xTRUE / xFALSE - 1))

ggplot(f13, aes(dow, pct, fill = dow == "Fri")) +
  geom_hline(yintercept = 0, colour = "grey50") +
  geom_col(width = 0.7) +
  geom_text(aes(label = sprintf("%+.1f%%", pct),
                vjust = ifelse(pct < 0, 1.3, -0.5)),
            size = 3.3, colour = "grey25") +
  scale_fill_manual(values = c("grey70", "#7d1128"), guide = "none") +
  scale_y_continuous(expand = expansion(0.15)) +
  labs(
    title = "Friday the 13th really is missing babies",
    subtitle = "Births on the 13th vs the same weekday's overall average, 2000–2014",
    x = "Weekday the 13th falls on", y = "Difference from that weekday's average"
  )

Births on the 13th relative to the same weekday’s average. Friday the 13th stands out.

Every 13th sees slightly fewer births than its weekday norm, but Friday the 13th is the outlier at −5.3% — more than double the next-largest dip. With the weekday already held constant, this isn’t the weekend effect in disguise: it’s a measurable reluctance to schedule a delivery on a day folklore marks as unlucky. A small, superstitious distortion in the timing of something we like to think of as beyond our control.

NoteA note on the test

Comparing the 13th to the same weekday’s average is the key control — a naive “13th vs all days” comparison would confound the date with whatever weekday it happened to fall on. Holding weekday fixed isolates the date superstition from the much larger weekly scheduling cycle.