FL Men's League Analytics
A real analytics pipeline for a recreational league. wRC+, WAR, and a custom chaos metric for a group of guys who work day jobs and play on Sundays. The absurdity is the point. The analytics are legit.
What it is
Scout Analytics is the data layer underneath Replacement Level Media. Every stat in a Max article, every number Bill cites in Power Rankings, every xCHAOS leaderboard Teddy inevitably gets wrong -- it all flows from this pipeline.
The system applies major league analytical frameworks to a recreational league where the talent range runs from "former D1 player" to "found on Facebook this morning." That calibration problem is actually interesting. The formulas are adapted -- not copy-pasted from FanGraphs.
Custom Metrics
wRC+
Weighted Runs Created Plus
League-calibrated offensive production. 100 = average player in this specific league. Accounts for park and league context -- which matters when you're playing on a 250-foot left field line.
WAR
Wins Above Replacement
Custom men's league version. Replacement level is defined as the sub you found on Facebook 20 minutes before the game in gray sweatpants borrowing someone else's glove. Negative WAR exists and is tracked.
xCHAOS
Chaos Index
Three-pillar z-scored index measuring a batter's ability to create unpredictable situations. Outcome (50%), Process (30%), Contact (20%). Built as a more holistic alternative to OPS for recreational league context.
The Pipeline
Fully automated from data drop to published leaderboard. The weekly workflow runs in minutes.
- 1
Export box score and play-by-play CSV from GameChanger after each game
- 2
Drop CSV into the Scout input folder
- 3
Run stats_calculator.py to compute all metrics
- 4
Output CSVs update the leaderboard automatically
- 5
RLM uses the updated stats for that week's analytics features
python stats_calculator.py --update --publish
Stack
Four seasons of historical data. Each season builds on the last. The formulas are calibrated to this specific league -- not copy-pasted from FanGraphs.