-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathnotas.Rmd
345 lines (273 loc) · 10.6 KB
/
notas.Rmd
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
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
---
title: "Notas"
output:
html_document:
toc: false
df_print: paged
---
```{r setup, include=FALSE}
source("setup_knitr.R")
```
```{r, include=FALSE, eval=TRUE}
## Importa
notas <- read.csv("misc/notas.csv")
## Converte matriculas para numero
notas$Matrícula <- as.numeric(gsub("[A-Z]", "", notas$Matrícula))
notas <- notas[order(notas$Matrícula), ]
rownames(notas) <- 1:nrow(notas)
## Seleciona apenas as colunas com as notas de provas (P*)
notas.col <- grep("^P", names(notas))
```
## Histograma e box plot geral
```{r hist-geral, fig.width=8, fig.height=6, echo=FALSE, eval=TRUE}
## Grafico geral das notas
breaks <- 0:10
## Junta notas de todas as provas em um único vetor
notas.all <- do.call(c, notas[, notas.col, drop = FALSE])
hist(notas.all, breaks = breaks, right = FALSE, include.lowest = TRUE,
main = "Notas gerais", xlab = "Notas", ylab = "Frequência absoluta")
```
Resumo dos cinco números, média, desvio-padrão, e número de provas não
realizadas (NA):
```{r, echo=FALSE, eval=TRUE}
statm <- function(x){
res <- c(fivenum(x),
mean(x, na.rm = TRUE),
sd(x, na.rm = TRUE),
sum(is.na(x)))
names(res) <- c("Min", "Q1", "Q2", "Q3", "Max", "Média", "s", "NAs")
return(res)
}
round(statm(notas.all), 2)
```
## Resumos por prova
Box plot de cada prova
```{r boxplot-provas, fig.width=8, fig.height=6, echo=FALSE, eval=TRUE}
## Boxplots comparando as notas entre sabatinas
boxplot(notas[, notas.col], ylim = c(0, 10), ylab = "Notas")
```
Resumo dos cinco números, média, desvio-padrão, e número de provas não
realizadas (NA):
```{r, echo=FALSE, eval=TRUE}
round(apply(notas[, notas.col, drop = FALSE], 2, statm), 2)
```
## Notas individuais
```{r,echo=FALSE,eval=TRUE,rownames.print=FALSE,rows.print=nrow(notas),include=FALSE}
notas[, c(1, notas.col)]
```
```{r, eval=TRUE, include=FALSE}
##----------------------------------------------------------------------
## Numero de aulas e frequencias
## Numero de aulas geral no semestre
## Datas iniciais e finais por dia da semana
sini1 <- as.Date("2017-08-01")
sini2 <- as.Date("2017-08-03")
sfim1 <- as.Date("2017-11-28")
sfim2 <- as.Date("2017-11-30")
## Numero de aulas nos dias 1 e 2
d1 <- length(seq(sini1, sfim1, by = "week"))
d2 <- length(seq(sini2, sfim2, by = "week"))
aulas <- d1 + d2
## Desconto de dias
## Dias iniciais
desc1 <- 1
## Feriados (quando realmente nao deveria ter aula e as presencas nao
## deveriam ser computadas)
feri <- 3
## Outros dias sem aula
out <- 3
## Numero efetivo de aulas
aulas.eff <- aulas - desc1 - feri - out
## Numero de dias em que foi passada a chamada
dcham <- 23
## Numero de dias em que nao foi passada a chamada
dscham <- aulas.eff - dcham
## As frequencias na planilha correspondem ao numero de dias em que foi
## passada a chamada. Para completar a frequencia com o numero de aulas
## total (incluindo aqueles dias em que nao foi passada a chamada), sera
## feita a soma do numero de dias em que nao foi passada a chamada (i.e.
## sera dada presenca para todo mundo). No entanto, se a frequencia for
## zero, ela sera mantida assim (pois sao desistencias)
notas$Freq2 <- 0
notas$Freq2[notas$Freq != 0] <- notas$Freq[notas$Freq != 0] + dscham
## Frequencia relativa
notas$Freq.rel <- notas$Freq2/aulas.eff
## Arredonda para duas casas decimais a frequencia relativa
notas$Freq.rel <- round(notas$Freq.rel, 2)
## Funcao para obter as diferencas entre um valor e um objetivo
difer <- function(x, obj){
obj - x
}
##----------------------------------------------------------------------
## Regras para arredondar a frequencia relativa
## 1) Se 0.7 <= Freq.rel < 0.75 entao SOMA difer
## Cria uma nova coluna e a condicao
notas$Freq.rel2 <- notas$Freq.rel
cond.freq <- notas$Freq.rel >= 0.7 & notas$Freq.rel < 0.75
## Soma as diferencas
notas$Freq.rel2[cond.freq] <- notas$Freq.rel2[cond.freq] +
difer(notas$Freq.rel2[cond.freq], 0.75)
```
```{r, include=FALSE, eval=TRUE}
##----------------------------------------------------------------------
## Tabela com as notas finais
## Calcula as médias
## Aqui é necessario calcular a média explicitamente pois existem casos
## onde o aluno pode ter perdido uma prova (NA), mas feito as outras.
## Por isso calcula usando a soma das notas e o número de provas.
## Número de provas
np <- length(notas.col)
## Médias
notas$Media <- apply(notas[, notas.col], 1,
function(x) sum(x, na.rm = TRUE)/np)
## Arredonda para duas casas decimais
notas$Media <- round(notas$Media, 2)
## Cria nova tabela somente com informações relevantes
notas2 <- notas[, 1:max(notas.col)]
## Regras para ser aprovado
## 1) Se 6.5 <= MF < 7.0 E Freq >= 75 entao SOMA difer
## Cria nova coluna e condicoes
notas2$M <- notas$Media
cond.nota1 <- notas$Media >=6.5 & notas$Media < 7
cond.nota2 <- notas$Freq.rel2 >= 0.75
## Soma as diferencas
notas2$M[cond.nota1 & cond.nota2] <-
notas2$M[cond.nota1 & cond.nota2] +
difer(notas2$M[cond.nota1 & cond.nota2], 7)
## Regras para ir para exame
## 1) Se 3.5 <= MF < 4.0 E Freq >= 75 entao SOMA difer
## Cria condicoes
cond.exam1 <- notas$Media >=3.5 & notas$Media < 4
## Soma as diferencas
notas2$M[cond.exam1 & cond.nota2] <-
notas2$M[cond.exam1 & cond.nota2] +
difer(notas2$M[cond.exam1 & cond.nota2], 4)
## Insere a frequencia (Freq.rel2 de notas)
notas2$F <- ceiling(notas$Freq.rel2*100)
```
```{r, include=FALSE, eval=TRUE}
##----------------------------------------------------------------------
## Antes do exame (Ex)
## Cria a coluna Situacao
notas2$S <- "Ap"
notas2$S[notas2$M >= 4 & notas2$M < 7] <- "Ex"
notas2$S[notas2$M < 4] <- "Re"
```
Na tabela abaixo estão as notas das 3 provas realizadas. A frequência
(`F`) é o percentual de presença.
A média (`M`) foi calculada com estas 3 notas, e já **arredondada para
cima** nos seguintes casos:
- Médias finais maiores ou iguais a 6,5 e menores do que 7,0 foram
arredondadas para 7,0, SE a frequência do aluno foi maior ou igual a
75%.
- Médias finais maiores ou iguais a 3,5 e menores do que 4,0 foram
arredondadas para 4,0, SE a frequência do aluno foi maior ou igual a
75%.
**Observação**: a frequência só foi utilizada aqui para critério de
arredondamento de nota. Mesmo que o aluno tenha frequência abaixo de
75%, é permitido fazer o exame.
A coluna de situação (`S`) indica se o aluno foi aprovado (`Ap`), ficou
em exame (`Ex`), ou foi reprovado (`Re`).
```{r, results='asis', include=FALSE, eval=TRUE}
kable(notas2, align = "c", digits = 2)
```
<!-- Número de alunos em cada situação: -->
```{r, include=FALSE, eval=TRUE}
addmargins(table(notas2$S))
```
<!-- Gráfico de barras com os percentuais por situação: -->
```{r, include=FALSE, eval=TRUE}
barplot(prop.table(table(notas2$S))*100,
xlab = "Situação", ylab = "Frequência (%)",
ylim = c(0, 40))
```
**Após o exame**: as notas dos exames estão na coluna `E`. A média final
(`MF`) é a mesma para quem não fez exame, e é a média entre a média
final (`M`) e a nota do exame (`E`) para quem fez exame. A média final
arredondada (`MFA`) é a nota que será lançada no sistema. A coluna `SF`
mostra a situação final dos alunos após o exame.
```{r, include=FALSE, eval=TRUE}
##----------------------------------------------------------------------
## Após exame (Ex)
## Insere notas do exame
notas2$E <- notas$E
## Verifica se houveram alunos em exame que não fizeram a prova. Aqui
## eles vão aparecer como NA, mas a nota de exame desses alunos deve ser
## zero
notas2[notas2$S == "Ex" & is.na(notas2$E), ]
## Se houver, atribuir zero nestes casos
notas2$E[notas2$S == "Ex" & is.na(notas2$E)] <- 0
## Calcula média final (MF), que é média da nota final com a nota do
## exame (apenas para os que ficaram de exame)
notas2$MF <- notas2$M
notas2$MF[notas2$S == "Ex"] <- (notas2$M[notas2$S == "Ex"] +
notas2$E[notas2$S == "Ex"])/2
notas2$MF <- round(notas2$MF, 2)
## Calcula a média final arredonadada (MFA), que é a média multiplicada por
## 10 e arredondada para cima (é como será lançada no sistema)
notas2$MFA <- ceiling(notas2$MF*10)
## Cria a coluna Situacao final (SF), que indica a situação após exame
notas2$SF <- "Ap"
notas2$SF[notas2$MFA < 50] <- "Re"
```
```{r, results='asis', include=TRUE, eval=TRUE}
## Mostra tabela
kable(notas2, align = "c", digits = 2)
```
Número de alunos em cada situação:
- Antes do exame
```{r, include=TRUE, eval=TRUE}
addmargins(table(notas2$S))
```
- Após o exame
```{r, include=TRUE, eval=TRUE}
addmargins(table(notas2$SF))
```
Gráfico de barras com os percentuais por situação:
```{r, fig.show='hold', include=TRUE, eval=TRUE}
par(mfrow = c(1, 2))
barplot(prop.table(table(notas2$S))*100,
xlab = "Situação", ylab = "Frequência (%)",
main = "Antes do exame")
barplot(prop.table(table(notas2$SF))*100,
xlab = "Situação", ylab = "Frequência (%)",
main = "Após o exame")
par(mfrow = c(1, 1))
```
```{r, echo=FALSE, include=FALSE, eval=FALSE}
##----------------------------------------------------------------------
## Monta a tabela final com as informacoes necessarias para digitar as
## notas no sistema
## Importa nomes
arq <- "~/Dropbox/UFPR/disciplinas/s2017-2/ce083/nomes.csv"
nomes <- read.csv(arq)
nomes$Matrícula <- as.numeric(gsub("[A-Z]", "", nomes$Matrícula))
## Faz o merge dos nomes com as notas
notas.sis <- merge(nomes, notas2[, c("Matrícula", "MFA")],
by = "Matrícula", sort = FALSE)
## Faz o merge da coluna Freq2 de notas (que e o numero de presencas)
notas.sis <- merge(notas.sis, notas[, c("Matrícula", "Freq2")],
by = "Matrícula", sort = FALSE)
## Mas Freq2 é o número de presenças para
aulas.eff
## dias. E o sistema considera que o número máximo de faltas é 15 para
## uma carga horária de 60H, que correspondem a 30 aulas. Por isso, é
## necessário converter as presenças para 30 dias. Aqui vou descontar o
## número de dias efetivos, mantendo o zero quando houver.
notas.sis$Freq3 <- ifelse(notas.sis$Freq2 > 0,
notas.sis$Freq2 + (30 - aulas.eff),
notas.sis$Freq2)
## Como o sistema precisa do número de faltas, então vou descontar as
## presenças
notas.sis$Faltas <- 30 - notas.sis$Freq3
## Cria uma coluna com a situação
notas.sis$S <- "Ap"
notas.sis$S[notas.sis$MFA < 50] <- "ReNota"
notas.sis$S[notas.sis$Faltas > 15] <- "ReFreq"
## Mantem apenas as coluna de interesse
col.sis <- c("Matrícula", "Nome", "Faltas", "MFA", "S")
## Exporta tabela final
write.table(notas.sis[, col.sis],
"~/Dropbox/UFPR/disciplinas/s2017-2/ce083/notas_final.csv",
sep = ",", dec = ".", col.names = TRUE, row.names = FALSE)
```