-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMonitorPassos.Rmd
More file actions
161 lines (101 loc) · 7.46 KB
/
MonitorPassos.Rmd
File metadata and controls
161 lines (101 loc) · 7.46 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
# Analisando um monitor de passos de uma pessoa
## Um exemplo de pesquisa reproduzível
### A importância
A pesquisa que permite ser reproduzida traz algumas vantagens:
1. O aprendizado. Quando nos deparamos com uma pesquisa reproduzível, podemos apredender e aplicar a mesma técnica para outras situações;
2. A refutabilidade. Um dos pontos que separam a ciência de outras crenças é que ela pode ser refutável. Podemos discordar da amostra obtida, do método de coleta de dados, das transformações dos dados, ou ainda das conclusões;
2. A sua evolução. Outras pessoas podem testar e aplicar a mesma pesquisa a outros cenários, à outras amostras e assim descobrir falhas ou lacunas que levarão à evolução desta pesquisa.
### Amostra
Para essa tarefa, usaremos os dados de um dispositivo de monitoramento de atividades pessoais. Este dispositivo coleta dados a cada 5 minutos ao longo do dia. Os dados consistem em dois meses de dados de um indivíduo anônimo coletado ao longo de alguns meses e o número de passos dados em intervalos de 5 minutos por dia.
### Bibliotecas utilizadas
```{r warning=FALSE}
library(data.table)
library(chron)
library(plyr)
library(reshape2)
library(lattice)
```
### Funções utilizadas
```{r}
# fread(), summary(), head(), length(), lapply(),
# as.Date(), is.na(), mean(), median()
# par(), plot(), lines(), xyplot()
# which.max(), with(), ave(), revalue(), suppressWarnings() ,dcast().
```
### Carregando e pré-processando os dados
Neste primeiro bloco, vamos carregar os dados e processá-los conforme necessário. O uso do código para este exercício é:
```{r read.data}
Originais <- fread("activity.csv")
Originais$date <- as.Date(Originais$date, "%Y-%m-%d")
```
O código é lido com a função "fread" do pacote data.table.
O único processamento aplicado ao conjunto de dados é a transformação da variável de dados de Caractere para Data.
Das funções básicas do R, podemos destacar summary e head. A primeira traz informações que já podem indicar algum procedimento que será necessário fazer. A função head traz os primeiros registros, que podem ajudar a visualizar a nossa amostra.
```{r}
summary(Originais)
head(Originais)
length(Originais$steps)
```
Algumas observações:
- Através destas funções vemos que temos o número de passos (steps) com mínimo e mediana zerados, ou seja, há muitos momentos em que a pessoa não caminha ou ainda possa ter alguma imperfeição na coleta dos dados;
- Porém, temos um total de 17568 amostras frente às 2304 amostras sem medidas (NA). Levando em conta que o equipamento pode não ter funcionado o tempo todo e que foram agrupadas as medidas a cada 5 minutos, me parece válido o intervalo obtido;
- As datas variam de 01/Out até 30/Nov, o que equivale a 2 meses;
- A coluna interval varia de 0 até 2355, o que corresponde ao horário medido, ou seja, de 00:00 a 23:55.
## Qual é o número total médio de passos dados por dia?
Neste exercício, geraremos um histograma do número total de etapas realizadas por dia e calcularemos o número médio de etapas realizadas por dia.
Neste bloco, os valores de NA podem ser ignorados.
```{r Fig1, fig.width=7, fig.height=6}
Passos <- Originais[, lapply(.SD, sum), by = date, .SDcols = "steps"]
par(lend = "square")
plot(Passos$date, Passos$steps,
type = "h", lwd = 10, col = "black",
xlab = "date", ylab = "número de passos",
main = "Número de passos por dia")
lines(Passos$date, Passos$steps, type = "h", lwd = 7, col = "green")
mean(Passos$steps, na.rm = T);
median(Passos$steps, na.rm = T)
```
## Qual é o padrão de atividade média diária?
Faremos uma série de tempos do intervalo de 5 minutos (eixo x) e o número médio de passos realizados, calculando a média todos os dias. Descubra qual intervalo de 5 minutos, em média, para todos os dias no conjunto de dados, contém o número máximo de etapas.
```{r Fig2}
Passos2 <- Originais[!is.na(Originais$steps)][,lapply(.SD, mean), by = interval, .SDcols = "steps"]
plot(Passos2$interval, Passos2$steps, type = "l",
xlab = "intervalo de tempo", ylab = "passos",
main = "passos por intervalo de tempo")
Passos2[which.max(Passos2$steps)]
```
## Inserindo valores ausentes
Vamos calcular o número total de valores omissos no conjunto de dados. Vamos elaborar uma estratégia para preencher todos os valores ausentes no conjunto de dados. Vamos criar um novo conjunto de dados sem valores ausentes e repetir o exercício 1.
```{r Fig3}
length(Originais$steps[is.na(Originais$steps)])
#valores perdidos serão substituidos pela mediana
Originais$steps[ is.na(Originais$steps) ] <-
with(Originais, ave(steps, interval,
FUN = function(x) median(x, na.rm = T)))[is.na(Originais$steps)]
#Replot "Passos por dia"
Passos3 <- Originais[, lapply(.SD, sum), by = date, .SDcols = "steps"]
par(lend = "square")
plot(Passos3$date, Passos3$steps,
type = "h", lwd = 8, col = "black",
xlab = "data", ylab = "número de passos",
main = "Número de passos por dia")
lines(Passos3$date, Passos3$steps, type = "h", lwd = 7, col = "blue")
mean(Passos3$steps, na.rm = T);
median(Passos3$steps, na.rm = T)
```
A estratégia desenvolvida: Substituímos os valores ausentes por um intervalo em um dia específico pelo valor médio das etapas para o intervalo correspondente, levando em consideração todos os dias para os quais existem medidas.
Existe uma diferença entre os valores médios e medianos calculados aqui e os do exercício um. Isso se deve simplesmente ao fato de que a mediana de um número significativo de intervalos é 0. Antes, estávamos ignorando os valores omissos que agora são substituídos em um número significativo de casos por 0. O efeito geral dessa subcessão é que ambos média e mediana são agora menores e a diferença entre eles é maior.
Eu usei a mediana em vez da média porque a mediana é uma quantidade estatística mais apropriada.
## Existem diferenças nos padrões de atividade entre os dias da semana e os finais de semana?
Os resultados são apresentados mostrando o número médio de passos em cada intervalo para a semana e outro para os dias do fim de semana.
Agora vamos criar uma nova variável que indique se um determinado dia é WEEKEND ou WEEKDAY. (Usando Fator) Em seguida, medimos o número de etapas por intervalo em todas as semanas e fins de semana.
```{r Fig4}
Originais$day <- revalue(as.factor(is.weekend(Originais$date)),
c("FALSE" = "Dia de semana", "TRUE"="Fim de semana"))
PassosMerge <- suppressWarnings(melt(Originais, c("interval", "day")))
PassosSoma <- dcast(PassosMerge, day + interval ~ variable, mean)[,1:3]
xyplot(steps ~ interval | day, data = PassosSoma, layout = c(1,2), type = "l")
```
Embora pareçam ser muito semelhantes, mais atividade é notada em torno dos intervalos do meio-dia no fim de semana em comparação com o dia da semana. A atividade durante a semana começa um pouco antes do fim de semana, com um alto nível de atividade por volta das 9 horas da manhã, provavelmente devido às horas trabalhadas.
Vale lembrar que esta análise foi realizada com um único indivíduo e um único conjunto de dados dentro deste período de dois meses.
Uma melhor análise que apontaria para uma conclusão poderia ser obtida usando as mesmas técnicas, como descrevi aqui, mas sob um grupo de pessoas e com maiores faixas de valores.