Overview

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

Data Source/Loading

install.packages(“nflreadr”)

Data Source

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.

Data Transformation

## 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

Analysis

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.

Findings and Recommendations

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.

AI Use

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.