library(dplyr)
library(cluster)
library(factoextra)
library(ggplot2)
library(readr)
library(datasets)
library(corrplot)
library(stats)
library(ggrepel)
library(textir)
library(BBmisc)
library(rstudioapi)
library(rvest)
library(reactable)
library(reactablefmtr)
#pull and clean data
player_stats <- read_html("https://www.basketball-reference.com/leagues/NBA_2023_per_minute.html") %>%
html_node("table") %>%
html_table()
adv_stats <- read_html("https://www.basketball-reference.com/leagues/NBA_2023_advanced.html") %>%
html_node("table") %>%
html_table() %>%
subset( , select = -c(Rk, Pos, Age, Tm, G, MP, Player))
player_df <- cbind(player_stats, adv_stats) %>%
subset( , select = -c(Rk, Var.42, Var.47)) %>%
mutate_at(c(3, 5:48), as.numeric)
player_df$MPG <- player_df$MP/player_df$G
player_df$Ast2TO <- player_df$AST/player_df$TOV
player_df[is.na(player_df)] <- 0
player_df <- normalize(player_df, method = "standardize")
main_df <- player_df[c(8:49)]
Unrestricted
free_unrest <- c( "Bruce Brown",
"Russell Westbrook",
"Kyrie Irving",
"D'Angelo Russell",
"Kevin Love",
"Nikola Vučević",
"Draymond Green",
"Fred VanVleet",
"Harrison Barnes",
"Jerami Grant",
"Caris LeVert",
"Will Barton",
"Christian Wood",
"Brook Lopez",
"Kyle Kuzma",
"Kelly Oubre Jr.",
"Josh Richardson",
"Dillon Brooks",
"Dwight Powell",
"Jae Crowder",
"Dario Šarić",
"Jakob Poeltl",
"Mason Plumlee",
"Seth Curry",
"Joe Ingles",
"Lonnie Walker IV",
"Hamidou Diallo",
"Kendrick Nunn",
"Cory Joseph",
"Torrey Craig",
"Ish Smith",
"Jeff Green",
"Justise Winslow",
"Terence Davis",
"George Hill",
"Alex Len",
"Georges Niang",
"Robin Lopez",
"Blake Griffin",
"Bismack Biyombo",
"Andre Iguodala",
"Udonis Haslem",
"Markieff Morris",
"Austin Rivers",
"Wesley Matthews",
"DeAndre Jordan",
"Taj Gibson",
"Dennis Schröder",
"T.J. Warren",
"JaMychal Green",
"Matthew Dellavedova",
"Trey Lyles",
"Udoka Azubuike",
"Frank Kaminsky",
"Raul Neto",
"Rodney McGruder",
"Jevon Carter",
"Dennis Smith Jr.",
"Damion Lee",
"Thomas Bryant",
"Danny Green",
"Svi Mykhailiuk",
"Aaron Holiday",
"Theo Pinson",
"Yuta Watanabe",
"Josh Okogie",
"Troy Brown Jr.",
"Drew Eubanks",
"Frank Ntilikina",
"Juan Toscano-Anderson",
"Thanasis Antetokounmpo",
"Moritz Wagner",
"Keita Bates-Diop",
"Gabe Vincent",
"Javonte Green",
"Max Strus",
"Shake Milton",
"Jaylen Nowell",
"Jalen McDaniels",
"Naz Reid",
"Chimezie Metu",
"Oshae Brissett",
"Wenyen Gabriel",
"James Johnson",
"Terrence Ross",
"Reggie Jackson",
"Gorgui Dieng",
"Dewayne Dedmon",
"Justin Holiday",
"Boban Marjanović",
"Patrick Beverley",
"Cody Zeller",
"Goran Dragić",
"Meyers Leonard",
"Louis King",
"Ty Jerome")
index_1 <- 1:96
unr <- cbind(index_1, free_unrest) %>%
as.data.frame() %>%
rename( "Player" = free_unrest)
unr$index_1 <- as.numeric(as.character(unr$index_1))
main_data1 <- left_join(unr, player_df) %>%
subset( , select = -c( Pos, Tm, Ast2TO, index_1, Player))
res.dist <- get_dist(main_data1, stand = TRUE, method = "euclidean")
fviz_dist(res.dist, gradient = list(low = "#00AFBB", mid = "white", high = "#FC4E07"), lab_size = 2)

fviz_nbclust(main_data1, kmeans, method = "gap_stat")

km.res <- kmeans(main_data1, 6, nstart = 25)
rownames(main_data1) <- main_data1$Player
fviz_cluster(km.res, main_data1, ellipse = TRUE, ellipse.alpha = .1,
palette = "jco", repel = TRUE, ggtheme = theme_minimal(),
main = FALSE, xlab = FALSE, ylab = FALSE,
labelsize = 9, lwd=2)

res.hc <- hclust(res.dist, method = "ward.D2")
fviz_dend(res.hc, k = 8, cex = .3, horiz = TRUE, rect = TRUE,
labelsize = 1, repel = TRUE, labels_track_height = 5,
lwd = .2,
main = "Cluster Dendogram for Unrestricted Free Agents",
sub = "Bruce Brown is 1 and is in the purple cluster;
Jeff Green is 52 and is in the blue cluster ",)

left_join(unr, player_df) %>%
select(Player) %>%
mutate(index = 1:146) %>%
select(index, Player)
## index Player
## 1 1 Bruce Brown
## 2 2 Russell Westbrook
## 3 3 Russell Westbrook
## 4 4 Russell Westbrook
## 5 5 Kyrie Irving
## 6 6 Kyrie Irving
## 7 7 Kyrie Irving
## 8 8 D'Angelo Russell
## 9 9 D'Angelo Russell
## 10 10 D'Angelo Russell
## 11 11 Kevin Love
## 12 12 Kevin Love
## 13 13 Kevin Love
## 14 14 Nikola Vučević
## 15 15 Draymond Green
## 16 16 Fred VanVleet
## 17 17 Harrison Barnes
## 18 18 Jerami Grant
## 19 19 Caris LeVert
## 20 20 Will Barton
## 21 21 Will Barton
## 22 22 Will Barton
## 23 23 Christian Wood
## 24 24 Brook Lopez
## 25 25 Kyle Kuzma
## 26 26 Kelly Oubre Jr.
## 27 27 Josh Richardson
## 28 28 Josh Richardson
## 29 29 Josh Richardson
## 30 30 Dillon Brooks
## 31 31 Dwight Powell
## 32 32 Jae Crowder
## 33 33 Dario Šarić
## 34 34 Dario Šarić
## 35 35 Dario Šarić
## 36 36 Jakob Poeltl
## 37 37 Jakob Poeltl
## 38 38 Jakob Poeltl
## 39 39 Mason Plumlee
## 40 40 Mason Plumlee
## 41 41 Mason Plumlee
## 42 42 Seth Curry
## 43 43 Joe Ingles
## 44 44 Lonnie Walker IV
## 45 45 Hamidou Diallo
## 46 46 Kendrick Nunn
## 47 47 Kendrick Nunn
## 48 48 Kendrick Nunn
## 49 49 Cory Joseph
## 50 50 Torrey Craig
## 51 51 Ish Smith
## 52 52 Jeff Green
## 53 53 Justise Winslow
## 54 54 Terence Davis
## 55 55 George Hill
## 56 56 George Hill
## 57 57 George Hill
## 58 58 Alex Len
## 59 59 Georges Niang
## 60 60 Robin Lopez
## 61 61 Blake Griffin
## 62 62 Bismack Biyombo
## 63 63 Andre Iguodala
## 64 64 Udonis Haslem
## 65 65 Markieff Morris
## 66 66 Markieff Morris
## 67 67 Markieff Morris
## 68 68 Austin Rivers
## 69 69 Wesley Matthews
## 70 70 DeAndre Jordan
## 71 71 Taj Gibson
## 72 72 Dennis Schröder
## 73 73 T.J. Warren
## 74 74 T.J. Warren
## 75 75 T.J. Warren
## 76 76 JaMychal Green
## 77 77 Matthew Dellavedova
## 78 78 Trey Lyles
## 79 79 Udoka Azubuike
## 80 80 Frank Kaminsky
## 81 81 Frank Kaminsky
## 82 82 Frank Kaminsky
## 83 83 Raul Neto
## 84 84 Rodney McGruder
## 85 85 Jevon Carter
## 86 86 Dennis Smith Jr.
## 87 87 Damion Lee
## 88 88 Thomas Bryant
## 89 89 Thomas Bryant
## 90 90 Thomas Bryant
## 91 91 Danny Green
## 92 92 Danny Green
## 93 93 Danny Green
## 94 94 Svi Mykhailiuk
## 95 95 Svi Mykhailiuk
## 96 96 Svi Mykhailiuk
## 97 97 Aaron Holiday
## 98 98 Theo Pinson
## 99 99 Yuta Watanabe
## 100 100 Josh Okogie
## 101 101 Troy Brown Jr.
## 102 102 Drew Eubanks
## 103 103 Frank Ntilikina
## 104 104 Juan Toscano-Anderson
## 105 105 Juan Toscano-Anderson
## 106 106 Juan Toscano-Anderson
## 107 107 Thanasis Antetokounmpo
## 108 108 Moritz Wagner
## 109 109 Keita Bates-Diop
## 110 110 Gabe Vincent
## 111 111 Javonte Green
## 112 112 Max Strus
## 113 113 Shake Milton
## 114 114 Jaylen Nowell
## 115 115 Jalen McDaniels
## 116 116 Jalen McDaniels
## 117 117 Jalen McDaniels
## 118 118 Naz Reid
## 119 119 Chimezie Metu
## 120 120 Oshae Brissett
## 121 121 Wenyen Gabriel
## 122 122 James Johnson
## 123 123 Terrence Ross
## 124 124 Terrence Ross
## 125 125 Terrence Ross
## 126 126 Reggie Jackson
## 127 127 Reggie Jackson
## 128 128 Reggie Jackson
## 129 129 Gorgui Dieng
## 130 130 Dewayne Dedmon
## 131 131 Dewayne Dedmon
## 132 132 Dewayne Dedmon
## 133 133 Justin Holiday
## 134 134 Justin Holiday
## 135 135 Justin Holiday
## 136 136 Boban Marjanović
## 137 137 Patrick Beverley
## 138 138 Patrick Beverley
## 139 139 Patrick Beverley
## 140 140 Cody Zeller
## 141 141 Goran Dragić
## 142 142 Goran Dragić
## 143 143 Goran Dragić
## 144 144 Meyers Leonard
## 145 145 Louis King
## 146 146 Ty Jerome
Restricted
restic <- c( "Bruce Brown",
"Jeff Green",
"Coby White",
"Jaxson Hayes",
"Cam Reddish",
"Cameron Johnson",
"Romeo Langford",
"Nickeil Alexander-Walker",
"Matisse Thybulle",
"P.J. Washington",
"Grant Williams",
"Darius Bazley",
"Dylan Windler",
"Omer Yurtseven",
"Tre Jones",
"Paul Reed",
"Austin Reaves",
"Ayo Dosunmu",
"Dalano Banton",
"Jock Landale",
"Luka Garza",
"Sandro Mamukelashvili",
"Anthony Lamb",
"David Duke Jr.",
"Saben Lee",
"Trevor Keels",
"Lester Quinones",
"Mfiondu Kabengele",
"Jared Butler",
"A.J. Green",
"Trevor Hudgins",
"Scotty Pippen Jr.",
"Xavier Moon",
"Julian Champagnie",
"Mac McClung",
"John Butler",
"Matt Ryan",
"JD Davison",
"Ron Harper Jr.",
"Jeff Dowtin",
"Darius Days",
"Jack White",
"Olivier Sarr",
"Orlando Robinson",
"Neemias Queta",
"Keon Ellis",
"Jamal Cain",
"Mamadi Diakite",
"Buddy Boeheim",
"Jared Rhoden",
"Isaiah Mobley",
"Terry Taylor",
"Dru Smith",
"Johnny Juzang",
"Trent Forrest",
"Théo Maledon",
"McKinley Wright IV",
"Gabe York",
"Duane Washington Jr.",
"Dominick Barlow",
"Moussa Diabaté",
"Jay Huff",
"Kendall Brown")
index_2 <- 1:63
rest <- cbind(index_2, restic) %>%
as.data.frame() %>%
rename( "Player" = restic)
rest$index_2 <- as.numeric(as.character(rest$index_2))
main_data2 <- left_join(rest, player_df) %>%
subset( , select = -c( Pos, Tm, Ast2TO, index_2, Player))
res.dist1 <- get_dist(main_data2, stand = TRUE, method = "euclidean")
fviz_dist(res.dist1, gradient = list(low = "#00AFBB", mid = "white", high = "#FC4E07"), lab_size = 2)

fviz_nbclust(main_data2, kmeans, method = "wss")

km.res1 <- kmeans(main_data2, 6, nstart = 25)
rownames(main_data2) <- main_data2$Player
fviz_cluster(km.res1, main_data2, ellipse = TRUE, ellipse.alpha = .1,
palette = "jco", repel = TRUE, ggtheme = theme_minimal(),
main = FALSE, xlab = FALSE, ylab = FALSE,
labelsize = 9, lwd=2)

res.hc1 <- hclust(res.dist1, method = "ward.D2")
fviz_dend(res.hc1, k = 8, cex = .3, horiz = TRUE, rect = TRUE,
labelsize = 1, repel = TRUE, labels_track_height = 5,
lwd = .2,
main = "Cluster Dendogram for Restricted Free Agents",
sub = "Bruce Brown is 1 and is in the blue cluster;
Jeff Green is 2 ")

left_join(rest, player_df) %>%
select(Player) %>%
mutate(index = 1:85) %>%
select(index, Player)
## index Player
## 1 1 Bruce Brown
## 2 2 Jeff Green
## 3 3 Coby White
## 4 4 Jaxson Hayes
## 5 5 Cam Reddish
## 6 6 Cam Reddish
## 7 7 Cam Reddish
## 8 8 Cameron Johnson
## 9 9 Cameron Johnson
## 10 10 Cameron Johnson
## 11 11 Romeo Langford
## 12 12 Nickeil Alexander-Walker
## 13 13 Nickeil Alexander-Walker
## 14 14 Nickeil Alexander-Walker
## 15 15 Matisse Thybulle
## 16 16 Matisse Thybulle
## 17 17 Matisse Thybulle
## 18 18 P.J. Washington
## 19 19 Grant Williams
## 20 20 Darius Bazley
## 21 21 Darius Bazley
## 22 22 Darius Bazley
## 23 23 Dylan Windler
## 24 24 Omer Yurtseven
## 25 25 Tre Jones
## 26 26 Paul Reed
## 27 27 Austin Reaves
## 28 28 Ayo Dosunmu
## 29 29 Dalano Banton
## 30 30 Jock Landale
## 31 31 Luka Garza
## 32 32 Sandro Mamukelashvili
## 33 33 Sandro Mamukelashvili
## 34 34 Sandro Mamukelashvili
## 35 35 Anthony Lamb
## 36 36 David Duke Jr.
## 37 37 Saben Lee
## 38 38 Saben Lee
## 39 39 Saben Lee
## 40 40 Trevor Keels
## 41 41 Lester Quinones
## 42 42 Mfiondu Kabengele
## 43 43 Jared Butler
## 44 44 A.J. Green
## 45 45 Trevor Hudgins
## 46 46 Scotty Pippen Jr.
## 47 47 Xavier Moon
## 48 48 Julian Champagnie
## 49 49 Julian Champagnie
## 50 50 Julian Champagnie
## 51 51 Mac McClung
## 52 52 John Butler
## 53 53 Matt Ryan
## 54 54 Matt Ryan
## 55 55 Matt Ryan
## 56 56 JD Davison
## 57 57 Ron Harper Jr.
## 58 58 Jeff Dowtin
## 59 59 Darius Days
## 60 60 Jack White
## 61 61 Olivier Sarr
## 62 62 Orlando Robinson
## 63 63 Neemias Queta
## 64 64 Keon Ellis
## 65 65 Jamal Cain
## 66 66 Mamadi Diakite
## 67 67 Buddy Boeheim
## 68 68 Jared Rhoden
## 69 69 Isaiah Mobley
## 70 70 Terry Taylor
## 71 71 Terry Taylor
## 72 72 Terry Taylor
## 73 73 Dru Smith
## 74 74 Dru Smith
## 75 75 Dru Smith
## 76 76 Johnny Juzang
## 77 77 Trent Forrest
## 78 78 Théo Maledon
## 79 79 McKinley Wright IV
## 80 80 Gabe York
## 81 81 Duane Washington Jr.
## 82 82 Dominick Barlow
## 83 83 Moussa Diabaté
## 84 84 Jay Huff
## 85 85 Kendall Brown
Options
opt <- c( "Bruce Brown",
"Jeff Green",
"Khris Middleton",
"James Harden",
"Kristaps Porziņģis",
"Jordan Clarkson",
"Josh Hart",
"Talen Horton-Tucker",
"Victor Oladipo",
"Rudy Gay",
"Donte DiVincenzo",
"Andre Drummond",
"Malik Beasley",
"Derrick Rose",
"Alec Burks",
"Mike Muscala",
"Lindy Waters III",
"Kevin Knox",
"Willy Hernangómez",
"Nathan Knight",
"Michael Carter-Williams",
"Kessler Edwards",
"Herbert Jones",
"Xavier Tillman Sr.",
"Kenyon Martin Jr.",
"Isaiah Livers",
"Lamar Stevens",
"Miles McBride",
"Goga Bitadze",
"Naji Marshall",
"Admiral Schofield",
"Ish Wainright",
"Eugene Omoruyi")
index_3 <- 1:33
opt2 <- cbind(index_3, opt) %>%
as.data.frame() %>%
rename( "Player" = opt)
opt2$index_3 <- as.numeric(as.character(opt2$index_3))
main_data3 <- left_join(opt2, player_df) %>%
subset( , select = -c( Pos, Tm, Ast2TO, index_3, Player))
res.dist2 <- get_dist(main_data3, stand = TRUE, method = "euclidean")
fviz_dist(res.dist2, gradient = list(low = "#00AFBB", mid = "white", high = "#FC4E07"), lab_size = 2)

fviz_nbclust(main_data3, kmeans, method = "wss")

km.res2 <- kmeans(main_data3, 6, nstart = 25)
rownames(main_data3) <- main_data3$Player
fviz_cluster(km.res2, main_data3, ellipse = TRUE, ellipse.alpha = .1,
palette = "jco", repel = TRUE, ggtheme = theme_minimal(),
main = FALSE, xlab = FALSE, ylab = FALSE,
labelsize = 9, lwd=2)

res.hc2 <- hclust(res.dist2, method = "ward.D2")
fviz_dend(res.hc2, k = 8, cex = .3, horiz = TRUE, rect = TRUE,
labelsize = 1, repel = TRUE, labels_track_height = 5,
lwd = .2,
main = "Cluster Dendogram for Options",
sub = "Bruce Brown is 1 and is in the blue cluster;
Jeff Green is 2 ")

left_join(opt2, player_df) %>%
select(Player) %>%
mutate(index = 1:47) %>%
select(index, Player)
## index Player
## 1 1 Bruce Brown
## 2 2 Jeff Green
## 3 3 Khris Middleton
## 4 4 James Harden
## 5 5 Kristaps Porziņģis
## 6 6 Jordan Clarkson
## 7 7 Josh Hart
## 8 8 Josh Hart
## 9 9 Josh Hart
## 10 10 Talen Horton-Tucker
## 11 11 Victor Oladipo
## 12 12 Rudy Gay
## 13 13 Donte DiVincenzo
## 14 14 Andre Drummond
## 15 15 Malik Beasley
## 16 16 Malik Beasley
## 17 17 Malik Beasley
## 18 18 Derrick Rose
## 19 19 Alec Burks
## 20 20 Mike Muscala
## 21 21 Mike Muscala
## 22 22 Mike Muscala
## 23 23 Lindy Waters III
## 24 24 Kevin Knox
## 25 25 Kevin Knox
## 26 26 Kevin Knox
## 27 27 Willy Hernangómez
## 28 28 Nathan Knight
## 29 29 Michael Carter-Williams
## 30 30 Kessler Edwards
## 31 31 Kessler Edwards
## 32 32 Kessler Edwards
## 33 33 Herbert Jones
## 34 34 Xavier Tillman Sr.
## 35 35 Kenyon Martin Jr.
## 36 36 Isaiah Livers
## 37 37 Lamar Stevens
## 38 38 Miles McBride
## 39 39 Goga Bitadze
## 40 40 Goga Bitadze
## 41 41 Goga Bitadze
## 42 42 Naji Marshall
## 43 43 Admiral Schofield
## 44 44 Ish Wainright
## 45 45 Eugene Omoruyi
## 46 46 Eugene Omoruyi
## 47 47 Eugene Omoruyi