Contexto

El conjunto de datos corresponde a un escenario académico de nivel superior. Cada registro representa a un estudiante y contiene información relacionada con su desempeño escolar, hábitos de estudio, actividades extraescolares, uso del tiempo, características demográficas y condiciones económicas.

Debido a que las variables son de tipo numérico y categórico, el conjunto resulta adecuado para aplicar clustering jerárquico con distancia de Gower.

Las variables del conjunto de datos:

El caso de estudio puede encontrar en el portal rpubs.com en https://rpubs.com/rpizarrog/1449170

Los datos pueden descargarse desde github.com en https://raw.githubusercontent.com/rpizarrog/Libro-Aprendizaje-Automatico.-Casos-de-Estudio-con-R-y-Python/refs/heads/main/datos/datos_estudiantes_superior_clustering_jerarquico_1000.csv

Las funciones se encuentran en PENDIENTE

Objetivo

Implementar modelo de agrupación de datos Clustering Jerárquico para identificar perfiles de estudiantes con características similares, los cuales pueden apoyar la toma de decisiones en tutorías, seguimiento académico, programas de becas, actividades deportivas, acompañamiento escolar y estrategias de permanencia.

Descripción

Cargar librerías

library(readr)        # Para conjuntos de datos
library(ggplot2)      # Gráficos
library(patchwork)    # Para tablas Word
library (psych)       # Para describir datos
library(scales)       # PAra graficos y escalas
library(dplyr)        # Tratar con estructuras de datos seleccionar, filtrar, modificar

library(cluster) # Distancia de Gower, agnes(), diana()
library(factoextra) # Visualización de dendrogramas 
library(ggplot2) # Gráficos generales 
library(dendextend) # Personalización de dendrogramas

Cargar funciones

url <- "../funciones/funciones para Clustering Jerarquico.R"# Local
# url <- "PENDIENTE" WEB
source(url)

Cargar datos

Se cargan los datos originales de los estudiantes quitando la última columna que no es de interés para el modelo y dejar en variable llamada datos; se visualizan los primeros y últimos registros y las primeras y últimas cuatros variables.

# url <- "../datos/datos_estudiantes_superior_clustering_jerarquico_1000.csv"  # Local
url <- "https://raw.githubusercontent.com/rpizarrog/Libro-Aprendizaje-Automatico.-Casos-de-Estudio-con-R-y-Python/refs/heads/main/datos/datos_estudiantes_superior_clustering_jerarquico_1000.csv" # WEB
datos_originales <- f_cargar_datos(url)

variables <- c("id","edad","genero","carrera","semestre","promedio","creditos","asistencia","estudio", "videojuegos","deporte","dormir", "trabajo", "ingresos","condicion", "modalidad", "extra_escolar", "seleccionado", "transporte","traslado", "internet", "tutorias", "beca")

datos <- datos_originales[,variables]
f_visualizar_head_tail_reducido_word(datos)

id

edad

genero

carrera

...

traslado

internet

tutorias

beca

E0001

20

Femenino

Civil

...

64

Bueno

NO

NO

E0002

18

Femenino

Administracion

...

27

Bueno

NO

NO

E0003

23

Femenino

Administracion

...

53

Limitado

SI

SI

E0004

23

Femenino

Sistemas

...

12

Bueno

NO

NO

E0005

18

Masculino

Mecatronica

...

38

Bueno

NO

SI

E0006

20

Femenino

Civil

...

9

Limitado

SI

NO

...

...

...

...

...

...

...

...

...

E0995

24

Masculino

Sistemas

...

10

Limitado

NO

NO

E0996

24

Femenino

Civil

...

43

Bueno

NO

NO

E0997

18

Femenino

Industrial

...

15

Bueno

NO

SI

E0998

21

Femenino

Mecatronica

...

62

Bueno

SI

NO

E0999

24

Femenino

Sistemas

...

37

Bueno

SI

SI

E1000

23

Femenino

Industrial

...

31

Regular

SI

NO

Estadísticos descriptivos

Se presentan los estadísticos descriptivos para las variables numéricas

variables_numericas <- c("edad","promedio","creditos","asistencia","estudio", "videojuegos","deporte","dormir", "trabajo", "ingresos")
f_describir_datos(datos[, variables_numericas])
## $describe
##             vars    n     mean      sd median  trimmed     mad  min   max range
## edad           1 1000    21.15    2.10     21    21.09    2.97   18    27     9
## promedio       2 1000    77.20    9.36     77    77.19   10.38   50   100    50
## creditos       3 1000   187.94   76.04    187   187.72   78.58    0   380   380
## asistencia     4 1000    81.50   10.85     82    82.01   11.86   41   100    59
## estudio        5 1000     9.64    5.22      9     9.27    4.45    0    29    29
## videojuegos    6 1000    10.42    7.69      8     9.59    5.93    0    35    35
## deporte        7 1000     3.71    2.88      3     3.43    2.97    0    16    16
## dormir         8 1000     6.52    1.11      7     6.57    1.48    4    10     6
## trabajo        9 1000    11.42   10.44      9    10.07   10.38    0    50    50
## ingresos      10 1000 17091.89 7531.45  16863 16861.87 7413.74 3000 47096 44096
##              skew kurtosis     se
## edad         0.23    -0.64   0.07
## promedio     0.03    -0.47   0.30
## creditos     0.04    -0.34   2.40
## asistencia  -0.44    -0.08   0.34
## estudio      0.68     0.34   0.17
## videojuegos  0.90    -0.01   0.24
## deporte      0.91     0.68   0.09
## dormir      -0.27    -0.25   0.04
## trabajo      0.97     0.26   0.33
## ingresos     0.38     0.22 238.17
## 
## $structure
## [1] "'data.frame':\t1000 obs. of  10 variables:\n $ edad       : num  20 18 23 23 18 20 24 23 18 19 ...\n $ promedio   : num  90 72 77 90 86 67 90 66 73 78 ...\n $ creditos   : num  133 36 255 278 206 257 12 259 377 133 ...\n $ asistencia : num  90 76 64 94 82 74 100 62 79 65 ...\n $ estudio    : num  16 7 2 17 12 2 25 5 9 12 ...\n $ videojuegos: num  5 7 21 8 4 10 1 17 16 8 ...\n $ deporte    : num  9 6 1 12 8 0 8 1 0 6 ...\n $ dormir     : num  8 7 6 7 8 6 7 4 4 6 ...\n $ trabajo    : num  0 19 34 9 13 27 0 26 12 27 ...\n $ ingresos   : num  16265 24195 10118 21557 18141 ..."

Las variables categóricas se hacen de tipo factor con la finalidad de conocer su frecuencia.

datos <- f_convertir_factor(datos)
f_summary_factores(datos)
##        id                genero              carrera    condicion  
##  E0001  :  1   Femenino     :468   Administracion:196   Alta :152  
##  E0002  :  1   Masculino    :511   Civil         :118   Baja :332  
##  E0003  :  1   No especifica: 21   Electronica   :100   Media:516  
##  E0004  :  1                       Industrial    :187              
##  E0005  :  1                       Mecatronica   :152              
##  E0006  :  1                       Sistemas      :247              
##  (Other):994                                                       
##       modalidad        extra_escolar seleccionado     transporte 
##  Hibrida   :267   Arte        : 97   NO:775       Auto     :331  
##  Presencial:592   Cultural    : 78   SI:225       Bicicleta: 86  
##  Virtual   :141   Deporte     :173                Caminando:171  
##                   Ninguna     :523                Publico  :412  
##                   Voluntariado:129                               
##                                                                  
##                                                                  
##      internet   tutorias beca    
##  Bueno   :569   NO:627   NO:603  
##  Limitado:107   SI:373   SI:397  
##  Regular :324                    
##                                  
##                                  
##                                  
## 
 variables_categoricas <- c("genero", "carrera", "condicion", "modalidad", "extra_escolar", "seleccionado", "transporte", "internet", "tutorias", "beca")

resultado_frecuencias <- f_frecuencias(
  datos = datos[,  variables_categoricas], ncol=2)

resultado_frecuencias$grafico

Desarrollo

Crear modelo clustering jerárquico K=4

Al crear el modelo de clustering jerárquico se le indica al modelo en los parámetros que la manera en que junta los registros similares es por medio del argumento complete que significa que el modelo calcula la distancia entre dos clústeres tomando la mayor distancia entre todos los pares de registros de ambos grupos. Existe el mecanismo single que utiliza la distancia más pequeña entre dos registros, sin embargo puede generar encadenamiento y average implica el promedio de todas las distancias entre registros, este produce grupos moderados y el mecanismos conmplete que fue el que se implementa produce grupos más compactos.

Se tomó el tiempo de construcción del modelo para los mil registros y se tarde[o aproximadamente 53 segundos en un equipo laptop con procesador Intel 12th gen Core I9, con 32 Gb de RAM.

variable_modelo <- variables[-1] # quitar "id"

tiempo_modelo_CR <- system.time({
modelo_CR <- f_crear_clustering_jerarquico(
    datos = datos,
    variable_nombre = "id",
    variables_modelo = variable_modelo,
    k = 4,
    metodo_enlace = "complete",
    graficar = TRUE
  )})

## 
## ========================================
## CLUSTERING JERÁRQUICO CREADO
## ========================================
## Registros: 1000 
## Variables del modelo: edad, genero, carrera, semestre, promedio, creditos, asistencia, estudio, videojuegos, deporte, dormir, trabajo, ingresos, condicion, modalidad, extra_escolar, seleccionado, transporte, traslado, internet, tutorias, beca 
## Variables numéricas: edad, semestre, promedio, creditos, asistencia, estudio, videojuegos, deporte, dormir, trabajo, ingresos, traslado 
## Variables categóricas: genero, carrera, condicion, modalidad, extra_escolar, seleccionado, transporte, internet, tutorias, beca 
## Tipo de distancia: gower 
## Método de enlace: complete 
## Número de clústeres: 4 
## ========================================
tiempo_modelo_CR
##    user  system elapsed 
##   54.57    0.59   55.86

El dendograma con los mil registros es poco amigable para identificar cuales registros son de cada grupo, lo recomendable es hacer una tabla y presentar los datos resumidos para identificar los registros de cada tabla.

tabla_frecuencia <- modelo_CR$frecuencia_cluster

tabla_frecuencia$porcentaje <- round(
    tabla_frecuencia$frecuencia / sum(tabla_frecuencia$frecuencia) * 100,
    2
)

tabla_frecuencia

Registros por clúster

Con la llamada de la función f_registros_por_cluster(), se integran los registros que pertenecen a cada clúster

registros_clusters <- f_registros_por_cluster(
  modelo = modelo_CR,
  variables = variables,
  variable_cluster = "cluster",
  visualizar = FALSE
)

f_visualizar_head_tail_reducido_word(registros_clusters$tabla_pertenencia)

id

edad

genero

carrera

...

internet

tutorias

beca

cluster

E0001

20

Femenino

Civil

...

Bueno

NO

NO

1

E0004

23

Femenino

Sistemas

...

Bueno

NO

NO

1

E0006

20

Femenino

Civil

...

Limitado

SI

NO

1

E0007

24

Femenino

Administracion

...

Regular

NO

SI

1

E0009

18

Femenino

Industrial

...

Bueno

NO

NO

1

E0011

26

Masculino

Sistemas

...

Bueno

NO

NO

1

...

...

...

...

...

...

...

...

...

E0925

24

Femenino

Civil

...

Bueno

SI

NO

4

E0930

22

Masculino

Sistemas

...

Bueno

NO

NO

4

E0953

24

Masculino

Administracion

...

Bueno

NO

NO

4

E0971

20

Femenino

Industrial

...

Bueno

NO

NO

4

E0981

19

Femenino

Sistemas

...

Regular

SI

NO

4

E0987

19

Masculino

Industrial

...

Bueno

NO

NO

4

Ahora los registros por clúster, presentando los primeros y últimos registros de cada uno.

# Estudiantes del clúster 1
f_visualizar_head_tail_reducido_word(subset(registros_clusters$tabla_pertenencia, cluster == 1))

id

edad

genero

carrera

...

internet

tutorias

beca

cluster

E0001

20

Femenino

Civil

...

Bueno

NO

NO

1

E0004

23

Femenino

Sistemas

...

Bueno

NO

NO

1

E0006

20

Femenino

Civil

...

Limitado

SI

NO

1

E0007

24

Femenino

Administracion

...

Regular

NO

SI

1

E0009

18

Femenino

Industrial

...

Bueno

NO

NO

1

E0011

26

Masculino

Sistemas

...

Bueno

NO

NO

1

...

...

...

...

...

...

...

...

...

E0993

24

Femenino

Electronica

...

Bueno

SI

SI

1

E0994

21

Femenino

Sistemas

...

Bueno

NO

SI

1

E0995

24

Masculino

Sistemas

...

Limitado

NO

NO

1

E0996

24

Femenino

Civil

...

Bueno

NO

NO

1

E0997

18

Femenino

Industrial

...

Bueno

NO

SI

1

E0998

21

Femenino

Mecatronica

...

Bueno

SI

NO

1

# Estudiantes del clúster 2
f_visualizar_head_tail_reducido_word(subset(registros_clusters$tabla_pertenencia, cluster == 2))

id

edad

genero

carrera

...

internet

tutorias

beca

cluster

E0002

18

Femenino

Administracion

...

Bueno

NO

NO

2

E0003

23

Femenino

Administracion

...

Limitado

SI

SI

2

E0005

18

Masculino

Mecatronica

...

Bueno

NO

SI

2

E0008

23

No especifica

Mecatronica

...

Regular

NO

SI

2

E0014

20

Femenino

Sistemas

...

Bueno

SI

SI

2

E0017

21

Masculino

Sistemas

...

Bueno

NO

NO

2

...

...

...

...

...

...

...

...

...

E0989

20

Masculino

Sistemas

...

Regular

SI

NO

2

E0990

20

Femenino

Administracion

...

Bueno

NO

NO

2

E0991

18

Masculino

Civil

...

Bueno

NO

SI

2

E0992

22

Femenino

Mecatronica

...

Bueno

SI

NO

2

E0999

24

Femenino

Sistemas

...

Bueno

SI

SI

2

E1000

23

Femenino

Industrial

...

Regular

SI

NO

2

# Estudiantes del clúster 3
f_visualizar_head_tail_reducido_word(subset(registros_clusters$tabla_pertenencia, cluster == 3))

id

edad

genero

carrera

...

internet

tutorias

beca

cluster

E0010

19

Femenino

Administracion

...

Regular

NO

SI

3

E0020

20

Masculino

Mecatronica

...

Limitado

NO

SI

3

E0026

19

Masculino

Sistemas

...

Regular

NO

SI

3

E0031

20

Femenino

Administracion

...

Regular

NO

SI

3

E0032

23

Masculino

Mecatronica

...

Limitado

SI

SI

3

E0035

21

Masculino

Mecatronica

...

Regular

NO

NO

3

...

...

...

...

...

...

...

...

...

E0951

24

Masculino

Mecatronica

...

Regular

NO

NO

3

E0955

21

Masculino

Administracion

...

Bueno

NO

SI

3

E0958

24

Masculino

Civil

...

Bueno

NO

SI

3

E0968

23

Masculino

Industrial

...

Regular

NO

SI

3

E0978

18

Masculino

Sistemas

...

Limitado

SI

NO

3

E0984

25

Masculino

Industrial

...

Regular

SI

SI

3

# Estudiantes del clúster 4
f_visualizar_head_tail_reducido_word(subset(registros_clusters$tabla_pertenencia, cluster == 4))

id

edad

genero

carrera

...

internet

tutorias

beca

cluster

E0013

19

Masculino

Administracion

...

Regular

NO

NO

4

E0018

21

Masculino

Mecatronica

...

Limitado

NO

NO

4

E0022

22

Masculino

Civil

...

Bueno

NO

NO

4

E0025

24

Masculino

Sistemas

...

Bueno

NO

NO

4

E0034

18

Masculino

Administracion

...

Bueno

SI

NO

4

E0039

20

Masculino

Industrial

...

Bueno

NO

NO

4

...

...

...

...

...

...

...

...

...

E0925

24

Femenino

Civil

...

Bueno

SI

NO

4

E0930

22

Masculino

Sistemas

...

Bueno

NO

NO

4

E0953

24

Masculino

Administracion

...

Bueno

NO

NO

4

E0971

20

Femenino

Industrial

...

Bueno

NO

NO

4

E0981

19

Femenino

Sistemas

...

Regular

SI

NO

4

E0987

19

Masculino

Industrial

...

Bueno

NO

NO

4

Perfil de cada cluster

La pregunta es: ¿qué característica distinguen a cada grupo?. Para interpretar qué atributos comunes tiene cada uno de los cuatro grupos, no conviene revisar estudiante por estudiante, sino construir perfiles por clúster. La lógica recomendada sería:

  • Para variables numéricas, calcular promedios por clúster.
  • Para variables categóricas, identificar la categoría dominante por clúster.
  • Comparar cada clúster contra el promedio general.
  • Asignar un nombre interpretativo a cada grupo.

Con la ayuda de la función f_perfil_cluster()* se identifican las características importantes que definen a cada cluster; con las variables numéricas se extrae la media de cada una de ellas que sirven para conocer el perfil numérico de cada cluster. Luego con las variables categóricas se extrae la moda para identificar la mayor frecuencia de cada clúster y con ello las variables dominante; finalmente se unen ambos perfiles para conocer el perfil general de cada grupo.

perfiles_CR <- f_perfil_cluster(
    modelo = modelo_CR,
    variables_numericas = variables_numericas,
    variables_categoricas = variables_categoricas,
    variable_cluster = "cluster",
    decimales = 2
)
## 
## ========================================
## PERFIL DE CLÚSTERES
## ========================================
## Número de registros: 1000 
## Variable de clúster: cluster 
## Variables numéricas: edad, promedio, creditos, asistencia, estudio, videojuegos, deporte, dormir, trabajo, ingresos 
## Variables categóricas: genero, carrera, condicion, modalidad, extra_escolar, seleccionado, transporte, internet, tutorias, beca 
## ========================================
# Perfil numérico
perfiles_CR$perfil_numerico
# Perfil categórico
perfiles_CR$perfil_categorico
# Perfil general integrado
perfiles_CR$perfil_general

Con la ayuda de IAG se tiene una interpretación de cada clústeres a partir de los perfiles tanto numéricos como categóricos:

Interpretación de los clústeres Clúster 1: estudiantes con desempeño académico medio-alto y equilibrio general

El clúster 1 agrupa a 312 estudiantes. Presenta un promedio escolar de 80.48, asistencia de 85.51% y alrededor de 11.36 horas de estudio semanal. Sus horas de videojuegos son moderadas, con 9.62 horas semanales, y su carga laboral es relativamente baja, con 8.29 horas de trabajo semanal.

Este grupo puede interpretarse como un perfil de estudiantes con desempeño académico favorable y hábitos relativamente equilibrados. No son los de mayor rendimiento del conjunto, pero muestran buena asistencia, dedicación al estudio y una carga laboral manejable.

En términos categóricos, predomina el género femenino, la carrera de Sistemas, la condición económica media, la modalidad presencial, sin actividad extraescolar dominante, transporte público, internet bueno, sin tutorías y sin beca.

Nombre sugerido del clúster 1: Estudiantes de desempeño medio-alto y equilibrio académico

Clúster 2: grupo mayoritario con menor desempeño y mayor exposición a videojuegos y trabajo

El clúster 2 es el grupo más numeroso, con 465 estudiantes, equivalente al 46.5% del conjunto. Presenta un promedio escolar de 73.62, asistencia de 77.41% y 7.59 horas de estudio semanal, valores más bajos que los observados en los clústeres 1 y 4.

Además, este grupo registra 12.14 horas semanales de videojuegos y 13.82 horas de trabajo semanal, lo cual sugiere una combinación de menor dedicación académica, mayor tiempo recreativo digital y mayor carga laboral.

Este clúster puede interpretarse como un grupo de estudiantes con desempeño académico moderado-bajo, cuya dinámica puede estar asociada con menor asistencia, menor estudio y mayor presión de tiempo por trabajo o actividades recreativas.

En las variables categóricas predominan estudiantes de género masculino, carrera de Sistemas, condición económica media, modalidad presencial, sin actividad extraescolar, transporte público, internet bueno, participación en tutorías y sin beca.

Nombre sugerido del clúster 2: Estudiantes con desempeño moderado-bajo y mayor carga de tiempo

Clúster 3: estudiantes con desempeño intermedio, mayor trabajo y condiciones de apoyo

El clúster 3 agrupa a 113 estudiantes. Su promedio escolar es de 75.71, con asistencia de 80.25% y 8.90 horas de estudio semanal. Estos valores lo ubican por encima del clúster 2, pero por debajo de los clústeres 1 y 4.

Este grupo destaca por tener la mayor carga laboral, con 14.35 horas de trabajo semanal, además de ingresos promedio de 17,043.44. También presenta acceso a internet regular como categoría dominante y beca dominante sí. Esto puede sugerir un perfil de estudiantes que combinan estudio y trabajo, con ciertas condiciones de apoyo económico o institucional.

Aunque el grupo no presenta el rendimiento más bajo, su carga laboral y condiciones de conectividad pueden representar factores importantes para su seguimiento académico.

En las variables categóricas predominan estudiantes de género masculino, carrera de Sistemas, condición económica media, modalidad presencial, sin actividad extraescolar, transporte público, internet regular, sin tutorías y con beca.

Nombre sugerido del clúster 3: Estudiantes trabajadores con apoyo económico y desempeño intermedio

Clúster 4: estudiantes de alto desempeño académico y mayor actividad deportiva

El clúster 4 agrupa a 110 estudiantes. Aunque es uno de los grupos más pequeños, presenta los mejores indicadores académicos: promedio escolar de 84.62, asistencia de 88.73%, 14.21 horas de estudio semanal y 198.56 créditos aprobados.

También muestra menor tiempo dedicado a videojuegos, con 5.79 horas semanales, y mayor participación deportiva, con 5.76 horas de deporte semanal. Además, tiene la mayor cantidad de horas de sueño, con 6.99 horas por noche, y la menor carga laboral, con 7.16 horas de trabajo semanal.

Este grupo puede interpretarse como el perfil de estudiantes con alto desempeño académico, mayor disciplina escolar y mayor participación deportiva. Es el clúster con mejores condiciones para considerarse un grupo de desempeño integral.

En las variables categóricas predominan estudiantes de género masculino, carrera de Sistemas, condición económica media, modalidad presencial, actividad extraescolar deporte, transporte en auto, internet bueno, sin tutorías y sin beca.

Nombre sugerido del clúster 4: Estudiantes de alto desempeño académico y perfil deportivo

Evaluación del modelo

Con la función f_evaluar_clustering(), se hace evaluación del modelo a través de técnica y/o estadístico de Silhouette y la correlación cofenética.

evaluacion_CR <- f_evaluar_clustering(
  modelo = modelo_CR,
  k_min = 2,
  k_max = 8,
  graficar = TRUE
)

## 
## ========================================
## EVALUACIÓN DEL CLUSTERING JERÁRQUICO
## ========================================
## Número de registros: 1000 
## Tipo de distancia: gower 
## Método de enlace: complete 
## Valores de K evaluados: 2 a 8 
## ----------------------------------------
## Mejor K según Silhouette: 2 
## Silhouette promedio: 0.0682 
## Interpretación: Estructura poco definida 
## ----------------------------------------
## Correlación cofenética: 0.295 
## Interpretación: Baja: el dendrograma representa débilmente las distancias originales 
## ========================================
## 
## INTERPRETACIÓN PARA EL REPORTE:
## La evaluación del clustering jerárquico se realizó mediante el estadístico Silhouette y la correlación cofenética. De acuerdo con Silhouette, el mejor valor de K fue 2, con un promedio de 0.0682, lo que indica una estructura poco definida. La correlación cofenética fue de 0.295, por lo que se considera que baja: el dendrograma representa débilmente las distancias originales.

Interpretación del caso

El caso construye un modelo de clustering jerárquico con K=4 grupos designados; se utiliza la modalidad de complete en el modelo lo que asegura grupos mas compactos.

El modelo construye cuatro grupos de los cuales el grupo 1 representa el 31.2%, el dos un 46.5%; el grupo 3 un 11.3% y el cuatro 11.0%.

Aquí el resumen de la interpreración de cada clúster:

El clúster 1: Los estudiantes tienen buen promedio, buena asistencia, estudio medio-alto, baja carga laboral, desempeño medio-alto y equilibrio académico.

El clúster 2* presenta menor promedio, menor asistencia, menor estudio, más videojuegos y trabajo; desempeño moderado-bajo y mayor carga de tiempo.

El cluster 3 son estudaintes con desempeño intermedio, mayor trabajo, internet regular y beca dominante; alumnos trabajadores con apoyo económico,

El clúster 4 son estudiantes con mayor promedio, mayor asistencia, más estudio, más deporte y menos videojuegos; alto desempeño académico y perfil deportivo.