Introduction

This R Markdown document analyzes NCAA quarterback performance and pressure metrics for Week 4, combining them into an overall score to rank quarterbacks. The analysis involves data manipulation, scaling, and weighting of various metrics to create a comprehensive ranking.

Load Data

# Load NCAA Files
passing_stats = read.csv("C:/Users/nkatzman1/Downloads/R-Studio Data/NCAA_Full_Passing_Stats.csv")
passing_pressure = read.csv("C:/Users/nkatzman1/Downloads/R-Studio Data/NCAA_Full_Passing_Pressure.csv")
time_in_pocket = read.csv("C:/Users/nkatzman1/Downloads/R-Studio Data/NCAA_Full_Time_in_Pocket.csv")

Data Preparation

# Merge the datasets by 'player', 'player_id', and 'team_name'
NCAA_QB_df = merge(passing_stats, passing_pressure, by=c('player', 'player_id', 'team_name'))
Full_NCAA_QB_df = merge(NCAA_QB_df, time_in_pocket, by=c('player', 'player_id', 'team_name'))

# Filter quarterbacks with at least 80 passing attempts (throws)
Full_NCAA_QB_df = Full_NCAA_QB_df |>
  filter(attempts >= 80)

# Ensure the relevant columns exist and handle any NA values
Full_NCAA_QB_df[is.na(Full_NCAA_QB_df)] = 0  # Replace NAs with 0s for calculations

Scaling QB Pressure Metrics

# Scale the pressure metrics individually to be out of 100
Full_NCAA_QB_df = Full_NCAA_QB_df |>
  mutate(
    scaled_sacks = 100 * (sacks - min(sacks)) / (max(sacks) - min(sacks)),
    scaled_time_to_throw = 100 * (avg_time_to_throw.x - min(avg_time_to_throw.x)) / 
      (max(avg_time_to_throw.x) - min(avg_time_to_throw.x)),
    scaled_scrambles = 100 * (scrambles - min(scrambles)) / (max(scrambles) - min(scrambles)),
    scaled_hit_as_threw = 100 * (hit_as_threw - min(hit_as_threw)) / (max(hit_as_threw) - min(hit_as_threw))
  )

Creating QB Pressure Score

# Create the scaled Pressure Score using the weights: sacks (30%), time to throw (30%), scrambles (30%), hit as thrown (10%)
Full_NCAA_QB_df = Full_NCAA_QB_df |>
  mutate(pressure_score = (scaled_sacks * 0.30) + 
           (scaled_time_to_throw * 0.30) + 
           (scaled_scrambles * 0.30) + 
           (scaled_hit_as_threw * 0.10))

Scaling QB Performance Score

# Scale the performance metrics individually to be out of 100
Full_NCAA_QB_df = Full_NCAA_QB_df |>
  mutate(
    scaled_ypa = 100 * (ypa - min(ypa)) / (max(ypa) - min(ypa)),
    scaled_touchdowns = 100 * (touchdowns - min(touchdowns)) / (max(touchdowns) - min(touchdowns)),
    scaled_twp = 100 * (turnover_worthy_plays - min(turnover_worthy_plays)) / 
      (max(turnover_worthy_plays) - min(turnover_worthy_plays)),
    scaled_btt = 100 * (big_time_throws - min(big_time_throws)) / 
      (max(big_time_throws) - min(big_time_throws)),
    scaled_comp_percent = 100 * (accuracy_percent - min(accuracy_percent)) / 
      (max(accuracy_percent) - min(accuracy_percent))
  )

Creating a QB Performance Score

# Calculate the scaled Performance Score with weights: YPA (20%), TDs (20%), TWP (20%), BTT (20%), Comp% (20%)
Full_NCAA_QB_df = Full_NCAA_QB_df |>
  mutate(performance_score = (scaled_ypa * 0.20) + 
           (scaled_touchdowns * 0.20) - 
           (scaled_twp * 0.20) + 
           (scaled_btt * 0.20) + 
           (scaled_comp_percent * 0.20))

QB Score Calculation

# Combine the Performance and Pressure Score: We'll still weigh the performance more heavily using a 80/20 split
Full_NCAA_QB_df = Full_NCAA_QB_df |>
  mutate(Overall_QB_Score = (performance_score * 0.8) + (pressure_score * 0.2))

Ranking and Display

# Rank quarterbacks by the final score
NCAA_QB_Rankings = Full_NCAA_QB_df %>%
  arrange(desc(Overall_QB_Score)) %>%
  select(player, team_name, Overall_QB_Score, performance_score, pressure_score)

# Display the top 10 quarterbacks
formatted_rankings = formattable(NCAA_QB_Rankings, 
                                  list(
                                    Overall_QB_Score = color_tile("white", "green"),
                                    performance_score = color_tile("white", "gold"),
                                    pressure_score = color_tile("white", "red")
                                  ))

formatted_rankings
player team_name Overall_QB_Score performance_score pressure_score
Cam Ward MIAMI FL 57.472018 64.2885116 30.206044
Jaxson Dart OLE MISS 57.431966 64.3054109 29.938187
Shedeur Sanders COLORADO 56.492454 53.1317081 69.935440
Dillon Gabriel OREGON 41.040486 44.1457308 28.619505
Diego Pavia VANDERBILT 39.513426 35.1898600 56.807692
Luke Altmyer ILLINOIS 38.710332 36.5300854 47.431319
Kurtis Rourke INDIANA 38.507009 41.8439257 25.159341
Kaidon Salter LIBERTY 38.418700 35.3877289 50.542582
Will Rogers WASHINGTON 38.217475 40.5857171 28.744505
Cade Klubnik CLEMSON 37.767819 44.7114902 9.993132
Eli Holstein PITTSBURGH 37.452363 29.6873628 68.512363
Chandler Morris N TEXAS 37.365790 40.8655476 23.366758
Garrett Nussmeier LSU 37.043665 42.4821226 15.289835
Billy Edwards Jr.  MARYLAND 36.837552 42.1726264 15.497253
Brendan Sorsby CINCINNATI 35.244257 35.1737965 35.526099
Blake Shapen MISS STATE 35.238532 30.5522859 53.983516
John Mateer WASH STATE 34.417058 28.1030527 59.673077
Josh Hoover TCU 34.372155 39.4720620 13.972527
Anthony Colandrea VIRGINIA 33.551965 29.6535550 49.145604
Haynes King GA TECH 33.373510 40.1097445 6.428571
Emmett Brown S JOSE ST 33.144505 35.7438175 22.747253
Dylan Raiola NEBRASKA 32.832863 33.9579740 28.332418
Gio Lopez S ALABAMA 32.458080 30.1203341 41.809066
Kyle McCord SYRACUSE 31.849099 32.4655631 29.383242
Hank Bachmeier WAKE 31.626809 26.3257507 52.831044
Nico Iamaleava TENNESSEE 31.490889 29.1850401 40.714286
Seth Henigan MEMPHIS 30.845404 29.5519479 36.019231
Owen McCown UTSA 30.823770 27.9129539 42.467033
Darian Mensah TULANE 30.682675 25.1349373 52.873626
Jordan McCloud TEXAS ST 30.660897 31.8917122 25.737637
Fernando Mendoza CAL 30.056107 23.7541996 55.263736
Behren Morton TEXAS TECH 30.043770 31.9812234 22.293956
Ben Wooldridge LA LAFAYET 29.665688 31.6477009 21.737637
Noah Fifita ARIZONA 29.300505 27.5030354 36.490385
Max Brosmer MINNESOTA 28.707721 23.8973569 47.949176
Maalik Murphy DUKE 28.501484 33.4633937 8.653846
Mikey Keene FRESNO ST 28.084312 30.2427530 19.450549
Devon Dampier NEW MEXICO 27.544134 25.7093576 34.883242
Sam Leavitt ARIZONA ST 27.524233 19.5539869 59.405220
Garrett Greene W VIRGINIA 27.231978 20.3267169 54.853022
Miller Moss USC 27.035669 27.5445857 25.000000
Alan Bowman OKLA STATE 26.494213 32.3141949 3.214286
Carson Beck GEORGIA 25.579766 25.7367272 24.951923
Nicholas Vattiato MIDDLE TN 25.481778 21.7612201 40.364011
Brayden Schager HAWAII 25.185737 15.8836134 62.394231
Jacob Zeno UAB 24.938233 21.6738213 37.995879
Taylen Green ARKANSAS 24.802954 14.4580190 66.182692
Jake Retzlaff BYU 24.695965 23.5499016 29.280220
Cole Snyder E MICHIGAN 24.530212 17.6967621 51.864011
DJ Uiagalelei FLORIDA ST 24.410566 15.9294160 58.335165
Kirk Francis TULSA 24.362591 24.6376476 23.262363
Keyone Jenkins FIU 23.744001 20.8149599 35.460165
Ethan Hampton N ILLINOIS 23.557562 24.7848645 18.648352
Taisun Phommachanh UMASS 22.935611 12.7265196 63.771978
Brady Cook MISSOURI 22.562048 22.1654718 24.148352
Kyron Drones VA TECH 22.552973 15.3182764 51.491758
Christian Veilleux GA STATE 22.429330 25.4302068 10.425824
Kadin Semonza BALL ST 22.187611 20.6359558 28.394231
Gevani McCoy OREGON ST 21.455384 15.4452600 45.495879
Jackson Arnold OKLAHOMA 21.091653 17.4943746 35.480769
Skyler Locklear UTEP 20.778304 11.0693772 59.614011
Rocco Becht IOWA STATE 20.741094 23.3405155 10.343407
Byrum Brown USF 20.110299 8.7360879 65.607143
Brendon Lewis NEVADA 20.013189 14.0755528 43.763736
Tucker Gleason TOLEDO 19.671506 18.3819648 24.829670
Avery Johnson KANSAS ST 19.640548 12.4088585 48.567308
Tyler Huff JVILLE ST 18.953063 15.1817135 34.038462
Joe Labas C MICHIGAN 18.838456 15.3931936 32.619505
Joey Aguilar APP STATE 17.971392 15.7832645 26.723901
Cam Fancher FAU 17.883678 2.4751332 79.517857
Ben Finley AKRON 17.882652 12.4110077 39.769231
CJ Ogbonna BUFFALO 17.845030 14.1043642 32.807692
Brock Vandagriff KENTUCKY 17.671031 10.4775248 46.445055
Ashton Daniels STANFORD 17.401155 9.8472541 47.616758
Donovan Smith HOUSTON 16.254574 8.8927372 45.701923
Cade McNamara IOWA 16.073445 14.0032072 24.354396
Connor Bazelak BOWL GREEN 15.934723 15.5039116 17.657967
JC French GA SOUTHRN 15.831425 11.0787728 34.842033
Ethan Vasko COAST CAR 15.385651 14.0754701 20.626374
Jake Garcia E CAROLINA 14.518583 8.0726799 40.302198
Isaac Wilson UTAH 13.541008 7.5454215 37.523352
Maddux Madsen BOISE ST 13.316086 13.3326078 13.250000
Ethan Garbers UCLA 12.540223 2.5451276 52.520604
Aidan Chiles MICH STATE 10.953191 2.8068740 43.538462
Riley Leonard NOTRE DAME 10.719654 4.3944170 36.020604
Brayden Fowler-Nicolosi COLO STATE 10.233701 3.4325800 37.438187
Brett Gabbert MIAMI OH 10.138036 3.7302375 35.769231
Jalon Daniels KANSAS 7.378948 -0.6616171 39.541209
Hunter Watson SM HOUSTON 6.793477 -2.9954482 45.949176
E.J. Warner RICE 6.790657 4.2846817 16.814560
Devin Kargman KENT STATE 5.776451 1.5900687 22.521978
Jaylen Raynor ARK STATE 3.605570 -4.2502494 35.028846
Evan Svoboda WYOMING 3.037471 -6.0372960 39.336538

Conclusion: Cameron Ward, Jaxson Dart, and Shadeur Sanders have dominated the field. Ward just edged out Dart for the top spot, with Sanders thriving despite having the highest pressure grade in the model.

Ward and Dart delivered more conventional success, benefiting from solid offensive line play, while Sanders excelled even under constant pressure, showcasing remarkable resilience and adaptability.

Excited to share these insights into the top-performing QBs through Week 4 of the 2024 season!

Let me know what model you want to see next!