Chapter 24: Key Takeaways

Quick Reference Summary

Tracking Data Fundamentals

Concept Key Points
Data Structure x,y coordinates at 10-25 Hz for all 22 players + ball
Field Coordinates 120 yards long (0-120), 53.3 yards wide (0-53.3)
Direction vs Orientation Direction = movement angle; Orientation = body facing
Standardization Transform so offense always moves left-to-right

Essential Formulas

Speed Calculation:
speed = sqrt(vx² + vy²)
vx = (x[t] - x[t-1]) × frame_rate

Distance Between Players:
distance = sqrt((x1-x2)² + (y1-y2)²)

Time to Contact:
ttc = distance / closing_speed
closing_speed = |v1 - v2| (considering direction)

Total Distance Traveled:
distance = Σ sqrt(Δx² + Δy²) for all frames

Movement Metrics

Metric Formula/Description Typical Range
Max Speed Peak speed during play 8-12 yds/sec
Acceleration Δspeed / Δtime 0-5 yds/sec²
Distance Traveled Sum of frame-to-frame distances 10-50 yards
Separation Euclidean distance to nearest defender 0-8 yards

Route Classification

Route Type Depth Lateral Movement
Go/Fly >15 yards <5 yards
Slant <8 yards >5 yards (crossing)
Out <8 yards >5 yards (sideline)
In/Dig <12 yards >5 yards (middle)
Curl 8-15 yards Returns toward QB
Corner >10 yards >8 yards (sideline)
Post >10 yards >8 yards (middle)

Formation Analysis

Box Count: Defenders within 5 yards of LOS, between tackles

Personnel Notation: - First digit = RBs - Second digit = TEs - Example: "11" = 1 RB, 1 TE, 3 WRs

Backfield Types: - Under Center: QB <2 yards from center - Pistol: QB 2-4 yards from center - Shotgun: QB >4 yards from center

Separation Benchmarks

Separation Quality Completion %
0-1 yards Tight ~42%
1-2 yards Contested ~59%
2-3 yards Average ~71%
3-4 yards Good ~79%
4+ yards Open ~85%+

Code Patterns

Loading Tracking Data:

df = pd.read_csv('tracking.csv')
df = df.sort_values(['play_id', 'frame_id', 'player_id'])

Calculating Speed:

df['vx'] = df.groupby('player_id')['x'].diff() * frame_rate
df['vy'] = df.groupby('player_id')['y'].diff() * frame_rate
df['speed'] = np.sqrt(df['vx']**2 + df['vy']**2)

Finding Nearest Defender:

def nearest_defender_distance(rec_x, rec_y, defense_df):
    distances = np.sqrt(
        (defense_df['x'] - rec_x)**2 +
        (defense_df['y'] - rec_y)**2
    )
    return distances.min()

Visualization Best Practices

  1. Field Background: Green (#228B22) with white yard lines
  2. Player Colors: Red for offense, blue for defense, brown for ball
  3. Animation Speed: 10-15 FPS for smooth playback
  4. Include: Yard lines, hash marks, end zones, current situation text

Common Pitfalls

Issue Problem Solution
Speed spikes Position noise Apply smoothing filter
Missing frames Data gaps Interpolate or flag
Coordinate flip Wrong direction Check play_direction field
Player count Not always 22 Validate before analysis

Key Metrics Summary

For Receivers: - Separation at throw - Separation created (max - initial) - Route efficiency (actual/straight distance) - Time to break

For Defense: - Box count - Safety depth and split - Coverage classification confidence - Time to pressure

For Quarterbacks: - Pocket area (convex hull) - Time to throw - Pressure rate - Optimal target selection

Industry Applications

  1. Player Evaluation: Quantify separation creation ability
  2. Game Planning: Identify defensive tendencies
  3. Real-Time Analytics: Live win probability and decisions
  4. Broadcasting: Enhanced viewer experience
  5. Contract Negotiation: Objective performance metrics