Bellabeat, una empresa de alta tecnología enfocada en la salud y el bienestar de las mujeres, busca expandir su presencia en el mercado de dispositivos SMART. Este informe presenta un análisis de datos de uso de dispositivos inteligentes (FitBit Fitness Tracker Data), no directamente de Bellabeat, con el objetivo de identificar tendencias y formular recomendaciones estratégicas de marketing.
Preguntas Clave del Negocio: 1. ¿Cuáles son algunas de las tendencias en el uso de los dispositivos SMART? 2. ¿Cómo podrían aplicarse estas tendencias a los clientes de Bellabeat? 3. ¿Cómo pueden ayudar estas tendencias en la estrategia de marketing de Bellabeat?
Los datos utilizados son del conjunto “FitBit Fitness Tracker Data”, proporcionado por Mobius y obtenido a través de una encuesta en Amazon Mechanical Turk en 2016. Contiene información de 30 usuarios elegibles de Fitbit, incluyendo actividad física a nivel de minuto, frecuencia cardíaca y monitoreo del sueño.
Características de los Datos: * Fuente: Pública, con licencia CC0. * Período: Diciembre de 2016 (no actualizados). * Estructura: Organizados en 29 archivos CSV, distribuidos en dos períodos (uno por mes), con formatos tanto “anchos” como “largos”. * Confiabilidad: Se consideran confiables, originales y exhaustivos para los fines de este análisis.
La fase de limpieza fue crucial para unificar y preparar los datos de los 29 archivos CSV, que presentaban diversos formatos y granularidades.
Pasos de Limpieza y Transformación (Implementados en R):
janitor::clean_names(), lo que facilita la
manipulación.activity_date, activity_hour,
activity_minute, sleep_day, date)
y se convirtió a un formato estándar de fecha y hora de R
(<dttm>) utilizando
lubridate::parse_date_time(), manejando múltiples
formatos.Fecha, para centralizar toda la
información temporal.hourlySteps_merged.csv,
minuteStepsNarrow_merged.csv), los datos de pasos
(step_total, steps respectivamente) se
consolidaron en una nueva columna llamada
total_steps_combinados. Esta columna es clave para análisis
de patrones horarios detallados.# Establecimiento del directorio de trabajo
setwd("C:/Users/sanro/OneDrive/Escritorio/bellabeat caso de exito")
# Cargar los datos limpios y combinados
datos_limpios <- read_csv("bellabeat_datos_limpios.csv", show_col_types = FALSE)
# Verificación rápida de la estructura de los datos cargados
skim(datos_limpios)| Name | datos_limpios |
| Number of rows | 2818200 |
| Number of columns | 17 |
| _______________________ | |
| Column type frequency: | |
| character | 1 |
| numeric | 15 |
| POSIXct | 1 |
| ________________________ | |
| Group variables | None |
Variable type: character
| skim_variable | n_missing | complete_rate | min | max | empty | n_unique | whitespace |
|---|---|---|---|---|---|---|---|
| dia_semana | 0 | 1 | 5 | 9 | 0 | 7 | 0 |
Variable type: numeric
| skim_variable | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 | hist |
|---|---|---|---|---|---|---|---|---|---|---|
| id | 0 | 1 | 4.869515e+09 | 2.421969e+09 | 1503960366 | 2.320127e+09 | 4.55861e+09 | 6.962181e+09 | 8.877689e+09 | ▇▅▃▅▅ |
| total_distance | 2816803 | 0 | 5.220000e+00 | 3.990000e+00 | 0 | 2.170000e+00 | 4.95000e+00 | 7.500000e+00 | 2.803000e+01 | ▇▅▁▁▁ |
| tracker_distance | 2816803 | 0 | 5.190000e+00 | 3.980000e+00 | 0 | 2.160000e+00 | 4.95000e+00 | 7.480000e+00 | 2.803000e+01 | ▇▅▁▁▁ |
| logged_activities_distance | 2816803 | 0 | 1.300000e-01 | 7.000000e-01 | 0 | 0.000000e+00 | 0.00000e+00 | 0.000000e+00 | 6.730000e+00 | ▇▁▁▁▁ |
| very_active_distance | 2816803 | 0 | 1.400000e+00 | 2.610000e+00 | 0 | 0.000000e+00 | 1.00000e-01 | 1.830000e+00 | 2.192000e+01 | ▇▁▁▁▁ |
| moderately_active_distance | 2816803 | 0 | 5.400000e-01 | 8.700000e-01 | 0 | 0.000000e+00 | 2.00000e-01 | 7.700000e-01 | 6.480000e+00 | ▇▁▁▁▁ |
| light_active_distance | 2816803 | 0 | 3.190000e+00 | 2.120000e+00 | 0 | 1.610000e+00 | 3.24000e+00 | 4.690000e+00 | 1.251000e+01 | ▇▇▃▁▁ |
| sedentary_active_distance | 2816803 | 0 | 0.000000e+00 | 1.000000e-02 | 0 | 0.000000e+00 | 0.00000e+00 | 0.000000e+00 | 1.100000e-01 | ▇▁▁▁▁ |
| very_active_minutes | 2816803 | 0 | 1.968000e+01 | 3.168000e+01 | 0 | 0.000000e+00 | 2.00000e+00 | 3.000000e+01 | 2.100000e+02 | ▇▁▁▁▁ |
| fairly_active_minutes | 2816803 | 0 | 1.340000e+01 | 2.640000e+01 | 0 | 0.000000e+00 | 6.00000e+00 | 1.800000e+01 | 6.600000e+02 | ▇▁▁▁▁ |
| lightly_active_minutes | 2816803 | 0 | 1.853700e+02 | 1.140600e+02 | 0 | 1.110000e+02 | 1.95000e+02 | 2.620000e+02 | 7.200000e+02 | ▆▇▃▁▁ |
| sedentary_minutes | 2816803 | 0 | 9.925400e+02 | 3.133000e+02 | 0 | 7.290000e+02 | 1.05700e+03 | 1.244000e+03 | 1.440000e+03 | ▁▁▇▅▇ |
| calories | 2816803 | 0 | 2.266270e+03 | 7.530100e+02 | 0 | 1.799000e+03 | 2.11400e+03 | 2.770000e+03 | 4.900000e+03 | ▁▆▇▃▁ |
| total_steps_combinados | 1397 | 1 | 9.920000e+00 | 9.622000e+01 | 0 | 0.000000e+00 | 0.00000e+00 | 0.000000e+00 | 1.056500e+04 | ▇▁▁▁▁ |
| hora_del_dia | 0 | 1 | 1.141000e+01 | 6.920000e+00 | 0 | 5.000000e+00 | 1.10000e+01 | 1.700000e+01 | 2.300000e+01 | ▇▇▆▇▇ |
Variable type: POSIXct
| skim_variable | n_missing | complete_rate | min | max | median | n_unique |
|---|---|---|---|---|---|---|
| Fecha | 0 | 1 | 2016-03-12 | 2016-05-12 15:59:00 | 2016-04-10 14:25:00 | 88800 |
## # A tibble: 6 × 17
## id Fecha total_distance tracker_distance
## <dbl> <dttm> <dbl> <dbl>
## 1 1503960366 2016-03-25 00:00:00 7.11 7.11
## 2 1503960366 2016-03-26 00:00:00 11.6 11.6
## 3 1503960366 2016-03-27 00:00:00 8.53 8.53
## 4 1503960366 2016-03-28 00:00:00 8.93 8.93
## 5 1503960366 2016-03-29 00:00:00 7.85 7.85
## 6 1503960366 2016-03-30 00:00:00 7.16 7.16
## # ℹ 13 more variables: logged_activities_distance <dbl>,
## # very_active_distance <dbl>, moderately_active_distance <dbl>,
## # light_active_distance <dbl>, sedentary_active_distance <dbl>,
## # very_active_minutes <dbl>, fairly_active_minutes <dbl>,
## # lightly_active_minutes <dbl>, sedentary_minutes <dbl>, calories <dbl>,
## # total_steps_combinados <dbl>, hora_del_dia <dbl>, dia_semana <chr>
Se realizaron dos análisis, uno en hojas de cálculo y otro con R. El análisis se estructura en varias áreas clave para comprender el uso de los dispositivos SMART y el comportamiento de los usuarios.
Se evaluó cuántos días los usuarios registraron datos y cuál era su actividad diaria promedio.
Hallazgos del análisis en hojas de cálculo: * Se observó variabilidad en la consistencia del seguimiento de diferentes métricas (peso, frecuencia cardíaca, sueño, calorías, pasos, intensidad). * El control de peso y frecuencia cardíaca tuvieron menor seguimiento comparado con calorías y pasos. * El monitoreo de sueño mostró inconsistencias y posibles errores en los registros (ej. 20 horas de sueño).
Análisis en RStudio: Se Confirma la variabilidad en
la consistencia. El análisis en R calcula dias_con_registro
y pasos_promedio_general para cuantificar esta consistencia
y el nivel de actividad promedio por usuario.
# Calcular la cantidad de días únicos con registro por cada ID
uso_por_usuario <- datos_limpios %>%
mutate(solo_fecha = as.Date(Fecha)) %>%
group_by(id) %>%
summarise(
dias_con_registro = n_distinct(solo_fecha),
.groups = 'drop'
)
# Ver la distribución de los días con registro
ggplot(uso_por_usuario, aes(x = dias_con_registro)) +
geom_histogram(binwidth = 1, fill = "skyblue", color = "black") +
labs(title = "Distribución de Días con Registro por Usuario",
x = "Días con Registro",
y = "Número de Usuarios") +
theme_minimal()## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 8.00 57.50 62.00 56.17 62.00 62.00
Interpretación: El histograma y el resumen numérico
de dias_con_registro revelan la frecuencia con la que los
usuarios interactuaron con el dispositivo. Una alta proporción de
usuarios con pocos días de registro puede indicar baja retención. Sin
embargo el 52% de los usuarios interactuaron con el dispositivo todos
los días y el 34% lo hiciero entre 50 y 62 días lo que nos indica un
alto grado de interacción.
Se examinó cómo los usuarios distribuyen su tiempo entre diferentes niveles de actividad y cómo se correlacionan las métricas.
Análisis en RStudio: Calculo de los minutos promedio en diferentes niveles de actividad y las correlaciones entre las métricas diarias.
# Se agrupan y suman los datos de los usuarios (pasos, calorías, minutos) a nivel diario
datos_diarios_agregados <- datos_limpios %>%
mutate(solo_fecha = as.Date(Fecha)) %>%
group_by(id, solo_fecha) %>%
summarise(
pasos_diarios = sum(total_steps_combinados, na.rm = TRUE), # Pasos diarios
calorias_diarias = sum(calories, na.rm = TRUE),
minutos_muy_activos = sum(very_active_minutes, na.rm = TRUE),
minutos_ligeramente_activos = sum(lightly_active_minutes, na.rm = TRUE),
minutos_sedentarios = sum(sedentary_minutes, na.rm = TRUE),
.groups = 'drop'
)
# Ahora, se calcula el promedio de las métricas por usuario a lo largo de todos sus días registrados
resumen_actividad_por_usuario <- datos_diarios_agregados %>%
group_by(id) %>%
summarise(
pasos_promedio_general = mean(pasos_diarios, na.rm = TRUE),
calorias_promedio_general = mean(calorias_diarias, na.rm = TRUE),
minutos_muy_activos_promedio = mean(minutos_muy_activos, na.rm = TRUE),
minutos_ligeramente_activos_promedio = mean(minutos_ligeramente_activos, na.rm = TRUE),
minutos_sedentarios_promedio = mean(minutos_sedentarios, na.rm = TRUE),
.groups = 'drop'
)
# Distribución de pasos diarios promedio
ggplot(resumen_actividad_por_usuario, aes(x = pasos_promedio_general)) +
geom_histogram(binwidth = 1000, fill = "lightgreen", color = "black") +
labs(title = "Distribución de Pasos Diarios Promedio por Usuario",
x = "Pasos Diarios Promedio",
y = "Número de Usuarios") +
theme_minimal()Interpretación: Este histograma muestra la distribución del nivel de actividad de los usuarios, indicando si la base de usuarios tiende a ser más sedentaria o activa. Del gráfifo podemos extraer la siguiente información: Sedentario: ~4 usuarios (15%) Ligeramente Activo: ~4 usuarios (15%) Moderadamente Activo: ~3 usuarios (11%) Muy Activo: ~16 usuarios (59%)
Se investigaron los momentos del día y los días de la semana en que los usuarios son más activos.
Análisis en RStudio (con datos combinados
horarios/minutales): Se utilizó la columna
total_steps_combinados (proveniente de
hourlySteps_merged y minuteStepsNarrow_merged)
para obtener un análisis preciso de la actividad por hora.
# Promedio de pasos por hora del día (a través de todos los usuarios)
actividad_por_hora <- datos_limpios %>%
group_by(hora_del_dia) %>%
summarise(
pasos_promedio_hora = mean(total_steps_combinados, na.rm = TRUE),
calorias_promedio_hora = mean(calories, na.rm = TRUE),
.groups = 'drop'
) %>%
arrange(hora_del_dia)
ggplot(actividad_por_hora, aes(x = hora_del_dia, y = pasos_promedio_hora, group = 1)) +
geom_line(color = "blue") +
geom_point(color = "darkblue") +
labs(title = "Pasos Promedio por Hora del Día",
x = "Hora del Día (0-23)",
y = "Pasos Promedio") +
theme_minimal()
Interpretación: Este gráfico mostrará los picos de
actividad (ej. mañana, tarde/noche) y los valles (ej. madrugada), lo
cual es crucial para programar intervenciones de marketing.
Horas de menor actividad (noche/madrugada): Desde la medianoche hasta aproximadamente las 5 o 6 de la mañana, el número de pasos promedio es muy bajo, lo que es esperado ya que la mayoría de las personas están durmiendo o en reposo.
Aumento de actividad (mañana): A partir de las 5-6 de la mañana, la cantidad de pasos comienza a aumentar significativamente, lo que sugiere el inicio de la jornada diaria (ir al trabajo, escuela, realizar actividades matutinas).
Picos de actividad (media tarde/noche): Se observan picos de actividad alrededor de las 13:00-14:00 (posiblemente la hora del almuerzo o un descanso) y un pico más pronunciado y sostenido entre las 17:00 y las 19:00 (5 PM a 7 PM), que podría corresponder a actividades post-laborales o ejercicio vespertino.
Disminución de actividad (noche): Después de las 19:00-20:00, la actividad comienza a disminuir gradualmente a medida que las personas se preparan para el descanso nocturno.
# Promedio de pasos por día de la semana
actividad_por_dia_semana <- datos_limpios %>%
group_by(dia_semana) %>%
summarise(
pasos_promedio_dia = mean(total_steps_combinados, na.rm = TRUE),
calorias_promedio_dia = mean(calories, na.rm = TRUE),
.groups = 'drop'
)
ggplot(actividad_por_dia_semana, aes(x = dia_semana, y = pasos_promedio_dia)) +
geom_bar(stat = "identity", fill = "purple", color = "black") +
labs(title = "Pasos Promedio por Día de la Semana",
x = "Día de la Semana",
y = "Pasos Promedio") +
theme_minimal()
Interpretación: Este gráfico revela si hay diferencias
significativas en la actividad entre días laborables y fines de
semana.
Mayor actividad en días laborales y sábado: Se observa que los días con el mayor promedio de pasos son el Lunes, Miércoles, Jueves y Sábado, con los pasos promedio más altos registrados el Sábado y el Miércoles, superando los 7,500 pasos.
Menor actividad el Domingo y Viernes: El Domingo es el día con el promedio de pasos más bajo, situándose por debajo de los 7,000 pasos. El Viernes también muestra una ligera disminución en comparación con los días centrales de la semana.
Patrones semanales: En general, la actividad se mantiene relativamente alta durante la semana laboral y el sábado, con una caída notable el domingo, lo que podría indicar un día de descanso o menor movilidad.
# Seleccionar las columnas numéricas clave para la correlación
columnas_numericas_para_correlacion <- datos_diarios_agregados %>%
select(pasos_diarios, calorias_diarias, minutos_muy_activos,
minutos_ligeramente_activos, minutos_sedentarios)
# Calcular la matriz de correlación
matriz_correlacion <- cor(columnas_numericas_para_correlacion, use = "pairwise.complete.obs")
# Visualizar la matriz de correlación
corrplot(matriz_correlacion, method = "circle", type = "upper",
title = "Matriz de Correlación de Métricas Diarias de Actividad",
mar = c(0,0,2,0),
tl.cex = 0.8)Interpretación: La matriz de correlación revela qué métricas se mueven juntas (ej. pasos y calorías) y cuáles tienen relaciones inversas (ej. pasos y minutos sedentarios).
Círculos grandes y oscuros (azules): Indican una correlación positiva fuerte. Esto significa que cuando una métrica aumenta, la otra también tiende a aumentar.
Ejemplos: “pasos_diarios” tiene una fuerte correlación positiva con “calorias_diarias”, “minutos_muy_activos” y “minutos_ligeramente_activos”. Esto es lógico: a más pasos, más calorías quemadas y más minutos de actividad.
Los usuarios fueron clasificados en segmentos basados en su actividad promedio de pasos diarios, siguiendo estándares de actividad.
Hallazgos del análisis realizado en hojas de cálculo: * El 63.1% de los usuarios monitorizaron el programa en toda su duración pero usaron solo funciones parciales. * Solo el 5.8% usó el programa completo (todas las funciones, todo el tiempo). * Se observó un porcentaje significativo de usuarios que comienzan tarde o dejan de usar funciones (10.7% y 17.5% respectivamente). * Se concluyó que no hay una correlación clara entre la cantidad de actividad física y la utilización de las funciones del programa.
Análisis en RStudio: Se crearon segmentos de usuarios basados en umbrales de pasos diarios promedio.
# Definir umbrales de actividad
umbrales_pasos_actividad <- resumen_actividad_por_usuario %>%
mutate(
nivel_actividad = case_when(
pasos_promedio_general >= 10000 ~ "Muy Activo",
pasos_promedio_general >= 7500 & pasos_promedio_general < 10000 ~ "Moderadamente Activo",
pasos_promedio_general >= 5000 & pasos_promedio_general < 7500 ~ "Ligeramente Activo",
TRUE ~ "Sedentario"
)
)
# Contar cuántos usuarios hay en cada segmento
nivel_actividad_conteo <- umbrales_pasos_actividad %>%
count(nivel_actividad, sort = TRUE)
print(nivel_actividad_conteo)## # A tibble: 4 × 2
## nivel_actividad n
## <chr> <int>
## 1 Muy Activo 22
## 2 Sedentario 5
## 3 Ligeramente Activo 4
## 4 Moderadamente Activo 4
# Visualizar la distribución de los segmentos
ggplot(nivel_actividad_conteo, aes(x = reorder(nivel_actividad, -n), y = n, fill = nivel_actividad)) +
geom_bar(stat = "identity") +
labs(title = "Segmentación de Usuarios por Nivel de Actividad (Pasos Diarios Promedio)",
x = "Nivel de Actividad",
y = "Número de Usuarios") +
theme_minimal()Interpretación: Este gráfico muestra la proporción de usuarios en cada segmento, lo que es vital para estrategias de marketing diferenciadas.
La categoría con la mayor cantidad de usuarios es “Ligeramente Activo”, con aproximadamente 13 usuarios.(40%)
Le sigue de cerca la categoría “Sedentario”, con alrededor de 12 usuarios.(36%)
Las categorías “Moderadamente Activo” y “Muy Activo” tienen la menor cantidad de usuarios, ambas con aproximadamente 4 usuarios cada una. (12% cada una)
# Combinación de los dataframes de resumen
resumen_usuario_completo <- inner_join(uso_por_usuario, resumen_actividad_por_usuario, by = "id")
# Gráfico de dispersión
ggplot(resumen_usuario_completo, aes(x = pasos_promedio_general, y = dias_con_registro)) +
geom_point(alpha = 0.6, color = "darkorange") +
geom_smooth(method = "lm", se = FALSE, color = "blue") +
labs(title = "Relación entre Consistencia de Uso y Nivel de Actividad",
x = "Pasos Diarios Promedio",
y = "Días con Registro del Dispositivo") +
theme_minimal()# Coeficiente de correlación
correlacion_consistencia_actividad <- cor(resumen_usuario_completo$pasos_promedio_general,
resumen_usuario_completo$dias_con_registro,
use = "pairwise.complete.obs")
print(paste("Correlación entre Pasos Diarios Promedio y Días con Registro:", round(correlacion_consistencia_actividad, 2)))## [1] "Correlación entre Pasos Diarios Promedio y Días con Registro: 0.43"
Interpretación: Este análisis muestra si los usuarios más consistentes en el uso del dispositivo también son los más activos.
La línea azul de tendencia tiene una ligera pendiente ascendente. Esto sugiere que hay una correlación positiva, aunque débil, entre la consistencia del uso del dispositivo y el nivel de actividad. En otras palabras:
Los usuarios que registran datos durante más días (mayor consistencia de uso) tienden a tener, en promedio, un número ligeramente mayor de pasos diarios.
Sin embargo, los puntos están bastante dispersos alrededor de la línea, lo que indica que esta relación no es muy fuerte. Hay usuarios con alta consistencia que tienen pocos pasos y viceversa.
En resumen, el gráfico sugiere que usar el dispositivo de seguimiento de actividad más consistentemente podría estar levemente asociado con un nivel de actividad física ligeramente más alto, pero no es una regla estricta y hay mucha variabilidad individual.
# Identifica las columnas de métricas numéricas relevantes (excluyendo 'id' y 'solo_fecha')
metricas_numericas_para_diversidad <- datos_diarios_agregados %>%
select(where(is.numeric), -id, -solo_fecha) %>% # Excluye 'solo_fecha' también
colnames()
# Calcula la diversidad de métricas registradas por usuario
diversidad_metricas_por_usuario <- datos_diarios_agregados %>%
group_by(id) %>%
summarise(
num_tipos_actividad_registrados = sum(sapply(pick(all_of(metricas_numericas_para_diversidad)),
function(x) any(!is.na(x) & x > 0))),
.groups = 'drop'
)
# Unir con el resumen de actividad para correlacionar
resumen_final_para_segmentacion <- inner_join(resumen_usuario_completo, diversidad_metricas_por_usuario, by = "id")
ggplot(resumen_final_para_segmentacion, aes(x = pasos_promedio_general, y = num_tipos_actividad_registrados)) +
geom_point(alpha = 0.6, color = "darkcyan") +
geom_smooth(method = "lm", se = FALSE, color = "red") +
labs(title = "Diversidad de Métricas Registradas vs. Pasos Diarios Promedio",
x = "Pasos Diarios Promedio",
y = "Número de Tipos de Actividad Registrados") +
theme_minimal()Interpretación: Este gráfico explora si los usuarios más activos también tienden a registrar una mayor variedad de métricas.
La línea de tendencia roja tiene una ligera pendiente ascendente. Esto sugiere que hay una correlación positiva, aunque no muy pronunciada, entre la diversidad de métricas registradas y el promedio de pasos diarios. Es decir:
Los usuarios que registran una mayor variedad de tipos de datos de actividad (más métricas) tienden a tener, en promedio, un número ligeramente mayor de pasos diarios.
Sin embargo, se observa que la mayoría de los usuarios registran un número muy similar de tipos de actividad (muchos puntos agrupados alrededor de 5.0 y 5.1 en el eje Y), incluso con variaciones en sus pasos diarios. Hay un punto atípico con una diversidad muy baja.
Integrando los hallazgos del análisis realizado con hojas de cálculo con el análisis en RStudio, se puede derivar conclusiones y sugerencias accionables para Bellabeat.
Sedentario a
Muy Activo) es una herramienta poderosa para personalizar
los mensajes y ofertas de Bellabeat.