# Plays per game
plays_per_game = total_plays / games_played
# Seconds per play (within drives)
seconds_per_play = (prev_clock - current_clock).mean()
# Neutral pace (close games, early downs)
neutral_pace = neutral_plays / games
# Typical league values
pass_epa = +0.05 # Positive on average
rush_epa = -0.03 # Negative on average
pass_premium = pass_epa - rush_epa # ~0.08
Key insight: Passing is more efficient, but has higher variance.
Game Script Effects
Score State
Expected Pass Rate
Down 14+
70-80%
Down 7-13
60-70%
Down 1-6
55-60%
Tied
50-55%
Up 1-6
50-55%
Up 7-13
45-50%
Up 14+
35-45%
Fourth Down Decision Framework
# Expected value of going for it
ev_go = (conv_prob * ep_success) + ((1 - conv_prob) * ep_failure)
# Expected value of field goal
ev_fg = (fg_prob * 3) + ((1 - fg_prob) * ep_miss)
# Expected value of punt
ev_punt = -ep_at_opponent_position