library(cluster)
library(ggplot2)
library(data.table)
library(factoextra)
library(readxl)
library(dplyr)
df <- read_excel("C:\\Users\\erik-\\OneDrive\\Documentos\\Escuela\\Universidad\\7ºSemestre\\Modulo_2\\Percepcion_inseguridad_2024_por_estado.xlsx")
df
## # A tibble: 32 × 2
## desc_entidad `2024`
## <chr> <dbl>
## 1 Aguascalientes 40.6
## 2 Baja California 37.2
## 3 Baja California Sur 19.3
## 4 Campeche 36.5
## 5 Coahuila de Zaragoza 28.9
## 6 Colima 34.7
## 7 Chiapas 32.7
## 8 Chihuahua 33.2
## 9 Ciudad de México 47.5
## 10 Durango 24.3
## # ℹ 22 more rows
summary(df)
## desc_entidad 2024
## Length:32 Min. :19.29
## Class :character 1st Qu.:31.04
## Mode :character Median :36.83
## Mean :36.59
## 3rd Qu.:40.68
## Max. :58.86
str(df)
## tibble [32 × 2] (S3: tbl_df/tbl/data.frame)
## $ desc_entidad: chr [1:32] "Aguascalientes" "Baja California" "Baja California Sur" "Campeche" ...
## $ 2024 : num [1:32] 40.6 37.2 19.3 36.5 28.9 ...
df_num <- df[sapply(df, is.numeric)]
df_num <- na.omit(df_num)
df_num <- df_num[apply(df_num, 1, function(x) all(is.finite(x))), ]
set.seed(123)
grupos <- 4
clusters <- kmeans(df_num, grupos)
clusters
## K-means clustering with 4 clusters of sizes 8, 2, 5, 17
##
## Cluster means:
## 2024
## 1 24.25946
## 2 57.98978
## 3 47.14110
## 4 36.77509
##
## Clustering vector:
## [1] 4 4 1 4 1 4 4 4 3 1 3 4 4 4 2 4 2 1 4 1 3 4 4 4 1 4 3 1 3 4 1 4
##
## Within cluster sum of squares by cluster:
## [1] 96.589506 1.531946 14.855287 149.326137
## (between_SS / total_SS = 91.1 %)
##
## Available components:
##
## [1] "cluster" "centers" "totss" "withinss" "tot.withinss"
## [6] "betweenss" "size" "iter" "ifault"
set.seed(123)
optimizacion <- clusGap(df_num, FUN = kmeans, nstart = 1, K.max = 7)
plot(optimizacion, xlab = "Número de clusters k", main = "Optimización")
set.seed(123)
grupos_optimizado <- 3
clusters_optimizado <- kmeans(df_num, grupos_optimizado)
clusters_optimizado
## K-means clustering with 3 clusters of sizes 8, 7, 17
##
## Cluster means:
## 2024
## 1 24.25946
## 2 50.24072
## 3 36.77509
##
## Clustering vector:
## [1] 3 3 1 3 1 3 3 3 2 1 2 3 3 3 2 3 2 1 3 1 2 3 3 3 1 3 2 1 2 3 1 3
##
## Within cluster sum of squares by cluster:
## [1] 96.58951 184.52148 149.32614
## (between_SS / total_SS = 85.4 %)
##
## Available components:
##
## [1] "cluster" "centers" "totss" "withinss" "tot.withinss"
## [6] "betweenss" "size" "iter" "ifault"
df_cl <- cbind(df, cluster = clusters_optimizado$cluster)
ggplot(df_cl, aes(x = factor(cluster), fill = factor(cluster))) +
geom_bar() +
labs(title = "Número de estados por clúster",
x = "Clúster", y = "Cantidad de estados") +
theme_minimal()
df_cl <- df_cl %>% arrange(`2024`)
df_cl
## desc_entidad 2024 cluster
## 1 Baja California Sur 19.29402 1
## 2 Sinaloa 19.33081 1
## 3 Nayarit 22.07829 1
## 4 Durango 24.30245 1
## 5 Yucatán 25.30951 1
## 6 Oaxaca 27.26456 1
## 7 Tamaulipas 27.56524 1
## 8 Coahuila de Zaragoza 28.93081 1
## 9 Guerrero 31.74318 3
## 10 Chiapas 32.72925 3
## 11 Chihuahua 33.20264 3
## 12 Sonora 33.68126 3
## 13 Veracruz 33.98077 3
## 14 Colima 34.71915 3
## 15 Michoacán de Ocampo 35.17247 3
## 16 Campeche 36.46388 3
## 17 Baja California 37.20460 3
## 18 Jalisco 37.71220 3
## 19 Quintana Roo 38.19205 3
## 20 Zacatecas 39.00657 3
## 21 Nuevo León 39.42006 3
## 22 x 39.99854 3
## 23 San Luis Potosí 40.43117 3
## 24 Aguascalientes 40.60093 3
## 25 Querétaro 40.91783 3
## 26 Puebla 44.34018 2
## 27 Guanajuato 46.42415 2
## 28 Ciudad de México 47.49259 2
## 29 Tabasco 47.89977 2
## 30 Tlaxcala 49.54879 2
## 31 Morelos 57.11458 2
## 32 México 58.86498 2
Podemos identificar que el mejor número de clusters para nuestra agrupar las entidades por percepción de inseguridad es de 3 clusters. De igual forma al revisar el dataframe con los estados de México y su cluster asignado, podemos identifar que el primer cluster tiene a los estados con menor percepción de inseguridad en el cluster 1, los que están en un rango medio (31% en adelante) en cluster 3 y en el cluster 2 los que tienen un porcentaje más alto de percepción de inseguridad.