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
- Receiving ability (highest EPA)
- Close-game efficiency (meaningful carries)
- Ball security (fumbles are costly)
- Short-yardage conversion (situational value)
- 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.