The complete guide to football analytics for sports betting, fantasy football, and data science. Learn EPA, win probability, and data-driven decision making.
Kickoff is September 9. The season hub, the frozen prediction ledger, and the opening slate — every number derived, graded in public.
Every 2026 page in one place: the schedule analysis, all eight division previews, and a tracker page for each of the 32 teams.
Open the season hubA frozen win probability for every 2026 game, published before kickoff and graded after. Week 1 is locked; misses stay on the page.
See the predictionsSixteen openers across four days — a Wednesday Super Bowl rematch, Melbourne, and every pairing's head-to-head ledger since 1999.
Read the slateFree interactive calculators for NFL analytics, betting, and fantasy football
Calculate Expected Points for any down, distance, and field position situation.
Use ToolShould you go for it, punt, or kick? Analyze the optimal fourth-down decision.
Use ToolEstimate win probability from the score margin, time remaining, and which side has the ball.
Use ToolFind +EV bets by comparing your probability estimates to betting odds.
Use Tool153 plain-English studies of the advanced numbers — each one the formula, a chart built from the bundled game log, and the caveat that keeps you from over-reading it. Latest October 16, 2026
The library runs from the metrics a broadcast quotes — expected points, DVOA, success rate, CPOE — through the structural effects that move games (home field, rest, weather), to the market studies that test what the betting line already knows (spread accuracy, road favorites, key numbers). The 12 newest are below; the rest are indexed on the explainers page.
The free source most public NFL analysis runs on is nflverse: 24 data releases on GitHub, 4,376 files, no key, CC BY 4.0. The catalog, how to load it with nflreadr or nflreadpy (nfl_data_py is archived and deprecated), the two releases that are traps, and a timed test: after Thursday night's game the 2026 play-by-play file was replaced 4 hours 18 minutes after kickoff.
All eight divisions have a sole leader through Thursday of week 6, from San Francisco 2.5 games clear to Carolina by half a game, and each leader also has its division's best point differential. In 192 division races since 2002, a team alone in first after week 5 won the division at .673, and two-game leaders won 26 of 32.
Four per-attempt parts, each held between 0 and 2.375, added, divided by 6 and multiplied by 100: that is the whole formula, and why its ceiling is 158.3. Two real lines worked through every step, Drake Maye's 113.5 for 2025 and a 2026 game where two caps bind; the formula as a straight line, in which a touchdown is worth 80 yards and an interception costs 100; and where the league's 13-point rise since 2003 came from.
Minnesota leads the league at +6 after week 5, with Jacksonville, Kansas City and Washington at +5 and Indianapolis and New Orleans last at -6. The week-6 games set both teams' margins side by side, the widest gap the Chargers at Kansas City. Across 736 team-seasons since 2003, a five-game margin carried into the rest of the season at only .18, and opponents' fumbles recovered at .06.
Both teams are 3-2 and Seattle is first on the site's Elo board, but by EPA per play its offense is 26th and Denver's 24th; the defenses rank second and seventh. Seattle's run game (-.275 per run, 30th) meets Denver's 28th-ranked run defense, and Seattle's net edge is .062 per play. Since 2002, road teams with an edge that size won .464 of their games.
San Francisco leads the league in net EPA per play after week 5 at +.260; Buffalo has the best offense and Minnesota, 5-0 with the 28th offense, the best defense. Across 768 team-seasons since 2002, five-game net EPA tracked the rest of the season (.394) about as well as point margin (.419), and the offensive half held up far better than the defensive half.
Every team has played four or five games, and the AFC and NFC standings after week 5 set each record beside its points. Five records run a full win or more ahead of their Pythagorean count, San Francisco, Minnesota, Kansas City, Buffalo and Cleveland (3-2 at -19), and three a full win behind, Houston, the Chargers and Tampa Bay. Since 2002, 75 teams a win ahead after five games won .522 of the rest, close to their Pythagorean .535 and far from their .792 record; point margin carried nearly all the signal.
After Buffalo's Monday win at the Rams closed week 5, the site's 20,000-season simulation gives every team's playoff and division odds. The AFC field is fairly settled; in the NFC seven teams sit between 35% and 55%. Chicago at Atlanta has the most at stake in week 6, 71.2 points of playoff odds; Carolina at Philadelphia the most for division titles. None of the six division games ranks in the top six. Since 2002, about three and a half playoff teams a season came from outside the top seats after week 5.
The ledger's frozen rows went eight right and three wrong in week 5's twelve Sunday games, and the Giants and Washington finished 27-27. The Brier score of .1679 beat the closing market's .1741 and Thursday's DraftKings board, and the two games in which ledger and market picked different winners split one each. For the season the ledger now leads the close .2173 to .2243. Since 2010 the engine has led the close after week 5 in four seasons and kept the lead in two, each time from a bigger lead than this one. Written before Monday night's game.
Run before and after Sunday's twelve games, the site's 20,000-season simulation moves the 32 playoff odds by a combined 208.3 points. Chicago fell furthest, from 65.9% to 37.3% after losing 31-7 at Green Bay; Baltimore at Atlanta had the most at stake, and San Francisco at Seattle the least for the playoffs, though it swung the NFC West title. Per game it was a quiet week 5, 19th of 25 since 2002. Over those seasons week-5 moves held at a slope of 0.79: falls stuck, and rises gave some back. Monday night is drawn from the board, unplayed.
Kansas City and Carolina take the first byes of 2026 in week 5 and then play thirteen straight weeks. Since 2002 a long run of games without a week off has cost nothing measurable: across 5,481 games, each game of difference in the two teams' runs moved results by -.001 against the site's engine and -0.01 points against the closing spread, and early-bye teams matched both in December. The part of the bye that shows up is the first game back, where teams have beaten the engine's numbers by .045, a rest edge the engine cannot see and the market mostly prices.
Seven teams changed head coach for 2026, and four of them are 3-1. Together the seven are 14-14, 1.45 wins ahead of the site's engine and 2.26 ahead of the closing line, and the August board gave four or more 3-1 starts a .047 chance. In the engine's graded window, 2010-2025, the 20 new-coach teams that beat it by a win or more over four games kept beating it, by .072 a game; over every season since 2000 that falls to .030, a lead rather than a finding. Written before this weekend's games.
From foundational concepts to advanced machine learning techniques, this textbook covers everything you need to master NFL analytics.
Browse All ChaptersData infrastructure, nflverse, wrangling, and visualization basics.
5 ChaptersPassing, rushing, EPA analysis, success rate, and efficiency metrics.
7 ChaptersCoverage analysis, pass rush, run defense, and scheme evaluation.
6 ChaptersFourth down decisions, two-point conversions, and win probability.
4 ChaptersMachine learning, Bayesian methods, tracking data, and simulation.
5 ChaptersSpecial teams, personnel, college football, and future trends.
18 ChaptersIn-depth analytics profiles for all 32 NFL teams
100+ code examples in R and Python covering data loading, EPA analysis, visualization, betting models, and machine learning.
# Load NFL play-by-play data with nflfastR
library(nflfastR)
library(tidyverse)
# Get 2024 season data
pbp_2024 <- load_pbp(2024)
# Calculate team EPA per play
team_epa <- pbp_2024 %>%
filter(!is.na(epa)) %>%
group_by(posteam) %>%
summarize(
plays = n(),
total_epa = sum(epa),
epa_per_play = mean(epa),
success_rate = mean(success)
) %>%
arrange(desc(epa_per_play))
# View top offenses
head(team_epa, 10)
Data-driven betting strategies
Learn how to use analytics to find +EV bets, manage your bankroll, and make smarter betting decisions.
Data sources, tools & community
Curated collection of the best NFL analytics resources, data sources, APIs, and learning materials.
Start with Chapter 1 and work your way through the full curriculum.