As a New York sports fan, I have been long jealous of the success of Kansas City QB Patrick Mahomes. So I set out to show, with data, how much better Mahomes is than either of the New York QBs (Daniel Jones and Zach Wilson).

EPA is an “all in one” metric which essentially tells the analyst how many points a particular player is worth to the team, per play.

All credit for the instructions and inspiration go to the MockUp blog and Tom Mock.

Code can be found below.

library(tidyverse)
library(nflreadr)
library(slider)
library(ggridges)
library(ggtext)
library(nflfastR)
library(ggthemes)
pbp_db <- nflreadr::load_pbp(2017:2022)

qb_names <- c(
  "P.Mahomes",
  "D.Jones",
  "Z.Wilson"
)

cur_date <- pbp_db |> 
  filter(passer_player_name =="P.Mahomes") |> 
  distinct(game_date, .keep_all = TRUE) |> 
  slice_max(game_date, n = 1) |> 
  select(game_date, week, season)

qb_tops <- pbp_db |>
  filter(
    !is.na(epa),
    play_type %in% c("pass", "run")
  ) |>
  filter(
    passer_player_name %in% qb_names |
      rusher_player_name %in% qb_names,
  ) |>
  mutate(
    name = if_else(
      is.na(passer_player_name), 
      rusher_player_name, 
      passer_player_name
    )
  ) |>
  select(name, posteam, defteam, season, game_id, epa)

qb_sum <- qb_tops |>
  group_by(name) |>
  summarize(
    slide_mean = slide_dbl(.x = epa, .f = mean, .before = 99L, .complete = TRUE),
    slide_median = slide_dbl(.x = epa, .f = median, .before = 99L, .complete = TRUE),
    slide_sum = slide_dbl(.x = epa, .f = sum, .before = 99L, .complete = TRUE),
    absolute_median = median(epa),
    absolute_mean = mean(epa),
    absolute_sum = sum(epa),
    posteam = tail(posteam, n = 1)
  ) |>
  ungroup() |>
  filter(!is.na(slide_mean)) |>
  arrange(desc(absolute_median))

name_colors <- if_else(
  unique(qb_sum$name) == "P.Mahomes", 
  "#e31837", 
  "black"
) |> rev()

dens_df <- qb_sum |>
  group_by(name) |>
  mutate(
    median_of_slides = median(slide_mean),
    fill_color = if_else(name == "P.Mahomes", "#e31837", "grey"),
    out_color = if_else(name == "P.Mahomes", "#e31837", "white")
  ) |>
  ungroup() |>
  left_join(
    nflfastR::teams_colors_logos |> select(posteam = team_abbr, team_color),
    by = "posteam"
  )

mahomes_plot <- dens_df |>
  ggplot(
    aes(
      x = slide_mean,
      y = fct_reorder(name, median_of_slides, .desc = FALSE),
      fill = team_color
    )
  ) +
  geom_density_ridges(
    quantile_lines = TRUE,
    quantiles = 2,
    color = "#f0f0f0",
    size = 0.5
  ) +
  geom_vline(xintercept = 0, linewidth = 1, alpha = 0.5) +
  coord_cartesian(xlim = c(-0.3, 0.65)) +
  theme_minimal() +
  scale_fill_identity(aesthetics = c("fill", "color")) +
  scale_x_continuous(breaks = scales::pretty_breaks(n = 8)) +
  labs(
    x = "Rolling 100 play mean EPA",
    y = "",
    title = "Patrick Mahomes is much better than the NY Quarterbacks",
    subtitle = glue::glue("Distribution of rolling 100 play average passing/running EPA in 2022")
  ) +
  theme_solarized()

mahomes_plot