Contexto

La base de datos USArrests contiene estadĂ­sticas en arrestos por cada 100,000 residentes por agresiĂ³n, asesinato y violaciĂ³n en cada uno de los 50 estados de EE.UU. en 1973

Instalar paquetes y librerĂ­as

#install.packages("cluster") # Para agrupamientos 
library(cluster)
#install.packages("ggplot2") # Para graficar
library(ggplot2)
#install.packages("factoextra") # Visualizar clusters
library(factoextra)
#install.packages("data.table") # Conjunto de datos grandes
library(data.table)
#install.packages("tidyverse")
library(tidyverse)
#install.packages("sf") # AnĂ¡lisis de datos espaciales
library(sf)
#install.packages("rnaturalearth") #Proporciona lĂ­mites grogrĂ¡ficos
library(rnaturalearth)
#install.packages("rnaturalearthdata") #Datos de geografĂ­a
library(rnaturalearthdata)
#install.packages("devtools")
library(devtools) #Instalar paquetes de fuentes externas
devtools::install_github("ropensci/rnaturalearthhires") #Mapa de Mexico particular
library(rnaturalearthhires)
#install.packages("caret") #Algoritmos de aprendizaje automĂ¡tico
library(caret)
#install.packages("datasets") # Para usar la base de datos "Iris"
library(datasets)
#install.packages("ggplot2") #GrĂ¡ficas con mejor diseño
library(ggplot2)
#install.packages("lattice") #Crear grĂ¡ficos
library(lattice)
#install.packages("DataExplorer") #AnĂ¡lisis descriptivo
library(DataExplorer)
#install.pachages(kernlab) #MĂ©todos de aprendizaje automĂ¡tico
library(kernlab)

Importar bases de datos

df <- USArrests

Obtener mapa de Estados unidos

usa <- ne_states(country = "United States of America", returnclass = "sf")

Entender base de datos

summary(df)
##      Murder          Assault         UrbanPop          Rape      
##  Min.   : 0.800   Min.   : 45.0   Min.   :32.00   Min.   : 7.30  
##  1st Qu.: 4.075   1st Qu.:109.0   1st Qu.:54.50   1st Qu.:15.07  
##  Median : 7.250   Median :159.0   Median :66.00   Median :20.10  
##  Mean   : 7.788   Mean   :170.8   Mean   :65.54   Mean   :21.23  
##  3rd Qu.:11.250   3rd Qu.:249.0   3rd Qu.:77.75   3rd Qu.:26.18  
##  Max.   :17.400   Max.   :337.0   Max.   :91.00   Max.   :46.00

Datos Escalados

df_scaled <- scale(df)  # Normalizamos las variables

Metodo de codo

fviz_nbclust(df_scaled, kmeans, method = "wss") + 
  ggtitle("MĂ©todo del codo para elegir el nĂºmero de clusters")

Asignacion del cluster

set.seed(123)  # Fijar semilla para reproducibilidad
kmeans_result <- kmeans(df_scaled, centers = 3, nstart = 25)

df$Cluster <- as.factor(kmeans_result$cluster)  # Agregar la asignaciĂ³n de cluster al dataframe

fviz_cluster(kmeans_result, data = df_scaled)

aggregate(df[, 1:4], by = list(df$Cluster), mean)
##   Group.1    Murder   Assault UrbanPop     Rape
## 1       1 12.165000 255.25000 68.40000 29.16500
## 2       2  3.600000  78.53846 52.07692 12.17692
## 3       3  5.841176 141.88235 72.47059 18.82353

Poner Nombres

df$Seguridad <- factor(df$Cluster, 
                       levels = c(1, 2, 3), 
                       labels = c("Muy Seguro", "Medio Seguro", "No Seguro"))

Asignar Dataset

# Unir el dataset con el mapa
usa$state_name <- tolower(usa$name)  # Convertir nombres de estados a minĂºsculas
df$state_name <- tolower(rownames(df))  # Lo mismo para la base de datos

usa_map <- left_join(usa, df, by = "state_name")


# Graficar el mapa con los clusters
ggplot(data = usa_map) +
  geom_sf(aes(fill = Seguridad)) +
  scale_fill_manual(values = c("Muy Seguro" = "green", 
                               "Medio Seguro" = "yellow", 
                               "No Seguro" = "red")) +
  ggtitle("Clusters de seguridad en EE.UU. (USArrests)") +
  theme_minimal()

LS0tDQp0aXRsZTogIlVTQWFycmVzdCINCmF1dGhvcjogIk1heGltaWxpYW5vIEd1ZXZhcmEgR2FyY2lhIg0KZGF0ZTogIjIwMjUtMDItMjEiDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50Og0KICAgICAgdG9jOiBUUlVFDQogICAgICB0b2NfZmxvYXQ6IFRSVUUNCiAgICAgIGNvZGVfZG93bmxvYWQ6IFRSVUUNCiAgICAgIHRoZW1lOiBqb3VybmFsDQotLS0NCg0KDQohW10oaHR0cHM6Ly9tZWRpYS5nZXR0eWltYWdlcy5jb20vaWQvMTQyMTY0NDA1NS92aWRlby90d28tcG9saWNlLW9mZmljZXJzLWFycmVzdGluZy1hLXN1c3BlY3QtYXQtbmlnaHQuanBnP3M9NjQweDY0MCZrPTIwJmM9Q3VmbGlUWlJVT0phRS05eVE0OGc4czQyMkItdUNsTnJPUkVjU0JrcTY0bz0pDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij5Db250ZXh0bzwvc3Bhbj4NCg0KTGEgYmFzZSBkZSBkYXRvcyAqKlVTQXJyZXN0cyoqIGNvbnRpZW5lIGVzdGFkw61zdGljYXMgZW4gYXJyZXN0b3MgcG9yIGNhZGEgMTAwLDAwMCByZXNpZGVudGVzIHBvciBhZ3Jlc2nDs24sIGFzZXNpbmF0byB5IHZpb2xhY2nDs24gZW4gY2FkYSB1bm8gZGUgbG9zIDUwIGVzdGFkb3MgZGUgRUUuVVUuIGVuIDE5NzMNCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPkluc3RhbGFyIHBhcXVldGVzIHkgbGlicmVyw61hczwvc3Bhbj4NCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNpbnN0YWxsLnBhY2thZ2VzKCJjbHVzdGVyIikgIyBQYXJhIGFncnVwYW1pZW50b3MgDQpsaWJyYXJ5KGNsdXN0ZXIpDQojaW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90MiIpICMgUGFyYSBncmFmaWNhcg0KbGlicmFyeShnZ3Bsb3QyKQ0KI2luc3RhbGwucGFja2FnZXMoImZhY3RvZXh0cmEiKSAjIFZpc3VhbGl6YXIgY2x1c3RlcnMNCmxpYnJhcnkoZmFjdG9leHRyYSkNCiNpbnN0YWxsLnBhY2thZ2VzKCJkYXRhLnRhYmxlIikgIyBDb25qdW50byBkZSBkYXRvcyBncmFuZGVzDQpsaWJyYXJ5KGRhdGEudGFibGUpDQojaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIikNCmxpYnJhcnkodGlkeXZlcnNlKQ0KI2luc3RhbGwucGFja2FnZXMoInNmIikgIyBBbsOhbGlzaXMgZGUgZGF0b3MgZXNwYWNpYWxlcw0KbGlicmFyeShzZikNCiNpbnN0YWxsLnBhY2thZ2VzKCJybmF0dXJhbGVhcnRoIikgI1Byb3BvcmNpb25hIGzDrW1pdGVzIGdyb2dyw6FmaWNvcw0KbGlicmFyeShybmF0dXJhbGVhcnRoKQ0KI2luc3RhbGwucGFja2FnZXMoInJuYXR1cmFsZWFydGhkYXRhIikgI0RhdG9zIGRlIGdlb2dyYWbDrWENCmxpYnJhcnkocm5hdHVyYWxlYXJ0aGRhdGEpDQojaW5zdGFsbC5wYWNrYWdlcygiZGV2dG9vbHMiKQ0KbGlicmFyeShkZXZ0b29scykgI0luc3RhbGFyIHBhcXVldGVzIGRlIGZ1ZW50ZXMgZXh0ZXJuYXMNCmRldnRvb2xzOjppbnN0YWxsX2dpdGh1Yigicm9wZW5zY2kvcm5hdHVyYWxlYXJ0aGhpcmVzIikgI01hcGEgZGUgTWV4aWNvIHBhcnRpY3VsYXINCmxpYnJhcnkocm5hdHVyYWxlYXJ0aGhpcmVzKQ0KI2luc3RhbGwucGFja2FnZXMoImNhcmV0IikgI0FsZ29yaXRtb3MgZGUgYXByZW5kaXphamUgYXV0b23DoXRpY28NCmxpYnJhcnkoY2FyZXQpDQojaW5zdGFsbC5wYWNrYWdlcygiZGF0YXNldHMiKSAjIFBhcmEgdXNhciBsYSBiYXNlIGRlIGRhdG9zICJJcmlzIg0KbGlicmFyeShkYXRhc2V0cykNCiNpbnN0YWxsLnBhY2thZ2VzKCJnZ3Bsb3QyIikgI0dyw6FmaWNhcyBjb24gbWVqb3IgZGlzZcOxbw0KbGlicmFyeShnZ3Bsb3QyKQ0KI2luc3RhbGwucGFja2FnZXMoImxhdHRpY2UiKSAjQ3JlYXIgZ3LDoWZpY29zDQpsaWJyYXJ5KGxhdHRpY2UpDQojaW5zdGFsbC5wYWNrYWdlcygiRGF0YUV4cGxvcmVyIikgI0Fuw6FsaXNpcyBkZXNjcmlwdGl2bw0KbGlicmFyeShEYXRhRXhwbG9yZXIpDQojaW5zdGFsbC5wYWNoYWdlcyhrZXJubGFiKSAjTcOpdG9kb3MgZGUgYXByZW5kaXphamUgYXV0b23DoXRpY28NCmxpYnJhcnkoa2VybmxhYikNCmBgYA0KDQoNCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkIDsiPkltcG9ydGFyIGJhc2VzIGRlIGRhdG9zPC9zcGFuPg0KYGBge3J9DQpkZiA8LSBVU0FycmVzdHMNCmBgYA0KDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZCA7Ij5PYnRlbmVyIG1hcGEgZGUgRXN0YWRvcyB1bmlkb3M8L3NwYW4+DQpgYGB7cn0NCnVzYSA8LSBuZV9zdGF0ZXMoY291bnRyeSA9ICJVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EiLCByZXR1cm5jbGFzcyA9ICJzZiIpDQoNCmBgYA0KDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZCA7Ij5FbnRlbmRlciBiYXNlIGRlIGRhdG9zPC9zcGFuPg0KYGBge3J9DQpzdW1tYXJ5KGRmKQ0KYGBgDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZCA7Ij5EYXRvcyBFc2NhbGFkb3M8L3NwYW4+DQpgYGB7cn0NCmRmX3NjYWxlZCA8LSBzY2FsZShkZikgICMgTm9ybWFsaXphbW9zIGxhcyB2YXJpYWJsZXMNCmBgYA0KDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZCA7Ij5NZXRvZG8gZGUgY29kbzwvc3Bhbj4NCmBgYHtyfQ0KZnZpel9uYmNsdXN0KGRmX3NjYWxlZCwga21lYW5zLCBtZXRob2QgPSAid3NzIikgKyANCiAgZ2d0aXRsZSgiTcOpdG9kbyBkZWwgY29kbyBwYXJhIGVsZWdpciBlbCBuw7ptZXJvIGRlIGNsdXN0ZXJzIikNCg0KDQpgYGANCg0KIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQgOyI+QXNpZ25hY2lvbiBkZWwgY2x1c3Rlcjwvc3Bhbj4NCmBgYHtyfQ0Kc2V0LnNlZWQoMTIzKSAgIyBGaWphciBzZW1pbGxhIHBhcmEgcmVwcm9kdWNpYmlsaWRhZA0Ka21lYW5zX3Jlc3VsdCA8LSBrbWVhbnMoZGZfc2NhbGVkLCBjZW50ZXJzID0gMywgbnN0YXJ0ID0gMjUpDQoNCmRmJENsdXN0ZXIgPC0gYXMuZmFjdG9yKGttZWFuc19yZXN1bHQkY2x1c3RlcikgICMgQWdyZWdhciBsYSBhc2lnbmFjacOzbiBkZSBjbHVzdGVyIGFsIGRhdGFmcmFtZQ0KDQpmdml6X2NsdXN0ZXIoa21lYW5zX3Jlc3VsdCwgZGF0YSA9IGRmX3NjYWxlZCkNCg0KYGBgDQoNCmBgYHtyfQ0KYWdncmVnYXRlKGRmWywgMTo0XSwgYnkgPSBsaXN0KGRmJENsdXN0ZXIpLCBtZWFuKQ0KYGBgDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZCA7Ij5Qb25lciBOb21icmVzPC9zcGFuPg0KYGBge3J9DQpkZiRTZWd1cmlkYWQgPC0gZmFjdG9yKGRmJENsdXN0ZXIsIA0KICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKDEsIDIsIDMpLCANCiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiTXV5IFNlZ3VybyIsICJNZWRpbyBTZWd1cm8iLCAiTm8gU2VndXJvIikpDQpgYGANCg0KDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZCA7Ij5Bc2lnbmFyIERhdGFzZXQ8L3NwYW4+DQpgYGB7cn0NCiMgVW5pciBlbCBkYXRhc2V0IGNvbiBlbCBtYXBhDQp1c2Ekc3RhdGVfbmFtZSA8LSB0b2xvd2VyKHVzYSRuYW1lKSAgIyBDb252ZXJ0aXIgbm9tYnJlcyBkZSBlc3RhZG9zIGEgbWluw7pzY3VsYXMNCmRmJHN0YXRlX25hbWUgPC0gdG9sb3dlcihyb3duYW1lcyhkZikpICAjIExvIG1pc21vIHBhcmEgbGEgYmFzZSBkZSBkYXRvcw0KDQp1c2FfbWFwIDwtIGxlZnRfam9pbih1c2EsIGRmLCBieSA9ICJzdGF0ZV9uYW1lIikNCg0KDQojIEdyYWZpY2FyIGVsIG1hcGEgY29uIGxvcyBjbHVzdGVycw0KZ2dwbG90KGRhdGEgPSB1c2FfbWFwKSArDQogIGdlb21fc2YoYWVzKGZpbGwgPSBTZWd1cmlkYWQpKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIk11eSBTZWd1cm8iID0gImdyZWVuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1lZGlvIFNlZ3VybyIgPSAieWVsbG93IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIFNlZ3VybyIgPSAicmVkIikpICsNCiAgZ2d0aXRsZSgiQ2x1c3RlcnMgZGUgc2VndXJpZGFkIGVuIEVFLlVVLiAoVVNBcnJlc3RzKSIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQoNCmBgYA0KDQoNCg==