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.
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"
conjunto_de_dados <- read_csv("dailyActivity_merged.csv", show_col_types = FALSE)
hourlyIntensities <- read_csv("hourlyIntensities_merged.csv", show_col_types = FALSE)
head(conjunto_de_dados)
head(hourlyIntensities)
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"
sum(is.na(conjunto_de_dados))
## [1] 0
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>
num_usuarios <- conjunto_de_dados %>%
summarize(Num_Usuarios = n_distinct(Id))
print(num_usuarios)
## # A tibble: 1 × 1
## Num_Usuarios
## <int>
## 1 33
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" ...
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)
conjunto_de_dados_com_horas <- separate(conjunto_de_dados_com_horas, ActivityHour, into = c("Data", "Hora"), sep = " (?=\\d+:)")
head(conjunto_de_dados_com_horas)
# 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))
# 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()`).
# 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.
# 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
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.
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.
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.
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.
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.
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.