Dean Oliver's "four factors" are the closest thing basketball has to a unified theory of winning: nearly everything that decides a game reduces to shooting, taking care of the ball, rebounding your misses, and getting to the line. If you can compute these four numbers, you can explain most games better than the box score does. Here's how, from public data. Full code: scripts/cbb-four-factors-python.py.
The four formulas
eFG% = (FGM + 0.5 * 3PM) / FGA # shooting, crediting the extra 3-pt point
TOV% = TOV / (FGA + 0.475 * FTA + TOV) # ball security, per possession
ORB% = OREB / (OREB + opponent DREB) # share of your misses you rebound
FT rate = FTA / FGA # how often you get to the line
eFG% is the heavyweight; the other three are tiebreakers, in roughly that order.
Three of them come straight from one team's box score. ORB% is the tricky one: it needs the opponent's defensive rebounds, so you have to pair the two team rows from the same game. With sportsdataverse's hoopR data, each row carries a game_id and opponent_team_id, so a quick lookup does it:
dreb = {(r.game_id, r.team_id): r.defensive_rebounds for r in df.itertuples()}
# then, per team-row:
opp_dreb = dreb[(r.game_id, r.opponent_team_id)]
orb = r.offensive_rebounds / (r.offensive_rebounds + opp_dreb)
The result
Averaging every Division I team-game in 2024-25, and pulling out the eventual champion for contrast:
League averages (2025): eFG% 51.0 TOV% 15.1 ORB% 29.7 FT rate 33.2
Florida Gators: eFG% 55.0 TOV% 13.2 ORB% 38.3 FT rate 35.7
Actual output, sportsdataverse / hoopR, retrieved June 2026.
This is a championship profile in four numbers. Florida beat the league average on every factor, but the standout is offensive rebounding: 38.3% vs. a 29.7% league average. The Gators turned misses into second chances at an elite rate, shot efficiently (55% eFG), and rarely turned it over (13.2%). You didn't need to watch a game to know how they won — the factors told you.
Offense and defense are the same code
Run the identical calculation from the opponent's perspective and you get a team's defensive four factors — what it allowed. The best teams win the factor battle on both ends. And because hoopR and wehoop share a schema, this exact code computes the women's game too (see our sportsdataverse tutorial).
How to use them
- Diagnose, don't just describe. When a team overachieves, one factor usually explains it. Florida's was the offensive glass.
- Weight them. Analysts typically weight eFG% most (~40%), then turnovers, rebounding, and free throws. Don't treat all four equally.
- Pair with pace. The factors are rate stats; combine them with tempo for a complete profile.
Sources & further reading
- sportsdataverse / hoopR — sportsdataverse.org
- Companion code:
scripts/cbb-four-factors-python.py - Related: Adjusted efficiency · Tempo and shot selection