Resumo da análise

Esta análise tem como objetivo identificar tendências e padrões de atividade física entre os usuários de dispositivos de rastreamento da Bellabeat. Utilizando dados detalhados de atividades diárias e horários específicos, foram calculadas estatísticas descritivas, detectadas anomalias e visualizadas distribuições de métricas de atividade. As tendências de passos, minutos ativos e calorias queimadas foram analisadas ao longo do tempo, identificando os horários de maior e menor intensidade de uso. Além disso, a análise destacou diferenças de comportamento entre usuários mais ativos e menos ativos, fornecendo insights valiosos para o desenvolvimento de estratégias de marketing e intervenções personalizadas para promover estilos de vida mais saudáveis entre os clientes da Bellabeat. Este trabalho faz parte do projeto final para a obtenção do Certificado Profissional de Data Analytics do Google, demonstrando habilidades em limpeza, manipulação e análise de dados, além de comunicação de resultados através de visualizações e relatórios detalhados.

Carregando os pacotes necessários para analisar dados no R Studio

library(readr)

library(dplyr)

library(ggplot2)

library(lubridate)

library(tidyr)

library(tidyverse)

Verificando o diretório de trabalho e listar arquivos

cat("Diretório de trabalho atual:\n")
## Diretório de trabalho atual:
print(getwd())
## [1] "/cloud/project"
cat("\nArquivos no diretório de trabalho:\n")
## 
## Arquivos no diretório de trabalho:
print(list.files())
##  [1] "dailyActivity_merged.csv"     "hourlyIntensities_merged.csv"
##  [3] "project.Rproj"                "Projeto_final_google_2.Rmd"  
##  [5] "Projeto_final_google_files"   "Projeto_final_google.html"   
##  [7] "Projeto_final_google.knit.md" "projeto_final_google.R"      
##  [9] "Projeto_final_google.Rmd"     "rsconnect"

Carregando os dados

conjunto_de_dados <- read_csv("dailyActivity_merged.csv", show_col_types = FALSE)
hourlyIntensities <- read_csv("hourlyIntensities_merged.csv", show_col_types = FALSE)

Visualizando os dados com o intuito de explorar para entender a base

head(conjunto_de_dados)
head(hourlyIntensities)

Estrutura e resumo dos dados

str(conjunto_de_dados)
## spc_tbl_ [940 × 15] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ Id                      : num [1:940] 1.5e+09 1.5e+09 1.5e+09 1.5e+09 1.5e+09 ...
##  $ ActivityDate            : chr [1:940] "4/12/2016" "4/13/2016" "4/14/2016" "4/15/2016" ...
##  $ TotalSteps              : num [1:940] 13162 10735 10460 9762 12669 ...
##  $ TotalDistance           : num [1:940] 8.5 6.97 6.74 6.28 8.16 ...
##  $ TrackerDistance         : num [1:940] 8.5 6.97 6.74 6.28 8.16 ...
##  $ LoggedActivitiesDistance: num [1:940] 0 0 0 0 0 0 0 0 0 0 ...
##  $ VeryActiveDistance      : num [1:940] 1.88 1.57 2.44 2.14 2.71 ...
##  $ ModeratelyActiveDistance: num [1:940] 0.55 0.69 0.4 1.26 0.41 ...
##  $ LightActiveDistance     : num [1:940] 6.06 4.71 3.91 2.83 5.04 ...
##  $ SedentaryActiveDistance : num [1:940] 0 0 0 0 0 0 0 0 0 0 ...
##  $ VeryActiveMinutes       : num [1:940] 25 21 30 29 36 38 42 50 28 19 ...
##  $ FairlyActiveMinutes     : num [1:940] 13 19 11 34 10 20 16 31 12 8 ...
##  $ LightlyActiveMinutes    : num [1:940] 328 217 181 209 221 164 233 264 205 211 ...
##  $ SedentaryMinutes        : num [1:940] 728 776 1218 726 773 ...
##  $ Calories                : num [1:940] 1985 1797 1776 1745 1863 ...
##  - attr(*, "spec")=
##   .. cols(
##   ..   Id = col_double(),
##   ..   ActivityDate = col_character(),
##   ..   TotalSteps = col_double(),
##   ..   TotalDistance = col_double(),
##   ..   TrackerDistance = col_double(),
##   ..   LoggedActivitiesDistance = col_double(),
##   ..   VeryActiveDistance = col_double(),
##   ..   ModeratelyActiveDistance = col_double(),
##   ..   LightActiveDistance = col_double(),
##   ..   SedentaryActiveDistance = col_double(),
##   ..   VeryActiveMinutes = col_double(),
##   ..   FairlyActiveMinutes = col_double(),
##   ..   LightlyActiveMinutes = col_double(),
##   ..   SedentaryMinutes = col_double(),
##   ..   Calories = col_double()
##   .. )
##  - attr(*, "problems")=<externalptr>
summary(conjunto_de_dados)
##        Id            ActivityDate         TotalSteps    TotalDistance   
##  Min.   :1.504e+09   Length:940         Min.   :    0   Min.   : 0.000  
##  1st Qu.:2.320e+09   Class :character   1st Qu.: 3790   1st Qu.: 2.620  
##  Median :4.445e+09   Mode  :character   Median : 7406   Median : 5.245  
##  Mean   :4.855e+09                      Mean   : 7638   Mean   : 5.490  
##  3rd Qu.:6.962e+09                      3rd Qu.:10727   3rd Qu.: 7.713  
##  Max.   :8.878e+09                      Max.   :36019   Max.   :28.030  
##  TrackerDistance  LoggedActivitiesDistance VeryActiveDistance
##  Min.   : 0.000   Min.   :0.0000           Min.   : 0.000    
##  1st Qu.: 2.620   1st Qu.:0.0000           1st Qu.: 0.000    
##  Median : 5.245   Median :0.0000           Median : 0.210    
##  Mean   : 5.475   Mean   :0.1082           Mean   : 1.503    
##  3rd Qu.: 7.710   3rd Qu.:0.0000           3rd Qu.: 2.053    
##  Max.   :28.030   Max.   :4.9421           Max.   :21.920    
##  ModeratelyActiveDistance LightActiveDistance SedentaryActiveDistance
##  Min.   :0.0000           Min.   : 0.000      Min.   :0.000000       
##  1st Qu.:0.0000           1st Qu.: 1.945      1st Qu.:0.000000       
##  Median :0.2400           Median : 3.365      Median :0.000000       
##  Mean   :0.5675           Mean   : 3.341      Mean   :0.001606       
##  3rd Qu.:0.8000           3rd Qu.: 4.782      3rd Qu.:0.000000       
##  Max.   :6.4800           Max.   :10.710      Max.   :0.110000       
##  VeryActiveMinutes FairlyActiveMinutes LightlyActiveMinutes SedentaryMinutes
##  Min.   :  0.00    Min.   :  0.00      Min.   :  0.0        Min.   :   0.0  
##  1st Qu.:  0.00    1st Qu.:  0.00      1st Qu.:127.0        1st Qu.: 729.8  
##  Median :  4.00    Median :  6.00      Median :199.0        Median :1057.5  
##  Mean   : 21.16    Mean   : 13.56      Mean   :192.8        Mean   : 991.2  
##  3rd Qu.: 32.00    3rd Qu.: 19.00      3rd Qu.:264.0        3rd Qu.:1229.5  
##  Max.   :210.00    Max.   :143.00      Max.   :518.0        Max.   :1440.0  
##     Calories   
##  Min.   :   0  
##  1st Qu.:1828  
##  Median :2134  
##  Mean   :2304  
##  3rd Qu.:2793  
##  Max.   :4900
colnames(conjunto_de_dados)
##  [1] "Id"                       "ActivityDate"            
##  [3] "TotalSteps"               "TotalDistance"           
##  [5] "TrackerDistance"          "LoggedActivitiesDistance"
##  [7] "VeryActiveDistance"       "ModeratelyActiveDistance"
##  [9] "LightActiveDistance"      "SedentaryActiveDistance" 
## [11] "VeryActiveMinutes"        "FairlyActiveMinutes"     
## [13] "LightlyActiveMinutes"     "SedentaryMinutes"        
## [15] "Calories"

Verificando valores ausentes para garantir a integridade dos dados

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

Verificando se existem linhas duplicadas

duplicadas <- conjunto_de_dados[duplicated(conjunto_de_dados), ]
print(duplicadas)
## # A tibble: 0 × 15
## # ℹ 15 variables: Id <dbl>, ActivityDate <chr>, TotalSteps <dbl>,
## #   TotalDistance <dbl>, TrackerDistance <dbl>, LoggedActivitiesDistance <dbl>,
## #   VeryActiveDistance <dbl>, ModeratelyActiveDistance <dbl>,
## #   LightActiveDistance <dbl>, SedentaryActiveDistance <dbl>,
## #   VeryActiveMinutes <dbl>, FairlyActiveMinutes <dbl>,
## #   LightlyActiveMinutes <dbl>, SedentaryMinutes <dbl>, Calories <dbl>

Verificando quantos usuários tenho na base de dados

num_usuarios <- conjunto_de_dados %>% 
  summarize(Num_Usuarios = n_distinct(Id))
print(num_usuarios)
## # A tibble: 1 × 1
##   Num_Usuarios
##          <int>
## 1           33

Garantindo que as datas estejam no formato correto

conjunto_de_dados$ActivityDate <- as.Date(conjunto_de_dados$ActivityDate, format = "%m/%d/%Y")
str(conjunto_de_dados$ActivityDate)
##  Date[1:940], format: "2016-04-12" "2016-04-13" "2016-04-14" "2016-04-15" "2016-04-16" ...

Unindo os dados das tabelas para que seja possível continuar a análise, os dados com os horários estão em um outro arquivo csv

conjunto_de_dados_com_horas <- merge(conjunto_de_dados, hourlyIntensities[, c("Id", "ActivityHour", "TotalIntensity")], by = "Id", all.x = TRUE)
head(conjunto_de_dados_com_horas)

Ao visualizar os dados percebi que as informações de data e hora estão em uma única coluna, precisei separar

conjunto_de_dados_com_horas <- separate(conjunto_de_dados_com_horas, ActivityHour, into = c("Data", "Hora"), sep = " (?=\\d+:)")
head(conjunto_de_dados_com_horas)

Análise temporal de atividades

# Médias diárias

medias_diarias <- conjunto_de_dados %>%
  group_by(ActivityDate) %>%
  summarise(Media_Passos = mean(TotalSteps),
            Media_Minutos_Ativos = mean(VeryActiveMinutes),
            Media_Calorias = mean(Calories))
head(medias_diarias)
# Remover linha correspondentes ao dia "2016-05-12" devido a não ter registros

medias_diarias <- medias_diarias %>%
  filter(ActivityDate != as.Date("2016-05-12"))

# Gráficos de linhas

ggplot(medias_diarias, aes(x = ActivityDate, y = Media_Passos)) +
  geom_line() +
  labs(title = "Média Diária de Passos ao Longo do Tempo", x = "Data", y = "Média de Passos") +
  scale_x_date(date_breaks = "1 day", date_labels = "%b %d") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

ggplot(medias_diarias, aes(x = ActivityDate, y = Media_Minutos_Ativos)) +
  geom_line() +
  labs(title = "Média Diária de Minutos Ativos ao Longo do Tempo", x = "Data", y = "Média de Minutos Ativos") +
  scale_x_date(date_breaks = "1 day", date_labels = "%b %d") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

ggplot(medias_diarias, aes(x = ActivityDate, y = Media_Calorias)) +
  geom_line() +
  labs(title = "Média Diária de Calorias Queimadas ao Longo do Tempo", x = "Data", y = "Média de Calorias Queimadas") +
  scale_x_date(date_breaks = "1 day", date_labels = "%b %d") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Análise de intensidade por hora

# Média de intensidade por hora

intensidade_uso_media_por_hora <- conjunto_de_dados_com_horas %>%
  group_by(Hora) %>%
  summarise(media_intensidade = mean(TotalIntensity))
print(intensidade_uso_media_por_hora)
## # A tibble: 25 × 2
##    Hora        media_intensidade
##    <chr>                   <dbl>
##  1 10:00:00 AM            16.5  
##  2 10:00:00 PM             7.87 
##  3 11:00:00 AM            17.2  
##  4 11:00:00 PM             4.98 
##  5 12:00:00 AM             2.62 
##  6 12:00:00 PM            19.6  
##  7 1:00:00 AM              1.43 
##  8 1:00:00 PM             17.0  
##  9 2:00:00 AM              0.821
## 10 2:00:00 PM             18.0  
## # ℹ 15 more rows
# Ordenar por intensidade

intensidade_media_por_hora <- intensidade_uso_media_por_hora %>% arrange(desc(media_intensidade))
print(intensidade_media_por_hora)
## # A tibble: 25 × 2
##    Hora        media_intensidade
##    <chr>                   <dbl>
##  1 7:00:00 PM               20.4
##  2 12:00:00 PM              19.6
##  3 6:00:00 PM               19.5
##  4 5:00:00 PM               19.0
##  5 2:00:00 PM               18.0
##  6 4:00:00 PM               17.5
##  7 11:00:00 AM              17.2
##  8 1:00:00 PM               17.0
##  9 10:00:00 AM              16.5
## 10 8:00:00 PM               15.9
## # ℹ 15 more rows
# Gráfico de barras

ggplot(data = intensidade_media_por_hora, aes(x = reorder(Hora, -media_intensidade), y = media_intensidade)) +
  geom_col() +
  labs(title = "Média de Intensidade por Hora do Dia", x = "Hora do Dia", y = "Média de Intensidade") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))
## Warning: Removed 1 row containing missing values or values outside the scale range
## (`geom_col()`).

Análise de dias da semana com mais e menos atividades

# Dia da semana com menos e mais minutos ativos

medias_diarias <- medias_diarias %>%
  mutate(DiaSemana = weekdays(ActivityDate))

minutos_ativos_por_dia <- medias_diarias %>%
  group_by(DiaSemana) %>%
  summarise(Total_Minutos_Ativos = sum(Media_Minutos_Ativos))

dia_com_menos_ativos <- minutos_ativos_por_dia %>%
  filter(Total_Minutos_Ativos == min(Total_Minutos_Ativos))
print(dia_com_menos_ativos)
## # A tibble: 1 × 2
##   DiaSemana Total_Minutos_Ativos
##   <chr>                    <dbl>
## 1 Sunday                    79.6
dia_com_mais_ativos <- minutos_ativos_por_dia %>%
  filter(Total_Minutos_Ativos == max(Total_Minutos_Ativos))
print(dia_com_mais_ativos)
## # A tibble: 1 × 2
##   DiaSemana Total_Minutos_Ativos
##   <chr>                    <dbl>
## 1 Tuesday                   115.

Análise de usuários ativos e menos ativos

# Média de passos por usuário

media_passos_por_usuario <- conjunto_de_dados_com_horas %>%
  group_by(Id) %>%
  summarise(Media_Passos = mean(TotalSteps))
print(media_passos_por_usuario)
## # A tibble: 33 × 2
##            Id Media_Passos
##         <dbl>        <dbl>
##  1 1503960366       12117.
##  2 1624580081        5744.
##  3 1644430081        7283.
##  4 1844505072        2580.
##  5 1927972279         916.
##  6 2022484408       11371.
##  7 2026352035        5567.
##  8 2320127002        4717.
##  9 2347167796        9520.
## 10 2873212765        7556.
## # ℹ 23 more rows
# Classificação de usuários

limite_atividade <- 8000
media_passos_por_usuario$Classificacao <- ifelse(media_passos_por_usuario$Media_Passos >= limite_atividade, "Ativo", "Menos ativo")
print(media_passos_por_usuario)
## # A tibble: 33 × 3
##            Id Media_Passos Classificacao
##         <dbl>        <dbl> <chr>        
##  1 1503960366       12117. Ativo        
##  2 1624580081        5744. Menos ativo  
##  3 1644430081        7283. Menos ativo  
##  4 1844505072        2580. Menos ativo  
##  5 1927972279         916. Menos ativo  
##  6 2022484408       11371. Ativo        
##  7 2026352035        5567. Menos ativo  
##  8 2320127002        4717. Menos ativo  
##  9 2347167796        9520. Ativo        
## 10 2873212765        7556. Menos ativo  
## # ℹ 23 more rows
# Contagem por classificação

contagem_classificacao <- table(media_passos_por_usuario$Classificacao)
print(contagem_classificacao)
## 
##       Ativo Menos ativo 
##          14          19

Resumo do Resultado da Análise

A análise envolveu dados de 33 usuários de dispositivos de rastreamento. Constatou-se que nos fins de semana há menor intensidade de uso dos dispositivos. Os horários de maior intensidade de uso foram identificados como 7:00 PM, 12:00 PM, 6:00 PM, 5:00 PM e 2:00 PM. O domingo foi o dia com menor intensidade de uso, enquanto a terça-feira foi o dia com maior intensidade. Dos usuários analisados, 19 foram classificados como menos ativos e 14 como mais ativos. Os usuários mais ativos passaram em média 41.7 minutos ativos por dia, enquanto os usuários menos ativos passaram em média 6.08 minutos.

Recomendações para a Bellabeat

Desenvolver Programas de Atividade Personalizados: Com base nos dados, criar programas que incentivem os usuários menos ativos a aumentarem sua atividade física, utilizando notificações e recompensas.

Foco nos dias e horários de menor atividade:

  • Implementar campanhas específicas para aumentar a atividade física nos fins de semana e domingos, quando a intensidade de uso é menor.

  • Lembretes de Movimento: Enviar lembretes amigáveis para se movimentar ou realizar uma atividade física rápida durante horários menos ativos.

  • Desafios de Passos: Criar desafios de passos para horários específicos. Por exemplo, um desafio que incentive os usuários a caminhar um certo número de passos entre 2:00 PM e 4:00 PM.

  • Sistema de Recompensas: Implementar um sistema de pontos ou recompensas por atividade física realizada durante horários menos ativos. Os usuários podem acumular pontos e trocá-los por prêmios ou descontos em produtos Bellabeat.

  • Badges e Conquistas: Criar badges e conquistas específicas para incentivar a atividade física em horários de baixa intensidade.

  • Exercícios Curtos: Oferecer vídeos de exercícios curtos (5-10 minutos) que os usuários podem realizar durante os intervalos em horários menos ativos.

  • Alertas de Sessão: Enviar alertas para sessões de alongamento ou exercícios rápidos durante a tarde para combater o sedentarismo.

  • Feedback dos Usuários: Coletar feedback dos usuários sobre as intervenções para entender o que funciona melhor e onde estão as áreas de melhoria.

  • Integração com Apps de Calendário: Integrar lembretes de atividade física com os aplicativos de calendário dos usuários para criar eventos que incentivem a movimentação em horários específicos.

Foco nos dias e horários de alta intensidade:

  • Aproveitar os horários de maior intensidade de uso para enviar mensagens motivacionais e lembretes de saúde.

  • Lançamentos de Produtos: Aproveite os horários e dias mais ativos para lançar novos produtos ou funcionalidades, capturando a atenção dos usuários quando eles estão mais engajados.

  • Análises Preditivas: Utilize análises preditivas para identificar futuros horários de alta atividade e prepare campanhas específicas para esses momentos.

  • Notificações Dinâmicas: Use notificações dinâmicas que reconheçam quando os usuários estão em seus horários de pico e ofereçam sugestões de atividades ou lembretes de saúde personalizados.

  • Análise Contínua de Dados: Continuar monitorando e analisando os dados dos usuários para identificar novas tendências e ajustar as estratégias de marketing e engajamento conforme necessário.

Conclusão

Com base na análise dos dados de uso dos dispositivos inteligentes, identificamos padrões significativos que podem orientar estratégias para aumentar a atividade física dos usuários. Recomendamos intervenções personalizadas e o uso de incentivos para engajar os usuários em horários e dias menos ativos. Estas ações ajudarão a Bellabeat a promover estilos de vida mais saudáveis, aumentar a retenção de clientes e solidificar sua posição no mercado de dispositivos de saúde inteligentes.

Descrição da Fonte de Dados

A base de dados utilizada nesta análise foi obtida do conjunto de dados de rastreadores de condicionamento físico FitBit, disponível sob domínio público (CC0). Este conjunto de dados foi disponibilizado através de Mobius e contém informações detalhadas sobre a atividade física diária de diversos usuários. As métricas incluem contagem de passos, distância percorrida, minutos ativos, calorias queimadas, entre outras variáveis, registradas ao longo do tempo.