Este relatório analisa os dados de um dispositivo de monitoramento de atividade pessoal, coletados em intervalos de 5 minutos durante os meses de outubro e novembro de 2012. O objetivo é explorar padrões de atividade, calcular estatísticas diárias e comparar comportamentos entre dias de semana e fins de semana.
# Carregar os dados
activity <- read.csv("activity.csv")
# Converter a coluna 'date' para formato Date
activity$date <- as.Date(activity$date)
# Visualizar as primeiras linhas
head(activity)
## steps date interval
## 1 NA 2012-10-01 0
## 2 NA 2012-10-01 5
## 3 NA 2012-10-01 10
## 4 NA 2012-10-01 15
## 5 NA 2012-10-01 20
## 6 NA 2012-10-01 25
# Estrutura dos dados
str(activity)
## 'data.frame': 17568 obs. of 3 variables:
## $ steps : int NA NA NA NA NA NA NA NA NA NA ...
## $ date : Date, format: "2012-10-01" "2012-10-01" ...
## $ interval: int 0 5 10 15 20 25 30 35 40 45 ...
# Resumo estatístico
summary(activity)
## steps date interval
## Min. : 0.00 Min. :2012-10-01 Min. : 0.0
## 1st Qu.: 0.00 1st Qu.:2012-10-16 1st Qu.: 588.8
## Median : 0.00 Median :2012-10-31 Median :1177.5
## Mean : 37.38 Mean :2012-10-31 Mean :1177.5
## 3rd Qu.: 12.00 3rd Qu.:2012-11-15 3rd Qu.:1766.2
## Max. :806.00 Max. :2012-11-30 Max. :2355.0
## NA's :2304
# Agregar passos por dia (ignorando NAs)
total_steps <- aggregate(steps ~ date, activity, sum, na.rm = TRUE)
# Visualizar os totais
head(total_steps)
## date steps
## 1 2012-10-02 126
## 2 2012-10-03 11352
## 3 2012-10-04 12116
## 4 2012-10-05 13294
## 5 2012-10-06 15420
## 6 2012-10-07 11015
# Histograma
hist(total_steps$steps,
main = "Total de Passos por Dia",
xlab = "Número de Passos",
ylab = "Frequência",
col = "steelblue",
border = "white",
breaks = 20)
# Calcular média e mediana
mean_steps <- mean(total_steps$steps)
median_steps <- median(total_steps$steps)
Resultados:
# Média de passos por intervalo de 5 minutos
interval_avg <- aggregate(steps ~ interval, activity, mean, na.rm = TRUE)
# Gráfico
plot(interval_avg$interval, interval_avg$steps,
type = "l",
main = "Padrão Médio de Atividade Diária",
xlab = "Intervalo (5 minutos)",
ylab = "Média de Passos",
col = "darkblue",
lwd = 2)
# Identificar o intervalo com máximo de passos
max_interval <- interval_avg[which.max(interval_avg$steps), "interval"]
max_steps <- max(interval_avg$steps)
Resposta: O intervalo 835 contém, em média, o maior número de passos (206 passos).
# Contar NAs
total_na <- sum(is.na(activity$steps))
Resultado: Existem 2304 valores ausentes no conjunto de dados.
A estratégia adotada foi preencher os valores ausentes com a média do intervalo de 5 minutos correspondente, calculada a partir de todos os dias disponíveis.
# Calcular a média de passos para cada intervalo
interval_means <- aggregate(steps ~ interval, activity, mean, na.rm = TRUE)
# Função para imputar valores ausentes
impute_steps <- function(steps, interval) {
if (is.na(steps)) {
return(interval_means[interval_means$interval == interval, "steps"])
} else {
return(steps)
}
}
# Criar novo dataset com valores imputados
activity_imputed <- activity
activity_imputed$steps <- mapply(impute_steps, activity_imputed$steps, activity_imputed$interval)
# Verificar se não há mais NAs
sum(is.na(activity_imputed$steps))
## [1] 0
# Total de passos por dia com dados imputados
total_steps_imp <- aggregate(steps ~ date, activity_imputed, sum)
# Histograma
hist(total_steps_imp$steps,
main = "Total de Passos por Dia (com Imputação)",
xlab = "Número de Passos",
ylab = "Frequência",
col = "darkgreen",
border = "white",
breaks = 20)
# Média e mediana com dados imputados
mean_steps_imp <- mean(total_steps_imp$steps)
median_steps_imp <- median(total_steps_imp$steps)
Resultados com imputação:
| Estatística | Original | Com Imputação | Diferença |
|---|---|---|---|
| Média | 1.07661910^{4} | 1.07661910^{4} | 0 |
| Mediana | 10765 | 1.076618910^{4} | 1.1886792 |
Impacto da imputação: A imputação aumentou ligeiramente a média e a mediana, pois substituiu os NAs por valores positivos.
# Identificar dias de semana e fins de semana
activity_imputed$day_type <- ifelse(weekdays(activity_imputed$date) %in% c("Saturday", "Sunday"),
"weekend", "weekday")
activity_imputed$day_type <- as.factor(activity_imputed$day_type)
# Verificar a distribuição
table(activity_imputed$day_type)
##
## weekday weekend
## 12960 4608
# Carregar ggplot2
library(ggplot2)
# Calcular média por intervalo e tipo de dia
interval_day_avg <- aggregate(steps ~ interval + day_type, activity_imputed, mean)
# Gráfico de painel
ggplot(interval_day_avg, aes(x = interval, y = steps, color = day_type)) +
geom_line(size = 1.2) +
facet_grid(day_type ~ .) +
labs(title = "Padrão de Atividade: Dias de Semana vs Fins de Semana",
x = "Intervalo (5 minutos)",
y = "Número Médio de Passos") +
theme_minimal() +
theme(legend.position = "none")
A análise revelou que:
Todo o código utilizado neste relatório está disponível neste documento, com echo = TRUE em todos os chunks para garantir a reprodutibilidade.