Podcast Stats
  • Overview
  • The Incomparable
    • The Motshership
    • The Network
  • Relay FM
  • ATP
  • Data

On this page

  • Current data
  • All Shows
    • Timeline
    • Duration

Podcast Data for Fun and (not) Profit

Author

Lukas Burk

Updated

May 30, 16:31 (UTC)

This site is an automatically generated collection of plots and tables visualizing some metadata from my favorite podcasts/podcast networks.

Included:

  • The Incomparable
  • Accidental Tech Podcast (ATP)
  • Relay FM

Data includes episode runtimes, release dates, and hosts (in case of The Incomparable, also guests).

The data sources are:

  • The Incomparable: Home-brewed stats.txt files Jason has set up for me to parse (thanks Jason <3) and some web-scraping of the individual show’s archive pages.
  • Relay.fm: The individual show RSS feeds and some mild web-scraping.
  • ATP: The website

Data collection and site/plot-recreation happens Sunday morning (UTC).

Current data

The last time the date of the latest episode within each dataset.

Code
podcasts |>
  summarize(
    latest_episode = max(date),
    .by = network
  ) |>
  select(network, latest_episode) |>
  arrange(desc(latest_episode)) |>
  knitr::kable(
    col.names = c("Podcast/Network", "Latest Episode")
  ) |>
  kableExtra::kable_styling()
Podcast/Network Latest Episode
The Incomparable 2026-05-29
relay.fm 2026-05-29
ATP 2026-05-21

All Shows

Here’s a quick overview of the podcast data I’ve collected so far.

Code
podcasts |>
  group_by(network) |>
  summarize(
    episodes = n(),
    firstep = as.character(as.Date(min(date, na.rm = TRUE))),
    lastep = as.character(as.Date(max(date, na.rm = TRUE))),
    shows = length(unique(show)),
    epspershow = round(episodes / shows, 1),
    .groups = "drop"
  ) |>
  setNames(c(
    "Network", "Episodes", "First Episode",
    "Last Episode", "# of Shows", "Avg Episodes per Show"
  )) |>
  reactable(
    rownames = FALSE 
  )

Timeline

From first to last published episode.

Code
podcasts |>
  group_by(show) |>
  mutate(
    d_min = min(date),
    d_max = max(date)
  ) |>
  ungroup() |>
  ggplot(aes(x = reorder(show, d_min), color = network)) +
  geom_errorbar(aes(ymin = d_min, ymax = d_max), width = 1, linewidth = 1) +
  scale_y_continuous(
    transform = c("date", "reverse"),
    breaks = scales::breaks_width("2 years"),
    minor_breaks = scales::breaks_width("1 year"),
    labels = scales::label_date("%Y")
  ) +
  scale_color_network() +
  coord_flip() +
  theme_neutral() +
  theme(axis.text.y = element_text(hjust = 1)) +
  labs(
    title = "All Podcasts Timeline",
    subtitle = "The Incomparable, Relay FM, ATP",
    x = NULL, y = "First to latest episode date",
    color = NULL,
    caption = caption
  )

Duration

Code
podcasts |>
  filter(!is.na(duration)) |>
  ggplot(aes(x = reorder(show, duration, FUN = mean), y = duration, fill = network)) +
  geom_boxplot() +
  coord_flip() +
  scale_fill_network() +
  theme_neutral() +
  labs(
    title = "Podcasts by duration", subtitle = "By network",
    x = NULL, y = "Duration (H:M:S)", fill = NULL,
    caption = caption
  )

 
  • About