036: Historical SP+

gtExtras
rollmean
Published

June 20, 2023

Add data

Code
# load csv public
sp_plus <- readr::read_csv("sp_historical.csv") |> 
          dplyr::mutate(team = dplyr::if_else(team == "Miami-FL", "Miami", team))

sp_data <- dplyr::group_by(sp_plus, team) |>
  dplyr::mutate(year = as.numeric(year)) |>
  dplyr::arrange(year) |>
  dplyr::mutate(pctile = stringr::str_remove_all(pctile, "%"), off_pctile = stringr::str_remove_all(off_pctile, "%"), def_pctile = stringr::str_remove_all(def_pctile, "%")) |>
  dplyr::mutate(pctile = as.numeric(pctile), off_pctile = as.numeric(off_pctile), def_pctile = as.numeric(def_pctile)) |>
  dplyr::mutate(avg = zoo::rollmean(
    pctile,
    k = 5,
    fill = NA,
    align = 'right'
  )) |>
  dplyr::ungroup()

Make GT Tables

Code
# make ACC table 
acc_teams <- c("Boston College", "Clemson", "Notre Dame", "Duke", "Florida State",
               "Georgia Tech", "Louisville", "Maryland", "Miami", "NC State", 
               "North Carolina", "Pittsburgh", "Syracuse", "Virginia", "Virginia Tech",
               "Wake Forest")

sp_data |> 
  dplyr::filter(team %in% acc_teams & decade > 1990) |> 
  dplyr::group_by(team, decade) |> 
  dplyr::summarize(sum_data = list(pctile), avg = mean(pctile), .groups = "drop") |> 
  tidyr::pivot_wider(names_from = c(decade), values_from = c(avg, sum_data)) |> 
  dplyr::select(team, avg_2020, sum_data_2020, avg_2010, sum_data_2010, avg_2000, sum_data_2000) |> 
  dplyr::mutate(logo = team) |> 
  dplyr::relocate(logo, .before = team) |> 
  dplyr::arrange(-avg_2020) |> 
  gt::gt() |> 
  gt::cols_label(
    # rename columns
    logo = "",
    team = "Team",
    avg_2020 = "Avg.",
    sum_data_2020 = "Trend",
    avg_2010 = "Avg.",
    sum_data_2010 = "Trend",
    avg_2000 = "Avg.",
    sum_data_2000 = "Trend"
  ) |> 
      gtExtras::gt_plt_dist(sum_data_2000, type ="density", fill = "#013ca6") |> 
  gtExtras::gt_plt_dist(sum_data_2010, type ="density", fill = "#013ca6") |> 
  gtExtras::gt_plt_dist(sum_data_2020, type = "density", fill = "#013ca6") |> 
    gt::tab_spanner(label = "2020s",
              columns = c(avg_2020, sum_data_2020)) |> 
  gt::tab_spanner(label = "2010s",
              columns = c(avg_2010, sum_data_2010)) |> 
  gt::tab_spanner(label = "2000s",
              columns = c(avg_2000, sum_data_2000)) |> 
  cfbplotR::gt_fmt_cfb_logo(columns = "logo") |> 
  gt::fmt_number(
    columns = c(avg_2020, avg_2010, avg_2000),
    decimals = 1,
    use_seps = FALSE
  ) |> 
  gt::tab_header(title = "ACC Football: SP+ Average Percentile Rankings by Decade",
                 subtitle = "Full time members across all three decades in yellow.") |> 
  gt::tab_source_note(source_note = "@dadgumboxscores | June 20, 2023 | data via @ESPN_BillC")  |> 
  gtExtras::gt_theme_538() |> 
  gt::tab_style(
    style = list(
      gt::cell_borders(
        sides = c("left"),
        color = "#c1c1c1",
        weight = gt::px(2)
      )
    ),
    locations = list(
      gt::cells_body(
        columns = c(avg_2020, avg_2010, avg_2000)
      )
    )
  ) |> 
  gt::tab_style(
    style = list(
      gt::cell_text(
        transform = "capitalize",
        size = gt::px(16)
      )
    ),
    locations = gt::cells_column_spanners()
    ) |> 
    gtExtras::gt_highlight_rows(
    rows = c(1, 4, 5, 6, 10, 11, 15, 16),
    fill = "#ffffe0",
    font_weight = "normal"
  ) -> acc_table 

acc_table 
ACC Football: SP+ Average Percentile Rankings by Decade
Full time members across all three decades in yellow.
Team 2020s 2010s 2000s
Avg. Trend Avg. Trend Avg. Trend
Clemson 91.2 88.0 77.7
Notre Dame 88.4 83.6 67.2
Pittsburgh 77.9 63.8 74.0
Wake Forest 74.6 43.5 56.5
NC State 72.9 64.1 62.1
North Carolina 69.0 65.3 50.4
Louisville 66.1 68.0 66.3
Miami 63.6 72.7 83.2
Maryland 59.8 45.8 65.1
Florida State 53.9 81.2 82.1
Virginia 51.0 44.6 58.9
Virginia Tech 50.4 72.4 90.4
Boston College 40.0 51.9 79.0
Syracuse 37.4 49.2 45.7
Duke 35.9 54.8 21.6
Georgia Tech 22.0 62.3 72.6
@dadgumboxscores | June 20, 2023 | data via @ESPN_BillC
Code
# make Big Ten table 
big_teams <- c("Illinois", "Minnesota", "Northwestern", "Purdue", "Wisconsin", "Michigan", "Indiana", "Iowa", "Ohio State", "Michigan State", "Penn State", "Nebraska", "Maryland", "Rutgers", "USC", "UCLA")

sp_data |> 
  dplyr::filter(team %in% big_teams & decade > 1990) |> 
  dplyr::group_by(team, decade) |> 
  dplyr::summarize(sum_data = list(pctile), avg = mean(pctile), .groups = "drop") |> 
  tidyr::pivot_wider(names_from = c(decade), values_from = c(avg, sum_data)) |> 
  dplyr::select(team, avg_2020, sum_data_2020, avg_2010, sum_data_2010, avg_2000, sum_data_2000) |> 
  dplyr::mutate(logo = team) |> 
  dplyr::relocate(logo, .before = team) |> 
  dplyr::arrange(-avg_2020) |> 
  gt::gt() |> 
  gtExtras::gt_plt_dist(sum_data_2000, type ="density", fill = "#0088ce") |> 
  gtExtras::gt_plt_dist(sum_data_2010, type ="density", fill = "#0088ce") |> 
  gtExtras::gt_plt_dist(sum_data_2020, type = "density", fill = "#0088ce") |> 
  gt::cols_label(
    # rename columns
    logo = "",
    team = "Team",
    avg_2020 = "Avg.",
    sum_data_2020 = "Trend",
    avg_2010 = "Avg.",
    sum_data_2010 = "Trend",
    avg_2000 = "Avg.",
    sum_data_2000 = "Trend"
  ) |> 
  gt::tab_spanner(label = "2020s",
              columns = c(avg_2020, sum_data_2020)) |> 
  gt::tab_spanner(label = "2010s",
              columns = c(avg_2010, sum_data_2010)) |> 
  gt::tab_spanner(label = "2000s",
              columns = c(avg_2000, sum_data_2000)) |> 
  cfbplotR::gt_fmt_cfb_logo(columns = "logo") |> 
  gt::fmt_number(
    columns = c(avg_2020, avg_2010, avg_2000),
    decimals = 1,
    use_seps = FALSE
  ) |> 
  gt::tab_header(title = "Big Ten Football: SP+ Average Percentile Rankings by Decade",
                 subtitle = "Full time members across all three decades in yellow.") |> 
  gt::tab_source_note(source_note = "@dadgumboxscores | June 20, 2023 | data via @ESPN_BillC")  |> 
  gtExtras::gt_theme_538() |> 
  gt::tab_style(
    style = list(
      gt::cell_borders(
        sides = c("left"),
        color = "#c1c1c1",
        weight = gt::px(2)
      )
    ),
    locations = list(
      gt::cells_body(
        columns = c(avg_2020, avg_2010, avg_2000)
      )
    )
  ) |> 
  gt::tab_style(
    style = list(
      gt::cell_text(
        transform = "capitalize",
        size = gt::px(16)
      )
    ),
    locations = gt::cells_column_spanners()
    ) |> 
    gtExtras::gt_highlight_rows(
    rows = c(1, 2, 3, 4, 5, 6, 9, 10, 12, 14, 15),
    fill = "#ffffe0",
    font_weight = "normal"
  ) -> big_table 

big_table
Big Ten Football: SP+ Average Percentile Rankings by Decade
Full time members across all three decades in yellow.
Team 2020s 2010s 2000s
Avg. Trend Avg. Trend Avg. Trend
Ohio State 98.2 94.1 89.7
Michigan 91.5 82.0 78.8
Iowa 88.2 78.2 75.9
Wisconsin 86.3 90.2 77.5
Penn State 86.3 79.5 77.5
Minnesota 83.3 61.3 66.6
UCLA 73.8 59.0 66.9
USC 70.4 81.6 88.3
Purdue 67.6 43.1 70.6
Illinois 60.0 44.8 48.7
Maryland 59.8 45.8 65.1
Michigan State 57.3 80.3 65.0
Nebraska 54.9 73.9 82.3
Indiana 46.9 51.8 35.5
Northwestern 39.5 62.9 49.2
Rutgers 33.4 37.0 50.2
@dadgumboxscores | June 20, 2023 | data via @ESPN_BillC
Code
# make SEC table
sec_teams <- c("Florida", "Georgia", "Kentucky", "Tennessee", "Vanderbilt", "Alabama", "Auburn", "LSU", "Ole Miss", "Mississippi State", "South Carolina", "Arkansas", "Missouri", "Texas A&M", "Texas", "Oklahoma")

sp_data |> 
  dplyr::filter(team %in% sec_teams & decade > 1990) |> 
  dplyr::group_by(team, decade) |> 
  dplyr::summarize(sum_data = list(pctile), avg = mean(pctile), .groups = "drop") |> 
  tidyr::pivot_wider(names_from = c(decade), values_from = c(avg, sum_data)) |> 
  dplyr::select(team, avg_2020, sum_data_2020, avg_2010, sum_data_2010, avg_2000, sum_data_2000) |> 
  dplyr::mutate(logo = team) |> 
  dplyr::relocate(logo, .before = team) |> 
  dplyr::arrange(-avg_2020) |> 
  gt::gt() |> 
  gtExtras::gt_plt_dist(sum_data_2000, type ="density", fill = "#004b8d") |> 
  gtExtras::gt_plt_dist(sum_data_2010, type ="density", fill = "#004b8d") |> 
  gtExtras::gt_plt_dist(sum_data_2020, type = "density", fill = "#004b8d") |> 
  gt::cols_label(
    # rename columns
    logo = "",
    team = "Team",
    avg_2020 = "Avg.",
    sum_data_2020 = "Trend",
    avg_2010 = "Avg.",
    sum_data_2010 = "Trend",
    avg_2000 = "Avg.",
    sum_data_2000 = "Trend"
  ) |> 
  gt::tab_spanner(label = "2020s",
              columns = c(avg_2020, sum_data_2020)) |> 
  gt::tab_spanner(label = "2010s",
              columns = c(avg_2010, sum_data_2010)) |> 
  gt::tab_spanner(label = "2000s",
              columns = c(avg_2000, sum_data_2000)) |> 
  cfbplotR::gt_fmt_cfb_logo(columns = "logo") |> 
  gt::fmt_number(
    columns = c(avg_2020, avg_2010, avg_2000),
    decimals = 1,
    use_seps = FALSE
  ) |> 
  gt::tab_header(title = "SEC Football: SP+ Average Percentile Rankings by Decade",
                 subtitle = "Full time members across all three decades in yellow.") |> 
  gt::tab_source_note(source_note = "@dadgumboxscores | June 20, 2023 | data via @ESPN_BillC")  |> 
  gtExtras::gt_theme_538() |> 
  gt::tab_style(
    style = list(
      gt::cell_borders(
        sides = c("left"),
        color = "#c1c1c1",
        weight = gt::px(2)
      )
    ),
    locations = list(
      gt::cells_body(
        columns = c(avg_2020, avg_2010, avg_2000)
      )
    )
  ) |> 
  gt::tab_style(
    style = list(
      gt::cell_text(
        transform = "capitalize",
        size = gt::px(16)
      )
    ),
    locations = gt::cells_column_spanners()
    ) |> 
    gtExtras::gt_highlight_rows(
    rows = c(1, 2, 5, 7, 8, 9, 10, 11, 12, 13, 15, 16),
    fill = "#ffffe0",
    font_weight = "normal"
  ) -> sec_table

sec_table
SEC Football: SP+ Average Percentile Rankings by Decade
Full time members across all three decades in yellow.
Team 2020s 2010s 2000s
Avg. Trend Avg. Trend Avg. Trend
Alabama 98.9 98.3 83.2
Georgia 97.8 91.1 90.3
Oklahoma 89.4 92.7 94.6
Texas A&M 86.2 86.8 66.2
Florida 84.2 83.1 91.5
Texas 83.7 72.1 95.7
Ole Miss 81.8 70.2 65.5
LSU 80.6 93.3 90.3
Kentucky 78.4 61.0 55.9
Tennessee 76.0 69.8 81.7
Auburn 74.1 85.2 82.8
Mississippi State 69.2 81.8 45.1
Arkansas 68.5 64.5 75.7
Missouri 63.3 77.5 71.1
South Carolina 60.6 76.6 73.3
Vanderbilt 20.3 55.8 44.5
@dadgumboxscores | June 20, 2023 | data via @ESPN_BillC

Make rolling mean tables

Code
# make rolling mean tables
sp_data |>
  dplyr::filter(team %in% c("Ole Miss", "Colorado")) |>
  dplyr::filter(year > 1949) |> 
  ggplot2::ggplot(ggplot2::aes(x = year, y = pctile)) +
  ggplot2::geom_col(alpha = 3 / 10,
                    linetype = 0,
                    ggplot2::aes(fill = team)) +
  ggplot2::geom_line(ggplot2::aes(x = year, y = avg, color = team)) +
  cfbplotR::scale_color_cfb(alpha = .8) +
  cfbplotR::scale_fill_cfb(alpha = .8) +
  ggplot2::facet_wrap( ~ team, nrow = 4) +
  ggplot2::geom_hline(yintercept = 50.0,
                      linetype = 'dashed',
                      color = "#333333") +
   ggplot2::scale_x_continuous(breaks = seq(1950, 2022, 10)) +
  ggplot2::scale_y_continuous(breaks = seq(0, 100, 25)) +
  ggthemes::theme_fivethirtyeight() +
  ggplot2::theme(
    strip.text = cfbplotR::element_cfb_logo(size = 1),
    plot.title = ggtext::element_markdown(),
    plot.subtitle = ggtext::element_markdown(),
    text = ggplot2::element_text(family = "Arial"),
    panel.grid = ggplot2::element_blank()
  ) +
  ggplot2::labs(
    x = "",
    y = "",
    title = "<span style='color:#CFB87C;'>Colorado</span> and <span style='color:#CE1126;'>Ole Miss</span> Football  \nSP+ Percentile Rankings",
    
    subtitle = "Shows percentile by year and rolling 5 year average since 1950 season.",
    caption = "dadgumboxscores | June 20, 2023 | data via @ESPN_BillC"
  )  -> sp_data_plot


ggplot2::ggsave(
  "sp_plot.png",
  sp_data_plot,
  w = 8,
  h = 8,
  dpi = 600,
  type = 'cairo'
)

sp_data_plot

Coach GT Tables

Code
sp_data |> 
  dplyr::filter(year > 2004 & conf == "ACC") |> 
  dplyr::filter(team != "Notre Dame") |> 
  dplyr::select(year, team, pctile, off_pctile, def_pctile) |> 
  dplyr::mutate(coach = dplyr::case_when(
    team == "North Carolina" & year < 2007 ~ "John Bunting",
    team == "North Carolina" & year > 2006 & year < 2011 ~ "Butch Davis", 
    team == "North Carolina" & year == 2011 ~ "Everett Withers", 
    team == "North Carolina" & year > 2011 & year < 2019 ~ "Larry Fedora", 
    team == "North Carolina" & year > 2018 ~ "Mack Brown 2.0", 
    team == "Florida State" & year < 2010 ~ "Bobby Bowden", 
    team == "Florida State" & year > 2009 & year < 2018 ~ "Jimbo Fisher", 
    team == "Florida State" & year > 2017 & year < 2019 ~ "Willie Taggart", 
    team == "Florida State" & year == 2019 ~ "Willie Taggart/Odell Haggins", 
    team == "Florida State" & year > 2019 ~ "Mike Norvell", 
    team == "Boston College" & year < 2007 ~ "Tom O'Brien", 
    team == "Boston College" & year < 2009 & year > 2006 ~ "Jeff Jagodzinkski", 
    team == "Boston College" & year > 2008 & year < 2013 ~ "Frank Spaziani",
    team == "Boston College" & year > 2012 & year < 2020 ~ "Steve Addazio", 
    team == "Boston College" & year > 2019 ~ "Jeff Hafley",
    team == "Clemson" & year < 2008 ~ "Tommy Bowden", 
    team == "Clemson" & year == 2008 ~ "Tommy Bowden/Dabo Swinney", 
    team == "Clemson" & year > 2008 ~ "Dabo Swinney", 
    team == "NC State" & year < 2007 ~ "Chuck Amato", 
    team == "NC State" & year > 2006 & year < 2013 ~ "Tom O'Brien", 
    team == "NC State" & year > 2012 ~ "Dave Doeren", 
    team == "Maryland" & year < 2011 ~ "Ralph Friedgen", 
    team == "Maryland" & year > 2010 ~ "Randy Edsall", 
    team == "Wake Forest" & year < 2014 ~ "Jim Grobe", 
    team == "Wake Forest" & year > 2013 ~ "Dave Clawson", 
    team == "Virginia Tech" & year < 2016 ~ "Frank Beamer", 
    team == "Virginia Tech" & year > 2015 & year < 2021 ~ "Justin Fuente",
    team == "Virginia Tech" & year == 2021 ~ "Justin Fuente/JC Price",
    team == "Virginia Tech" & year == 2022 ~ "Brent Pry",
    team == "Miami" & year < 2007 ~ "Larry Coker", 
    team == "Miami" & year > 2006 & year < 2011 ~ "Randy Shannon", 
    team == "Miami" & year > 2010 & year < 2015 ~ "Al Golden", 
    team == "Miami" & year == 2015 ~ "Al Golden/Larry Scott",
    team == "Miami" & year > 2015 & year < 2019 ~ "Mark Richt",
    team == "Miami" &year > 2018 & year < 2022 ~ "Manny Diaz", 
    team == "Miami" & year == 2022 ~ "Mario Cristobal", 
    team == "Georgia Tech" & year < 2008 ~ "Chan Gailey",
    team == "Georgia Tech" & year > 2007 & year < 2019 ~ "Paul Johnson",
    team == "Georgia Tech" & year > 2018 & year < 2022 ~ "Geoff Collins",
    team == "Georgia Tech" & year == 2022 ~ "Geoff Collins/Brent Key",
    team == "Virginia" & year < 2010 ~ "Al Groh", 
    team == "Virginia" & year > 2009 & year < 2016 ~ "Mike London",
    team == "Virginia" & year > 2015 & year < 2022 ~ "Bronco Mendenhall",
    team == "Virginia" & year == 2022 ~ "Tony Elliott", 
    team == "Duke" & year < 2008 ~ "Ted Roof", 
    team == "Duke" & year > 2007 & year < 2022 ~ "David Cutcliffe", 
    team == "Duke" & year == 2022 ~ "Mike Elko",
    team == "Syracuse" & year > 2012 & year < 2016 ~ "Scott Shafer", 
    team == "Syracuse" & year > 2015 ~ "Dino Barbers", 
    team == "Pittsburgh" & year < 2015 ~ "Paul Chryst", 
    team == "Pittsburgh" & year > 2014 ~ "Pat Narduzzi", 
    team == "Louisville" & year < 2018 ~ "Bobby Petrino", 
    team == "Louisville" & year == 2018 ~ "Bobby Petrino/Lorenzo Ward", 
    team == "Louisville" & year > 2018 ~ "Scott Satterfield",
    TRUE ~ NA_character_
  )) -> coaches


coaches |> 
  dplyr::group_by(coach, team) |> 
  dplyr::summarise(avg_overall = mean(pctile), 
                   avg_off = mean(off_pctile),
                   avg_def = mean(def_pctile),
                   total_szn = dplyr::n(),
                   .groups = "drop") |> 
  dplyr::arrange(-total_szn) |> 
  dplyr::filter(team != "Maryland") -> the_coach


the_coach |> 
  dplyr::filter(team %in% c("NC State", "North Carolina", "Duke", "Wake Forest")) |> 
  dplyr::mutate(logo = team) |> 
  dplyr::select(logo, team, coach, total_szn, avg_overall, avg_off, avg_def) |> 
  gt::gt(groupname_col = "team") |> 
  gt::cols_label(
    # rename columns
    logo = "",
    coach = "Head Coach",
    total_szn = "Seasons",
    avg_overall = "Overall",
    avg_off = "Offense",
    avg_def = "Defense"
  ) |> 
  gt::tab_spanner(label = "Average SP+ Percentile",
                  columns = c(avg_overall, avg_off, avg_def)) |> 
  cfbplotR::gt_fmt_cfb_logo(columns = "logo") |> 
  gt::fmt_number(columns = c(avg_overall, avg_off, avg_def),
                 decimals = 2,
                 use_seps = FALSE) |> 
  gt::tab_header(title = "ACC Football Since 2005: Average SP+ Percentiles by Coach") |> 
  gt::tab_source_note(source_note = "@dadgumboxscores | June 28, 2023 | data via @ESPNBill_BillC") |> 
  gtExtras::gt_theme_538() -> first_four 

first_four
ACC Football Since 2005: Average SP+ Percentiles by Coach
Head Coach Seasons Average SP+ Percentile
Overall Offense Defense
Duke
David Cutcliffe 14 47.81 45.91 49.75
Ted Roof 3 11.17 11.00 24.20
Mike Elko 1 71.60 58.50 77.00
NC State
Dave Doeren 10 66.95 58.52 68.66
Tom O'Brien 6 54.88 53.20 57.13
Chuck Amato 2 52.25 21.65 80.50
Wake Forest
Dave Clawson 9 59.26 56.69 57.91
Jim Grobe 9 48.80 36.38 60.91
North Carolina
Larry Fedora 7 65.84 71.29 53.96
Butch Davis 4 64.78 42.17 79.03
Mack Brown 2.0 4 69.53 80.85 48.60
John Bunting 2 36.20 25.40 49.75
Everett Withers 1 61.50 57.20 67.40
@dadgumboxscores | June 28, 2023 | data via @ESPNBill_BillC
Code
the_coach |> 
  dplyr::filter(team %in% c("Clemson", "Georgia Tech", "Pittsburgh", "Louisville")) |> 
  dplyr::mutate(logo = team) |> 
  dplyr::select(logo, team, coach, total_szn, avg_overall, avg_off, avg_def) |> 
  gt::gt(groupname_col = "team") |> 
  gt::cols_label(
    # rename columns
    logo = "",
    coach = "Head Coach",
    total_szn = "Seasons",
    avg_overall = "Overall",
    avg_off = "Offense",
    avg_def = "Defense"
  ) |> 
  gt::tab_spanner(label = "Average SP+ Percentile",
                  columns = c(avg_overall, avg_off, avg_def)) |> 
  cfbplotR::gt_fmt_cfb_logo(columns = "logo") |> 
  gt::fmt_number(columns = c(avg_overall, avg_off, avg_def),
                 decimals = 2,
                 use_seps = FALSE) |> 
  gt::tab_header(title = "ACC Football Since 2005: Average SP+ Percentiles by Coach") |> 
  gt::tab_source_note(source_note = "@dadgumboxscores | June 28, 2023 | data via @ESPNBill_BillC") |> 
  gtExtras::gt_theme_538() -> second_four 

second_four
ACC Football Since 2005: Average SP+ Percentiles by Coach
Head Coach Seasons Average SP+ Percentile
Overall Offense Defense
Clemson
Dabo Swinney 14 88.33 80.87 85.08
Tommy Bowden 3 82.13 63.03 90.63
Tommy Bowden/Dabo Swinney 1 76.60 44.20 90.50
Georgia Tech
Paul Johnson 11 67.97 67.45 63.79
Chan Gailey 3 68.83 38.47 86.43
Geoff Collins 3 22.03 24.37 30.73
Geoff Collins/Brent Key 1 18.50 9.40 53.20
Pittsburgh
Pat Narduzzi 8 67.79 60.71 65.90
Paul Chryst 2 66.00 53.10 73.75
Louisville
Bobby Petrino 4 83.78 77.72 79.78
Scott Satterfield 4 61.30 66.38 54.02
Bobby Petrino/Lorenzo Ward 1 15.10 27.70 12.60
@dadgumboxscores | June 28, 2023 | data via @ESPNBill_BillC
Code
the_coach |> 
  dplyr::filter(team %in% c("Florida State", "Miami", "Boston College")) |> 
  dplyr::mutate(logo = team) |> 
  dplyr::select(logo, team, coach, total_szn, avg_overall, avg_off, avg_def) |> 
  gt::gt(groupname_col = "team") |> 
  gt::cols_label(
    # rename columns
    logo = "",
    coach = "Head Coach",
    total_szn = "Seasons",
    avg_overall = "Overall",
    avg_off = "Offense",
    avg_def = "Defense"
  ) |> 
  gt::tab_spanner(label = "Average |>  SP+ Percentile",
                  columns = c(avg_overall, avg_off, avg_def)) |> 
  cfbplotR::gt_fmt_cfb_logo(columns = "logo") |> 
  gt::fmt_number(columns = c(avg_overall, avg_off, avg_def),
                 decimals = 2,
                 use_seps = FALSE) |> 
  gt::tab_header(title = "ACC Football Since 2005: Average SP+ Percentiles by Coach") |> 
  gt::tab_source_note(source_note = "@dadgumboxscores | June 28, 2023 | data via @ESPNBill_BillC") |> 
  gtExtras::gt_theme_538() -> third_four 

third_four
ACC Football Since 2005: Average SP+ Percentiles by Coach
Head Coach Seasons Average |> SP+ Percentile
Overall Offense Defense
Florida State
Jimbo Fisher 8 90.39 78.53 88.86
Bobby Bowden 5 72.84 61.10 73.42
Mike Norvell 3 53.90 54.00 53.50
Willie Taggart 1 37.90 37.80 44.70
Willie Taggart/Odell Haggins 1 50.50 55.60 51.70
Boston College
Steve Addazio 7 58.06 42.11 72.01
Frank Spaziani 4 46.17 21.82 69.50
Jeff Hafley 3 39.97 33.80 51.47
Jeff Jagodzinkski 2 73.40 47.60 88.95
Tom O'Brien 2 82.95 60.90 92.20
Miami
Al Golden 4 67.47 63.67 63.30
Randy Shannon 4 66.45 51.27 75.17
Manny Diaz 3 70.10 65.93 63.90
Mark Richt 3 83.53 67.97 89.00
Larry Coker 2 79.70 47.15 95.20
Al Golden/Larry Scott 1 71.00 60.10 67.00
Mario Cristobal 1 42.60 22.40 64.00
@dadgumboxscores | June 28, 2023 | data via @ESPNBill_BillC
Code
the_coach |> 
  dplyr::filter(team %in% c("Virginia", "Virginia Tech", "Syracuse")) |> 
  dplyr::mutate(logo = team) |> 
  dplyr::select(logo, team, coach, total_szn, avg_overall, avg_off, avg_def) |> 
  gt::gt(groupname_col = "team") |> 
  gt::cols_label(
    # rename columns
    logo = "",
    coach = "Head Coach",
    total_szn = "Seasons",
    avg_overall = "Overall",
    avg_off = "Offense",
    avg_def = "Defense"
  ) |> 
  gt::tab_spanner(label = "Average SP+ Percentile",
                  columns = c(avg_overall, avg_off, avg_def)) |> 
  cfbplotR::gt_fmt_cfb_logo(columns = "logo") |> 
  gt::fmt_number(columns = c(avg_overall, avg_off, avg_def),
                 decimals = 2,
                 use_seps = FALSE) |> 
  gt::tab_header(title = "ACC Football Since 2005: Average SP+ Percentiles by Coach") |> 
  gt::tab_source_note(source_note = "@dadgumboxscores | June 28, 2023 | data via @ESPNBill_BillC") |> 
  gtExtras::gt_theme_538() -> four_four 

four_four
ACC Football Since 2005: Average SP+ Percentiles by Coach
Head Coach Seasons Average SP+ Percentile
Overall Offense Defense
Virginia Tech
Frank Beamer 11 79.40 58.55 87.91
Justin Fuente 5 72.76 69.86 63.40
Brent Pry 1 29.70 10.50 72.10
Justin Fuente/JC Price 1 54.40 38.50 62.70
Syracuse
Dino Barbers 7 48.43 46.57 46.43
Scott Shafer 3 39.93 27.50 63.50
Virginia
Bronco Mendenhall 6 55.22 56.52 53.55
Mike London 6 39.25 29.48 53.80
Al Groh 5 52.74 26.80 75.68
Tony Elliott 1 32.30 18.60 62.80
@dadgumboxscores | June 28, 2023 | data via @ESPNBill_BillC