My role Data sourcing, cleaning & dashboard design — solo, end-to-end
Tools Tableau Public, Python, Basketball-Reference
Duration Single focused session · 2025-26 season (in progress)

Overview

Every box score leads with points per game, but that single number treats a player who needs 25 shots to score 30 points the same as one who needs 17. This project brings current-season NBA stats together with shooting efficiency, so the fuller story — who's truly earning their numbers — comes through clearly.

Built as a hands-on Tableau project: source real data, clean it, build calculated fields, and design a dashboard that tells a clear analytical story instead of just displaying a table of stats.

The question

A scoring average alone leaves a few real questions unanswered:

  1. Is a player's scoring volume backed by strong shot quality, or does it come at a lower value per shot?
  2. Which lower-usage players are quietly among the most efficient scorers in the league?
  3. Do the highest scorers also rank as strong playmakers and rebounders, or is their impact mainly scoring?
  4. Where does the league's "average" efficiency actually sit, so any player can be judged against a real baseline?

The goal wasn't just to visualize stats — it was to answer these specific questions in a way a single glance at the dashboard could settle.

Approach

Data sourcing and cleaning. Pulled current 2025-26 per-game stats for the league's top and most notable scorers from Basketball-Reference. The raw data came back as unstructured text rather than a clean table, so it had to be parsed with a custom script — matching each stat token by shape (integers, per-game decimals, shooting percentages) to correctly reconstruct every player's row, including edge cases like missing percentages for players with zero attempts in a category.

Calculated fields. Points per game alone doesn't capture efficiency, so the dashboard is built on True Shooting %PTS / (2 × (FGA + 0.44 × FTA)) — which accounts for twos, threes, and free throws in one number, plus a usage-proxy field to size each player's footprint on offense.

Chart design, not just chart selection. Three views, each answering a different piece of the question:

Interactivity. A highlight action links the bar chart to both scatter plots — clicking a player in Top Scorers highlights them across every view while keeping the rest of the field visible for comparison, instead of filtering everyone else away.

Constraints

Key findings

Results

Published live on Tableau Public as a fully interactive dashboard — hover for exact stats, click any player to highlight them across all three views, and explore the data directly rather than reading a static chart.

Dashboard not loading? Open it directly on Tableau Public ↗

Challenges & insights