Inspiration

Every year around awards season, my friends and I get into the same argument: who actually deserves MVP. Someone says points, someone says winning, someone says "but did you see his defense." Nobody ever agrees, because everyone's secretly using a different formula in their head. I wanted to build something that makes that formula explicit — instead of one more app that just tells you who the "correct" MVP is.

What it does

MVP Impact ranks NBA players using a formula you control. Six sliders — scoring, efficiency, playmaking, defense, rebounding, team success — and dragging any one of them re-ranks the entire league instantly. There's a leaderboard for six real seasons of data, a head-to-head comparison tool with a radar chart, and a full write-up of the math so nothing is a black box.

How we built it

I pulled real box-score data (2018-19 through 2023-24) from a public dataset and processed it with Python and pandas — aggregating game-by-game stats into player seasons, computing true shooting percentage, assist-to-turnover ratio, and team win percentage, then converting everything into z-scores relative to that season's league average. That got exported as a static JSON file. The actual app is Next.js and Tailwind, with the composite score formula and all the ranking logic running client-side, so the sliders can recalculate instantly with no server round-trip.

Challenges we ran into

The biggest one was deciding not to train a model on historical MVP voting data. I looked into it, but real voting datasets are messy and inconsistent, and honestly, training on past votes just teaches the model to copy old biases — market size, media narrative, name recognition — instead of measuring actual performance. It felt more honest to build a transparent formula than to fake precision with a model that's secretly just memorizing who voters already liked. The other challenge was normalizing stats fairly across seasons, since pace and scoring have changed a lot even in this six-year window — that's why every stat is scored relative to its own season, not a flat career number.

Accomplishments that we're proud of

Getting the Formula Builder to feel instant was the part I'm most happy with — there's no lag between moving a slider and seeing the whole leaderboard shuffle. I'm also proud that this isn't just "trust the algorithm." Anyone can open the Methodology page, read exactly how the score works, disagree with it, and go build their own version on the sliders.

What we learned

I learned a lot about how much cleanup real sports data actually needs before it's usable — box scores look simple until you're handling traded players, shortened seasons, and DNPs. I also learned that explainable and interactive usually beats "impressive-sounding" ML. A visible formula people can argue with is more useful than a model that just spits out a number.

What's next for MVP Impact

I'd like to add more award races beyond MVP — Defensive Player of the Year, Most Improved, Rookie of the Year — since the same z-score approach would work for all of them. Bringing in playoff data and adding a "clutch performance" category are on the list too, along with letting people save and share their own custom formulas instead of starting from scratch every visit.## Inspiration

Built With

Share this project:

Updates

Submission history