Methodology
This document describes the complete technical methodology behind the AllFame HOF Score. Every formula, weight, and calibration decision is documented here. If you find an error or have a suggestion, contact data@allfame.co.
OVERVIEW
The HOF Score is a composite 0–100 measurement that assesses where an active player's current résumé stands against the historical bar for Hall of Fame induction in their sport. It is not a prediction of induction — it is a measurement of the statistical case as it exists today.
The score is built from five weighted dimensions, each scored independently 0–100, then combined using fixed weights. The dimensions and weights are identical across sports. The metrics within each dimension are sport-specific and calibrated against historical induction data.
THE Formula
HOF_Score =
Career_Value × 0.30 // 30% weight
+ Milestones × 0.25 // 25% weight
+ Awards × 0.20 // 20% weight
+ Peak × 0.15 // 15% weight
+ Longevity × 0.10 // 10% weightWhy these weights? Career value (WAR/WS) is the strongest single predictor of induction across all sports, hence the highest weight. Milestones carry outsized influence in voter behavior despite being arbitrary thresholds. Awards validate excellence. Peak distinguishes inner-circle HOFers from compilers. Longevity is the lowest because talent matters more than tenure — but without it, injury-shortened careers can't be properly assessed.
DIMENSION 1: CAREER Value — 30%
The most comprehensive single measure of player value. We compare the player's current career value metric against the distribution of Hall of Famers at the same age and position.
MLB: Wins Above Replacement (WAR)
cv_score = percentile(player.war, hof_wars_at_same_age)
// Position adjustments:
if position == "C" cv_score += 8 // catcher scarcity
if position == "SS" cv_score += 5 // shortstop premium
if position == "CF" cv_score += 3 // center field
if position == "DH" cv_score -= 3 // no defensive value
if position == "1B" cv_score -= 3 // low defensive bar
// Two-way player bonus (Ohtani rule):
if HR > 50 AND pitching_wins > 20:
cv_score += 15 // historic two-way value
// Active production modifier:
if consecutive_seasons_war_below_1 >= 2 (last 3 yrs):
cv_score -= 10 // declining production penaltyWe use bWAR (Baseball Reference WAR) as the primary source. For the top ~100 active players, WAR values are manually verified against Baseball Reference. For remaining players, WAR is estimated from available stats.
NBA: Win Shares + Box Plus/Minus
ws_normalized = (player.win_shares / max_hof_ws) × 100
bpm_score = map(player.bpm, {
10+ → 100,
0 → 30,
-2 → 0
})
cv_score = ws_normalized × 0.6 + bpm_score × 0.4
// Position adjustments:
if position == "C" cv_score += 5
if position == "PG" cv_score += 3
// 3PT leader bonus:
if career_3pt_made > 3500 cv_score += 8DIMENSION 2: Milestones — 25%
Round numbers carry disproportionate weight in HOF voting. This dimension measures proximity to key statistical thresholds that have historically served as unofficial induction gates.
| Sport | Milestone | Weight | Historical Correlation |
|---|---|---|---|
| MLB | 500 Home Runs | 30 | 100% induction (non-PED) |
| MLB | 3,000 Hits | 30 | 100% induction (excl. Rose) |
| MLB | 75+ WAR | 25 | 98% induction |
| MLB | 400 Home Runs | 20 | 78% induction |
| MLB | 300 Wins (P) | 25 | 100% induction |
| MLB | 3,000 Strikeouts (P) | 20 | 83% induction |
| NBA | 30,000 Points | 30 | 100% induction (eligible) |
| NBA | 25,000 Points | 20 | 92% induction |
| NBA | 200+ Win Shares | 25 | 95% induction |
| NBA | 10,000 Assists | 25 | 100% induction |
// For each relevant milestone:
if crossed: points += weight × 1.0
if progress > 80%: points += weight × (pct / 100)
if progress > 50%: points += weight × (pct / 100) × 0.7
if progress < 50%: points += weight × (pct / 100) × 0.3
mi_score = min(100, total_points / max_possible × 100)
// Two-way players: evaluate BOTH hitting + pitching milestonesDIMENSION 3: AWARDS & Selections — 20%
Awards build the narrative case for induction. Each award is assigned a point value based on its historical correlation with induction in that sport.
| Award | MLB Points | NBA Points |
|---|---|---|
| MVP (1st) | 25 | 25 |
| MVP (additional) | +15 each | +15 each |
| All-Star / All-NBA | 6 each (cap 60) | 6 each (cap 60) |
| Championship | 10 each | 12 each |
| Finals/WS MVP | 12 | 18 |
| Cy Young | 25 / +15 | — |
| DPOY | — | 15 |
| ROY | 8 | 8 |
| Gold Glove / All-Defense | 4 each | 4 each |
aw_score = min(100, total_award_points / sport_max × 100)
// Sport max (inner-circle HOFer ceiling):
MLB_MAX = 150
NBA_MAX = 180
// NBA multi-MVP multiplier:
if mvp_count >= 2 AND sport == "nba":
aw_score *= 1.15DIMENSION 4: PEAK Performance — 15%
Peak distinguishes dominant players from accumulators. We measure the best consecutive 5-year stretch of production and compare it against Hall of Fame benchmarks.
best_5yr = max_consecutive_window(season_values, 5)
// MLB: season WAR values
// NBA: season Win Shares values
pk_score = percentile(best_5yr, hof_best_5yr_values)
// MVP-caliber season bonus:
for each MVP award: pk_score += 5 (cap +20)DIMENSION 5: Longevity — 10%
Longevity is the smallest weight because talent matters more than tenure. But durability determines whether talent converts into a Hall of Fame résumé.
// Sub-metric 1: Games played ratio (40%)
games_ratio = games / (seasons × full_season_games) × 100
// full_season: MLB=155, NBA=75
// Sub-metric 2: Quality seasons (40%)
quality_count = seasons where WAR >= 3.0 (MLB) or WS >= 6.0 (NBA)
// 12+ = 100, 8-11 = 75-99, 5-7 = 50-74, <5 = proportional
// Sub-metric 3: Active seasons (20%)
seasons_score = scale(seasons, { 18: 100, 14: 80, 10: 50 })
// Injury penalty:
penalty = injured_seasons × 12 (cap 40)
// Recent availability modifier:
recent_pct = games_last_4_seasons / possible_last_4_seasons
if recent_pct < 0.50: penalty += 15
if recent_pct < 0.30: penalty += 25 // replaces 15
lo_score = (games_ratio × 0.4 + quality × 0.4 + seasons × 0.2) - penalty
lo_score = clamp(0, 100)TIER Classification
| Score Range | Tier | Meaning |
|---|---|---|
| 90 – 100 | HOF Lock | Could retire today with a strong induction case. First-ballot candidate. |
| 75 – 89 | On Track | Current trajectory leads to HOF. Needs 2–4 more productive seasons. |
| 50 – 74 | Borderline | HOF-caliber talent but case is incomplete. Could go either way. |
| 0 – 49 | Unlikely | Would need dramatic career resurgence to build a viable case. |
Calibration
The algorithm went through 3 calibration iterations before launch. Key adjustments made:
- Two-way player bonus: Added +15 career value bonus for players with significant batting AND pitching stats (triggered by Ohtani scoring too low at 76.5 pre-calibration).
- Injury penalty increase: Raised from 8pts/season to 12pts/season with additional “recent availability” modifier for players missing 50%+ of games in last 4 seasons.
- NBA championship weight: Increased from 10 to 12 points. Finals MVP increased from 15 to 18. NBA multi-MVP multiplier of 1.15× added.
- All-Star value: Increased from 5 to 6 points per selection with cap raised from 50 to 60.
- MVP peak bonus: Added +5 per MVP season to peak score (cap +20).
Post-calibration validation targets: LeBron 97.5 (Lock), Curry 90.6 (Lock), Ohtani 89.9 (On Track), Trout 79.0 (On Track), Wembanyama 40.8 (Unlikely). All within acceptable range.
DATA Sources
| Source | Data Provided | Update Method |
|---|---|---|
| Baseball Reference | bWAR, career stats, HOF benchmarks (MLB) | Manual verification for top 100 players |
| MLB Stats API | Real-time game stats, rosters, awards (MLB) | Daily automated ingestion |
| Basketball Reference | Win Shares, BPM, VORP, HOF benchmarks (NBA) | Manual verification for top 60 players |
| NBA Stats API | Real-time game stats, rosters, awards (NBA) | Daily automated ingestion |
| HOF Voting Records | Historical voting data for calibration | Updated annually after voting results |
UPDATE Frequency
- Daily during season: Scores recalculate after each day's games using updated stats from league APIs.
- Award events: Immediate recalculation when MVP, Cy Young, All-Star, All-NBA, or similar awards are announced.
- HOF voting: Annual recalibration against actual voting results to validate and tune the model.
- Off-season: Scores are static unless roster moves, injuries, or award announcements occur.
KNOWN Limitations
- Voter behavior is unpredictable. The HOF Score measures the statistical case, not the political or narrative dynamics of actual voting. Jack Morris was inducted with a middling résumé; Barry Bonds was not inducted with a historic one.
- Young players score low by design. A 22-year-old with 2 elite seasons will score in the 40s-50s because the algorithm rewards accumulated value. This is intentional — it measures where you ARE, not where you COULD BE.
- Cross-sport comparison is approximate. While we calibrate so that 90 in MLB ≈ 90 in NBA, different sports have different HOF selection dynamics. The NBA Hall is easier to enter than the MLB Hall by historical standards.
- WAR/WS are imperfect. These are the best available composite metrics but they have known biases (WAR undervalues catchers and relievers, Win Shares has era adjustments that can distort).
- No “narrative” dimension. Factors like being the face of a franchise, postseason heroics beyond stats, and cultural impact are real influences on voting but are not captured in our model.
- Two-way players are structurally unusual. The Ohtani bonus is a manual calibration for a genuinely unprecedented situation. If more two-way players emerge, this dimension will need rethinking.
Changelog
All algorithm changes are documented here with dates and rationale.