#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)