Descripción del problema

Bellabeat es una aplicación que ayuda a mujeres a gestionar su salud y bienestar, se realizo un estudio donde a partir de datos recolectados se podía obtener información de la utilización diaria de la app por parte de los usuarios, analizando datos de actividad física mensual, comportamiento del sueño y frecuencia cardiaca.

Con el objetivo de conocer mejor a los usuarios y sus comportamiento nos planteamos las siguientes preguntas:

Análisis de Uso y Compromiso de la Aplicación ¿Cuáles son las tendencias de uso de las funciones de la aplicación de Bellabeat, específicamente en las categorías de actividad diaria, monitoreo del sueño y medición de frecuencia cardíaca? ¿Cuántas personas se encuentran utilizando las diferentes funciones de Bellabeat?

Análisis de la Actividad Física y Pasos ¿Cuál es el rango promedio de tiempo que los usuarios dedican a sus entrenamientos? ¿Cuál es el promedio de actividad diaria de la muestra estudiada a lo largo del mes? ¿Cuáles son los valores máximos y mínimos de la actividad mensual? ¿Cuál es el promedio de pasos diarios de la muestra? ¿Cuáles son los valores máximos y mínimos de pasos registrados a lo largo del mes de estudio? A nivel individual, ¿cuáles son los registros máximos y mínimos de pasos por usuario? ¿Se puede identificar algún patrón de comportamiento semanal en las actividades físicas de los usuarios?

Análisis del Sueño y la Frecuencia Cardíaca ¿Cuáles son los valores máximos, mínimos y promedio de la actividad del sueño para el grupo en general? ¿Cuáles son los valores máximos y mínimos de la frecuencia cardíaca de los usuarios?

Análisis de Correlación y Comportamiento ¿Existe una correlación entre la actividad física y la calidad o duración del sueño? (Esto podría revelar si un mayor nivel de actividad física contribuye a un mejor descanso). ¿Cómo varían los niveles de actividad física y las horas de sueño a lo largo de la semana, comparando los días laborables con los fines de semana? ¿Se observa una relación entre la frecuencia cardíaca promedio y los niveles de actividad diaria de los usuarios? ¿Cómo es el comportamiento de la frecuencia cardíaca promedio en un día de mucha actividad física y un día de baja actividad física?

Estrategias y Recomendaciones A partir del análisis de la actividad física, el sueño y la frecuencia cardíaca, ¿cómo se pueden aplicar los hallazgos para mejorar las funciones de la aplicación y crear estrategias dirigidas a los clientes de Bellabeat?

Recomendaciones para el Producto ¿Qué tipo de recomendaciones o notificaciones personalizadas podría ofrecer Bellabeat a los usuarios basándose en sus datos de sueño, pasos y actividad cardíaca para fomentar un estilo de vida más saludable? (Por ejemplo, sugerir una hora de ir a dormir si la calidad del sueño es baja, o animar a un paseo si la actividad diaria es baja).

Definición de librerías a utilizar

library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.2     ✔ tibble    3.3.0
## ✔ lubridate 1.9.4     ✔ tidyr     1.3.1
## ✔ purrr     1.1.0     
## ── 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(readr)
library(ggpmisc)
## Cargando paquete requerido: ggpp
## Registered S3 methods overwritten by 'ggpp':
##   method                  from   
##   heightDetails.titleGrob ggplot2
##   widthDetails.titleGrob  ggplot2
## 
## Adjuntando el paquete: 'ggpp'
## 
## The following object is masked from 'package:ggplot2':
## 
##     annotate
library(calendR)
## ~~ Package calendR
## Visit https://r-coder.com/ for R tutorials ~~
library(lubridate)
library(ggplot2)

Importar datos

Buscamos direcciones guardadas de dataframes de actividad diaria, actividad de sueño y cardíaca

DF de actividad diaria

Guardamos ruta en una variable de actividad diaria

ruta_csv_fitbase<- "C:\\Users\\chech\\OneDrive\\Documentos\\Data Analytics Google\\Proyecto final Google Data A\\mturkfitbit_export_4.12.16-5.12.16\\Fitabase Data 4.12.16-5.12.16\\Archivos a utilizar\\dailyActivity_merged.csv"

Importamos df de actividad diaria

df_actividad_diaria <- read.csv(ruta_csv_fitbase)
str(df_actividad_diaria)
## 'data.frame':    940 obs. of  15 variables:
##  $ Id                      : num  1.5e+09 1.5e+09 1.5e+09 1.5e+09 1.5e+09 ...
##  $ ActivityDate            : chr  "4/12/2016" "4/13/2016" "4/14/2016" "4/15/2016" ...
##  $ TotalSteps              : int  13162 10735 10460 9762 12669 9705 13019 15506 10544 9819 ...
##  $ TotalDistance           : num  8.5 6.97 6.74 6.28 8.16 ...
##  $ TrackerDistance         : num  8.5 6.97 6.74 6.28 8.16 ...
##  $ LoggedActivitiesDistance: num  0 0 0 0 0 0 0 0 0 0 ...
##  $ VeryActiveDistance      : num  1.88 1.57 2.44 2.14 2.71 ...
##  $ ModeratelyActiveDistance: num  0.55 0.69 0.4 1.26 0.41 ...
##  $ LightActiveDistance     : num  6.06 4.71 3.91 2.83 5.04 ...
##  $ SedentaryActiveDistance : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ VeryActiveMinutes       : int  25 21 30 29 36 38 42 50 28 19 ...
##  $ FairlyActiveMinutes     : int  13 19 11 34 10 20 16 31 12 8 ...
##  $ LightlyActiveMinutes    : int  328 217 181 209 221 164 233 264 205 211 ...
##  $ SedentaryMinutes        : int  728 776 1218 726 773 539 1149 775 818 838 ...
##  $ Calories                : int  1985 1797 1776 1745 1863 1728 1921 2035 1786 1775 ...

DF de actividad del sueño

Guardamos ruta en una variable de de actividad de sueño

ruta_csv_dormir<-"C:\\Users\\chech\\OneDrive\\Documentos\\Data Analytics Google\\Proyecto final Google Data A\\mturkfitbit_export_4.12.16-5.12.16\\Fitabase Data 4.12.16-5.12.16\\Archivos a utilizar\\sleepDay_merged.csv"

Importamos datos de actividad de sueño

df_dormir <- read.csv(ruta_csv_dormir)
str(df_dormir)
## 'data.frame':    413 obs. of  5 variables:
##  $ Id                : num  1.5e+09 1.5e+09 1.5e+09 1.5e+09 1.5e+09 ...
##  $ SleepDay          : chr  "4/12/2016 12:00:00 AM" "4/13/2016 12:00:00 AM" "4/15/2016 12:00:00 AM" "4/16/2016 12:00:00 AM" ...
##  $ TotalSleepRecords : int  1 2 1 2 1 1 1 1 1 1 ...
##  $ TotalMinutesAsleep: int  327 384 412 340 700 304 360 325 361 430 ...
##  $ TotalTimeInBed    : int  346 407 442 367 712 320 377 364 384 449 ...

DF de actividad cardíaca

Añadimos dirección a una variable actividad cardíaca

ruta_csv_cardiaca<-"C:\\Users\\chech\\OneDrive\\Documentos\\Data Analytics Google\\Proyecto final Google Data A\\mturkfitbit_export_4.12.16-5.12.16\\Fitabase Data 4.12.16-5.12.16\\Archivos a utilizar\\heartrate_seconds_merged.csv"

Importamos datos de actividad cardíaca

df_cardiaca<-read.csv(ruta_csv_cardiaca)
str(df_cardiaca)
## 'data.frame':    2483658 obs. of  3 variables:
##  $ Id   : num  2.02e+09 2.02e+09 2.02e+09 2.02e+09 2.02e+09 ...
##  $ Time : chr  "4/12/2016 7:21:00 AM" "4/12/2016 7:21:05 AM" "4/12/2016 7:21:10 AM" "4/12/2016 7:21:20 AM" ...
##  $ Value: int  97 102 105 103 101 95 91 93 94 93 ...

Limpieza de datos

Limpieza de dataframe de actividad diaria

Duplicación de df de actividad diaria

copy_dailyActivity_merged <- df_actividad_diaria

Transformar formatos de columna id de num a string

copy_dailyActivity_merged$Id <- as.character(copy_dailyActivity_merged$Id)
str(copy_dailyActivity_merged)
## 'data.frame':    940 obs. of  15 variables:
##  $ Id                      : chr  "1503960366" "1503960366" "1503960366" "1503960366" ...
##  $ ActivityDate            : chr  "4/12/2016" "4/13/2016" "4/14/2016" "4/15/2016" ...
##  $ TotalSteps              : int  13162 10735 10460 9762 12669 9705 13019 15506 10544 9819 ...
##  $ TotalDistance           : num  8.5 6.97 6.74 6.28 8.16 ...
##  $ TrackerDistance         : num  8.5 6.97 6.74 6.28 8.16 ...
##  $ LoggedActivitiesDistance: num  0 0 0 0 0 0 0 0 0 0 ...
##  $ VeryActiveDistance      : num  1.88 1.57 2.44 2.14 2.71 ...
##  $ ModeratelyActiveDistance: num  0.55 0.69 0.4 1.26 0.41 ...
##  $ LightActiveDistance     : num  6.06 4.71 3.91 2.83 5.04 ...
##  $ SedentaryActiveDistance : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ VeryActiveMinutes       : int  25 21 30 29 36 38 42 50 28 19 ...
##  $ FairlyActiveMinutes     : int  13 19 11 34 10 20 16 31 12 8 ...
##  $ LightlyActiveMinutes    : int  328 217 181 209 221 164 233 264 205 211 ...
##  $ SedentaryMinutes        : int  728 776 1218 726 773 539 1149 775 818 838 ...
##  $ Calories                : int  1985 1797 1776 1745 1863 1728 1921 2035 1786 1775 ...

Función transformar columna activityDate de chr a Date

copy_dailyActivity_merged <- copy_dailyActivity_merged %>% 
  transform(ActivityDate = mdy(ActivityDate))
str(copy_dailyActivity_merged)
## 'data.frame':    940 obs. of  15 variables:
##  $ Id                      : chr  "1503960366" "1503960366" "1503960366" "1503960366" ...
##  $ ActivityDate            : Date, format: "2016-04-12" "2016-04-13" ...
##  $ TotalSteps              : int  13162 10735 10460 9762 12669 9705 13019 15506 10544 9819 ...
##  $ TotalDistance           : num  8.5 6.97 6.74 6.28 8.16 ...
##  $ TrackerDistance         : num  8.5 6.97 6.74 6.28 8.16 ...
##  $ LoggedActivitiesDistance: num  0 0 0 0 0 0 0 0 0 0 ...
##  $ VeryActiveDistance      : num  1.88 1.57 2.44 2.14 2.71 ...
##  $ ModeratelyActiveDistance: num  0.55 0.69 0.4 1.26 0.41 ...
##  $ LightActiveDistance     : num  6.06 4.71 3.91 2.83 5.04 ...
##  $ SedentaryActiveDistance : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ VeryActiveMinutes       : int  25 21 30 29 36 38 42 50 28 19 ...
##  $ FairlyActiveMinutes     : int  13 19 11 34 10 20 16 31 12 8 ...
##  $ LightlyActiveMinutes    : int  328 217 181 209 221 164 233 264 205 211 ...
##  $ SedentaryMinutes        : int  728 776 1218 726 773 539 1149 775 818 838 ...
##  $ Calories                : int  1985 1797 1776 1745 1863 1728 1921 2035 1786 1775 ...

Poner nombre de titulos en minúscula y luego cambiar a snake_case

titulos <-colnames(copy_dailyActivity_merged)
titulos_minuscula <-tolower(titulos)

copy_dailyActivity_merged <- copy_dailyActivity_merged %>% 
  rename(
    id=Id,
    activity_date=ActivityDate, 
    total_steps=TotalSteps, 
    total_distance=TotalDistance, 
    tracker_distance=TrackerDistance, 
    logged_activities_distance= LoggedActivitiesDistance, 
    very_active_distance=VeryActiveDistance, 
    moderately_active_distance=ModeratelyActiveDistance,
    light_active_distance=LightActiveDistance, 
    sedentary_active_distance=SedentaryActiveDistance, 
    very_active_minutes=VeryActiveMinutes,       
    fairly_active_minutes=FairlyActiveMinutes, 
    lightly_active_minutes=LightlyActiveMinutes, 
    sedentary_minutes=SedentaryMinutes,
    calories=Calories)

colnames(copy_dailyActivity_merged)
##  [1] "id"                         "activity_date"             
##  [3] "total_steps"                "total_distance"            
##  [5] "tracker_distance"           "logged_activities_distance"
##  [7] "very_active_distance"       "moderately_active_distance"
##  [9] "light_active_distance"      "sedentary_active_distance" 
## [11] "very_active_minutes"        "fairly_active_minutes"     
## [13] "lightly_active_minutes"     "sedentary_minutes"         
## [15] "calories"

Agregar 1 columna para el nombre del dia

df_day_of_week_name <- copy_dailyActivity_merged %>%
  mutate(day_of_week = wday(copy_dailyActivity_merged$activity_date, label = TRUE, abbr = FALSE))

str(df_day_of_week_name)
## 'data.frame':    940 obs. of  16 variables:
##  $ id                        : chr  "1503960366" "1503960366" "1503960366" "1503960366" ...
##  $ activity_date             : Date, format: "2016-04-12" "2016-04-13" ...
##  $ total_steps               : int  13162 10735 10460 9762 12669 9705 13019 15506 10544 9819 ...
##  $ total_distance            : num  8.5 6.97 6.74 6.28 8.16 ...
##  $ tracker_distance          : num  8.5 6.97 6.74 6.28 8.16 ...
##  $ logged_activities_distance: num  0 0 0 0 0 0 0 0 0 0 ...
##  $ very_active_distance      : num  1.88 1.57 2.44 2.14 2.71 ...
##  $ moderately_active_distance: num  0.55 0.69 0.4 1.26 0.41 ...
##  $ light_active_distance     : num  6.06 4.71 3.91 2.83 5.04 ...
##  $ sedentary_active_distance : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ very_active_minutes       : int  25 21 30 29 36 38 42 50 28 19 ...
##  $ fairly_active_minutes     : int  13 19 11 34 10 20 16 31 12 8 ...
##  $ lightly_active_minutes    : int  328 217 181 209 221 164 233 264 205 211 ...
##  $ sedentary_minutes         : int  728 776 1218 726 773 539 1149 775 818 838 ...
##  $ calories                  : int  1985 1797 1776 1745 1863 1728 1921 2035 1786 1775 ...
##  $ day_of_week               : Ord.factor w/ 7 levels "domingo"<"lunes"<..: 3 4 5 6 7 1 2 3 4 5 ...

Verificar valores nulos

sum(is.na(df_day_of_week_name))
## [1] 0

Verificar valores duplicados, filas duplicadas

duplicados <- duplicated(df_day_of_week_name) | duplicated(df_day_of_week_name, fromLast = TRUE)

Crear un subconjunto del dataframe, eliminado las columnas innecesarias para el análisis

sub_df <- df_day_of_week_name %>% 
  select(
    -tracker_distance,
    -logged_activities_distance,
    -very_active_distance,
    -moderately_active_distance,
    -light_active_distance,
    -sedentary_active_distance)

colnames(sub_df)
##  [1] "id"                     "activity_date"          "total_steps"           
##  [4] "total_distance"         "very_active_minutes"    "fairly_active_minutes" 
##  [7] "lightly_active_minutes" "sedentary_minutes"      "calories"              
## [10] "day_of_week"

Eliminar filas con cero ingresos en columna total_step

df_filtrado_ceros <- subset(sub_df, total_steps != 0)

str(df_filtrado_ceros)
## 'data.frame':    863 obs. of  10 variables:
##  $ id                    : chr  "1503960366" "1503960366" "1503960366" "1503960366" ...
##  $ activity_date         : Date, format: "2016-04-12" "2016-04-13" ...
##  $ total_steps           : int  13162 10735 10460 9762 12669 9705 13019 15506 10544 9819 ...
##  $ total_distance        : num  8.5 6.97 6.74 6.28 8.16 ...
##  $ very_active_minutes   : int  25 21 30 29 36 38 42 50 28 19 ...
##  $ fairly_active_minutes : int  13 19 11 34 10 20 16 31 12 8 ...
##  $ lightly_active_minutes: int  328 217 181 209 221 164 233 264 205 211 ...
##  $ sedentary_minutes     : int  728 776 1218 726 773 539 1149 775 818 838 ...
##  $ calories              : int  1985 1797 1776 1745 1863 1728 1921 2035 1786 1775 ...
##  $ day_of_week           : Ord.factor w/ 7 levels "domingo"<"lunes"<..: 3 4 5 6 7 1 2 3 4 5 ...

Crear columna sumando minutos totales de actividad

df_sum_min <- df_filtrado_ceros %>% 
  mutate(total_min_activiy = df_filtrado_ceros$very_active_minutes+df_filtrado_ceros$fairly_active_minutes+df_filtrado_ceros$lightly_active_minutes)

str(df_sum_min)
## 'data.frame':    863 obs. of  11 variables:
##  $ id                    : chr  "1503960366" "1503960366" "1503960366" "1503960366" ...
##  $ activity_date         : Date, format: "2016-04-12" "2016-04-13" ...
##  $ total_steps           : int  13162 10735 10460 9762 12669 9705 13019 15506 10544 9819 ...
##  $ total_distance        : num  8.5 6.97 6.74 6.28 8.16 ...
##  $ very_active_minutes   : int  25 21 30 29 36 38 42 50 28 19 ...
##  $ fairly_active_minutes : int  13 19 11 34 10 20 16 31 12 8 ...
##  $ lightly_active_minutes: int  328 217 181 209 221 164 233 264 205 211 ...
##  $ sedentary_minutes     : int  728 776 1218 726 773 539 1149 775 818 838 ...
##  $ calories              : int  1985 1797 1776 1745 1863 1728 1921 2035 1786 1775 ...
##  $ day_of_week           : Ord.factor w/ 7 levels "domingo"<"lunes"<..: 3 4 5 6 7 1 2 3 4 5 ...
##  $ total_min_activiy     : int  366 257 222 272 267 222 291 345 245 238 ...

Limpieza de dataframe de actividad del sueño

Duplicamos dataframe

df_dormir_copy <- df_dormir
str(df_dormir_copy)
## 'data.frame':    413 obs. of  5 variables:
##  $ Id                : num  1.5e+09 1.5e+09 1.5e+09 1.5e+09 1.5e+09 ...
##  $ SleepDay          : chr  "4/12/2016 12:00:00 AM" "4/13/2016 12:00:00 AM" "4/15/2016 12:00:00 AM" "4/16/2016 12:00:00 AM" ...
##  $ TotalSleepRecords : int  1 2 1 2 1 1 1 1 1 1 ...
##  $ TotalMinutesAsleep: int  327 384 412 340 700 304 360 325 361 430 ...
##  $ TotalTimeInBed    : int  346 407 442 367 712 320 377 364 384 449 ...

Transformar formato de columna Id de num a str

df_dormir_copy$Id <- as.character(df_dormir_copy$Id)
str(df_dormir_copy)
## 'data.frame':    413 obs. of  5 variables:
##  $ Id                : chr  "1503960366" "1503960366" "1503960366" "1503960366" ...
##  $ SleepDay          : chr  "4/12/2016 12:00:00 AM" "4/13/2016 12:00:00 AM" "4/15/2016 12:00:00 AM" "4/16/2016 12:00:00 AM" ...
##  $ TotalSleepRecords : int  1 2 1 2 1 1 1 1 1 1 ...
##  $ TotalMinutesAsleep: int  327 384 412 340 700 304 360 325 361 430 ...
##  $ TotalTimeInBed    : int  346 407 442 367 712 320 377 364 384 449 ...

Transformar formato de columna Sleepday de chr a date

df_dormir_copy <- df_dormir_copy %>% 
  transform(SleepDay =mdy_hms(SleepDay))

str(df_dormir_copy)
## 'data.frame':    413 obs. of  5 variables:
##  $ Id                : chr  "1503960366" "1503960366" "1503960366" "1503960366" ...
##  $ SleepDay          : POSIXct, format: "2016-04-12" "2016-04-13" ...
##  $ TotalSleepRecords : int  1 2 1 2 1 1 1 1 1 1 ...
##  $ TotalMinutesAsleep: int  327 384 412 340 700 304 360 325 361 430 ...
##  $ TotalTimeInBed    : int  346 407 442 367 712 320 377 364 384 449 ...

Cambiamos títulos a minúscula y luego a snake case

titulos_dormir <- colnames(df_dormir_copy)
titulos_min_dormir <- tolower(titulos_dormir)

df_dormir_copy <- df_dormir_copy %>% 
  rename(id=Id, 
         sleep_day=SleepDay, 
         total_sleep_records=TotalSleepRecords, 
         total_minutes_asleep=TotalMinutesAsleep,
         total_time_in_bed=TotalTimeInBed )

colnames(df_dormir_copy)
## [1] "id"                   "sleep_day"            "total_sleep_records" 
## [4] "total_minutes_asleep" "total_time_in_bed"

Verificar valores nulos

sum(is.na(df_dormir_copy))
## [1] 0

Verificar filas duplicadas

duplicados_dormir <- duplicated(df_dormir_copy) | duplicated(df_dormir_copy, fromLast = TRUE)
print(duplicados_dormir)
##   [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [13] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [25] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [37] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [49] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [61] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [73] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [85] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [97] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [109] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [121] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [133] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [145] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [157] FALSE FALSE FALSE FALSE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE
## [169] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [181] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [193] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [205] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [217] FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE FALSE FALSE FALSE FALSE
## [229] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [241] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [253] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [265] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [277] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [289] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [301] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [313] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [325] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [337] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [349] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [361] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [373] FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE FALSE FALSE FALSE
## [385] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [397] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [409] FALSE FALSE FALSE FALSE FALSE

Encontramos duplicados en las filas 161 y 163, 223 y 224, 380 y 381.

Eliminar duplicados

df_dormir_unique <- df_dormir_copy[!duplicated(df_dormir_copy),]
str(df_dormir_unique)
## 'data.frame':    410 obs. of  5 variables:
##  $ id                  : chr  "1503960366" "1503960366" "1503960366" "1503960366" ...
##  $ sleep_day           : POSIXct, format: "2016-04-12" "2016-04-13" ...
##  $ total_sleep_records : int  1 2 1 2 1 1 1 1 1 1 ...
##  $ total_minutes_asleep: int  327 384 412 340 700 304 360 325 361 430 ...
##  $ total_time_in_bed   : int  346 407 442 367 712 320 377 364 384 449 ...

Limpieza de dataframe de actividad cardiaca

Duplicar base de datos

df_cardiaca_copy <- df_cardiaca

Transformar formato de columna Id de num a str

df_cardiaca_copy$Id <- as.character(df_cardiaca_copy$Id)

str(df_cardiaca_copy)
## 'data.frame':    2483658 obs. of  3 variables:
##  $ Id   : chr  "2022484408" "2022484408" "2022484408" "2022484408" ...
##  $ Time : chr  "4/12/2016 7:21:00 AM" "4/12/2016 7:21:05 AM" "4/12/2016 7:21:10 AM" "4/12/2016 7:21:20 AM" ...
##  $ Value: int  97 102 105 103 101 95 91 93 94 93 ...

Transformar formato de columna Time de chr a date

df_cardiaca_copy<- df_cardiaca_copy %>% 
  transform(Time = mdy_hms(Time))

str(df_cardiaca_copy)
## 'data.frame':    2483658 obs. of  3 variables:
##  $ Id   : chr  "2022484408" "2022484408" "2022484408" "2022484408" ...
##  $ Time : POSIXct, format: "2016-04-12 07:21:00" "2016-04-12 07:21:05" ...
##  $ Value: int  97 102 105 103 101 95 91 93 94 93 ...

Cambiamos títulos a minuscula

titulos_cardiaca <- colnames(df_cardiaca_copy)
titulos_mini_cardiaca<- tolower(titulos_cardiaca)

df_cardiaca_copy<- df_cardiaca_copy %>% 
  rename(
    id=Id ,
    date=Time ,
    value=Value )

colnames(df_cardiaca_copy)
## [1] "id"    "date"  "value"

Verificar valores nulos

sum(is.na(df_cardiaca_copy))
## [1] 0

Eliminamos duplicados

df_cardiaca_unique <- df_cardiaca_copy[!duplicated(df_cardiaca_copy),]
str(df_cardiaca_unique)
## 'data.frame':    2483658 obs. of  3 variables:
##  $ id   : chr  "2022484408" "2022484408" "2022484408" "2022484408" ...
##  $ date : POSIXct, format: "2016-04-12 07:21:00" "2016-04-12 07:21:05" ...
##  $ value: int  97 102 105 103 101 95 91 93 94 93 ...

df_cardica_unique contiene 2,483,658 filas, es decir que no había filas duplicadas.

Análisis de datos

Análisis de datos de actividad diaria

Usuarios activos

integrantes <- unique(df_sum_min$id)
print(integrantes)
##  [1] "1503960366" "1624580081" "1644430081" "1844505072" "1927972279"
##  [6] "2022484408" "2026352035" "2320127002" "2347167796" "2873212765"
## [11] "3372868164" "3977333714" "4020332650" "4057192912" "4319703577"
## [16] "4388161847" "4445114986" "4558609924" "4702921684" "5553957443"
## [21] "5577150313" "6117666160" "6290855005" "6775888955" "6962181067"
## [26] "7007744171" "7086361926" "8053475328" "8253242879" "8378563200"
## [31] "8583815059" "8792009665" "8877689391"

Tenemos 33 usuarios utilizando la función de actividad diaria.

Días de recolección de datos

dias_estudiados <- unique(df_sum_min$activity_date)
print(dias_estudiados)
##  [1] "2016-04-12" "2016-04-13" "2016-04-14" "2016-04-15" "2016-04-16"
##  [6] "2016-04-17" "2016-04-18" "2016-04-19" "2016-04-20" "2016-04-21"
## [11] "2016-04-22" "2016-04-23" "2016-04-24" "2016-04-25" "2016-04-26"
## [16] "2016-04-27" "2016-04-28" "2016-04-29" "2016-04-30" "2016-05-01"
## [21] "2016-05-02" "2016-05-03" "2016-05-04" "2016-05-05" "2016-05-06"
## [26] "2016-05-07" "2016-05-08" "2016-05-09" "2016-05-10" "2016-05-11"
## [31] "2016-05-12"

Contiene los datos de 31 días, desde el 12/04/2016 al 12/05/2016 Si multiplicamos los usuarios por los días que se debería tener 1023 filas de datos, sin embargo se analizaron 863 filas, lo que representa una tasa de usabilidad de la aplicación del 84,35%.

Registro de entrenamientos

ggplot(df_sum_min, aes(total_min_activiy))+
  geom_histogram(binwidth = 5, fill = "green", color = "black")+
  labs(title = "Histograma de entrenamientos", x = "Minutos", y = "Cantidad de entrenamientos")+
  scale_x_continuous(n.breaks = 15)

El rango promedio de tiempo dedicado al entrenamiento se encuentra mayormente entre 120 y 400 minutos.

Promedio de minutos de actividad física por dia de los usuarios

avg_min_activity <- df_sum_min %>% 
  group_by(activity_date) %>% 
  summarise(promedio_total_min = mean(total_min_activiy))

ggplot(avg_min_activity, aes(x = activity_date, y = promedio_total_min))+
  geom_line(size=1, color ="green")+
  geom_point(size=0.8)+
  geom_smooth(se = FALSE, size=0.5)+
  stat_peaks(geom = "point", span = 11, color = "blue", size = 3) +
  stat_peaks(geom = "label", span = 11, color = "blue", angle = 0, hjust = -0.1, x.label.fmt = "%d-%m") +
  stat_peaks(geom = "rug", span = 11, color = "blue", sides = "b")+
  stat_valleys(geom = "point", span = 11, color = "red", size = 3) +
  stat_valleys(geom = "label", span = 11, color = "red", angle = 0, hjust = -0.1, x.label.fmt = "%d-%m") +
  stat_valleys(geom = "rug", span = 11, color = "red", sides = "b")+
  labs(title = "Promedio de actividad por dia de usuarios", x = "Días", y = "Minutos de actividad")+
  scale_x_date(date_labels = "%d/%m")+
  scale_y_continuous(n.breaks = 10)+
  theme(legend.position = "bottom")
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'

Los valores promedio del grupo oscilan entre 210 y 300 minutos, con una media entre 230 y 260 minutos.

Valores máximos y mínimos hallados en el estudio

Actividad física promedio de los usuarios

Máxima

activity_max_grupal <- avg_min_activity[which.max(avg_min_activity$promedio_total_min),]
print(activity_max_grupal)
## # A tibble: 1 × 2
##   activity_date promedio_total_min
##   <date>                     <dbl>
## 1 2016-04-23                  293.
dia_prom_max_acti <- df_sum_min[df_sum_min$activity_date == "2016-04-23",][1, ]
print(dia_prom_max_acti)
##            id activity_date total_steps total_distance very_active_minutes
## 12 1503960366    2016-04-23       14371           9.04                  41
##    fairly_active_minutes lightly_active_minutes sedentary_minutes calories
## 12                    21                    262               732     1949
##    day_of_week total_min_activiy
## 12      sábado               324

El día sábado 23/04/2016 se obtuvo el valor máximo promedio de actividad con 293 min.

Mínima

activity_min_grupal <- avg_min_activity[which.min(avg_min_activity$promedio_total_min),]
print(activity_min_grupal)
## # A tibble: 1 × 2
##   activity_date promedio_total_min
##   <date>                     <dbl>
## 1 2016-05-12                  130.
dia_prom_min_acti <- df_sum_min[df_sum_min$activity_date == "2016-05-12",][1, ]
print(dia_prom_min_acti)
##            id activity_date total_steps total_distance very_active_minutes
## 62 1624580081    2016-05-12        2971           1.93                   0
##    fairly_active_minutes lightly_active_minutes sedentary_minutes calories
## 62                     0                    107               890     1002
##    day_of_week total_min_activiy
## 62      jueves               107

El día jueves 12/05/2016 se obtuvo el valor minimo promedio de actividad con 129 min.

Valores máximos y mínimos individuales de actividad física

Máxima

activity_max_ind <- df_sum_min[which.max(df_sum_min$total_min_activiy),]
print(activity_max_ind)
##             id activity_date total_steps total_distance very_active_minutes
## 914 8877689391    2016-04-16       29326          25.29                  94
##     fairly_active_minutes lightly_active_minutes sedentary_minutes calories
## 914                    29                    429               888     4547
##     day_of_week total_min_activiy
## 914      sábado               552

El máximo de minutos en actividad fue 552, el día sábado 2016-04-16, id 8877689391.

Mínima

activity_min_ind <- df_sum_min[which.min(df_sum_min$total_min_activiy),]
print(activity_min_ind)
##             id activity_date total_steps total_distance very_active_minutes
## 382 4319703577    2016-04-12        7753            5.2                   0
##     fairly_active_minutes lightly_active_minutes sedentary_minutes calories
## 382                     0                      0              1440     2115
##     day_of_week total_min_activiy
## 382      martes                 0

El mínimo de minutos en actividad fue 0, el dia martes 2016-04-12 id 4319703577.

Promedio de pasos de los usuarios por día

avg_pasos_totales <- df_sum_min %>% 
  group_by(activity_date) %>% 
  summarise(promedio_pasos_totales = mean(total_steps))

ggplot(avg_pasos_totales, aes(x=activity_date, y=promedio_pasos_totales))+
  geom_line(stat = "identity", color = "brown")+
  geom_point(size=0.8)+
  geom_smooth(se = FALSE, size=0.5)+
  stat_peaks(geom = "point", span = 11, color = "blue", size = 3) +
  stat_peaks(geom = "label", span = 11, color = "blue", angle = 0, hjust = -0.1, x.label.fmt = "%d-%m") +
  stat_peaks(geom = "rug", span = 11, color = "blue", sides = "b")+
  stat_valleys(geom = "point", span = 11, color = "red", size = 3) +
  stat_valleys(geom = "label", span = 11, color = "red", angle = 0, hjust = -0.1, x.label.fmt = "%d-%m") +
  stat_valleys(geom = "rug", span = 11, color = "red", sides = "b")+
  labs(title = "Promedio de pasos totales por día", x = "Días", y = "Pasos totales") +
  scale_x_date(date_labels = "%d/%m")+
  theme(legend.position = "bottom")
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'

Observamos valores que van de los 7000 a los 9700 pasos, con una media que oscila entre 8000 y 8500 pasos.

Valores máximos y mínimos hallados en el estudio

Pasos totales promedio de los usuarios

Máxima

pasos_max_grupal <- avg_pasos_totales[which.max(avg_pasos_totales$promedio_pasos_totales),]
print(pasos_max_grupal)
## # A tibble: 1 × 2
##   activity_date promedio_pasos_totales
##   <date>                         <dbl>
## 1 2016-05-05                     9738.
dia_prom_max_pasos <- df_sum_min[df_sum_min$activity_date == "2016-05-05",][1, ]
print(dia_prom_max_pasos)
##            id activity_date total_steps total_distance very_active_minutes
## 24 1503960366    2016-05-05       14070            8.9                  45
##    fairly_active_minutes lightly_active_minutes sedentary_minutes calories
## 24                    24                    250               857     1959
##    day_of_week total_min_activiy
## 24      jueves               319

El día jueves 05/05/2016 se obtuvo el máximo de pasos promedio, se realizaron 9738.462 pasos.

Mínima

pasos_min_grupal <- avg_pasos_totales[which.min(avg_pasos_totales$promedio_pasos_totales),]
print(pasos_min_grupal)
## # A tibble: 1 × 2
##   activity_date promedio_pasos_totales
##   <date>                         <dbl>
## 1 2016-05-12                     4302.
dia_prom_min_pasos <- df_sum_min[df_sum_min$activity_date == "2016-05-12",][1, ]
print(dia_prom_min_pasos)
##            id activity_date total_steps total_distance very_active_minutes
## 62 1624580081    2016-05-12        2971           1.93                   0
##    fairly_active_minutes lightly_active_minutes sedentary_minutes calories
## 62                     0                    107               890     1002
##    day_of_week total_min_activiy
## 62      jueves               107

El día jueves 12/05/2016, se obtuvo el minimo de pasos promedio, se realizaron 4301.706 pasos.

Valores máximos y mínimos individuales de pasos totales

Máxima

pasos_max_ind <- df_sum_min[which.max(df_sum_min$total_steps),]
print(pasos_max_ind)
##            id activity_date total_steps total_distance very_active_minutes
## 51 1624580081    2016-05-01       36019          28.03                 186
##    fairly_active_minutes lightly_active_minutes sedentary_minutes calories
## 51                    63                    171              1020     2690
##    day_of_week total_min_activiy
## 51     domingo               420

El máximo de pasos fue 36019, el día domingo 2016/05/01 del usuario 1624580081.

Mínima

pasos_min_ind <- df_sum_min[which.min(df_sum_min$total_steps),]
print(pasos_min_ind)
##             id activity_date total_steps total_distance very_active_minutes
## 108 1844505072    2016-04-27           4              0                   0
##     fairly_active_minutes lightly_active_minutes sedentary_minutes calories
## 108                     0                      1              1439     1348
##     day_of_week total_min_activiy
## 108   miércoles                 1

El mínimo de pasos fue 4, el dia miércoles 2016/04/27 del usuario 1844505072.

Contamos personas con registro de cero pasos por día

dias_cero_pasos <-  subset(sub_df, total_steps == 0)

cantidad_ceros <- dias_cero_pasos %>% 
  group_by(activity_date) %>% 
  count(dias_cero_pasos$total_steps == 0)

ggplot(cantidad_ceros, aes(x = activity_date, y = n))+
  geom_col(fill="orange", color="black")+
  labs(title = "Cantidad de registros con cero pasos por día", x="Días", y="Cantidad de personas")+
  scale_x_date(date_labels = "%d/%m")

Con este gráfico podemos observar que la mayoría de los días, salvo un día 15/04, hubo registro con cero pasos, por día entre 1 a 4 personas no utilizan el dispositivo de recolección de datos, ahí encontramos los faltantes de datos del dataframe.

Registro de actividad física y pasos según el día de la semana

activiy_semanal <- df_sum_min %>% 
  group_by(day_of_week) %>% 
  summarise(activity_promedio = mean(total_min_activiy))%>% 
  arrange(desc(activity_promedio))

print(activiy_semanal)
## # A tibble: 7 × 2
##   day_of_week activity_promedio
##   <ord>                   <dbl>
## 1 sábado                   268.
## 2 martes                   258.
## 3 lunes                    250 
## 4 viernes                  248.
## 5 miércoles                241.
## 6 jueves                   240.
## 7 domingo                  229.
ggplot(activiy_semanal, aes(x = day_of_week, y = activity_promedio, fill = day_of_week))+
  geom_bar(stat = "identity")+
  labs(title = "Actividad física promedio según día de la semana", x= " Días", y= "Minutos")+
  scale_y_continuous(n.breaks = 10)+
  theme_minimal()

pasos_semanal <- df_sum_min %>% 
  group_by(day_of_week) %>% 
  summarise(pasos_promedio = mean(total_steps)) %>% 
  arrange(desc(pasos_promedio))

print(pasos_semanal)
## # A tibble: 7 × 2
##   day_of_week pasos_promedio
##   <ord>                <dbl>
## 1 martes               8949.
## 2 sábado               8947.
## 3 lunes                8488.
## 4 jueves               8185.
## 5 miércoles            8158.
## 6 viernes              7821.
## 7 domingo              7627.
ggplot(pasos_semanal, aes(x = day_of_week, y = pasos_promedio, fill = day_of_week))+
  geom_bar(stat = "identity")+
  labs(title = "Promedio de pasos según día de la semana", x= " Días", y= "Pasos")+
  scale_y_continuous(n.breaks = 10)+
  theme_minimal()

Podemos decir según el grupo estudiado que en los fines de semana, los días sábados se encuentran los mayores registros de actividad física y pasos realizados, mientras que en la semana los días martes son los días de mayor actividad y movimiento. Por el contrario el domingo es el día con menor actividad, y en la semana los jueves son también de menor actividad y movimiento.

Análisis de datos de actividad del sueño

Integrantes

dormir_integrantes <- unique(df_dormir_unique$id)
print(dormir_integrantes)
##  [1] "1503960366" "1644430081" "1844505072" "1927972279" "2026352035"
##  [6] "2320127002" "2347167796" "3977333714" "4020332650" "4319703577"
## [11] "4388161847" "4445114986" "4558609924" "4702921684" "5553957443"
## [16] "5577150313" "6117666160" "6775888955" "6962181067" "7007744171"
## [21] "7086361926" "8053475328" "8378563200" "8792009665"

Tenemos 24 usuarios de los que se han recolectado datos, 9 usuarios menos que en actividad diaria.

Fecha

dias_dormir <- unique(df_dormir_unique$sleep_day)
print(dias_dormir)
##  [1] "2016-04-12 UTC" "2016-04-13 UTC" "2016-04-15 UTC" "2016-04-16 UTC"
##  [5] "2016-04-17 UTC" "2016-04-19 UTC" "2016-04-20 UTC" "2016-04-21 UTC"
##  [9] "2016-04-23 UTC" "2016-04-24 UTC" "2016-04-25 UTC" "2016-04-26 UTC"
## [13] "2016-04-28 UTC" "2016-04-29 UTC" "2016-04-30 UTC" "2016-05-01 UTC"
## [17] "2016-05-02 UTC" "2016-05-03 UTC" "2016-05-05 UTC" "2016-05-06 UTC"
## [21] "2016-05-07 UTC" "2016-05-08 UTC" "2016-05-09 UTC" "2016-05-10 UTC"
## [25] "2016-05-11 UTC" "2016-04-14 UTC" "2016-04-22 UTC" "2016-04-27 UTC"
## [29] "2016-05-04 UTC" "2016-05-12 UTC" "2016-04-18 UTC"

Los días de recolección de datos fueron 31, del 12/4/2016 al 12/5/2016.

El dataframe de actividad del sueño abarca el mismo período, pero con menos usuarios (24). Se esperaban 744 filas, pero se obtuvieron 410, lo que equivale al 55,1% del total esperado.

Minutos de sueño por día

Promedio de los usuarios

avg_min_dormidos <- df_dormir_unique %>% 
  group_by(sleep_day) %>% 
  summarise(promedio_sueño =mean(total_minutes_asleep))

ggplot(avg_min_dormidos, aes(x=sleep_day, y=promedio_sueño))+
  geom_line(stat = "identity", size=1, color="violet")+
  geom_point(size=0.8)+
  geom_smooth(se = FALSE, size=0.5)+
  stat_peaks(geom = "point", span = 11, color = "blue", size = 3) +
  stat_peaks(geom = "label", span = 11, color = "blue", angle = 0, hjust = -0.1, x.label.fmt = "%d-%m") +
  stat_peaks(geom = "rug", span = 11, color = "blue", sides = "b")+
  stat_valleys(geom = "point", span = 11, color = "red", size = 3) +
  stat_valleys(geom = "label", span = 11, color = "red", angle = 0, hjust = -0.1, x.label.fmt = "%d-%m") +
  stat_valleys(geom = "rug", span = 11, color = "red", sides = "b")+
  labs(title = "Promedio de minutos de sueño por día", x="Días", y="Minutos de sueño")+
  theme(legend.position = "bottom")+
  scale_y_continuous(n.breaks = 10)
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'

Los valores promedio de sueño del grupo oscilan entre 360 y 490 minutos, con una media entre 410 y 440 minutos.

Valores máximos y mínimos de minutos de sueño

Valores promedio de los usuarios

Máxima

sueño_max_prom <- avg_min_dormidos[which.max(avg_min_dormidos$promedio_sueño),]
print(sueño_max_prom)
## # A tibble: 1 × 2
##   sleep_day           promedio_sueño
##   <dttm>                       <dbl>
## 1 2016-04-24 00:00:00           487.
dia_prom_max_sueño <- df_sum_min[df_sum_min$activity_date == "2016-4-24",][1, ]
print(dia_prom_max_sueño)
##            id activity_date total_steps total_distance very_active_minutes
## 13 1503960366    2016-04-24       10039           6.41                  39
##    fairly_active_minutes lightly_active_minutes sedentary_minutes calories
## 13                     5                    238               709     1788
##    day_of_week total_min_activiy
## 13     domingo               282

El registro máximo de minutos de sueño promedio fue el día doming 24/4 con 487 minutos.

Mínima

sueño_mini_prom <- avg_min_dormidos[which.min(avg_min_dormidos$promedio_sueño),]
print(sueño_mini_prom)
## # A tibble: 1 × 2
##   sleep_day           promedio_sueño
##   <dttm>                       <dbl>
## 1 2016-05-05 00:00:00           362.
dia_prom_min_sueño <- df_sum_min[df_sum_min$activity_date == "2016-5-05",][1, ]
print(dia_prom_min_sueño)
##            id activity_date total_steps total_distance very_active_minutes
## 24 1503960366    2016-05-05       14070            8.9                  45
##    fairly_active_minutes lightly_active_minutes sedentary_minutes calories
## 24                    24                    250               857     1959
##    day_of_week total_min_activiy
## 24      jueves               319

El registro mínimo de minutos de sueño fue el día jueves 5/5 con 362 minutos.

Valores individuales de los usuarios

Máxima

sueño_max_ind <- df_dormir_unique[which.max(df_dormir_unique$total_minutes_asleep),]
print(sueño_max_ind)
##            id  sleep_day total_sleep_records total_minutes_asleep
## 28 1644430081 2016-05-02                   1                  796
##    total_time_in_bed
## 28               961

El registro máximo de minutos de sueño fue el día lunes 2/5 con 796 minutos, id 1644430081.

Mínima

sueño_min_ind <- df_dormir_unique[which.min(df_dormir_unique$total_minutes_asleep),]
print(sueño_min_ind)
##             id  sleep_day total_sleep_records total_minutes_asleep
## 339 7007744171 2016-05-01                   1                   58
##     total_time_in_bed
## 339                61

El registro mínimo de minutos de sueño fue el domingo 1/5 con 58 min, id 7007744171.

Comportamiento del sueño según dia de la semana

day_of_week_sueño <- df_dormir_unique %>% 
  mutate(day_of_week = wday(df_dormir_unique$sleep_day, label = TRUE, abbr = FALSE))

head(day_of_week_sueño)
##           id  sleep_day total_sleep_records total_minutes_asleep
## 1 1503960366 2016-04-12                   1                  327
## 2 1503960366 2016-04-13                   2                  384
## 3 1503960366 2016-04-15                   1                  412
## 4 1503960366 2016-04-16                   2                  340
## 5 1503960366 2016-04-17                   1                  700
## 6 1503960366 2016-04-19                   1                  304
##   total_time_in_bed day_of_week
## 1               346      martes
## 2               407   miércoles
## 3               442     viernes
## 4               367      sábado
## 5               712     domingo
## 6               320      martes
prom_sueño_day <- day_of_week_sueño %>%  
  group_by(day_of_week) %>% 
  summarise(day_prom_sueño = mean(total_minutes_asleep))%>% 
  arrange(desc(day_prom_sueño))
  

print(prom_sueño_day)
## # A tibble: 7 × 2
##   day_of_week day_prom_sueño
##   <ord>                <dbl>
## 1 domingo               453.
## 2 miércoles             435.
## 3 lunes                 420.
## 4 sábado                419.
## 5 viernes               405.
## 6 martes                405.
## 7 jueves                401.
ggplot(prom_sueño_day, aes(x = day_of_week, y = day_prom_sueño, fill =day_of_week))+
  geom_bar(stat =  "identity")+
  labs(title = "Promedio de minutos de sueño según dia de la semana", x = "Días", y = "Minutos de sueño")+
  scale_y_continuous(n.breaks = 10)+
  theme_minimal()

Podemos observar que los fines de semana la mayor cantidad de minutos de sueño se encuentran en los días domingo, mientras que en la semana los días miércoles poseen mas minutos de sueño. Por el contrario el dia jueves se encuentra el promedio mas bajo de minutos de sueño.

Análisis de datos de actividad de frecuencia cardiaca

Integrantes

cardica_integrantes <- unique(df_cardiaca_unique$id)
print(cardica_integrantes)
##  [1] "2022484408" "2026352035" "2347167796" "4020332650" "4388161847"
##  [6] "4558609924" "5553957443" "5577150313" "6117666160" "6775888955"
## [11] "6962181067" "7007744171" "8792009665" "8877689391"

El data frame contiene información de 14 usuarios, 10 usuarios menos que en actividad del sueño y 19 menos que en actividad diaria.

Valores máximos y mínimos de frecuencia cardiaca

####Máxima

cardiaca_max<- df_cardiaca_copy[which.max(df_cardiaca_copy$value),]
print(cardiaca_max)
##               id                date value
## 49262 2022484408 2016-04-21 16:31:40   203

El valor de frecuencia cardiaca máxima fue 203, el día 2016-04-21 16:31:40, id 2022484408.

Mínima

cardiaca_min<- df_cardiaca_copy[which.min(df_cardiaca_copy$value),]
print(cardiaca_min)
##                 id                date value
## 1504248 5577150313 2016-05-04 02:00:10    36

El valor de frecuencia cardiaca mínimo fue 36, el dia 2016-05-04 02:00:10, id 5577150313.

Función extraer subcadena de la columna date, conservar fecha y eliminar hora

sub_cardiaca_time <- df_cardiaca_unique

sub_cardiaca_time$date <- substr(sub_cardiaca_time$date,start = 1, stop = 10)

Calculamos la frecuencia cardiaca promedio un dia de mucha actividad fisica como el día 23/04

cardiaca_mucha_actividad <-subset(sub_cardiaca_time, date == "2016-04-23")  

promedio_cardiaca_mucha_actividad <- mean(cardiaca_mucha_actividad$value)
print(promedio_cardiaca_mucha_actividad)
## [1] 78.76555

La frecuencia cardíaca promedio del día 23/4, considerado un día de mucha actividad física, fue de 78.76.

Calculamos la frecuencia cardíaca promedio un día de poca actividad física 24/04

cardiaca_poca_actividad <- subset(sub_cardiaca_time, date == "2016-04-24")

promedio_cardiaca_poca_actividad <- mean(cardiaca_poca_actividad$value)
print(promedio_cardiaca_poca_actividad)
## [1] 76

La frecuencia cardíaca del día domingo 24/4, considerado un día de poca actividad física, fue de 76.

Esto sugiere una correlación positiva entre mayor actividad física y mayor frecuencia cardíaca.

Análisis de correlación y comportamiento

calend_4<-rep(NA,30)

calend_4[21] <- "Mayor cantidad de pasos"
calend_4[c(23,30)]<-"Mayor actividad"
calend_4[c(17)]<-"Menor actividad y mayor hs sueño"
calend_4[c(24)]<-"Mayor hs sueño"
calend_4[26]<-"Menor hs sueño"

calendR(year = 2016, 
        month = 4,
        start = "M",
        text =  "Start",
        text.pos = 12,
        special.days = calend_4,
        special.col = c("green2","lightgreen","lightblue","violet","pink"),
        legend.pos = "bottom",
        )

calend_5 <-rep(NA,31)

calend_5[c(1,4)]<-"Menor actividad"
calend_5[c(5)]<-"Menor hs sueño y mayor cant. pasos"

calendR(year = 2016,
        month = 5,
        start = "M",
        text = "End",
        text.pos = 12,
        special.days = calend_5,
        special.col = c("violet","green3"),
        legend.pos = "bottom",
        )

Análisis de correlación y comportamiento:

Se observó que, tras un día de alta actividad física, el descanso nocturno tiende a ser mayor. Por ejemplo: Los sábados presentan altos niveles de actividad, y los domingos muestran mayor duración del sueño. En la semana, los martes son días de intensa actividad, seguidos por miércoles con mayor cantidad de minutos de sueño. Los días con menor promedio de sueño son los martes y jueves, aunque no se encontró una correlación directa con la actividad física del día anterior.