The dataset I have chosen for my beachhead assignment is the 2025 NFL
regular season player statistics dataset. I will use the
nflreadr package in R to load and analyze player-level
passing, rushing, receiving, and fantasy scoring statistics from the
2025 season.
I chose this dataset because I am a huge football and fantasy sports fan, and I am interested in using data to identify trends that may be useful when evaluating players. I also hope to pursue a career in sports analytics, so this project gives me an opportunity to work with data in an area that interests me.
The ESPN article below reviews fantasy football booms, busts, disappointments, and MVPs from the 2025 season. I plan to expand on the article by examining and providing additional player statistics and analysis’ for quarterbacks, running backs, wide receivers, and tight ends.
##Article Link ESPN: Fantasy football winners and losers from the 2025 season
install.packages(“nflreadr”)
The data for this analysis comes from the nflverse project and is
accessed through the nflreadr R package. I will use
regular-season player statistics from the 2025 NFL season.
The original dataset contains more information than is needed for this analysis. I will therefore create a smaller dataset containing the most relevant to fantasy football.
## installing packages
library(nflreadr)
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
## creating a file
nfl_2025 <- load_player_stats(
seasons = 2025,
summary_level = "reg"
)
## Viewing the data
head(nfl_2025)
## ── nflverse player stats: REG season ───────────────────────────────────────────
## ℹ Data updated: 2026-08-13 12:51:48 EDT
## # A tibble: 6 × 148
## player_id player_name player_display_name position position_group headshot_url
## <chr> <chr> <chr> <chr> <chr> <chr>
## 1 00-00229… P.Rivers Philip Rivers QB QB https://sta…
## 2 00-00234… A.Rodgers Aaron Rodgers QB QB https://sta…
## 3 00-00238… M.Prater Matt Prater K SPEC https://sta…
## 4 00-00242… M.Lewis Marcedes Lewis TE TE https://sta…
## 5 00-00255… N.Folk Nick Folk K SPEC https://sta…
## 6 00-00261… J.Flacco Joe Flacco QB QB https://sta…
## # ℹ 142 more variables: season <int>, season_type <chr>, recent_team <chr>,
## # games <int>, completions <int>, attempts <int>, passing_yards <int>,
## # passing_tds <int>, passing_interceptions <int>, sacks_suffered <int>,
## # sack_yards_lost <int>, sack_fumbles <int>, sack_fumbles_lost <int>,
## # passing_air_yards <int>, passing_yards_after_catch <int>,
## # passing_first_downs <int>, passing_epa <dbl>, passing_cpoe <dbl>,
## # passing_2pt_conversions <int>, pacr <dbl>, passing_10 <int>, …
## Consolidating data that we need
fantasy_2025 <- nfl_2025 |>
filter(position %in% c("QB", "RB", "WR", "TE")) |>
select(
player_id,
player_display_name,
position,
recent_team,
games,
attempts,
passing_yards,
passing_tds,
passing_interceptions,
carries,
rushing_yards,
rushing_tds,
receptions,
targets,
receiving_yards,
receiving_tds,
target_share,
air_yards_share,
fantasy_points_ppr
)
##renaming files
fantasy_2025 <- fantasy_2025 |>
rename(
Player_ID = player_id,
Player = player_display_name,
Position = position,
Team = recent_team,
Games = games,
Pass_Attempts = attempts,
Passing_Yards = passing_yards,
Passing_TDs = passing_tds,
Interceptions = passing_interceptions,
Carries = carries,
Rushing_Yards = rushing_yards,
Rushing_TDs = rushing_tds,
Receptions = receptions,
Targets = targets,
Receiving_Yards = receiving_yards,
Receiving_TDs = receiving_tds,
Target_Share = target_share,
Air_Yards_Share = air_yards_share,
PPR_Points = fantasy_points_ppr
)
## Adding a ppr per game column
fantasy_2025 <- fantasy_2025 |>
mutate(
PPR_Points_Per_Game = PPR_Points / Games
)
## Top 10 QBs
top_qbs <- fantasy_2025 |>
filter(Position == "QB", Games >= 8) |>
arrange(desc(PPR_Points_Per_Game)) |>
select(
Player,
Team,
Games,
PPR_Points,
PPR_Points_Per_Game
) |>
head(10)
top_qbs
## ── nflverse player stats: REG season ───────────────────────────────────────────
## ℹ Data updated: 2026-08-13 12:51:48 EDT
## # A tibble: 10 × 5
## Player Team Games PPR_Points PPR_Points_Per_Game
## <chr> <chr> <int> <dbl> <dbl>
## 1 Josh Allen BUF 16 365. 22.8
## 2 Drake Maye NE 17 352. 20.7
## 3 Matthew Stafford LA 17 350. 20.6
## 4 Patrick Mahomes KC 14 286. 20.4
## 5 Trevor Lawrence JAX 17 338. 19.9
## 6 Brock Purdy SF 9 177. 19.7
## 7 Jalen Hurts PHI 16 301. 18.8
## 8 Caleb Williams CHI 17 319. 18.7
## 9 Dak Prescott DAL 17 314. 18.5
## 10 Bo Nix DEN 17 305. 17.9
## Top 10 RBs
top_rbs <- fantasy_2025 |>
filter(Position == "RB", Games >= 8) |>
arrange(desc(PPR_Points_Per_Game)) |>
select(
Player,
Team,
Games,
PPR_Points,
PPR_Points_Per_Game
) |>
head(10)
top_rbs
## ── nflverse player stats: REG season ───────────────────────────────────────────
## ℹ Data updated: 2026-08-13 12:51:48 EDT
## # A tibble: 10 × 5
## Player Team Games PPR_Points PPR_Points_Per_Game
## <chr> <chr> <int> <dbl> <dbl>
## 1 Christian McCaffrey SF 17 417. 24.5
## 2 Bijan Robinson ATL 17 371. 21.8
## 3 Jahmyr Gibbs DET 17 367. 21.6
## 4 Jonathan Taylor IND 17 362. 21.3
## 5 De'Von Achane MIA 16 323. 20.2
## 6 James Cook BUF 17 302. 17.8
## 7 Chase Brown CIN 17 283. 16.6
## 8 Derrick Henry BAL 17 280. 16.4
## 9 Cam Skattebo NYG 8 128. 16.0
## 10 Josh Jacobs GB 15 237. 15.8
## Top 10 WRs
top_wrs <- fantasy_2025 |>
filter(Position == "WR", Games >= 8) |>
arrange(desc(PPR_Points_Per_Game)) |>
select(
Player,
Team,
Games,
PPR_Points,
PPR_Points_Per_Game
) |>
head(10)
top_wrs
## ── nflverse player stats: REG season ───────────────────────────────────────────
## ℹ Data updated: 2026-08-13 12:51:48 EDT
## # A tibble: 10 × 5
## Player Team Games PPR_Points PPR_Points_Per_Game
## <chr> <chr> <int> <dbl> <dbl>
## 1 Puka Nacua LA 16 375 23.4
## 2 Jaxon Smith-Njigba SEA 17 360. 21.2
## 3 Ja'Marr Chase CIN 16 314. 19.6
## 4 Amon-Ra St. Brown DET 17 324 19.1
## 5 Rashee Rice KC 8 150. 18.8
## 6 George Pickens DAL 17 292. 17.2
## 7 Drake London ATL 12 202. 16.8
## 8 Chris Olave NO 16 268 16.8
## 9 Davante Adams LA 14 223. 15.9
## 10 CeeDee Lamb DAL 13 201. 15.5
## Tight Ends
top_tes <- fantasy_2025 |>
filter(Position == "TE", Games >= 8) |>
arrange(desc(PPR_Points_Per_Game)) |>
select(
Player,
Team,
Games,
PPR_Points,
PPR_Points_Per_Game
) |>
head(10)
top_tes
## ── nflverse player stats: REG season ───────────────────────────────────────────
## ℹ Data updated: 2026-08-13 12:51:48 EDT
## # A tibble: 10 × 5
## Player Team Games PPR_Points PPR_Points_Per_Game
## <chr> <chr> <int> <dbl> <dbl>
## 1 Trey McBride ARI 17 316. 18.6
## 2 Brock Bowers LV 12 176. 14.7
## 3 George Kittle SF 11 162. 14.7
## 4 Tucker Kraft GB 8 117. 14.6
## 5 Kyle Pitts ATL 17 211. 12.4
## 6 Dallas Goedert PHI 15 185. 12.3
## 7 Sam LaPorta DET 9 107. 11.9
## 8 Harold Fannin Jr. CLE 16 186. 11.6
## 9 Travis Kelce KC 17 193. 11.4
## 10 Tyler Warren IND 17 188. 11.1
To compare fantasy performance across positions, I calculated PPR fantasy points per game, for players that played a minimum of eight games.
The tables above display the ten highest-scoring players by PPR points per game at quarterback, running back, wide receiver, and tight end.
The 2025 NFL player data gives us a useful way to compare fantasy production across quarterbacks, running backs, wide receivers, and tight ends. Using PPR points per game rather than total points helps account for differences in the number of games played and gives a clearer view of a player’s average weekly fantasy production.
We can extend this analysis with a predictive model using data from the last 3 seasons and creating multiple linear regressions.
OpenAI. (2026). ChatGPT (GPT-5.6 Sol) [Large language model]. Accessed September 6, 2026.
ChatGPT was used for guidance on project organization, R syntax, debugging, and explanations of code.