Methodology

What Contact Luck measures, what it does not measure, and its current limitations.

Definitions

Contact Luck Runs
The number of runs by which a batter's observed eligible batted-ball outcomes were more or less favorable than the model expected.
Contact Luck Runs per 100
Contact Luck Runs normalized to 100 eligible batted balls.
Positive
More favorable realized outcomes than expected.
Negative
Less favorable realized outcomes than expected.

Limitation. Contact Luck is a retrospective description of realized outcomes, not a measure of stable batting talent and not a projection of future performance.

How a score is built

Each fair batted ball is compared against what the model expected given its measured contact quality and the situation it occurred in. The difference between the actual outcome's run value and the model's expectation, summed across a player's eligible batted balls, is their Contact Luck Runs. At a high level, that expectation is built from several stages:

Read more technical detail ↓

Technical details

Every component's per-play model carries its own status (for example calibrated, calibrated_with_limited_subgroup_evidence, provisional, or unavailable) and, where relevant, a reason code explaining why a play could not be scored by a given component (for example missing_geometry or not_outfield_air_ball_bb_type). A player's own page shows these directly, along with the share of their total score coming from components that are still provisional rather than fully calibrated. Uncertainty intervals use a game-clustered bootstrap (not a per-play bootstrap), because plays within the same game are not independent observations.

For the full modeling history, versioning, and validation results behind the frozen model this dashboard displays, see the project's README.md and CLAUDE.md.