Contexto

La base de datos USArrests contiene estadisticas en arrestos por cada 100,000 residentes por agresion, asesinato y violacion en cada uno de los 50 estados de EE.UU- En 1973.

Instalar paquetes y llamar librerias

#install.packages("cluster")
library(cluster)
#install.packages("ggplot2")
library(ggplot2)
#install.packages("factoextra")
library(factoextra)
#install.packages("data.table")
library(data.table)
#install.packages("tidyverse")
library(tidyverse)
#install.packages("sf")
library(sf)
#install.packages("rnaturalearth")
library(rnaturalearth)
#install.packages("rnaturalearthdata")
library(rnaturalearthdata)
#install.packages("devtools")
library(devtools)
devtools::install_github("ropensci/rnaturalearthhires")
#install.packages("dplyr")
library(dplyr)

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