
Teoría
En México, analizar los estados según el número de asesinatos nos
ayuda a ver de manera más clara cuáles zonas tienen más violencia y
cuáles menos. Esto no solo sirve para enfocar mejor las políticas de
prevención y seguridad, sino que también nos permite relacionar los
homicidios con otros factores como la población, el nivel de
marginación, los ingresos y la presencia de policías en cada estado.
Paso 1. Instalar paquetes y llamar
librerías
#install.packages("cluster") # Análisis de Agrupamiento
library(cluster)
#install.packages("ggplot2") # Graficar
library(ggplot2)
#install.packages("data.table") # Manejo de muchos datos
library(data.table)
#install.packages("factoextra") # Gráfica optimización de número de clusters
library(factoextra)
Paso 2. Obtener los datos
df1 <- read.csv("C:\\Users\\gardi\\Downloads\\Numero_Asesinatos_EstadoMexico.csv")
df_numeric <- df1[,c("Numero_Asesinatos", "Población_Total")]
Paso 3. Entender los datos
summary(df_numeric)
## Numero_Asesinatos Población_Total
## Min. : 24.0 Min. : 731391
## 1st Qu.: 164.2 1st Qu.: 1851651
## Median : 669.0 Median : 3054892
## Mean : 790.2 Mean : 3937938
## 3rd Qu.:1311.8 3rd Qu.: 4947592
## Max. :2581.0 Max. :16992418
str(df_numeric)
## 'data.frame': 32 obs. of 2 variables:
## $ Numero_Asesinatos: int 2581 2254 2116 1759 1444 1438 1401 1338 1303 1134 ...
## $ Población_Total : int 6166934 16992418 3769020 3741869 8348151 4748846 3540685 5784442 1971520 2944840 ...
Paso 4. Escalar los datos
datos_escalados <- scale(df_numeric)
Paso 5. Determinar número de grupos
plot(datos_escalados)

grupos <- 3
Paso 6. Generar los grupos
clusters1 <- kmeans(datos_escalados, grupos)
clusters1
## K-means clustering with 3 clusters of sizes 4, 18, 10
##
## Cluster means:
## Numero_Asesinatos Población_Total
## 1 0.7581097 2.0486016
## 2 -0.7083960 -0.5231078
## 3 0.9718689 0.1221534
##
## Clustering vector:
## [1] 3 1 3 3 1 3 3 3 3 3 3 3 1 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
##
## Within cluster sum of squares by cluster:
## [1] 7.897386 4.319786 7.143926
## (between_SS / total_SS = 68.8 %)
##
## Available components:
##
## [1] "cluster" "centers" "totss" "withinss" "tot.withinss"
## [6] "betweenss" "size" "iter" "ifault"
Paso 7. Optimizar el número de grupos
set.seed(123)
optimizacion <- clusGap(datos_escalados, FUN=kmeans, nstart=1, K.max=10)
#El K.max normalmente es 10
plot(optimizacion, xlab="Numero de clusters k", main="Optimizacion de clusters")

#Se selecciona como optimo el primer punto mas alto.
Paso 8. Graficar los grupos
fviz_cluster(clusters1, data=datos_escalados)

Paso 9. Agregar Clusters a la Base de
Datos
df1_clusters <- cbind(df1,datos_escalados, cluster = clusters1$cluster)
head(df1_clusters)
## Estado_Mexico Numero_Asesinatos Población_Total Numero_Asesinatos
## 1 Guanajuato 2581 6166934 2.5326009
## 2 Mexico State 2254 16992418 2.0701513
## 3 Baja California 2116 3769020 1.8749891
## 4 Chihuahua 1759 3741869 1.3701130
## 5 Jalisco 1444 8348151 0.9246340
## 6 Michoacán de Ocampo 1438 4748846 0.9161487
## Población_Total cluster
## 1 0.67998461 3
## 2 3.98244159 1
## 3 -0.05153074 3
## 4 -0.05981352 3
## 5 1.34539369 1
## 6 0.24737813 3
Conclusiones
La técnica de clustering permite identificar patrones o
grupos naturales en los datos sin necesidad de etiquetas previas. En
este caso si fue necesario utilizar la escala de datos para poder
trabajar con los datos durante el analisis y el agrupamiento de los
clusters. Además, en el caso de mi Optimización de clusters, el cluster
óptimo es el 1.
LS0tDQp0aXRsZTogIk1leGljbyINCmF1dGhvcjogIkRpZWdvIEdhcmPDrWEgLSBBMDEyODUyOTQiDQpkYXRlOiAiMjAyNS0wOC0xOSINCm91dHB1dDogDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiBUUlVFDQogICAgdG9jX2Zsb2F0OiBUUlVFDQogICAgY29kZV9kb3dubG9hZDogVFJVRQ0KICAgIHRoZW1lOiB1bml0ZWQNCi0tLQ0KDQohW10oaHR0cHM6Ly9pLnBpbmltZy5jb20vb3JpZ2luYWxzLzEyLzZkLzU3LzEyNmQ1N2FhZGZhMGFhN2RlODJkYTMwODhlZjczN2EzLmdpZikNCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6Z3JlZW47Ij4gVGVvcsOtYSA8L3NwYW4+DQpFbiBNw6l4aWNvLCBhbmFsaXphciBsb3MgZXN0YWRvcyBzZWfDum4gZWwgbsO6bWVybyBkZSBhc2VzaW5hdG9zIG5vcyBheXVkYSBhIHZlciBkZSBtYW5lcmEgbcOhcyBjbGFyYSBjdcOhbGVzIHpvbmFzIHRpZW5lbiBtw6FzIHZpb2xlbmNpYSB5IGN1w6FsZXMgbWVub3MuIEVzdG8gbm8gc29sbyBzaXJ2ZSBwYXJhIGVuZm9jYXIgbWVqb3IgbGFzIHBvbMOtdGljYXMgZGUgcHJldmVuY2nDs24geSBzZWd1cmlkYWQsIHNpbm8gcXVlIHRhbWJpw6luIG5vcyBwZXJtaXRlIHJlbGFjaW9uYXIgbG9zIGhvbWljaWRpb3MgY29uIG90cm9zIGZhY3RvcmVzIGNvbW8gbGEgcG9ibGFjacOzbiwgZWwgbml2ZWwgZGUgbWFyZ2luYWNpw7NuLCBsb3MgaW5ncmVzb3MgeSBsYSBwcmVzZW5jaWEgZGUgcG9saWPDrWFzIGVuIGNhZGEgZXN0YWRvLg0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjpncmVlbjsiPiBQYXNvIDEuIEluc3RhbGFyIHBhcXVldGVzIHkgbGxhbWFyIGxpYnJlcsOtYXMgPC9zcGFuPg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNpbnN0YWxsLnBhY2thZ2VzKCJjbHVzdGVyIikgIyBBbsOhbGlzaXMgZGUgQWdydXBhbWllbnRvDQpsaWJyYXJ5KGNsdXN0ZXIpDQojaW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90MiIpICMgR3JhZmljYXINCmxpYnJhcnkoZ2dwbG90MikNCiNpbnN0YWxsLnBhY2thZ2VzKCJkYXRhLnRhYmxlIikgIyBNYW5lam8gZGUgbXVjaG9zIGRhdG9zDQpsaWJyYXJ5KGRhdGEudGFibGUpDQojaW5zdGFsbC5wYWNrYWdlcygiZmFjdG9leHRyYSIpICMgR3LDoWZpY2Egb3B0aW1pemFjacOzbiBkZSBuw7ptZXJvIGRlIGNsdXN0ZXJzDQpsaWJyYXJ5KGZhY3RvZXh0cmEpDQpgYGANCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6Z3JlZW47Ij4gUGFzbyAyLiBPYnRlbmVyIGxvcyBkYXRvcyA8L3NwYW4+DQpgYGB7cn0NCmRmMSA8LSByZWFkLmNzdigiQzpcXFVzZXJzXFxnYXJkaVxcRG93bmxvYWRzXFxOdW1lcm9fQXNlc2luYXRvc19Fc3RhZG9NZXhpY28uY3N2IikNCg0KZGZfbnVtZXJpYyA8LSBkZjFbLGMoIk51bWVyb19Bc2VzaW5hdG9zIiwgIlBvYmxhY2nDs25fVG90YWwiKV0NCmBgYA0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjpncmVlbjsiPiBQYXNvIDMuIEVudGVuZGVyIGxvcyBkYXRvcyA8L3NwYW4+DQpgYGB7cn0NCnN1bW1hcnkoZGZfbnVtZXJpYykNCnN0cihkZl9udW1lcmljKQ0KYGBgDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOmdyZWVuOyI+IFBhc28gNC4gRXNjYWxhciBsb3MgZGF0b3MgPC9zcGFuPg0KYGBge3J9DQpkYXRvc19lc2NhbGFkb3MgPC0gc2NhbGUoZGZfbnVtZXJpYykNCmBgYA0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjpncmVlbjsiPiBQYXNvIDUuIERldGVybWluYXIgbsO6bWVybyBkZSBncnVwb3MgPC9zcGFuPg0KYGBge3J9DQpwbG90KGRhdG9zX2VzY2FsYWRvcykNCmdydXBvcyA8LSAzDQpgYGANCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6Z3JlZW47Ij4gUGFzbyA2LiBHZW5lcmFyIGxvcyBncnVwb3MgPC9zcGFuPg0KYGBge3J9DQpjbHVzdGVyczEgPC0ga21lYW5zKGRhdG9zX2VzY2FsYWRvcywgZ3J1cG9zKQ0KY2x1c3RlcnMxDQpgYGANCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6Z3JlZW47Ij4gUGFzbyA3LiBPcHRpbWl6YXIgZWwgbsO6bWVybyBkZSBncnVwb3MgPC9zcGFuPg0KYGBge3J9DQpzZXQuc2VlZCgxMjMpDQpvcHRpbWl6YWNpb24gPC0gY2x1c0dhcChkYXRvc19lc2NhbGFkb3MsIEZVTj1rbWVhbnMsIG5zdGFydD0xLCBLLm1heD0xMCkNCiNFbCBLLm1heCBub3JtYWxtZW50ZSBlcyAxMA0KcGxvdChvcHRpbWl6YWNpb24sIHhsYWI9Ik51bWVybyBkZSBjbHVzdGVycyBrIiwgbWFpbj0iT3B0aW1pemFjaW9uIGRlIGNsdXN0ZXJzIikNCiNTZSBzZWxlY2Npb25hIGNvbW8gb3B0aW1vIGVsIHByaW1lciBwdW50byBtYXMgYWx0by4NCmBgYA0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjpncmVlbjsiPiBQYXNvIDguIEdyYWZpY2FyIGxvcyBncnVwb3MgPC9zcGFuPg0KYGBge3J9DQpmdml6X2NsdXN0ZXIoY2x1c3RlcnMxLCBkYXRhPWRhdG9zX2VzY2FsYWRvcykNCmBgYA0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjpncmVlbjsiPiBQYXNvIDkuIEFncmVnYXIgQ2x1c3RlcnMgYSBsYSBCYXNlIGRlIERhdG9zIDwvc3Bhbj4NCmBgYHtyfQ0KZGYxX2NsdXN0ZXJzIDwtIGNiaW5kKGRmMSxkYXRvc19lc2NhbGFkb3MsIGNsdXN0ZXIgPSBjbHVzdGVyczEkY2x1c3RlcikNCmhlYWQoZGYxX2NsdXN0ZXJzKQ0KYGBgDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOmdyZWVuOyI+IENvbmNsdXNpb25lcyA8L3NwYW4+DQpMYSB0w6ljbmljYSBkZSAqY2x1c3RlcmluZyogcGVybWl0ZSBpZGVudGlmaWNhciBwYXRyb25lcyBvIGdydXBvcyBuYXR1cmFsZXMgZW4gbG9zIGRhdG9zIHNpbiBuZWNlc2lkYWQgZGUgZXRpcXVldGFzIHByZXZpYXMuIEVuIGVzdGUgY2FzbyBzaSBmdWUgbmVjZXNhcmlvIHV0aWxpemFyIGxhIGVzY2FsYSBkZSBkYXRvcyBwYXJhIHBvZGVyIHRyYWJhamFyIGNvbiBsb3MgZGF0b3MgZHVyYW50ZSBlbCBhbmFsaXNpcyB5IGVsIGFncnVwYW1pZW50byBkZSBsb3MgY2x1c3RlcnMuIEFkZW3DoXMsIGVuIGVsIGNhc28gZGUgbWkgT3B0aW1pemFjacOzbiBkZSBjbHVzdGVycywgZWwgY2x1c3RlciDDs3B0aW1vIGVzIGVsIDEuDQo=