Introduction

This project aims to analyze and visualize the top kickers in the NFL using a dataset that includes variables such as kick attempts, kick length successful kicks, and length of play (at least one season). By exploring these variables, we can identify the most consistent and effective kickers, providing valuable insights into their overall performance.

Description of Project

This project involves analyzing NFL kicker performance by use of a dataset that has recorded details about each kick, including the season, kick length, special teams play type, and the result of the kick only if it was deemed a success. The analysis will focus on determining the top 50 Best kickers based on Average Kick length, and further analyze the success of the top 50kickers using a selected criteria based on touchbacks and kick result

Missing/ Irrelevant Data

To handle missing data, we removed any row listed as NA for both Kick length and SpecialTeamsPlayType To consolidate my data, I filtered out players with less than 5 kicks. I applied a similar constraint to only consider players who’ve played for more than one season

Calculating Kicker Stats

Using the mean function, I calculated the average kick length per selected player,arranging them in descending order. We then used the summarise and mutate functions to give a binary variable to the specialTeamsResult, calculating success based on successful kick attempts, touchbacks, and returns to aid in visualization

Visualizations

To represent the data visually, I first made a vertical bar chart demonstrating the top 50 kickers in descending order. To display the defined success rate, I made a table with each player and their corresponding success rate and average kick length

# Setup chunk for loading libraries

knitr::opts_chunk$set(echo = TRUE)
library(data.table)
library(dplyr)
library(ggplot2)


# Set working directory and load data
setwd("U:/IS470/Data")

# Load datasets
plays_df <- fread("plays.csv")
players_df <- fread("players.csv")
games_df <- fread("games.csv")
scouting_df <- fread("PFFScoutingData.csv")

# Left joins
df <- plays_df %>%
  left_join(games_df, by = "gameId") %>%
  left_join(scouting_df, by = c("gameId", "playId")) %>%
  left_join(players_df, by = c("kickerId" = "nflId"))
df_filtered <- df %>%
  select(displayName, season, gameId, playId, kickLength, specialTeamsPlayType,specialTeamsResult ) %>%
  
  # Group by displayName and possessionTeam for where a player was on multiple teams
  group_by(displayName) %>%
  
  # Summarise by counting distinct seasons and calculating total kicks and average kick length
  summarise(
    seasons = n_distinct(season),             
    total_kicks = n(),                         
    avg_kick_length = mean(kickLength, na.rm = TRUE)  
  ) %>%
  
  # Filter for kickers who played in more than one season
  filter(seasons > 1) %>%
  
  # Arrange  by total kicks (or you can use avg_kick_length or any other variable of interest)
  arrange(desc(total_kicks))



# Filter the top 100 kickers by average kick length
df_top50 <- df_filtered %>%
  arrange(desc(avg_kick_length)) %>%  # Sort in descending order by avg_kick_length
  slice_head(n = 50)  # Select the top 100 kickers

  df_kicker_stats <- df %>%
    select(displayName, specialTeamsResult, kickLength) %>%
    group_by(displayName) %>%
    summarise(
      total_kicks = n(),  # Total kicks for each kicker
      total_touchbacks = sum(specialTeamsResult == "Touchback", na.rm = TRUE),  # Count touchbacks
      total_returns = sum(specialTeamsResult == "Return", na.rm = TRUE),  # Count returns
      avg_kick_length = mean(kickLength, na.rm = TRUE),
      successful_kicks = sum(specialTeamsResult == "Kick Attempt Good", na.rm = TRUE)  # Count successful kicks
    ) %>%
    mutate(
      # success rate based on touchbacks, returns, and successful kicks
      success_rate = (total_touchbacks + total_returns + successful_kicks) / total_kicks * 100,  # Success rate as percentage
      TB_success = (total_touchbacks / total_kicks) * 100,  # Touchback success rate
      return_success = (total_returns / total_kicks) * 100  # Return success rate
    ) %>%
    filter(total_kicks > 5)   
  
# Sort the dataframe by average kick length (or success rate)
df_top50 <- df_kicker_stats %>%
  arrange(desc(success_rate)) %>%  # Sorting by average kick length
  slice_head(n = 50)  # Select the top 25 kickers
knitr::kable(df_top50 %>%
               select(displayName, success_rate, avg_kick_length),  # Select relevant columns
             caption = "Top 50 Kickers by Success Rate", 
             col.names = c("Kicker", " Success Rate (%)", "Avg Kick Length"))
Top 50 Kickers by Success Rate
Kicker Success Rate (%) Avg Kick Length
Giorgio Tavecchio 100.00000 42.60000
Matthew Wright 100.00000 54.26316
Ryan Santoso 100.00000 62.94118
Tristan Vizcaino 100.00000 47.75000
Wil Lutz 97.49035 62.29650
Justin Tucker 97.32824 60.83377
Graham Gano 96.49123 59.28249
Mason Crosby 95.94595 61.08280
Josh Lambo 95.60976 54.03205
Tyler Bass 95.60440 63.52344
Brandon McManus 95.49072 60.76792
Daniel Carlson 95.34884 58.76370
Jake Elliott 95.31250 61.14094
Jason Myers 95.13274 61.60299
Harrison Butker 95.10358 61.43850
Jason Sanders 95.00000 59.55806
Chris Boswell 94.92386 60.46127
Dustin Hopkins 94.75138 60.03401
Randy Bullock 94.52055 59.29787
Cairo Santos 94.42379 57.71707
Dan Bailey 94.34889 59.31126
Greg Zuerlein 94.31818 60.93373
Sebastian Janikowski 94.24460 60.06522
Greg Joseph 94.11765 62.20202
Younghoe Koo 93.86792 55.16667
Stephen Gostkowski 93.71585 60.32955
Stephen Hauschka 93.60000 57.81347
Cody Parkey 93.55828 61.21459
Brett Maher 93.35793 58.83251
Ka’imi Fairbairn 93.16239 59.27841
Rodrigo Blankenship 93.00000 46.96429
Phil Dawson 92.72727 59.17500
Mike Nugent 92.50000 53.48077
Zane Gonzalez 92.50000 59.86017
Chandler Catanzaro 92.43697 62.61905
Ryan Succop 92.43028 53.99320
Joey Slye 92.25092 63.41667
Michael Badgley 92.01878 51.01550
Sam Sloman 92.00000 61.79245
Aldrick Rosas 91.77632 59.40000
Chase McLaughlin 91.42857 50.27907
Austin Seibert 91.17647 58.84615
Nick Folk 90.80460 38.26667
Matt Prater 90.62500 46.69167
Robbie Gould 90.52632 37.80851
Sam Ficken 90.52632 57.74648
Matthew McCrane 90.24390 54.09375
Eddy Pineiro 90.19608 54.82667
Matt Bryant 89.88764 43.84615
Kai Forbath 89.85507 55.42000

Conclusion

In this Analysis we determined the top 50 kickers based on average kick length and top 50 based on defined success.In doing so, I’ve provided visualizations that demonstrate said success rates in comparison to other NFL kickers.