Contexto

Se realizó un análisis sobre la movilidad y transporte de las ciudades con mayor demanda de este servicio en México.

La base de datos contiene información sobre la cantidad de pasajeros

Paso 1. Instalar paquetes y llamar librerías

#install.packages("cluster") # Analisis 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

df <- read.csv("/Users/marielgarza/Downloads/movilidad2020-2025.csv") # conseguir path con file.choose() en Console
df <- as.data.frame(df)
df1 <- df[, -c(1, 6:10)]

Paso 3. Entender los datos

summary(df1)
##  autobuses_op_entre_semana autobuses_op_fin_semana       km           
##  Min.   : 1474             Min.   : 1147           Min.   :8.249e+06  
##  1st Qu.: 8299             1st Qu.: 6321           1st Qu.:2.087e+07  
##  Median :18336             Median :14622           Median :1.384e+08  
##  Mean   :29008             Mean   :20797           Mean   :2.374e+08  
##  3rd Qu.:37470             3rd Qu.:28148           3rd Qu.:2.282e+08  
##  Max.   :89940             Max.   :55410           Max.   :1.306e+09  
##    pasajeros        
##  Min.   :3.782e+07  
##  1st Qu.:1.140e+08  
##  Median :6.757e+08  
##  Mean   :1.690e+09  
##  3rd Qu.:1.389e+09  
##  Max.   :1.092e+10
str(df1)
## 'data.frame':    10 obs. of  4 variables:
##  $ autobuses_op_entre_semana: int  89940 1771 12819 73049 1474 6817 23853 26474 12746 41135
##  $ autobuses_op_fin_semana  : int  55410 1393 8260 54458 1147 5675 19008 22273 10235 30107
##  $ km                       : num  1.31e+09 1.13e+07 2.63e+08 2.31e+08 8.25e+06 ...
##  $ pasajeros                : num  1.09e+10 8.01e+07 1.20e+09 1.45e+09 5.18e+07 ...

Paso 4. Escalar los datos

# Sí los datos no están en la misma escala
df1 <- scale(df1)

Paso 5. Determinar número de grupos

# Siempre es una valor inicial "cualquiera", luego se optimiza
# plot(df1$x,df1$y)
grupos1 <- 3 

Paso 6. Generar los grupos

set.seed(222)
clusters1 <- kmeans(df1,grupos1)
clusters1
## K-means clustering with 3 clusters of sizes 7, 2, 1
## 
## Cluster means:
##   autobuses_op_entre_semana autobuses_op_fin_semana         km  pasajeros
## 1                -0.5491671              -0.5478834 -0.3066588 -0.3182651
## 2                 0.9219460               1.0620888 -0.3019302 -0.2865815
## 3                 2.0002777               1.7110060  2.7504719  2.8010183
## 
## Clustering vector:
##  [1] 3 1 1 2 1 1 1 1 1 2
## 
## Within cluster sum of squares by cluster:
## [1] 2.248940 1.529342 0.000000
##  (between_SS / total_SS =  89.5 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"

Paso 7. Optimizar el número de grupos

optimizacion1 <- clusGap(df1, FUN=kmeans, nstart=1, K.max=8)
plot(optimizacion1, xlab="Número de clusters k", main="Optimización de Clusters")

Paso 8. Graficar los grupos

fviz_cluster(clusters1, data=df1)

Paso 9. Agregar Clusters a la Base de Datos

df1_clusters <- cbind(df1, cluster = clusters1$cluster)
head(df1_clusters)
##      autobuses_op_entre_semana autobuses_op_fin_semana          km  pasajeros
## [1,]                 2.0002777               1.7110060  2.75047193  2.8010183
## [2,]                -0.8941276              -0.9591567 -0.58192281 -0.4883417
## [3,]                -0.5314447              -0.6197079  0.06516701 -0.1492182
## [4,]                 1.4457812               1.6639468 -0.01558973 -0.0720029
## [5,]                -0.9038775              -0.9713170 -0.58973275 -0.4969155
## [6,]                -0.7284779              -0.7474894 -0.48323912 -0.4472275
##      cluster
## [1,]       3
## [2,]       1
## [3,]       1
## [4,]       2
## [5,]       1
## [6,]       1
df_final <- cbind(df1_clusters, entidad = df$entidad)

Conclusiones

La técnica de clustering permite identificar patrones o grupos naturales en los datos sin necesidad de etiquetas previas. De esta manera se identificaron patrones entre las distintas entidades en cuanto al uso y desempeño del transporte público. Se encontró que la Ciudad de México tiene un usoo mucho mayor a las otras entidades. Por otro lado, Guanajuato y Querétaro tienen una demanda menor. Finalmente Chihuahua, Edo. de México, Guerrero, Hidalgo, Jalisco, Nuevo León y Puebla tienen un uso del transporte público similar.

LS0tCnRpdGxlOiAiTcOpeGljbyAtIE1vdmlsaWRhZCB5IFRyYW5zcG9ydGUiCmF1dGhvcjogIk1hcmllbCBHYXJ6YSBBMDEyODUxNzUiCmRhdGU6ICIyMDI1LTA4LTE5IgpvdXRwdXQ6IAogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IFRSVUUKICAgIHRvY19mbG9hdDogVFJVRQogICAgY29kZV9kb3dubG9hZDogVFJVRQogICAgdGhlbWU6IHlldGkKLS0tCiFbXShodHRwczovL2ZhY3VsdHlzdGFmZi5yaWNobW9uZC5lZHUvfnRtYXR0c29uL0lORk8zMDMvaW1hZ2VzL2NsdXN0ZXJfcDQuZ2lmKQoKIyA8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZTsiPiBDb250ZXh0byA8L3NwYW4+ClNlIHJlYWxpesOzIHVuIGFuw6FsaXNpcyBzb2JyZSBsYSAqbW92aWxpZGFkIHkgdHJhbnNwb3J0ZSogZGUgbGFzIGNpdWRhZGVzIGNvbiBtYXlvciBkZW1hbmRhCmRlIGVzdGUgc2VydmljaW8gZW4gTcOpeGljby4gCgpMYSBiYXNlIGRlIGRhdG9zIGNvbnRpZW5lIGluZm9ybWFjacOzbiBzb2JyZSBsYSBjYW50aWRhZCBkZSBwYXNhamVyb3MgCgojIDxzcGFuIHN0eWxlPSJjb2xvcjpibHVlOyI+IFBhc28gMS4gSW5zdGFsYXIgcGFxdWV0ZXMgeSBsbGFtYXIgbGlicmVyw61hcyA8L3NwYW4+CgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojaW5zdGFsbC5wYWNrYWdlcygiY2x1c3RlciIpICMgQW5hbGlzaXMgZGUgQWdydXBhbWllbnRvCmxpYnJhcnkoY2x1c3RlcikKI2luc3RhbGwucGFja2FnZXMoKCJnZ3Bsb3QyIikpICMgR3JhZmljYXIKbGlicmFyeShnZ3Bsb3QyKQojaW5zdGFsbC5wYWNrYWdlcygoImRhdGEudGFibGUiKSkgIyBNYW5lam8gZGUgbXVjaG9zIGRhdG9zCmxpYnJhcnkoZGF0YS50YWJsZSkKI2luc3RhbGwucGFja2FnZXMoKCJmYWN0b2V4dHJhIikpICMgR3LDoWZpY2Egb3B0aW1pemFjacOzbiBkZSBuw7ptZXJvIGRlIGNsdXN0ZXJzCmxpYnJhcnkoZmFjdG9leHRyYSkKYGBgCgojIDxzcGFuIHN0eWxlPSJjb2xvcjpibHVlOyI+IFBhc28gMi4gT2J0ZW5lciBsb3MgZGF0b3MgPC9zcGFuPgpgYGB7cn0KZGYgPC0gcmVhZC5jc3YoIi9Vc2Vycy9tYXJpZWxnYXJ6YS9Eb3dubG9hZHMvbW92aWxpZGFkMjAyMC0yMDI1LmNzdiIpICMgY29uc2VndWlyIHBhdGggY29uIGZpbGUuY2hvb3NlKCkgZW4gQ29uc29sZQpkZiA8LSBhcy5kYXRhLmZyYW1lKGRmKQpgYGAKCmBgYHtyfQpkZjEgPC0gZGZbLCAtYygxLCA2OjEwKV0KYGBgCgojIDxzcGFuIHN0eWxlPSJjb2xvcjpibHVlOyI+IFBhc28gMy4gRW50ZW5kZXIgbG9zIGRhdG9zIDwvc3Bhbj4KYGBge3J9CnN1bW1hcnkoZGYxKQpzdHIoZGYxKQpgYGAKCiMgPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWU7Ij4gUGFzbyA0LiBFc2NhbGFyIGxvcyBkYXRvcyA8L3NwYW4+CmBgYHtyfQojIFPDrSBsb3MgZGF0b3Mgbm8gZXN0w6FuIGVuIGxhIG1pc21hIGVzY2FsYQpkZjEgPC0gc2NhbGUoZGYxKQpgYGAKCiMgPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWU7Ij4gUGFzbyA1LiBEZXRlcm1pbmFyIG7Dum1lcm8gZGUgZ3J1cG9zIDwvc3Bhbj4KYGBge3J9CiMgU2llbXByZSBlcyB1bmEgdmFsb3IgaW5pY2lhbCAiY3VhbHF1aWVyYSIsIGx1ZWdvIHNlIG9wdGltaXphCiMgcGxvdChkZjEkeCxkZjEkeSkKZ3J1cG9zMSA8LSAzIApgYGAKCiMgPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWU7Ij4gUGFzbyA2LiBHZW5lcmFyIGxvcyBncnVwb3MgPC9zcGFuPgpgYGB7cn0Kc2V0LnNlZWQoMjIyKQpjbHVzdGVyczEgPC0ga21lYW5zKGRmMSxncnVwb3MxKQpjbHVzdGVyczEKYGBgCgojIDxzcGFuIHN0eWxlPSJjb2xvcjpibHVlOyI+IFBhc28gNy4gT3B0aW1pemFyIGVsIG7Dum1lcm8gZGUgZ3J1cG9zIDwvc3Bhbj4KYGBge3J9Cm9wdGltaXphY2lvbjEgPC0gY2x1c0dhcChkZjEsIEZVTj1rbWVhbnMsIG5zdGFydD0xLCBLLm1heD04KQpwbG90KG9wdGltaXphY2lvbjEsIHhsYWI9Ik7Dum1lcm8gZGUgY2x1c3RlcnMgayIsIG1haW49Ik9wdGltaXphY2nDs24gZGUgQ2x1c3RlcnMiKQpgYGAKCiMgPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWU7Ij4gUGFzbyA4LiBHcmFmaWNhciBsb3MgZ3J1cG9zIDwvc3Bhbj4KYGBge3J9CmZ2aXpfY2x1c3RlcihjbHVzdGVyczEsIGRhdGE9ZGYxKQpgYGAKCiMgPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWU7Ij4gUGFzbyA5LiBBZ3JlZ2FyIENsdXN0ZXJzIGEgbGEgQmFzZSBkZSBEYXRvcyA8L3NwYW4+CmBgYHtyfQpkZjFfY2x1c3RlcnMgPC0gY2JpbmQoZGYxLCBjbHVzdGVyID0gY2x1c3RlcnMxJGNsdXN0ZXIpCmhlYWQoZGYxX2NsdXN0ZXJzKQpgYGAKCmBgYHtyfQpkZl9maW5hbCA8LSBjYmluZChkZjFfY2x1c3RlcnMsIGVudGlkYWQgPSBkZiRlbnRpZGFkKQpgYGAKCgojIDxzcGFuIHN0eWxlPSJjb2xvcjpibHVlOyI+IENvbmNsdXNpb25lcyA8L3NwYW4+CkxhIHTDqWNuaWNhIGRlICpjbHVzdGVyaW5nKiBwZXJtaXRlIGlkZW50aWZpY2FyIHBhdHJvbmVzIG8gZ3J1cG9zIG5hdHVyYWxlcyBlbiAKbG9zIGRhdG9zIHNpbiBuZWNlc2lkYWQgZGUgZXRpcXVldGFzIHByZXZpYXMuIERlIGVzdGEgbWFuZXJhIHNlIGlkZW50aWZpY2Fyb24gcGF0cm9uZXMKZW50cmUgbGFzIGRpc3RpbnRhcyBlbnRpZGFkZXMgZW4gY3VhbnRvIGFsIHVzbyB5IGRlc2VtcGXDsW8gZGVsIHRyYW5zcG9ydGUgcMO6YmxpY28uIApTZSBlbmNvbnRyw7MgcXVlIGxhIENpdWRhZCBkZSBNw6l4aWNvIHRpZW5lIHVuIHVzb28gbXVjaG8gbWF5b3IgYSBsYXMgb3RyYXMgZW50aWRhZGVzLiBQb3IKb3RybyBsYWRvLCBHdWFuYWp1YXRvIHkgUXVlcsOpdGFybyB0aWVuZW4gdW5hIGRlbWFuZGEgbWVub3IuIEZpbmFsbWVudGUgQ2hpaHVhaHVhLCBFZG8uIGRlIE3DqXhpY28sCkd1ZXJyZXJvLCBIaWRhbGdvLCBKYWxpc2NvLCBOdWV2byBMZcOzbiB5IFB1ZWJsYSB0aWVuZW4gdW4gdXNvIGRlbCB0cmFuc3BvcnRlIHDDumJsaWNvIHNpbWlsYXIu