Loading Statcast Data
Statcast-Powered Analytics

Underestimated Player
Analyzer

Identifying players whose true talent is masked by bad luck or defensive positioning. The diff_rolling_OBA metric compares rolling wOBA against expected wOBA over configurable plate-appearance windows to surface hidden value.

Underestimated Player Rankings

# Player Team PA wOBA xwOBA Diff (Rolling) EV HH% Brl% AVG

Player Detail

Select a Player
Click any row in the rankings table to view detailed player analytics, rolling trends, and Statcast metrics.

League-Wide Distributions

xwOBA vs wOBA — Underestimation Map
Players below the diagonal are underperforming expected output based on contact quality
diff_rolling_OBA Distribution
Frequency of rolling wOBA–xwOBA differentials
Team Average Differential
Which rosters are collectively underestimated?

How It Works

wOBA

Weighted On-Base Average assigns linear weights to all offensive events — walks, singles, doubles, triples, home runs — based on their empirical run value. Unlike batting average, wOBA captures the true offensive contribution of each plate appearance.

wOBA = (0.69*BB + 0.89*1B + 1.27*2B + 1.62*3B + 2.10*HR) / PA

xwOBA

Expected wOBA uses Statcast data — exit velocity and launch angle — to predict what a player's wOBA should be based on quality of contact, removing the influence of luck, defensive alignment, and park effects.

xwOBA = f(exit_velocity, launch_angle) per batted ball event

diff_rolling_OBA

The core metric of this platform. Since xwOBA represents what a player's production should be based on contact quality, a large negative gap (wOBA − xwOBA < 0) means the player's actual results are significantly worse than expected. Historically, these gaps tend to regress — the larger the negative diff, the higher the probability that the player's wOBA will rebound toward xwOBA. This platform identifies exactly those players: batters whose current results are most likely to improve, making them the most underestimated.

diff_rolling_OBA = rolling_wOBA(N PA) − rolling_xwOBA(N PA)
Negative = underestimated → likely to rebound

Cross-Season Rolling

At the start of each new MLB season, no player has enough plate appearances for meaningful rolling windows. Instead of showing a blank page or stale data, this platform uses cross-season rolling windows that physically span the season boundary. For example, if a player has 20 PA in the new season and you select the 50 PA window, the calculation uses the last 30 PA from the previous season plus 20 PA from the new season.

As the new season progresses and players accumulate more PA, old-season data naturally rolls out of the window. Once all PAs in a window belong to the new season, the transition is seamless. When 10+ players reach 50 PA entirely within the new season, the system fully switches to single-season mode.

50 PA window = (50 − new_season_PA) from prev season + new_season_PA from current season
Updates daily → old season data gradually rolls out