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=