Exercises: Pace and Play Calling


Exercise 1: Basic Pace Calculation

A team ran 1,054 plays over 17 games. Calculate: - Plays per game - If they averaged 28 seconds between plays, how many minutes of possession per game?


Exercise 2: Pass Rate Analysis

A team's season data:

Category Passes Rushes
Total 612 442
Neutral situations 280 240

Calculate overall and neutral pass rates. What does the difference indicate?


Exercise 3: Game Script Effect

Team X's play calling by score differential:

Score State Passes Rushes
Down 7+ 185 65
Close (±6) 220 210
Up 7+ 95 145

Calculate pass rates for each situation. How much does game script affect this team's play calling?


Exercise 4: Pass vs Rush Efficiency

A team has these efficiency metrics:

Play Type EPA/Play Success Rate Std Dev
Pass +0.09 48% 1.4
Rush -0.04 44% 0.9

Calculate the pass premium. Should this team pass more or less?


Exercise 5: Fourth Down Expected Value

Situation: 4th & 2 at the opponent's 35-yard line, tied game, 25 minutes remaining.

Given: - Conversion probability: 65% - Field goal probability (52 yards): 68% - EP if convert: +3.5 points - EP if fail: -1.8 points - EP if FG miss: -2.1 points

Calculate expected value for: a) Going for it b) Field goal attempt

Which is optimal?


Exercise 6: Entropy and Predictability

A team has these pass rates by situation:

Situation Pass Rate
1st & 10 50%
2nd & Long 90%
3rd & Short 30%

Calculate Shannon entropy for each situation. Which is most predictable?


Exercise 7: Down and Distance Patterns

Analyze this team's play calling:

Situation Pass Rate EPA
1st down 45% +0.02
2nd & Short 35% -0.01
2nd & Long 72% +0.06
3rd & Short 55% +0.15
3rd & Long 88% -0.08

Identify the team's most and least efficient situations.


Exercise 8: Neutral Situation Analysis

Define "neutral" as: 1st/2nd down, score within 7, WP 35-65%.

From 500 total plays, 185 were in neutral situations (95 passes, 90 rushes).

Calculate: - Neutral pass rate - Compare to likely overall pass rate (~58%) - What does this reveal about the team's true philosophy?


Exercise 9: Tempo Comparison

Two teams' pace data:

Metric Team A Team B
Plays/Game 68 58
Sec/Play 24 32
Off EPA +0.08 +0.10

Which team is more efficient despite fewer plays? Calculate EPA per game for each.


Exercise 10: Fourth Down Decision Audit

A team's 4th down decisions over the season:

Field Position Distance Decision Optimal
Opp 35 2 FG Go
Opp 42 1 Punt Go
Opp 28 4 FG FG
Midfield 3 Punt Go
Own 35 6 Punt Punt

How many optimal decisions did the team make? What's their "correct" rate?


Exercise 11: Formation Tendencies

A team's play calling by formation:

Formation Passes Rushes Pass Rate
Shotgun 380 120 ?
Under Center 85 215 ?
Pistol 45 80 ?

Calculate pass rates. Which formation is a "tell"?


Exercise 12: Score-Time Analysis

Late in the 4th quarter, down by 4 points:

Time Left Pass Rate
5:00-4:01 65%
4:00-3:01 72%
3:00-2:01 80%
2:00-1:01 88%
< 1:00 95%

Is this pattern appropriate? Why or why not?


Exercise 13: Early Down Optimization

A team's 1st down data:

Play Type Attempts EPA/Play Success Rate
Pass 280 +0.06 49%
Rush 340 -0.02 43%

If they shifted 50 rushes to passes (maintaining same efficiency), how much total EPA would they gain?


Exercise 14: Predictability Score

Calculate predictability scores for two teams:

Team A: - 1st & 10: 52% pass - 2nd & Long: 68% pass - 3rd & Short: 48% pass

Team B: - 1st & 10: 48% pass - 2nd & Long: 85% pass - 3rd & Short: 25% pass

Which team is more predictable?


Exercise 15: Win Probability and Pass Rate

A team's pass rates at different win probabilities:

Win Prob Range Pass Rate EPA
20-30% 75% +0.04
40-50% 52% +0.06
50-60% 48% +0.05
70-80% 40% +0.02

In which range is the team most efficient? Should they adjust their neutral-game approach?


Programming Exercises


Exercise 16: Pace Calculator

Write a function to calculate comprehensive pace metrics:

def calculate_pace_metrics(pbp: pd.DataFrame, team: str) -> dict:
    """
    Calculate pace metrics for a team.

    Returns:
    - plays_per_game
    - seconds_per_play (average)
    - neutral_pace (plays in neutral situations per game)
    - pace_by_quarter
    """
    pass

Exercise 17: Pass Rate Analyzer

Build a pass rate analysis function:

def analyze_pass_rates(pbp: pd.DataFrame, team: str) -> pd.DataFrame:
    """
    Analyze pass rates across all situations.

    Returns DataFrame with columns:
    - situation (1st&10, 2nd&Short, etc.)
    - pass_rate
    - plays
    - epa
    - success_rate
    """
    pass

Exercise 18: Fourth Down Evaluator

Create a fourth down decision evaluator:

def evaluate_fourth_down(
    field_position: int,
    distance: int,
    score_diff: int,
    time_remaining: float,
    conversion_model: dict = None
) -> dict:
    """
    Evaluate optimal 4th down decision.

    Returns:
    - ev_go: Expected value of going for it
    - ev_fg: Expected value of field goal (if in range)
    - ev_punt: Expected value of punting
    - optimal_decision: 'go', 'fg', or 'punt'
    - confidence: How clear-cut the decision is
    """
    pass

Exercise 19: Game Script Visualizer

Create a visualization of pass rate by game state:

def plot_game_script_analysis(pbp: pd.DataFrame, team: str) -> None:
    """
    Create visualization showing:
    - Pass rate vs score differential
    - Pass rate vs win probability
    - Pass rate by quarter and score state

    Include reference lines for league averages.
    """
    pass

Exercise 20: Predictability Analyzer

Build a tendency detection system:

def analyze_predictability(pbp: pd.DataFrame, team: str) -> dict:
    """
    Measure team's play-calling predictability.

    Returns:
    - overall_entropy
    - situational_entropy (by down/distance)
    - formation_tells (formations with extreme pass rates)
    - personnel_tells
    - predictability_score (0 = unpredictable, 1 = very predictable)
    """
    pass

Challenge Exercises


Challenge 1: Optimal Pass Rate Model

Build a model that suggests optimal pass rates:

  1. Calculate pass and rush EPA for each team
  2. Account for variance (risk tolerance)
  3. Consider game state adjustments
  4. Compare suggested rates to actual rates
  5. Estimate "lost EPA" from suboptimal play selection

Challenge 2: Fourth Down Decision Audit

Audit an entire season of 4th down decisions:

  1. Load all 4th down plays
  2. Calculate optimal decision for each
  3. Compare to actual decision
  4. Calculate aggregate "decision value added"
  5. Rank coaches by 4th down aggressiveness

Challenge 3: Tempo Impact Study

Analyze whether tempo affects efficiency:

  1. Calculate pace metrics for all teams
  2. Segment by game situation (close vs blowout)
  3. Correlate pace with efficiency metrics
  4. Control for team quality
  5. Determine if tempo has causal effect on EPA

Challenge 4: Predictability Exploitation

Identify the most predictable teams and situations:

  1. Calculate conditional pass rates for all teams/situations
  2. Identify "tells" (extreme tendencies)
  3. Quantify the EPA difference when plays are predictable
  4. Determine if predictability costs teams wins

Challenge 5: Complete Play Calling Optimizer

Build a comprehensive play selection optimization system:

  1. Account for team-specific pass/rush efficiency
  2. Incorporate game state (score, time, field position)
  3. Include opponent defensive tendencies
  4. Model risk/variance preferences
  5. Generate play-by-play recommendations
  6. Backtest against actual outcomes

Solutions

Solutions are available in code/exercise-solutions.py