#SCALED

library(ggplot2)
data("USArrests")

# It is recommended to scale the data
usarrests_scaled <- scale(USArrests)

# Now, let´s run the K-means
set.seed(123)
km_sc <- kmeans(usarrests_scaled, centers = 3, nstart = 25)

km_sc$cluster
##        Alabama         Alaska        Arizona       Arkansas     California 
##              1              1              1              3              1 
##       Colorado    Connecticut       Delaware        Florida        Georgia 
##              1              3              3              1              1 
##         Hawaii          Idaho       Illinois        Indiana           Iowa 
##              3              2              1              3              2 
##         Kansas       Kentucky      Louisiana          Maine       Maryland 
##              3              2              1              2              1 
##  Massachusetts       Michigan      Minnesota    Mississippi       Missouri 
##              3              1              2              1              1 
##        Montana       Nebraska         Nevada  New Hampshire     New Jersey 
##              2              2              1              2              3 
##     New Mexico       New York North Carolina   North Dakota           Ohio 
##              1              1              1              2              3 
##       Oklahoma         Oregon   Pennsylvania   Rhode Island South Carolina 
##              3              3              3              3              1 
##   South Dakota      Tennessee          Texas           Utah        Vermont 
##              2              1              1              3              2 
##       Virginia     Washington  West Virginia      Wisconsin        Wyoming 
##              3              3              2              2              3

#NOT SCALED

library(ggplot2)
data("USArrests")

set.seed(123)
km_sc2 <- kmeans(USArrests, centers = 3, nstart = 25)

km_sc2$cluster
##        Alabama         Alaska        Arizona       Arkansas     California 
##              1              1              1              3              1 
##       Colorado    Connecticut       Delaware        Florida        Georgia 
##              3              2              1              1              3 
##         Hawaii          Idaho       Illinois        Indiana           Iowa 
##              2              2              1              2              2 
##         Kansas       Kentucky      Louisiana          Maine       Maryland 
##              2              2              1              2              1 
##  Massachusetts       Michigan      Minnesota    Mississippi       Missouri 
##              3              1              2              1              3 
##        Montana       Nebraska         Nevada  New Hampshire     New Jersey 
##              2              2              1              2              3 
##     New Mexico       New York North Carolina   North Dakota           Ohio 
##              1              1              1              2              2 
##       Oklahoma         Oregon   Pennsylvania   Rhode Island South Carolina 
##              3              3              2              3              1 
##   South Dakota      Tennessee          Texas           Utah        Vermont 
##              2              3              3              2              2 
##       Virginia     Washington  West Virginia      Wisconsin        Wyoming 
##              3              3              2              2              3

###Habiendo elegido tres centros para agrupar los estados en relación a los arrestos, la diferencia principal entre los datos escalados y no escalados se basa en el conjunto donde fueron agrupados.

Por ejemplo: Mientras que los estados escalados de KANSAS,CONNECTICUT,DELAWERE,PENNSYLVANIA, etc, fueron designados a el cluster #tres (3), los datos no escalados agruparon a KANSAS,CONNECTICUT,PENNSYLVANIA en el grupo dos (2), y a DELAWERE en el grupo uno (1).

km_sc$centers #SCALED
##       Murder    Assault   UrbanPop       Rape
## 1  1.0049340  1.0138274  0.1975853  0.8469650
## 2 -0.9615407 -1.1066010 -0.9301069 -0.9667633
## 3 -0.4469795 -0.3465138  0.4788049 -0.2571398
km_sc2$centers #NOT SCALED
##      Murder  Assault UrbanPop     Rape
## 1 11.812500 272.5625 68.31250 28.37500
## 2  4.270000  87.5500 59.75000 14.39000
## 3  8.214286 173.2857 70.64286 22.84286

LAS Tablas acceden a los cluster y la distancia a sus centros. A quellos datos escalados tienen distancias más cortas y parecidas entre ellas. Mientras que los datos no escalados se dispersan en valores muy altos y difrerentes, es por esta razon que el algoritmo categorizo de distintas formas los estados a los clusters.

#SCALED

wss_sc = numeric(10)
for (k in 1:10) {
  set.seed(123)
  wss_sc[k] <- kmeans(usarrests_scaled, centers = k, nstart = 25)$tot.withinss
}

plot(1:10, wss_sc, type = "b", pch = 19,
     xlab = "Number of clusters (k) ",
     ylab = "Total within-cluster sum of squares",
     main = "Elbow Method for K-means - SCALED")

wss_sc = numeric(10)
for (k in 1:10) {
  set.seed(123)
  wss_sc[k] <- kmeans(USArrests, centers = k, nstart = 25)$tot.withinss
}

plot(1:10, wss_sc, type = "b", pch = 19,
     xlab = "Number of clusters (k)",
     ylab = "Total within-cluster sum of squares ",
     main = "Elbow Method for K-means  -NON SCALED")

Encontramos que entre las gráficas de codo, los datos no escalados contienen un WSS con valores muy grandes que nos indica una gran varianza o distancia entre los puntos y el centroide.

Los datos escalados se ven mejor distribuidos en la grafica, con un codo menos pronunciado y valores WSS menores.

A pesar de esto, ambas graficas nos sugieren que los valores adecuados para K estan entre 2 y 4. (La escalada es más facil de leer para encontrar K valor)

#SCALED

# ------------------------------------------
# Now let´s work the PCA on this dataset
# ------------------------------------------
# Note that we use scale = TRUE because variables are on different scales
pca <- prcomp(USArrests, scale. = TRUE)

# Summary
summary(pca)
## Importance of components:
##                           PC1    PC2     PC3     PC4
## Standard deviation     1.5749 0.9949 0.59713 0.41645
## Proportion of Variance 0.6201 0.2474 0.08914 0.04336
## Cumulative Proportion  0.6201 0.8675 0.95664 1.00000

#NOT SCALED

# ------------------------------------------
# Now let´s work the PCA on this dataset
# ------------------------------------------

pca2 <- prcomp(USArrests)

# Summary
summary(pca2)
## Importance of components:
##                            PC1      PC2    PC3     PC4
## Standard deviation     83.7324 14.21240 6.4894 2.48279
## Proportion of Variance  0.9655  0.02782 0.0058 0.00085
## Cumulative Proportion   0.9655  0.99335 0.9991 1.00000

#SCALED

# Scree plot
plot(pca, type = "l", main = "Scree Plot SCALED")

# Variance explained
var_explained <- pca$sdev^2 / sum(pca$sdev^2)

# PCA Variance plotted
plot(var_explained, type = "b", pch = 19,
     xlab = "Principal Component",
     ylab = "Proportion of Variance Explained",
     main = "Variance Explained by Principal Components SCALED")

# Scree plot
plot(pca2, type = "l", main = "Scree Plot- not SCALED")

# Variance explained
var_explained <- pca2$sdev^2 / sum(pca2$sdev^2)

# PCA Variance plotted
plot(var_explained, type = "b", pch = 19,
     xlab = "Principal Component",
     ylab = "Proportion of Variance Explained",
     main = "Variance Explained by Principal Components -not SCALED")

El scree plot compara las PCAs de los datos y nos muestra cómo se proyecta la proporción de varianzas para cuatro variables.

Podemos observar que las primeras dos son aquellas con los valores más altos, mientras que las otras quedan casi al ras del eje Y. Esto nos indica que en nuestro modelo, las variables 1 y 2 son… explican más sobre nuestros datos y tienen más información que ruido.

Se puede complementar con la tabla de importancia de los componentes vistos previamente, que nos indica como la variable PCE1 explica el 62% de los arrestos en Estados Unidos y el PCO2 el un 24% de los arrestos (En conjunto 88% ). Los otros valores porcentuales parecen ser bastante insignificantes. En otras palabras, nos indica que la naturaleza de los datos cambia en su mayoría en direccion a estas variables.

# PCA scores plot
plot(pca$x[,1], pca$x[,2],
     pch = 19,
     xlab = "PC1",
     ylab = "PC2",
     main = "PCA of USArrests")
text(pca$x[,1], pca$x[,2], labels = rownames(USArrests), pos = 3, cex = 0.7)

# ------------------------------------------
# Cool approach: K-means clusters on PCA space
# ------------------------------------------
plot(pca$x[,1], pca$x[,2],
     col = km_sc$cluster,
     pch = 19,
     xlab = "PC1",
     ylab = "PC2",
     main = "K-means Clusters Visualized on PCA Space")
text(pca$x[,1], pca$x[,2], labels = rownames(USArrests), pos = 3, cex = 0.7)

Cuando los datos no están escalados, se disparan los valores en el eje Y de 0 a 7000. Esto reafirma que nuestros datos originales tienen mucha diferencia de varianza entre ellos. Sin embargo, también ejemplifica que los datos se encuentran en su mayoría en la primera variable con una proporción de varianza del 96% (Tabla de Importancia de los componentes).

Tomar estos datos como buenos resultaría en excluir la influenza de las variables con otro tipo de crimen y atribuirlo completamente a uno solo.

library(ggplot2)

pca_df <- data.frame(
  PC1 = pca$x[,1],
  PC2 = pca$x[,2],
  Cluster = factor(km_sc$cluster),
  State = rownames(USArrests)
)

ggplot(pca_df, aes(x = PC1, y = PC2, color = Cluster, label = State)) +
  geom_point(size = 3) +
  geom_text(vjust = -0.5, size = 3) +
  labs(
    title = "K-means Clusters in PCA Space",
    x = "Principal Component 1",
    y = "Principal Component 2"
  ) +
  theme_minimal(base_size = 14)