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

May 4, 6:22 (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 1082 hours of content (roughly 45 days) across 788 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
763 2025-04-25 <a href="https://www.theincomparable.com/theincomparable/763">You're in the Gibson Area Now</a> Jason Snell Monty Ashley, Shelly Brisbin, Erika Ensign, Joe Rosensteel, Moisés Chiullán, and Tony Sindelar

Panelists

2025 Panelists

There were 15 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