Key Takeaways: Rushing Analytics

One-page reference for Chapter 7 concepts


Core Rushing Metrics

Metric Formula Meaning
EPA/Carry Total EPA / Carries Efficiency per rush
Success Rate EPA > 0 Plays / Total Consistency
YPC Yards / Carries Traditional efficiency
Stuff Rate 0-or-less / Total O-line failure rate

Quick EPA Reference

rb_stats = (
    pbp
    .query("rush_attempt == 1")
    .groupby('rusher_player_name')
    .agg(
        carries=('rush_attempt', 'sum'),
        epa=('epa', 'mean'),
        success_rate=('epa', lambda x: (x > 0).mean()),
        ypc=('yards_gained', 'mean')
    )
    .query("carries >= 100")
)

EPA Interpretation (Rushing)

EPA/Carry Interpretation
> 0.05 Excellent
0.00 to 0.05 Above average
-0.10 to 0.00 Average
-0.15 to -0.10 Below average
< -0.15 Poor

Note: Average rushing EPA is negative (~-0.05). Breaking even is good!


Pass vs Rush Efficiency

Play Type Avg EPA Success Rate
Pass ~+0.05 ~45%
Rush ~-0.05 ~42%

Gap: ~0.10 EPA per play favoring passing


Why YPC Misleads

Problem Explanation
Ignores context 3 yards on 3rd-and-2 > 6 yards on 1st-and-10
Scheme-dependent Outside zone inflates YPC
Rewards volatility 1,1,1,1,16 = same as 4,4,4,4,4
Conflates O-line Blocking creates yards before contact

Game Script Effects

rushes['game_state'] = pd.cut(
    rushes['score_differential'],
    bins=[-100, -7, 7, 100],
    labels=['Behind', 'Close', 'Ahead']
)
Game State Rush Volume Rush EPA
Ahead 7+ High Lower (clock kill)
Close Normal Normal
Behind 7+ Low Variable

Decomposing Rush Production

Component Who Controls
YBC (Yards Before Contact) O-line, scheme
YAC (Yards After Contact) Running back
# Isolate RB skill with YAC
rb_yac = rushes.groupby('rusher_player_name').agg(
    yac_per_carry=('yards_after_contact', 'mean')
)

RB Value Hierarchy

  1. Receiving ability (highest EPA)
  2. Close-game efficiency (meaningful carries)
  3. Ball security (fumbles are costly)
  4. Short-yardage conversion (situational value)
  5. Volume (least important)

When Rushing Matters

Situation Why Rush?
3rd/4th and 1-2 Low variance advantage
Goal line Compressed field
Clock kill Time > points
Heavy play-action Set up pass

Filtering Garbage Time

meaningful_rushes = rushes[
    (rushes['qtr'] <= 3) |
    (abs(rushes['score_differential']) <= 14)
]

Common Pitfalls

Pitfall Reality
Leading rusher = best Volume ≠ efficiency
High YPC = elite Context matters
Rushing TDs = skill Opportunity-dependent
Volume predicts wins Winning predicts volume

RB Contract Principles

  • Don't pay for volume (replaceable)
  • Pay for receiving (scarce)
  • Avoid long contracts (short peaks)
  • Draft Day 2-3 (value sweet spot)

Evaluation Framework

1. Efficiency (EPA/carry, success rate)
2. Usage (touches, snap share)
3. Receiving (targets, catch rate, YAC)
4. Situations (short yardage, goal line)
5. Context (team, opponents, O-line)

What Statistics Miss

  • Vision and patience
  • Pass protection ability
  • Durability patterns
  • Locker room leadership
  • Practice habits

Preview: Chapter 8

Next: Receiving Analytics — evaluating pass-catchers with target share, separation, and efficiency metrics.