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

On this page

  • Introduction
  • Panelists
    • 2025 Panelists
    • All Time Stats
  • Runtime
    • By Year
    • Per Person

The Mothership

Author

Lukas Burk

Updated

November 16, 6:24 (UTC)

Introduction

I would like to do a lot more with this, but currently time is scarce.
However, I want to fulfill Jason’s request, since I would love to be worthy of the title of record keeper.

Since its first episode on August 22, 2010, The Incomparable has accumulated 1121 hours of content (roughly 47 days) across 815 episodes.

The latest episode in the current dataset:

Code
mothership_wide |>
  head(1) |>
  select(number, date, title, host, guest) |>
  mutate(
    date = as.Date(date),
    title = glue::glue("<a href=\"https://www.theincomparable.com/theincomparable/{number}\">{title}</a>"),
    guest = and::and(stringr::str_split(guest, ";", simplify = TRUE))
  ) |>
  knitr::kable(
    col.names = c("#", "Date", "Title", "Host", "Guests"),
    escape = FALSE
  ) |>
  kableExtra::kable_styling()
# Date Title Host Guests
790 2025-10-30 <a href="https://www.theincomparable.com/theincomparable/790">Serious Academic Arguments</a> Jason Snell Steve Lutz, Tiff Arment, and Monty Ashley

Panelists

2025 Panelists

There were 42 episodes published in 2025. Here’s a breakdown by host and guest counts.

Code
mothership_long |>
  # Filter out special episodes containing letters
  filter(!str_detect(number, "[a-z]$"), year == current_year) |>
  count(person, role) |>
  pivot_wider(names_from = role, values_from = n, values_fill = 0) |>
  mutate(
    person = factor(person),
    total = guest + host,
    total_perc = scales::label_percent(.accuracy = .1)(total / nrow(mothership_wide)),
    rank = rank(-total, ties.method = "min")
  ) |>
  arrange(desc(total)) |>
  select(rank, person, host, guest, total, total_perc) |>
  reactable(
    columns = list(
      rank = colDef(name = "Rank", sortable = TRUE),
      person = colDef(name = "Person", filterable = TRUE, sortable = TRUE),
      host = colDef(name = "Host", sortable = TRUE),
      guest = colDef(name = "Guest", sortable = TRUE),
      total = colDef(name = "Total", sortable = TRUE),
      total_perc = colDef(name = "Total (%)", sortable = TRUE)
    )
  )

Looking at it as a bar chart is not really helping I guess but sure why not.

Code
panelist_breakdown <- mothership_long |>
  filter(year == current_year) |>
  group_by(person, role) |>
  tally() |>
  spread(role, n) |>
  replace_na(list(guest = 0, host = 0)) |>
  mutate(total = guest + host)

panelist_breakdown_long <- panelist_breakdown |>
  gather(role, n, guest, host) 


ggplot(data = panelist_breakdown_long, aes(x = reorder(person, total), y = n, fill = role)) +
  geom_col(color = "black", alpha = .6) +
  coord_flip() +
  scale_y_continuous(breaks = seq(0, 100, 5), minor_breaks = seq(0, 100, 1)) +
  scale_fill_brewer(palette = "Dark2", label = c("Guest", "Host")) +
  labs(
    title = glue::glue("The Incomparable — {current_year}"),
    subtitle = "Panelists by # of Appearances",
    x = "Panelist", y = "# of Appearances", fill = "Role"
  )

All Time Stats

Here are some rankings of panelists (including hosts) across different metrics / subsets.
Special bonus episodes are not included (507b, 506b, 337b, 173z).

By Number of Appearances

Nothing special, just “appears in episode” counts.

Code
mothership_long |>
  # Filter out special episodes containing letters
  filter(!str_detect(number, "[a-z]$")) |>
  count(person, role) |>
  pivot_wider(names_from = role, values_from = n, values_fill = 0) |>
  mutate(
    person = factor(person),
    total = guest + host,
    total_perc = scales::label_percent(.accuracy = .1)(total / nrow(mothership_wide)),
    rank = rank(-total, ties.method = "min")
  ) |>
  arrange(desc(total)) |>
  select(rank, person, host, guest, total, total_perc) |>
  reactable(
    columns = list(
      rank = colDef(name = "Rank", sortable = TRUE),
      person = colDef(name = "Person", filterable = TRUE, sortable = TRUE),
      host = colDef(name = "Host", sortable = TRUE),
      guest = colDef(name = "Guest", sortable = TRUE),
      total = colDef(name = "Total", sortable = TRUE),
      total_perc = colDef(name = "Total (%)", sortable = TRUE)
    )
  )

By Duration of Appearance

Duration per episode in which each person appears, one episode can count towards multiple people’s total of course.

Code
mothership_long |>
  # Filter out special episodes containing letters
  filter(!str_detect(number, "[a-z]$")) |>
  group_by(person) |>
  summarize(mins = sum(as.numeric(duration)/60)) |>
  mutate(
    mins = round(mins, 1),
    hours = round(mins/60, 1), 
    days = round(hours/24, 1),
    person = factor(person),
    runtime_perc = scales::label_percent(accuracy = .1)(mins / sum(as.numeric(mothership_wide$duration/60))),
    rank = rank(-mins, ties.method = "min")
  ) |>
  arrange(rank) |>
  select(rank, person, runtime_perc, mins, hours, days) |>
  reactable(
    columns = list(
      rank = colDef(name = "Rank", sortable = TRUE),
      person = colDef(name = "Person", filterable = TRUE, sortable = TRUE),
      runtime_perc = colDef(name = "% of All", sortable = TRUE),
      mins = colDef(name = "Minutes", sortable = TRUE),
      hours = colDef(name = "Hours", sortable = TRUE),
      days = colDef(name = "Days", sortable = TRUE)
    )
  )

Runtime

Because that’s the easy one.

Code
# column: screen-inset-shaded
tmp <- mothership_wide |>
  mutate(title_long = str_wrap(paste0(number, ": ", title), 20))

ggplot(tmp, aes(x = date, y = duration)) +
  geom_point(alpha = .75) +
  geom_smooth(method = loess, formula = y ~ x, se = FALSE, color = "red") +
  geom_label_repel(
    data = slice_max(tmp, duration, n = 8),
    aes(label = title_long), alpha = .8, size = 3
  ) +
  scale_x_date(
    date_breaks = "1 year", date_labels = "%Y"
  ) +
  scale_y_time(
    breaks = hms(minutes = seq(0, 1e5, 60)),
    limits = c(0, NA)
  ) +
  labs(
    title = "The Incomparable: Mothership",
    subtitle = "Episode runtimes",
    y = "Duration (HH:MM:SS)", x = "Date Published",
    caption = caption
  )

By Year

Code
# column: screen-inset-shaded
mothership_wide |> 
  ggplot(aes(x = factor(year), y = duration)) +
    geom_point(
      alpha = .75,
      position = position_jitter(height = 0, width = .2)
    ) +
    geom_boxplot(outlier.alpha = 0, alpha = .5) +
    stat_summary(fun = mean, geom = "point", color = "red") +
    scale_y_time(
      breaks = hms(minutes = seq(0, 1e5, 60)),
      limits = c(0, NA)
    ) +
    labs(
      title = "The Incomparable Network: Mothership",
      subtitle = "Episode runtimes",
      y = "Duration (HH:MM:SS)", x = "Year Published",
      caption = caption
    )

Per Person

Code
# column: screen-inset-shaded
mothership_long |>
  filter(year >= 2011) |>
  group_by(person) |>
  mutate(mean_duration = mean(duration)) |>
  ggplot(aes(x = reorder(person, mean_duration), y = duration)) +
  geom_point(alpha = .5, position = position_jitter(height = 0, width = .25)) +
  geom_boxplot(alpha = .5, outlier.alpha = 0) +
  coord_flip() +
  labs(
    title = "The Incomparable Mothership",
    subtitle = "Episode runtimes by panelist",
    y = "Duration (HH:MM:SS)", x = "Panelist",
    caption = caption
  )

 
  • About