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.
#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)
df <- USArrests
usa <- ne_states(country = "United States of America", returnclass = "sf")
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
df_scaled <- scale(df) # Normalizamos las variables
fviz_nbclust(df_scaled, kmeans, method = "wss") +
ggtitle("Método del codo para elegir el número de clusters")
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
df$Seguridad <- factor(df$Cluster,
levels = c(1, 2, 3),
labels = c("Muy Seguro", "Medio Seguro", "No Seguro"))
# 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()