Because of my age and the fact I have been interested in NBA few years ago I did not live the Bulls supremacy in the 90s led by Michael Jordan. Recently, with The Last Dance (available on Netflix) I asked myself if it was possible to find similar players to the greatest teams of the past. Therefore I made a focus on the 3 best teams of the last decades :

Chicago Bulls 19951998

Los Angeles Lakers 19992002

Golden State Warriors 20162018
The first two are among the only ones to have realized a 3 peat and the Warriors had a chance of doing it last year.
For each of this team I wanted to find their current similarity with team and players of the 20192020 season. /!\ IT WILL ONLY BE SIMILARITY IN TERMS OF STATISTICS PRODUCED (for example of player A has 50% similarity with Michael Jordan it does not mean he has 50% of his talent. He just produced stats that were close at 50%.)
For teams/players I needed a full profil so I have collected the following data on Statsnba.com :

Basic data : points, rebounds, assists, blocks, turnovers etc.

Quality data : winrate, offensive/defensive ratings, usage percentage etc.

Basic shoot data : field goals attempted, field goals made, free throws, 3P etc.

Advanced shoot data : points in the paint, true shooting etc.

Defense data : points on paint allowed, opponent 2nd chance points etc.
(For teams there are a total of 57 features and 77 features for players.)
This stats are only available from the 199697 season meaning we miss the first year of the 3 peat of the Bulls.This article will be divided in two parts :

Team similarity : find the most similar teams to the top teams of the last decades.

Players similarity : find the most similar players position by position. (PG, SG, SF, PF, C and 6th man)

Criticism of the results : is it possible to compare epochs ?
The approach will be the same for both first two parts. First we need to reduce the dimension of our features space with an Principal Component Analysis (PCA). Then, since the number of team is reasonable we compute distance between each tams to get the closest similarity. For players we do exactly the same except before computing distance we do an Unsupervised Classification to regroup players in clusters. At the end, the most similar team/player will be the closer one in terms of distance (Euclidean distance). Every details about mathematics are explained at the end of the article.
TEAM
As I mentioned above, first we need to reduce the features space dimension with an PCA.
As we can see, going from 58 features to 12 features allow us to keep 90% the informations.
The first componant contains offensive stats as points and shooting stats, the second one contains everything about ratings, the third is about defense and scoring 3 points, the 4th about rebounds and so on.
First let’s represent all our teams in 2D (component 1 and 2) and 3D (component 1,2 and 3).
The first obvious thing is that NBA champions are teams with good ratings, you can’t win if you allow too much points and don’t score enough. They are also most of the time good in offense (X axis).
Now if we focus only on team hat were champions.
The Lakers 9902 appears to be the balance between the Bulls 9698 and the Warriors 1618. Bulls had better ratings while Warriors had better offense and shots percentage. (Note that in the NBA of today there are more points scored by game that it used to in the 90s).
Now we can calculate the distances (in 12 dimensions) between the teams and find the closest team of today.
Since the winrate is taken into account good and well ranked team are more likely to be close to the best team of the decades. That is funny to see that the closest team of the GSW1618 are the Raptors with a mean of 76% similarity. An other obvious thing showing that the NBA has evolved is that teams of today are closer to the Warriors 1618 than the Bulls 9698 or Lakers9902. In a way it shows how atypical these teams were.
Let’s go deeper and watch the similarity among players.
PLAYERS
The first part was kind of an introduction, now we get to the heart of the matter. The point is to approach the top teams of the decades rosters position by position by finding similar players based on statistics produced on the court.
The first step remains the same, we need to reduce the dimension with a PCA.
This time again, 12 components are enough to hold 90% of the data. Here are some interesting components to classify players :

Component 1 : points and shooting

Component 2 : rebounds

Component 4 : ratings and winrate

Componant 7 : assists and turnovers
These 4 components are going to be used for 2D plots but everything is done in a 12 dimensions which is not representable. Below I have represented all the NBA players of the selected seasons (9697, 9798, 9900, 0001, 0102, 1617 and 1718) that have played a minimum of games during the season.
Now that the dimension is reduced we can classify players into clusters. I wanted to make it very simple so for each position I have decided to define 3 clusters that are basically players below average, average players and top players. On the below graphs I have only displayed a few names to make it readable. (The cluster for top players will always be the green one).
Point Guard
For the 2D representation I have used component 1 and component 7 that can be resume as scoring, shooting properly, good passing and too many dispossessions.
Shooting Guard
For the 2D representation I have used component 1 and component 4 that can be resume as scoring, shooting properly, good winrate and good ratings.
Small Forward
For the 2D representation I have used component 1 and component 4 that can be resume as scoring, shooting properly, good winrate and good ratings.
Power Forward
For the 2D representation I have used component 1 and component 2 that can be resumed as scoring, shooting properly and rebounds.
Center
For the 2D representation I have used component 1 and component 2 that can be resumed as scoring, shooting properly and rebounds.
Then we just need, as previously, to calculate distances between every players and select the closer one for each positions of the top teams. The 6th man is not necessarily playing the same position.
Some of the (strange ?) results :
Ron Harper – Patrick Beverley (Clippers), Michael Jordan – Donovan Mitchell (Jazz), Scottie Pippen – Gordon Hayward (Celtics), Dennis Rodman – Paul Millsap (Nuggets), Luc Longley – Daniel Theis (Celtics) and Toni Kukoc – George Hill (Bucks)
Stephen Curry – Kemba Walker (Celtics), Klay Thompson – Norman Powell (Raptors), Kevin Durant – Kawhi Leonard (Clippers), Draymond Green – Paul Millsap (Nuggets), JaVale McGee – JaVale McGee (Lakers) and Andre Iguodala – Marc Gasol (Raptors)
Criticism
As we can see, and it is quite logical, recent teams/players are close with the current NBA. By seeing such low percentage and bad restults in term of basketball (for example Dennis Rodman was a good defender but not the first options in offensive plays for the Bulls while Paul Millsap is the 3rd usage rate of the Nuggets this season and a true offensive option) I asked myself if it was possible and relevant to compare epochs. The NBA has for sure changed between the 90s and now and I have tried to hilight these changes.
For that, I have focused on shots taken according to time for different player positions.

Midrange shots

3 points

Free throws
(Every stats are collected since 1996 season for top 15 scorers per position.)
As we can observe, Point Guards gave up shooting midrange for 3 points shots. From 2010s (Stephen Curry arrival) there is a huge increase of 3P attempts per match for PG.
We can have the same conclusion for Shooting Guards & Small Forwards with the growth of 3P and the diminution of midrange shots.
Once more, same curves with an impressive increase of 3 points shots (x3 in 10 years).
In order to supplement those observations, I have represented the distribution of the shot locations :

3 points

Midrange

Paint (non RA)

Restricted Area
One more time we get the same observations.
In order to see the evolution position by position, for every 5 years periods I have selected a TOP player :

199600

200005

200510

201015

201520
For each player, I have displayed the distribution of their scoring methods.
To conclude I would say that comparing eras was a mistake : NBA has evolved and will continue to do so.
MATHEMATICAL DETAILS
Principal Components Analysis
PCA is one of the mothed used for dimension reduction. It reduces the dimension of features space while keeping most of the information conatined in the data. It is used a lot in Machine Learning/Deep Learning when we face huge datasets with many features.
Mathematically it is a projection into a new features space (which is smaller of course) that create independent axes called components. For our problem a dozen components were sufficient to synthesize the information.
Unsupervised Classification
It is used when our data is not labelled which means we want to find underlying structures. In our example players are not already classified : for example we all know that Michael Jordan is a top player maybe the greatest but how to classify Jamal Murray for example ? That is what the algorithm will do based on the data.
I have decided to use the ExpectationMaximization algorithm (EM algorithm) based on Gaussian Mixture models (GMM).
GMM
It is a statistical model based on the following hypothesis : our data comes from a mixture of Gaussian sub data. We can see our problem as a GMM : all our players are a mixture between subpopulations of players (clusters).
EM Algorithm
Mathematically it worked as followed :
We suppose that our date comes from a mixture of Gaussian density f.
We then try to estimate the parameters by maximizing the likelihood. For that we search the local minimum by first oder conditions of the zero gradient of nb_clusters Gaussians.