Proyecto 2 Herramientas Tecnológicas

Datos: Información sobre personas que asisten a un gimnasion específico

Cegarra, Leonora.

Jimenez, Diego.

Zambrano, Francesca.

Paso 1

Importar los datos

library(readxl)
gym_members_exercise <- read_excel("/Users/leonoracegarra/Desktop/gym_members_exercise.xlsx")

Cargar las librerias necesarias

library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(tidyr)
library(lubridate)
## 
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
## 
##     date, intersect, setdiff, union
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats 1.0.0     ✔ readr   2.1.5
## ✔ ggplot2 3.5.1     ✔ stringr 1.5.1
## ✔ purrr   1.0.2     ✔ tibble  3.2.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(kableExtra)
## 
## Attaching package: 'kableExtra'
## 
## The following object is masked from 'package:dplyr':
## 
##     group_rows
library(scales)
## 
## Attaching package: 'scales'
## 
## The following object is masked from 'package:purrr':
## 
##     discard
## 
## The following object is masked from 'package:readr':
## 
##     col_factor

Importar archivo de datos de excel “gym_members_exercise.xlsx”

Verificar valores nulos y eliminar o imputar si es necesario

sapply(gym_members_exercise, function(x) sum(is.na(x)))  
##                           Age                        Gender 
##                             0                             0 
##                   Weight (kg)                    Height (m) 
##                             0                             0 
##                       Max_BPM                       Avg_BPM 
##                             0                             0 
##                   Resting_BPM      Session_Duration (hours) 
##                             0                             0 
##               Calories_Burned                  Workout_Type 
##                             0                             0 
##                Fat_Percentage         Water_Intake (liters) 
##                             0                             0 
## Workout_Frequency (days/week)              Experience_Level 
##                             0                             0 
##                           BMI 
##                             0

Mostrar conteo de nulos por columna

Eliminar duplicados si existen

gym_members_exercise <- gym_members_exercise %>%
  distinct()

Paso 2

Renombrar variables en español

gym_members_exercise <- gym_members_exercise %>%
  rename(
    edad = Age,
    genero = Gender,
    peso = `Weight (kg)`,
    altura = `Height (m)`,
    max_BPM = Max_BPM,
    prom_BPM = Avg_BPM,
    reposo_BPM = Resting_BPM,
    duracion_sesion = `Session_Duration (hours)`,
    calorias_quemadas = Calories_Burned,
    tipo_ejercicio = Workout_Type,
    porcentaje_grasa = Fat_Percentage,
    ingesta_agua = `Water_Intake (liters)`,
    frecuencia_entrenamiento = `Workout_Frequency (days/week)`,
    nivel_experiencia = Experience_Level,
    IMC = BMI,
  )

Preguntas y Respuestas

1. Calcule la media y la desviación estándar de la frecuencia cardíaca máxima (Max_BPM) por género.

pregunta1 <- gym_members_exercise %>%
  group_by(genero) %>%
  summarise(
    media_max_BPM = mean(max_BPM, na.rm = TRUE),
    DesviacionEstandar_max_BPM = sd(max_BPM, na.rm = TRUE)
  )
print(pregunta1)
## # A tibble: 2 × 3
##   genero media_max_BPM DesviacionEstandar_max_BPM
##   <chr>          <dbl>                      <dbl>
## 1 Female          180.                       11.4
## 2 Male            180.                       11.7

El género no representa una diferencia significativa con respecto a la frecuencia cardiaca, ya que tanto hombres como mujeres tienen una media y desviación similar

2. Agrupe a los miembros por nivel de experiencia y calcula el promedio de porcentaje de grasa corporal por grupo.

Calcular el promedio de porcentaje de grasa corporal por nivel de experiencia

pregunta2 <- gym_members_exercise %>%
  group_by(nivel_experiencia) %>%
  summarise(
    promedio_grasa = mean(porcentaje_grasa, na.rm = TRUE)
  )
print(pregunta2)
## # A tibble: 3 × 2
##   nivel_experiencia promedio_grasa
##               <dbl>          <dbl>
## 1                 1           27.6
## 2                 2           27.3
## 3                 3           14.8

Crear un gráfico de barras para ilustrar los resultados

library(ggplot2)
grafico2 <- ggplot(pregunta2, aes(x = as.factor(nivel_experiencia), y = promedio_grasa)) +
geom_bar(stat = "identity", fill = "skyblue", color = "navyblue")
labs(title = "Promedio de Porcentaje de Grasa Corporal por Nivel de Experiencia", 
     x = "Nivel de Experiencia", y = "Promedio de Porcentaje de Grasa Corporal") + theme_minimal()
## NULL
print(grafico2)

Se puede observar que entre un principiante y un intermedio no existe una diferencia notable en el porcentaje de grasa corporal, sin embargo, la diferencia con los expertos es de 54%.

3. ¿Cuantos participantes tienen un IMC mayor de 25 y cuál es el promedio de calorías quemadas por tipo de entrenamiento?

Contar el número de participantes con un IMC mayor de 25

pregunta3.1 <- gym_members_exercise %>%
  filter(IMC > 25) %>%
  summarise(num_participantes = n())
print(pregunta3.1)
## # A tibble: 1 × 1
##   num_participantes
##               <int>
## 1               435

Calcular el promedio de calorías quemadas por tipo de entrenamiento

pregunta3.2 <- gym_members_exercise %>%
  group_by(tipo_ejercicio) %>%
  summarise(
    promedio_calorias_quemadas = mean(calorias_quemadas, na.rm = TRUE)
  )
print(pregunta3.2)
## # A tibble: 4 × 2
##   tipo_ejercicio promedio_calorias_quemadas
##   <chr>                               <dbl>
## 1 Cardio                               885.
## 2 HIIT                                 926.
## 3 Strength                             911.
## 4 Yoga                                 903.

Crear un gráfico de barras para ilustrar los resultados

grafico3 <- ggplot(pregunta3.2, aes(x = tipo_ejercicio, y = promedio_calorias_quemadas)) +
  geom_bar(stat = "identity", fill = "pink", color = "red") +
  labs(title = "Promedio de Calorías Quemadas por Tipo de Entrenamiento",
       x = "Tipo de Entrenamiento",
       y = "Promedio de Calorías Quemadas") +
  theme_minimal()
print(grafico3)

Las personas con un IMC mayor a 25 suelen quemar entre 885 y 926 calorías por entrenamiento, siendo el cardio el menos efectivo, y el HIIT el más efectivo

4. ¿Cuál es el número total de participantes por grupo de edad (categorías de 10 años) y género?

Crear categorías de edad en intervalos de 10 años

gym_members_exercise <- gym_members_exercise %>%
  mutate(categoria_edad = cut(edad, breaks = seq(0, 100, by = 10), right = FALSE))

Contar el número total de participantes por grupo de edad y género

pregunta4 <- gym_members_exercise %>%
  group_by(categoria_edad, genero) %>%
  summarise(num_participantes = n())
## `summarise()` has grouped output by 'categoria_edad'. You can override using
## the `.groups` argument.
print(pregunta4)
## # A tibble: 10 × 3
## # Groups:   categoria_edad [5]
##    categoria_edad genero num_participantes
##    <fct>          <chr>              <int>
##  1 [10,20)        Female                31
##  2 [10,20)        Male                  22
##  3 [20,30)        Female               102
##  4 [20,30)        Male                 121
##  5 [30,40)        Female               102
##  6 [30,40)        Male                 107
##  7 [40,50)        Female               111
##  8 [40,50)        Male                 134
##  9 [50,60)        Female               116
## 10 [50,60)        Male                 127

Crear un gráfico de puntos para el número total de participantes por grupo de edad y género

grafico4 <- ggplot(pregunta4, aes(x = categoria_edad, y = num_participantes, color = genero)) +
  geom_point(size = 4) +
  labs(title = "Número Total de Participantes por Grupo de Edad y Género",
       x = "Grupo de Edad",
       y = "Número de Participantes") +
  theme_minimal()
print(grafico4)

Con esta data se pueden resaltar varias afirmaciones:

  • La mayoría de las personas comienzan a ir al gimnasio después de los 20 años.

  • El rango de edad donde hay más hombres es entre los 40 y los 50, mientras que el de mujeres es entre 50 y 60.

  • Hay más hombres que mujeres en el gimnasio: 511 hombres y 462 mujeres.

5. ¿Cuáles son los tres tipos de entrenamiento más populares y muestre la distribución de la duración de la sesión para estos tipos?

Calcular la frecuencia de cada tipo de entrenamiento

frecuencia_tipo <- gym_members_exercise %>%
  group_by(tipo_ejercicio) %>%
  summarise(Frecuencia = sum(frecuencia_entrenamiento, na.rm = TRUE)) %>%
  arrange(desc(Frecuencia))

Mostrar los tres tipos de entrenamiento más populares

pregunta5 <- head(frecuencia_tipo, 3)
print(pregunta5)
## # A tibble: 3 × 2
##   tipo_ejercicio Frecuencia
##   <chr>               <dbl>
## 1 Strength              866
## 2 Cardio                825
## 3 Yoga                  801

Crear un gráfico de caja para la distribución de la duración de la sesión

grafico5 <- ggplot(gym_members_exercise, aes(x = tipo_ejercicio, y = duracion_sesion, fill = tipo_ejercicio)) +
  geom_boxplot() +
  labs(title = "Distribución de la Duración de la Sesión para los Tres Tipos de Entrenamiento Más Populares",
       x = "Tipo de Entrenamiento",
       y = "Duración de la Sesión (horas)") +
  theme_minimal() +
  theme(legend.position = "none")
print(grafico5)

El entrenamiento de fuerza es el preferido de hacer por los usuarios del gimnasio, seguido del cardio y posteriormente el yoga, por último, el menos realizado es el HIIT

6. Determine la media y la mediana de la frecuencia cardíaca en reposo para cada nivel de experiencia. ¿existen diferencias?

pregunta6 <- gym_members_exercise %>%
  group_by(nivel_experiencia) %>%
  summarise(
    media_reposo_BPM = mean(reposo_BPM, na.rm = TRUE),
    mediana_reposo_BPM = median(reposo_BPM, na.rm = TRUE)
  )
print(pregunta6)
## # A tibble: 3 × 3
##   nivel_experiencia media_reposo_BPM mediana_reposo_BPM
##               <dbl>            <dbl>              <dbl>
## 1                 1             62.3                 63
## 2                 2             62.1                 62
## 3                 3             62.4                 62

Se puede observar que la frecuencia cardiaca no tiene una variación significativa con respecto al nivel de experiencia en el gimnasio

7. Muestre un perfil de los participantes del gimnasio por tipo de entrenamiento.

pregunta7 <- gym_members_exercise %>%
  group_by(tipo_ejercicio) %>%
  summarise(
    media_edad = mean(edad, na.rm = TRUE),
    proporcion_hombres = sum(genero == "Male", na.rm = TRUE) / n(),
    proporcion_mujeres = sum(genero == "Female", na.rm = TRUE) / n(),
    media_duracion_sesion = mean(duracion_sesion, na.rm = TRUE),
    media_IMC = mean(IMC, na.rm = TRUE),
    media_reposo_BPM = mean(reposo_BPM, na.rm = TRUE),
    media_calorías_quemadas = mean(calorias_quemadas, na.rm = TRUE)
  )
print(pregunta7)
## # A tibble: 4 × 8
##   tipo_ejercicio media_edad proporcion_hombres proporcion_mujeres
##   <chr>               <dbl>              <dbl>              <dbl>
## 1 Cardio               37.7              0.506              0.494
## 2 HIIT                 38.9              0.516              0.484
## 3 Strength             38.9              0.523              0.477
## 4 Yoga                 39.2              0.556              0.444
## # ℹ 4 more variables: media_duracion_sesion <dbl>, media_IMC <dbl>,
## #   media_reposo_BPM <dbl>, media_calorías_quemadas <dbl>

Analizando un promedio de los datos más relevantes por tipo de entrenamiento en el gimnasio, obtuvimos las siguientes características:

  • La edad media por entrenamiento mas joven es el cardio, con un promedio de 37.67 años, y el entrenamiento realizado por personas de mayor edad es el yoga con 39.23 de promedio de edad.

  • Los hombres tienen más participación en los 4 tipos de entrenamiento.

  • El entrenamiento más duradero es el HIT, mientras que el más corto es el cardio.

  • El IMC más alto se ve en el cardio, seguido del HIIT, y posteriormente el yoga y el entrenamiento de fuerza.

  • El entrenamiento que más calorías quema es el HIIT.

8. ¿Cuál es el promedio del IMC para los integrantes que entrenan más de 1.5 horas y que tienen un promedio de BPM mayor de 130

Filtrar los datos

datos_filtrados <- gym_members_exercise %>%
  filter(duracion_sesion > 1.5, prom_BPM > 130)
print(datos_filtrados)
## # A tibble: 148 × 16
##     edad genero  peso altura max_BPM prom_BPM reposo_BPM duracion_sesion
##    <dbl> <chr>  <dbl>  <dbl>   <dbl>    <dbl>      <dbl>           <dbl>
##  1    56 Male    88.3   1.71     180      157         60            1.69
##  2    56 Female  58     1.68     168      156         74            1.59
##  3    45 Male    84.9   1.86     186      136         66            1.64
##  4    38 Male    81.4   1.71     187      148         58            1.52
##  5    53 Male    84.2   1.76     165      137         69            1.67
##  6    46 Female  61     1.71     181      153         61            1.67
##  7    27 Male    87.5   1.63     183      135         74            1.75
##  8    31 Female  64.4   1.7      160      144         70            1.97
##  9    32 Male    85.9   1.6      176      145         60            1.99
## 10    31 Female  61.1   1.76     189      150         67            1.81
## # ℹ 138 more rows
## # ℹ 8 more variables: calorias_quemadas <dbl>, tipo_ejercicio <chr>,
## #   porcentaje_grasa <dbl>, ingesta_agua <dbl>, frecuencia_entrenamiento <dbl>,
## #   nivel_experiencia <dbl>, IMC <dbl>, categoria_edad <fct>

Calcular el promedio del IMC para estos integrantes

promedio_imc <- datos_filtrados %>%
  summarise(promedio_IMC = mean(IMC, na.rm = TRUE))
print(promedio_imc)
## # A tibble: 1 × 1
##   promedio_IMC
##          <dbl>
## 1         24.6

Esta pregunta tuvo que ser modificada debido a que ningún usuario del gimnasio superaba las 2 horas de entreno, por lo que la modificamos a 1.5 horas. Una vez modificada la pregunta, obtuvimos que el IMC promedio de las personas que superan las 130 BPM, es de 24.9, siendo 775 personas las que superan estas pulsaciones.

9. Analice la relación entre la frecuencia de entrenamiento y la ingesta diaria de agua.

Calcular el coeficiente de correlación entre frecuencia_entrenamiento y ingesta_agua

correlacion <- cor(gym_members_exercise$frecuencia_entrenamiento, gym_members_exercise$ingesta_agua, use = "complete.obs")
print(correlacion)
## [1] 0.2385626

Crear un gráfico de línea

grafico9 <- ggplot(gym_members_exercise, aes(x = frecuencia_entrenamiento, y = ingesta_agua)) +
  geom_smooth(method = "lm", color = "salmon", se = FALSE) +
  labs(title = "Relación entre la Frecuencia de Entrenamiento y la Ingesta Diaria de Agua",
       x = "Frecuencia de Entrenamiento (días/semana)",
       y = "Ingesta Diaria de Agua (litros)") +
  theme_minimal()
print(grafico9)
## `geom_smooth()` using formula = 'y ~ x'

El coeficiente de correlacion entre estas dos variables es de 0.23856, lo que indica una relación positiva, aunque débil, entre la frecuencia de entrenamiento y la ingesta diaria de agua.

10. ¿Se observan diferencias entre el índice de masa corporal (IMC) y las calorías quemadas por grupos de edad y género?

Crear categorías de edad en intervalos de 10 años

gym_members_exercise <- gym_members_exercise %>%
  mutate(categoria_edad = cut(edad, breaks = seq(0, 100, by = 10), right = FALSE))

Calcular la media del IMC y calorías quemadas por grupo de edad y género

pregunta10 <- gym_members_exercise %>%
  group_by(categoria_edad, genero) %>%
  summarise(
    media_IMC = mean(IMC, na.rm = TRUE),
    media_calorias_quemadas = mean(calorias_quemadas, na.rm = TRUE)
  )
## `summarise()` has grouped output by 'categoria_edad'. You can override using
## the `.groups` argument.
print(pregunta10)
## # A tibble: 10 × 4
## # Groups:   categoria_edad [5]
##    categoria_edad genero media_IMC media_calorias_quemadas
##    <fct>          <chr>      <dbl>                   <dbl>
##  1 [10,20)        Female      23.2                    909.
##  2 [10,20)        Male        26.9                   1047.
##  3 [20,30)        Female      22.7                    891.
##  4 [20,30)        Male        27.8                    994.
##  5 [30,40)        Female      22.7                    880.
##  6 [30,40)        Male        27.5                    986.
##  7 [40,50)        Female      21.9                    856.
##  8 [40,50)        Male        25.0                    942.
##  9 [50,60)        Female      23.3                    815.
## 10 [50,60)        Male        27.4                    847.

Para visualizar si hay diferencias, creamos un gráfico de barras para comparar el IMC y las calorías quemadas por grupo de edad y género

Gráfico de barras del IMC por grupo de edad y género

grafico_imc <- ggplot(pregunta10, aes(x = categoria_edad, y = media_IMC, fill = genero)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(title = "Media del IMC por Grupo de Edad y Género",
       x = "Grupo de Edad",
       y = "IMC") +
  theme_minimal()
print(grafico_imc)

Si, se observan diferencias, por ejemplo, en el IMC, los hombres tienen un mayor promedio de IMC que las mujeres en todos los grupos de edad, también se observa una disminución del IMC en el grupo de edad de 40 a 50 años en los hombres, en los demás grupos de edad no hay diferencias significativas, son muy pequeñas. En las mujeres, la media del IMC se mantiene bastante constante en los grupos de edad, sin embargo, también en el grupo de 40 a 50 años, se observa una ligera disminución.

Gráfico de barras de las calorías quemadas por grupo de edad y género

grafico_calorias <- ggplot(pregunta10, aes(x = categoria_edad, y = media_calorias_quemadas, fill = genero)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(title = "Media de Calorías Quemadas por Grupo de Edad y Género",
       x = "Grupo de Edad",
       y = "Calorías Quemadas") +
  theme_minimal()
print(grafico_calorias)

En el caso de las calorías quemadas, podemos observar, para los dos géneros, que mientras mas avanzada es la edad, menos calorías quemas, observando ligeras disminuciones entre un grupo de edad y otro. Estas disminuciones son mas pronunciadas en los hombres. También podemos observar que los hombres queman más calorías que las mujeres en todas las edades.