Who’s talking: A Severance Analysis

rstats
severance
data visualization
For each episode we count the number of words each of the four main characters (Mark, Helly, Dylan, and Irving) speak for in each minute and visualize them.
Author

Lucy D’Agostino McGowan

Published

February 5, 2025

In this analysis, I use my mdr R package, which used data originally compiled by the Severance wiki. For each episode we count the number of words each of the four main characters (Mark, Helly, Dylan, and Irving) speak for in each minute and visualize them below. Click on the tabs to switch episodes.

library(tidyverse)
library(tidytext)
library(ggiraph)
library(mdr)

make_plot <- function(input) {
data <- transcripts |>
  mutate(speaker = case_when(
         grepl("Cobel", speaker) ~ "Cobel",
         speaker == "Mark W" ~ "Mark W",
         grepl("Mark", speaker) ~ "Mark",
         grepl("Helly", speaker) ~ "Helly",
         speaker == "Dylan’s son" ~ "Dylan’s son",
         grepl("Dylan", speaker) ~ "Dylan",
         grepl("Irv", speaker) ~ "Irving",
         grepl("Devon", speaker) ~ "Devon",
         grepl("Ricken", speaker) ~ "Ricken",
         grepl("Milchick", speaker) ~ "Milchick",
         grepl("Burt", speaker) ~ "Burt",
         grepl("Petey", speaker) ~ "Petey",
         grepl("Casey | Gemma", speaker) ~ "Ms. Casey",
         grepl("Reghabi", speaker) ~ "Reghabi",
         TRUE ~ "other"
  ),
  id = glue::glue("Season {season} Episode {episode}")) |>
  filter(id == input) |>
  filter(speaker %in% c("Mark", "Helly", "Dylan", "Irving")) |>
  unnest_tokens(word, dialogue) |>
  mutate(minute = minute(timestamp)) |>
  group_by(id, minute, speaker) |>
  summarise(value = n(), .groups = 'drop') 

 ggplot(data) +
  geom_bar_interactive(aes(x = minute, y = value, fill = speaker,
                           tooltip = glue::glue("{minute} min<br>{speaker}: {value} words")), 
           stat = "identity") +
  scale_x_continuous(expand = c(0, 0)) +
  scale_y_continuous(expand = c(0, 0)) +
  scale_fill_manual(values = c("#A28248", "#A25056", "#00957E",  "#2358A8")) +
  theme_mdr() +
   guides(fill = guide_legend(position = "inside",
                              direction = "horizontal")) +
  theme(
    legend.position.inside = c(0.5, 0.1),
    axis.text = element_blank(),
    axis.title = element_blank(),
    panel.grid = element_blank(),
    axis.line = element_blank(),
    plot.margin = unit(rep(-1, 4), units = "cm")
  ) +
  coord_radial(inner.radius = 0.2) +
  labs(fill = "")
} 

This post was originally posted on my Severance themed site [found here].