Exercises: Rushing and Running Game Analysis
Level 1: Conceptual Understanding
Exercise 1.1: Success Rate vs YPC
Explain why a running back with 4.0 YPC and 48% success rate might be more valuable than one with 4.5 YPC and 38% success rate.
Exercise 1.2: Yards After Contact
A running back has 1,000 rushing yards with 600 coming after contact. His teammate has 900 yards with 300 after contact. What does this tell you about: - Their respective skill levels? - The offensive line's contribution to each? - Who might perform better with a different team?
Exercise 1.3: RYOE Interpretation
If a back has +0.8 RYOE per carry, what does this mean? What if he has -0.5 RYOE per carry?
Exercise 1.4: Situational Value
Why is short-yardage conversion rate considered more valuable than overall YPC for evaluating a running back's reliability?
Exercise 1.5: EPA Difference
Two carries both gain 4 yards: - Carry A: 1st and 10 at the 50-yard line - Carry B: 3rd and 3 at the opponent's 30
Which has higher EPA? Explain why.
Level 2: Basic Calculations
Exercise 2.1: Calculate Success Rate
Given these 10 carries, calculate the overall success rate:
| Carry | Down | Distance | Yards Gained |
|---|---|---|---|
| 1 | 1 | 10 | 5 |
| 2 | 1 | 10 | 3 |
| 3 | 2 | 5 | 3 |
| 4 | 2 | 7 | 2 |
| 5 | 3 | 4 | 5 |
| 6 | 3 | 1 | 0 |
| 7 | 1 | 10 | 8 |
| 8 | 2 | 2 | 4 |
| 9 | 1 | 10 | 2 |
| 10 | 3 | 3 | 4 |
Success criteria: 1st down = 40%+, 2nd down = 50%+, 3rd/4th = 100%
Exercise 2.2: YAC Calculations
A running back has these statistics: - Total carries: 150 - Total yards: 675 - Total yards before contact: 350 - Broken tackles: 28
Calculate: - Yards per carry - Average yards before contact - Average yards after contact - YAC share percentage - Broken tackles per carry
Exercise 2.3: Stuff Rate
From these carries, calculate stuff rate (yards <= 0):
Yards gained: [4, -1, 2, 0, 6, -2, 3, 0, 5, 1, -1, 4, 2, 8, 0]
Exercise 2.4: Explosive Play Rate
A team has 450 rushing attempts. Of these: - 42 went for 10+ yards - 15 went for 20+ yards - 5 went for 40+ yards
Calculate the explosive play rate (10+ yards).
Exercise 2.5: Short-Yardage Analysis
A running back has these short-yardage carries (3rd/4th and 2 or less):
| Attempt | Distance | Yards |
|---|---|---|
| 1 | 1 | 2 |
| 2 | 2 | 1 |
| 3 | 1 | 3 |
| 4 | 2 | 0 |
| 5 | 1 | 1 |
| 6 | 2 | -1 |
| 7 | 1 | 4 |
| 8 | 2 | 2 |
Calculate conversion rate and stuff rate.
Level 3: Implementation
Exercise 3.1: Success Rate Calculator
def calculate_success_rate(carries: List[Dict]) -> Dict:
"""
Calculate rushing success rate.
Parameters:
-----------
carries : list
List of carries with 'down', 'distance', 'yards_gained'
Returns:
--------
dict with:
- total_carries
- successful_carries
- success_rate
- by_down (breakdown for each down)
"""
pass
Exercise 3.2: YAC Analyzer
def analyze_yards_after_contact(carries: List[Dict]) -> Dict:
"""
Calculate YAC metrics.
Parameters:
-----------
carries : list
Each carry has: yards_gained, yards_before_contact, broken_tackles
Returns:
--------
dict with:
- avg_ypc
- avg_ybc (yards before contact)
- avg_yac (yards after contact)
- yac_share
- broken_tackles_per_carry
"""
pass
Exercise 3.3: RYOE Calculator
def calculate_ryoe(carries: List[Dict]) -> Dict:
"""
Calculate Rush Yards Over Expected.
For simplicity, use this expected yards formula:
Expected = 4.0 - 0.3 * (defenders_in_box - 7)
Returns total RYOE and RYOE per carry.
"""
pass
Exercise 3.4: Situational Analyzer
def analyze_situational_rushing(carries: List[Dict]) -> Dict:
"""
Analyze rushing by situation.
Return separate analysis for:
- Short yardage (3rd/4th and 2 or less)
- Goal line (inside 5)
- Negative game script (trailing by 7+)
"""
pass
Exercise 3.5: RB Comparison Tool
def compare_running_backs(rb_data: Dict[str, List[Dict]]) -> pd.DataFrame:
"""
Compare multiple RBs across all metrics.
Return DataFrame with:
- carries, yards, ypc
- success_rate
- avg_yac
- explosive_rate
- composite_rank
"""
pass
Level 4: Advanced Analysis
Exercise 4.1: Build Expected Rushing Model
Create a more sophisticated expected rushing yards model:
class ExpectedRushingYardsModel:
"""
Features to consider:
- Defenders in box
- Run gap (A, B, C, off-tackle)
- Formation (shotgun, under center, pistol)
- Down and distance
- Score differential
- Time remaining
"""
def train(self, historical_data: pd.DataFrame):
"""Train model on historical plays."""
pass
def predict(self, play: Dict) -> float:
"""Predict expected yards."""
pass
def calculate_ryoe(self, carries: List[Dict]) -> pd.DataFrame:
"""Calculate RYOE with confidence intervals."""
pass
Exercise 4.2: Run Blocking Attribution
Develop a method to attribute rushing success between back and blocking:
class RushingAttribution:
"""
Attribute rushing success to:
- Offensive line (yards before contact)
- Running back skill (yards after contact)
- Scheme (play design)
"""
def calculate_attribution(self, team_carries: List[Dict]) -> Dict:
"""
Return percentage attribution:
- oline_contribution
- back_contribution
- scheme_contribution
"""
pass
Exercise 4.3: Workload-Adjusted Efficiency
Analyze how efficiency changes with workload:
def analyze_efficiency_by_workload(carries: List[Dict]) -> pd.DataFrame:
"""
Analyze:
- Efficiency on carries 1-10 vs 11-20 vs 20+
- Efficiency in first half vs second half
- Efficiency early season vs late season
Look for signs of fatigue or durability.
"""
pass
Exercise 4.4: RYOE Stability Study
Examine year-over-year RYOE stability:
def analyze_ryoe_stability(multi_year_data: Dict[str, Dict[int, List[Dict]]]) -> Dict:
"""
For each RB, calculate RYOE per year and examine:
- Year-over-year correlation
- Stability coefficient
- Regression to mean patterns
"""
pass
Exercise 4.5: Comprehensive Evaluation System
Build a complete RB evaluation system:
class RBEvaluationSystem:
"""
Multi-factor evaluation considering:
- Efficiency (success rate, RYOE)
- Volume (carries, yards)
- Big plays (explosive rate)
- Situational (short yardage, goal line)
- Durability (efficiency over workload)
- Receiving (catches, yards, targets)
- Protection (pass block wins)
Produce overall grade 0-100.
"""
def evaluate(self, rb_data: Dict) -> Dict:
"""Full evaluation with breakdown."""
pass
def compare(self, rb_list: List[Dict]) -> pd.DataFrame:
"""Rank multiple RBs."""
pass
Level 5: Research Projects
Exercise 5.1: RYOE Predictive Value
Research question: How well does RYOE predict future rushing performance?
Tasks: 1. Calculate RYOE for 50+ RBs over multiple seasons 2. Examine year-to-year correlation 3. Compare predictive power to YPC 4. Write report with visualizations
Exercise 5.2: Blocking vs Back Skill Study
Analyze the relative contribution of blocking vs back skill:
Tasks: 1. Compare backs who changed teams 2. Analyze YBC vs YAC for same plays/blocks 3. Determine what percentage of rushing success is attributable to each 4. Present findings with statistical support
Exercise 5.3: Short-Yardage Specialist Value
Study: Is short-yardage rushing skill a real trait?
Tasks: 1. Identify backs with extreme short-yardage conversion rates 2. Test if this persists year-over-year 3. Calculate the value of short-yardage conversion 4. Recommend roster construction strategy
Exercise 5.4: Rushing and Game Script
Analyze how rushing metrics vary by game script:
Tasks: 1. Define game script categories 2. Calculate success rate and efficiency by script 3. Identify backs who excel in different scripts 4. Discuss implications for evaluation
Exercise 5.5: The Value of an Elite RB
Calculate the replacement-level value added by elite backs:
Tasks: 1. Define replacement level (league average or worse) 2. Calculate value added above replacement 3. Convert to wins and/or draft value 4. Recommend appropriate RB investment strategy
Bonus Challenges
Challenge A: Real-Time Rushing Dashboard
Build an interactive dashboard showing: - Rolling success rate - RYOE trend - Situational performance - Comparison to league average
Challenge B: Rushing Tendencies
Analyze and visualize rushing tendencies: - Run gap frequency - Formation preferences - Down and distance patterns - Success rate by tendency
Challenge C: Machine Learning RYOE
Build a ML-based expected rushing model: - Feature engineering from play-by-play - Model comparison (linear, RF, XGBoost) - Feature importance analysis - Validation methodology
Solutions
Solutions are available in code/exercise-solutions.py