Stats Glossary
How each statistic is calculated and what it measures.
Elo Rating System
Elonew = old + K × MOV × (actual − expected)
A team strength rating where 1500 is the D1 average. After each game, ratings shift based on the result, margin of victory, and how surprising the outcome was. Stronger wins against better opponents earn bigger gains; blowout losses to weak teams cost more.
K Factor (Recency-Weighted)K = 20 × (0.8 + 0.4 × season_progress)
Controls how much each game moves ratings. Early-season games use a lower K (16) since rosters are still settling, ramping up to a higher K (24) late in the season when games matter more. The base K of 20 is tuned for ~56-game college softball seasons.
Margin of Victory MultiplierMOV = ln(diff + 1) × 2.2 / (2.2 + 0.001 × |eloDiff|)
Blowouts count for more than close wins, but with diminishing returns (logarithmic). The autocorrelation correction (denominator) prevents strong teams from inflating their ratings by running up scores against weak opponents — if you were already heavily favored, a large margin adds less.
Home Advantage+25 Elo points
Home teams receive a 25-point Elo boost when calculating expected outcomes. This doesn't change stored ratings, only game predictions.
Back-to-Back Penalty−10 Elo points
Teams playing on consecutive calendar days receive a 10-point penalty to reflect pitching fatigue and roster strain common in tournament and doubleheader formats.
Season Reversionstart = 0.6 × prev_final + 0.4 × 1500
At the start of each season, ratings revert 40% toward the mean (1500). This accounts for roster turnover while still rewarding teams that were strong last year. New teams with no history start at 1500.
Power Rating (PWR)
PWRrank percentile weighted composite
A composite rating combining multiple stats into a single team strength measure. Each component is converted to a rank percentile (0–1) across all D1 teams, then weighted and summed. Uses rank percentiles instead of z-scores to be robust against skewed distributions.
| Component | Weight | Why |
|---|---|---|
| Elo | 40% | Strongest single predictor of postseason success; encodes SOS implicitly |
| Adj Offense | 20% | Run production adjusted for opponent quality |
| Adj Defense | 20% | Runs allowed adjusted for opponent quality (inverted) — defense wins championships |
| Ace Adj ERA | 20% | Ace pitcher ERA adjusted for opponent offensive quality — rewards dominant #1 starters |
Adjusted Stats
AdjO — Adjusted OffenseΣ(runs × adj_factor) / Σ(innings)
Runs scored per inning, weighted by opponent quality. Each game's runs are multiplied by a logistic adjustment factor based on the opponent's Elo rating. Beating a 1700-Elo team gets ~1.56× weight; scoring against a 1200-Elo team gets only ~0.30×. This properly rewards scoring against good pitching.
AdjD — Adjusted DefenseΣ(runs_allowed / adj_factor) / Σ(innings)
Runs allowed per inning, discounted by opponent quality. Runs allowed against strong offenses are divided by their adjustment factor, giving credit for holding elite lineups in check. Lower is better.
Logistic Adjustment Factoradj = 2 × E(opp_elo, 1500)
The opponent quality weight uses the Elo expected score formula instead of a simple linear ratio. This creates a proper S-curve: weak opponents (Elo 1200) get severely discounted (~0.30×) while strong opponents (Elo 1700) get meaningful bonus (~1.56×). A linear approach (Elo/1500) would only give 0.80× for a 1200-team, barely penalizing cupcake scheduling.
SOS — Strength of Scheduleavg opponent Elo at game time
The average Elo rating of all opponents, measured at the time each game was played (not their final season rating). This captures true schedule difficulty — playing a team early when they were weaker counts differently than playing them when they're peaking.
QW — Quality Winscount of wins vs top-50 Elo opponents
Number of victories against teams ranked in the top 50 by Elo at the time the game was played. Actually beating good teams is a stronger signal than just playing them (which SOS captures).
RPI — Rating Percentage Index0.25×WP + 0.50×OWP + 0.25×OOWP
The standard NCAA committee metric. WP is the team's win percentage, OWP is the average win percentage of all opponents (excluding games against the team), and OOWP is the average OWP of all opponents. Heavily weights opponent quality (75% schedule-dependent). Shown for reference — it does not feed into PWR because it ignores margin of victory, home/away, and game recency.
Pitcher Stats
aAcE — Adjusted Ace ERAΣ(ace_ER / adj_factor) / Σ(ace_IP) × 7
The team's ace (primary pitcher by innings pitched) ERA, adjusted for opponent offensive quality. Earned runs against strong offenses are discounted; runs against weak offenses are amplified. Multiplied by 7 for the softball per-game rate. This measures how dominant a team's top pitcher is relative to the competition they faced.
AcPy — Ace PythagoreanRS_ace^1.83 / (RS_ace^1.83 + RA_ace^1.83)
Expected win percentage during the ace's innings, treating them as isolated from the rest of the pitching staff. Runs scored are pro-rated by the ace's share of game innings (ace_IP / game_IP). Runs allowed use the ace's actual earned runs. This separates ace performance from bullpen performance without requiring a minimum IP threshold.
rGS± — Rolling Game Score Adjustmentace_rGS − team_avg_rGS
How much better (or worse) the ace's rolling game score is compared to the team's overall pitching game score. Game score is an in-game quality metric (40 + outs×2 − ER×4 − unearned×2), exponentially smoothed with a 0.1 decay factor to weight recent performance. Positive means the ace outperforms the staff average.
aRGS — Ace Rolling Game ScoreEWMA(game_score, α=0.1)
The ace pitcher's rolling game score — an exponentially weighted moving average of per-start game scores that captures recent pitching dominance. Used as a PWR component (10% weight) because it reflects current form better than season-long ERA. Higher is better.
ERA — Earned Run Average(ER / IP) × 7
Traditional ERA scaled to 7 innings (softball standard). When boxscore pitching data is sparse, falls back to runs allowed from game scores.
ERA+ (Player)(league_ERA / adj_ERA) × 100
Individual pitcher ERA adjusted for opponent offensive quality, then scaled where 100 = league average. Higher is better. A pitcher with ERA+ of 150 was 50% better than league average after accounting for opponent strength. Uses the same logistic Elo adjustment as team-level stats — earned runs against strong offenses are discounted.
Batting Stats
AVG — Batting Averagehits / at_bats
Traditional batting average across all games.
OBP — On-Base Percentage(H + BB) / (AB + BB)
Approximation of on-base percentage. The NCAA API doesn't provide hit-by-pitch or sacrifice fly data, so this slightly overestimates true OBP.
SLG — Slugging Percentagetotal_bases / at_bats
Total bases (1B + 2×2B + 3×3B + 4×HR) divided by at-bats. Measures extra-base power.
wRC+ (Player)(adj_wOBA / league_wOBA) × 100
Opponent-adjusted wOBA (weighted on-base average) scaled to league average (100). Per-game hits are distributed into singles, doubles, triples, and home runs using each player's season-level extra-base-hit rates, then weighted with linear weights (BB 0.69, 1B 0.88, 2B 1.27, 3B 1.62, HR 2.10). Each game's wOBA is adjusted for opponent quality via Elo — performing against a 1700-Elo pitching staff counts for more than against a 1200-Elo team. A wRC+ of 130 means 30% better than average against quality-adjusted competition.
Expected & Luck
Pyth — Pythagorean Win%RS^1.83 / (RS^1.83 + RA^1.83)
Expected win percentage based on runs scored and allowed, using a 1.83 exponent (calibrated for college softball, slightly lower than baseball's 1.83 due to shorter games and more variance). Teams that significantly over- or under-perform their Pythagorean expectation tend to regress toward it.
Luckactual_win% − Pythagorean_win%
How much a team's actual record exceeds (positive) or falls short of (negative) their expected record based on run differential. Lucky teams win more close games than expected. Regressed toward zero with a 10-game Bayesian prior to handle small sample sizes.
Game Predictions
Win Probability1 / (1 + 10^((opp_elo − team_elo) / 400))
Pre-game win probability from the Elo logistic model, including home advantage (+25) and back-to-back penalty (−10). Displayed as a percentage in the game log.
Predicted Margin(team_rpg × opp_rapg / league_rpg) − (opp_rpg × team_rapg / league_rpg)
Expected run margin for future games. Uses a log5-style projection: each team's run scoring rate is adjusted for the opponent's defensive rate relative to the league average. Home teams get a 3% scoring boost. Shown as +/− from the team's perspective — positive means favored, negative means underdog.
Pitcher Win/Loss Methodology
W / L / SV
Individual pitcher decisions from NCAA boxscores. The NCAA API sometimes reports per-game decisions (0 or 1) and sometimes cumulative season totals in the same field. We use the cumulative maximum when a pitcher has enough innings to justify the count (IP ≥ wins × 3), and sum per-game decisions otherwise. This filters out ghost entries where a relief pitcher's single appearance carries the entire staff's cumulative record. As a result, individual pitcher wins may slightly exceed team wins due to data mixing across formats.
Sample Size Regression
Bayesian Shrinkageeffective = (n × observed + 10 × league_mean) / (n + 10)
Rate stats (AdjO, AdjD, aAcE, rGS±) are regressed toward the league average using a Bayesian prior worth 10 games of evidence. At 7 games played, ~59% of the value comes from the league mean; at 20 games, ~33%; at 55 games (full season), only ~15%. This prevents early-season outliers from dominating rankings. Pythagorean stats (Pyth, AcPy) are not regressed — the formula naturally handles small samples and regression would compress the range.