Searching For Unicorns (And Other NBA Myths)

[This article was first published on R – NYC Data Science Academy Blog, and kindly contributed to R-bloggers]. (You can report issue about the content on this page here)
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

A visual exploration of the 2017-2018 NBA landscape

The modern NBA landscape is rapidly changing.

Steph Curry has redefined the lead guard prototype with jaw-dropping shooting range coupled with unprecedented scoring efficiency for a guard. The likes of Marc Gasol, Al Horford and Kristaps Porzingis are paving the way for a younger generation of modern big men as defensive rim protectors who can space the floor on offense as three-point threats. Then there are the new-wave facilitators – LeBron James, Draymond Green, Ben Simmons – enormous athletes who can guard any position on defense and push the ball down court in transition.

For fans, analysts and NBA front offices alike, these are the prototypical players that make our mouths water. So what do they have in common?

For one, they are elite statistical outliers in at least two categories, and this serves as the primary motivation for my exploratory analysis tool: To identify NBA players in the 2017-2018 season that exhibited unique skill sets based on statistical correlations.

To access the tool, click here.

The Data

The tool uses box score data from the 2017-2018 NBA season (source: Kaggle) and focuses on the following categories: Points, rebounds, assists, turnovers, steals, blocks, 3-pointers made, FG% and FT%. I also used Dean Oliver’s formula for estimating a players total possessions (outlined here).

To assess all players on an equal scale, I normalized the box score data for each player. For ease of interpretability, I chose to use “per 36 minute” normalization, which take a player’s per-minute production and extrapolates it to 36 minutes of playing time. In this way, the values displayed in the scatterplot represent each player’s production per 36 minutes of playing time.

To ensure that the per-36 minute calculations did not generate any outliers due to small statistical samples, I removed all players with fewer than nine games in the season, as well as players who averaged three minutes or less per game.

Using the tool: A demonstration

The tool is a Shiny application intended to be used for exploratory analysis and player discovery. To most effectively understand and interpret the charts, you can follow these steps:

Step 1: Assess the correlation matrix

The correlation matrix uses the Pearson correlation coefficient as a reference to guide your use of the dynamic scatter plot. Each dot represents the league-wide correlation between two statistical categories.

The color scale indicates the direction of the correlation. That is, blue dots represent negatively correlated statistics, and red dots positively correlated statistics. The size of the dot indicates the magnitude of the correlation – that is, how strong the relationship is between the two statistics across the entire league. Large dots represent high correlation between two statistics, while small dots indicate that the two statistics do not have a linear relationship.

Step 2: Select two statistics to plot for exploration

We can get a flavor of these relationships as we move to the scatterplot. (Follow along using the app.) For the purpose of identifying truly unique players, let’s look at a pairing of negatively correlated statistics with high magnitude (i.e. a blue, large dot): 3-pointers made (“3PM”) vs. Field goal percentage (“FG%”).

Step 3: Explore

It makes sense intuitively why these are negatively correlated – a player making a lot of threes is also attempting a lot of long-distance, low-percentage shots. Given the value of floor-spacing in today’s NBA, a high-volume 3-point shooter who is also an efficient scorer possesses unique abilities. So, let’s select FG% for our x-axis and 3PM for our y-axis (using the dropdowns in the menu bar), and see what we find…

The two dotted lines within the scatterplot represent the 50th percentile for each statistic. In the case of FG% vs. 3PM, we turn to the upper right quadrant, which represents the players who are above average in both FG% and 3-pointers made. To focus our analysis, we can zoom in on this quadrant for a close look.

To zoom, simply select and drag across the plotted space you want to zoom in to, in this case the upper right quadrant. You can also filter by position by simply selecting specific positions in the legend.

Scroll over a point to see who the player is, as well as their per-36 statistics. At the top of our plot, no surprises here: Steph Curry. While his 4.7 threes per 36 minutes leads the league, what truly separates him is his 50% efficiency from the field. But we already know that Steph is an exceptional anomaly, so who what else can we find?

While several superstars can also be found at the top of our plot – Kevin Durant, Kyrie Irving, and Klay Thompson stand out – we have quite a few role players up there as well: Kyle Korver, J.J. Redick, Kelly Olynyk and Joe Ingles. These are quality reserves who may not wow us with their overall statistical profiles, but play a crucial, high-value role on teams by spacing the floor without sacrificing scoring efficiency.

Step 4: Repeat

I recommend starting your exploration on the blue-dots of the correlation matrix – blocks vs. threes, rebounds vs. threes, assists vs. blocks, for example. These are where you can identify players with the most unique skill pairings across the league. (Note: When plotting turnovers, be sure to focus below the median line, as it is better to have low turnovers than high.)

For fantasy basketball enthusiasts, this is a great tool to identify players with specific statistical strengths to construct a well-balanced team, or complement your roster core.


I really enjoyed building this tool and exploring its visualization of the NBA landscape. From an interpretability standpoint, however, it is not ideal that we can only focus on one player at time. To improve on this, I plan include an additional table that provides a deeper look at players that fall above the median line for both X and Y statistics. In this way, we can further analyze these players across a larger range of performance variables.


To leave a comment for the author, please follow the link and comment on their blog: R – NYC Data Science Academy Blog. offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

Never miss an update!
Subscribe to R-bloggers to receive
e-mails with the latest R posts.
(You will not see this message again.)

Click here to close (This popup will not appear again)