Positional Spending and Winning in the NFL

Introduction

Every NFL team has a salary cap that limits how much money can be spent on player contracts each season. In 2024, that cap sits at about $280 million, and it forces front offices to make tough choices about where to invest their money. I wanted to look into what positions teams chose to spend big on, and how this can effect their winning percentage. This project looks at the relationship between how teams allocate their salary cap by position and how successful those teams are on the field.

Oftentimes, NFL spending trends can be cyclical. For example, running backs used to be the star player on a team and commanded massive contracts, but in recent years, a wave of analytics and shifting team philosophies have led to the position being widely devalued. Many teams now believe they can get good production from cheap running backs, focusing their big spending elsewhere. However, teams like the superbowl winning Philadelphia Eagles, who in recent years have gone against the grain, investing more in their running game and still finding success. It is contradictions like this that made me want to explore this topic. To explore these questions, I analyzed how each NFL team allocated its cap across different position groups in 2024, and how those decisions related to team success.

## 
## 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
## 
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ lubridate 1.9.4     ✔ tibble    3.2.1
## ✔ purrr     1.0.4     ✔ tidyr     1.3.1
## ✔ readr     2.1.5     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ plotly::filter()        masks dplyr::filter(), stats::filter()
## ✖ readr::guess_encoding() masks rvest::guess_encoding()
## ✖ dplyr::lag()            masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
## 
## Attaching package: 'scales'
## 
## 
## The following object is masked from 'package:purrr':
## 
##     discard
## 
## 
## The following object is masked from 'package:readr':
## 
##     col_factor
## 
## 
## 
## Attaching package: 'reshape2'
## 
## 
## The following object is masked from 'package:tidyr':
## 
##     smiths
## # A tibble: 32 × 30
##    Team        QB     RB     WR     TE     LT     LG      C     RG     RT    IDL
##    <chr>    <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
##  1 49ers   5.44e6 1.04e7 2.63e7 1.50e7 2.40e7 7.07e6 3.67e6 2.19e6 3.17e6 1.79e7
##  2 Bears   8.33e6 9.74e6 3.80e7 1.99e7 5.33e6 7.35e6 4.51e6 1.34e6 5.46e6 1.72e7
##  3 Bengals 3.05e7 6.75e6 3.56e7 1.06e7 1.68e7 2.50e6 8.31e6 1.00e7 8.59e6 2.61e7
##  4 Bills   3.30e7 3.97e6 1.05e7 1.21e7 1.42e7 6.45e6 9.34e5 2.83e6 3.07e6 1.73e7
##  5 Broncos 1.31e7 5.05e6 1.26e7 5.22e6 2.19e7 7.61e6 9.34e5 5.04e6 9.36e6 2.61e7
##  6 Browns  3.10e7 1.03e7 1.19e7 1.30e7 5.37e6 1.45e7 5.36e6 1.22e7 1.42e7 1.23e7
##  7 Buccan… 8.95e6 5.05e6 3.89e7 4.23e6 1.72e6 9.14e6 5.88e6 4.70e5 8.31e6 3.35e7
##  8 Cardin… 5.05e7 1.54e7 1.52e7 3.69e6 6.92e6 2.15e6 8.20e6 6.24e6 9.70e6 1.96e7
##  9 Charge… 2.18e7 5.84e6 1.47e7 5.37e6 6.28e6 5.24e6 3.28e6 1.03e6 1.53e7 9.77e6
## 10 Chiefs  3.99e7 4.31e6 2.27e7 2.45e7 4.89e6 2.79e7 6.03e6 4.69e6 2.02e7 1.31e7
## # ℹ 22 more rows
## # ℹ 19 more variables: EDGE <dbl>, LB <dbl>, S <dbl>, CB <dbl>, K <dbl>,
## #   Offense <dbl>, Defense <dbl>, Oline <dbl>, Dline <dbl>, DB <dbl>,
## #   Passing <dbl>, Running <dbl>, team <chr>, wins <dbl>, losses <dbl>,
## #   ties <dbl>, win_pct <dbl>, total_spending <dbl>, offensive_spending <dbl>

Total Salary Cap Spending vs Win Percentage

## `geom_smooth()` using formula = 'y ~ x'

This scatterplot shows the relationship between total salary cap spending and team success, measured by win percentage. We see a moderate positive association, suggesting that teams that spend more tend to win more games, which makes intuitive sense. However, we can clearly see that this relationship is not perfect, and plenty of teams under or over perform by a lot. So, is success just about spending more or spending smarter?

Next, I wanted to look by positions and position groups. Are there certain positions where investment is more closely tied to success?

Position Group Spending by Team Heatmap

This heat map breaks down how teams allocate their salary cap by position group, showing the percentage of total cap dedicated to each. Some patterns are make sense, we can see that running backs, tight ends, and especially kickers consistently take up a smaller share of the cap. That makes sense becasue most teams only roster one kicker, and running back and tight end are often single-starter positions as well. Similarly, the offensive line command a much larger share of spending because there are five starters. Of course, many teams still spend heavily on quarterback even though there’s typically only one starter. This reflects the high market value of elite quarterbacks and the premium teams place on the position.

What stood out most to me were running backs and linebackers, both which show reletively low spending. Football media has recently claimed that these roles are being devalued, so it was interesting to see that reflected here.

Proportion of Cap by Position Group

To take the analysis a step further, I wanted to look at how each individual team distributes its salary cap across position groups. This stacked bar chart displays the proportion of cap spent by each team, allowing for a clearer visual comparison of spending strategies. Here, the balance between offensive and defensive spending becomes much more apparent. For example, the LA Rams stand out as a team that allocates a noticeably larger share of their cap to offense compared to defense. Other teams tend to have a more balanced approach. Because the chart is interactive, hovering over each colored segment reveals the exact dollar amount spent per position group, making it easy to explore and compare cap strategies in greater detail.

Position Group Spending Over Time

Shiny applications not supported in static R Markdown documents

This interactive graph allows us to explore the relationship between cap spending at individual positions or grouped position categories and team win percentage. By selecting a position from the dropdown menu, we can see how investment in that specific role correlates with success across the league.

You can look at individual positions like QB, RB, WR, or EDGE, or examine broader groups I put together like:

  • Offensive Line (LT, LG, C, RG, RT)
  • Offense (all offensive positions)
  • Defense (all defensive positions)
  • D-Line (IDL and EDGE)
  • Defensive Backs (Safeties and Corners)
  • Passing (QB, WR, TE)
  • Rushing (RB and O Line)

However, it’s important to be cautious when interpreting these plots. A strong correlation at one position might seem convincing at first glance, but it could be confounded by trade-offs elsewhere. Since every team is bound by the same salary cap, spending more on one area inherently means spending less on another.

## `geom_smooth()` using formula = 'y ~ x'
## `geom_smooth()` using formula = 'y ~ x'

Intuitively, you might expect that spending more on either side of the ball would result in more wins. But when we split the cap like this we can see something different. The first scatterplot, Offensive Spending vs Win Percentage, shows a moderate positive association. Teams that spend more on offense tend to win more, which feels intuitive. But, the second plot, Defensive Spending vs Win Percentage, shows a negative relationship. It looks like spending more on defense is associated with fewer wins, which seems counterintuitive at first glance.

Of course, all teams are bound by the same salary cap. So if you’re spending heavily on one side, you’re necessarily spending less on the other. These two plots reflect that zero-sum tradeoff. It’s not that defense doesn’t matter, but rather that how you balance your spending within the cap constraint is what really shapes outcomes, which reminds us that its inportant to avoid drawing overly simplistic conclusions from correlations alone.

Win Percentage Per Million Spent by Position

This bar chart looks at which positions give teams the most return on investment in terms of winning. To do this, I calculated efficiency as a team’s win percentage divided by how much they spent on a given position (in millions). Each bar represents the average efficiency across all teams for each position in the 2024 season. Positions at the top of the chart are those where spending tends to translate to wins more effectively. This isn’t necessarily saying teams should only spend money on those high-efficiency positions—but it does highlight potential value opportunities. For example, if a position like Right tackle is generating more win percentage per dollar than Quarterback, it might be worth considering if elite talent at those positions is being undervalued. It’s important to keep in mind that this doesn’t account for factors like positional scarcity, scheme fit, or injuries, but it helps us start thinking about where cap dollars might stretch further.

## 
## Call:
## lm(formula = win_pct ~ QB + RB + WR + TE + Oline + IDL + EDGE + 
##     LB + S + CB + K, data = final_df)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.37369 -0.15463  0.02659  0.11743  0.47562 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)
## (Intercept)  3.189e-01  4.670e-01   0.683    0.503
## QB           3.133e-09  3.691e-09   0.849    0.406
## RB          -1.280e-08  1.255e-08  -1.020    0.320
## WR          -9.012e-10  4.513e-09  -0.200    0.844
## TE           7.647e-09  8.898e-09   0.859    0.400
## Oline        2.302e-09  4.116e-09   0.559    0.582
## IDL          3.438e-09  5.359e-09   0.641    0.528
## EDGE        -7.859e-10  4.860e-09  -0.162    0.873
## LB          -5.652e-09  7.491e-09  -0.754    0.459
## S            2.141e-09  6.728e-09   0.318    0.754
## CB           3.652e-09  6.877e-09   0.531    0.601
## K           -1.190e-09  2.391e-08  -0.050    0.961
## 
## Residual standard error: 0.2332 on 20 degrees of freedom
## Multiple R-squared:  0.2625, Adjusted R-squared:  -0.1431 
## F-statistic: 0.6473 on 11 and 20 DF,  p-value: 0.7688
Shiny applications not supported in static R Markdown documents

Conclusion

The cap forces teams to make difficult decisions, balancing their spending across a wide range of positions to maximize team success while staying under the league’s financial limits. As we delved into the data, our primary goal was not just to understand how teams allocate their resources, but to challenge the assumptions and trends that often drive these decisions.

We found that while spending more money overall does correlate with better win percentages, this association isn’t as simple as it may seem. The trade-offs teams face between investing in offense versus defense—both constrained by the same salary cap—are complex and, at times, contradictory. While offensive spending often shows a positive relationship with success, defensive spending exhibits a negative one, reinforcing the idea that spending smarter is just as critical as spending more. Ultimately, the teams that can best balance their spending across key positions, while remaining adaptable to the evolving nature of the NFL, will be those best positioned for success. It’s also important to note that this analysis doesnt take into account how teams can spend big in terms of draft capital on key positions. These highly drafted rookies are haivng major resources (draft capital) expended to acquire them, but they usually won’t be major hits against the cap until their second contract.

This exploration into the NFL salary cap has been an attempt to not only understand how the numbers work, but to challenge and rethink the underlying strategies that guide decision-making in the league. As the NFL continues to evolve, teams that adopt a more data-driven, flexible approach to their salary cap management will be more likely to maximize their resources, and perhaps most importantly, win more games.