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.
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
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
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
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"))
| 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 |
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.