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:
- Contact expectation — the model's prediction of the batted ball's outcome from its measured launch speed/angle and situational context, before defense or baserunning are involved.
- Outfield / infield opportunity — whether a defender had a realistic chance to make the play, given where and how hard the ball was hit.
- Defensive execution — how the actual defensive outcome compared to what a typical defender would be expected to do with that opportunity.
- Advancement — baserunner advancement value beyond the batted-ball outcome itself.
- Uncertainty — a 95% interval around each score, estimated by resampling games (not individual plays), to reflect sampling variability in a season-to-date sample.
- Qualification — only players who clear a minimum-sample threshold are
included in the official leaderboard ranking; others are reported as
small_sampleand excluded from ranking, though they can still be looked up on their own player page. - Provisional near-wall treatment — batted balls near the outfield wall use a specialist model that is still provisional (not yet fully calibrated across every venue); its share of a player's score is reported explicitly rather than hidden.
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.