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

On this page

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

The Mothership

Author

Lukas Burk

Updated

March 30, 15:31 (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 936 hours of content (roughly 39 days) across 683 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
658 2023-03-24 Nowhere In Time Jason Snell James Thomson, Glenn Fleishman, Erika Ensign, Moisés Chiullán, Annette Wierstra and Monty Ashley

Panelists

2022 Panelists

There were 52 episodes published in 2022. 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