setwd("~/Teaching/Grades_and_SRT/")
#setwd("G:/My\ Drive/Teaching/Grades_and_SRT")
f18 = read.csv("Fall2018/chem1331_f18.csv",header = TRUE)
f19 = read.csv("Fall2019/CHEM1331/chem1331f19_gradebook.csv",header = TRUE)
f21 = read.csv("Fall2021/chem1331f21_Octgradebook.csv",header = TRUE)

rownames(f18) = f18[,4]
rownames(f19) = f19[,4]
rownames(f21) = f21[,4]
f18[,4] = NULL
f19[,4] = NULL
f21[,4] = NULL

nf18 = length(f18$Student)
nf19 = length(f19$Student)
nf21 = length(f21$Student)

This is a preliminary anlysis of CHEM1331 and how the three past iterations of this course compare with each other. We have excluded Fall2020 because both the curriculum and the assessment had been altered to adapt to online delivery.

1 Homework

We can see that the number of students who miss homework is significantly higher than other years. Weekly homework is always due on Thursdays nights and it’s always online, they have several attempts to achieve their highest score. This periodicity in the schedule should make it harder to miss.

f18hw = f18[,grepl("Thu",names(f18))]
f19hw = f19[,grepl("Homework",names(f19)) & !grepl("Score",names(f19))]
f21hw = f21[,grepl("Thu",names(f21))]

plot(0+colSums(f18hw == 0),type="l",col="red",ylim=c(0,15),xlab = "Homework item",ylab="students not attempting hw")
lines(0+colSums(f19hw == 0),type="l",col="blue")
lines(0+colSums(f21hw == 0),type="l",col="black")
legend(1, 12, legend=c("F2018", "F2019","F2021"), col=c("red", "blue","black"),lty=1:1, cex=0.8)
title("Number of students missing each homework")

plot(0+colMeans(f18hw),type="l",col="red",ylim=c(50,100),xlab = "Homework item",ylab="Average % score")
lines(0+colMeans(f19hw/12*100,na.rm = TRUE),type="l",col="blue")
lines(0+colMeans(f21hw/12*100,na.rm = TRUE),type="l",col="black")
legend(1, 60, legend=c( paste("F2018 n=",nf18), 
                        paste("F2019 n=",nf19), 
                        paste("F2021 n=",nf21)), col=c("red", "blue","black"),lty=1:1, cex=0.8)
title("Average score of each homework")

Homework does not strongly correlate with final grade, but a low score (lower than seventy percent) in homework is usually indication of something not quite right.

regF18 = lm(f18$Final.Score ~ f18$Homework.Final.Score )
regF19 = lm(f19$Final.Score ~ f19$Homework.Final.Score )
plot(f18$Homework.Final.Score,f18$Final.Score,col="red",ylab = "Final course grade",xlab = "Average HW grade")
points(f19$Homework.Final.Score,f19$Final.Score,col="blue")
legend(40, 90, legend=c( paste("F2018 n=",nf18," R2=",format(summary(regF18)$r.squared,digits=3)), 
                        paste("F2019 n=",nf19," R2=",format(summary(regF19)$r.squared,digits=3))
                        ),  col=c("red", "blue"),lty=1:1, cex=0.8)
abline(regF18,col="red")
abline(regF19,col="blue")
title("How does homework performance correlate with final score")

So we can say students averaging lower than 70% in the homework they typically do not pass the course. In 2021 there’s already more than 20 students with average score below 70.

hist(f18$Homework.Final.Score,main="Fall 2018",xlab = "Homework average score")

hist(f19$Homework.Final.Score,main="Fall 2019",xlab = "Homework average score")

hist(f21$Homework.Final.Score,main="Fall 2021",xlab = "Homework average score")

2 Milestone scores 1st attempt

Since 2018 we have split assessment between low-level order thinking skills and high-level ones. The low-level skills are assessed on what we call milestones. A way to think of them is proctored online homework. They know the questions ahead of time, they have a week prior to practice as much as they need. The only caveat is that it’s graded on the A/C/F scale. If they obtain above 80% that turns into 100, if it’s between 70 and 80% it becomes 80%, lower than 70% becomes a zero and it is a strong indicator of course failure.

They have 3 attempts and this years, most students (except for 4) managed to pass (>70%) after the 3 attempts. That being said, the difference in how seriously they took the first attempt is remarkable for a fraction of this years populations.

#I split the moodle csv into different attempts, just couldnt figure out how to split it
m1f18_1 = read.csv("Fall2018/milestone1.csv",header = TRUE)
m1f19 = read.csv("Fall2019/CHEM1331/milestone1.csv",header = TRUE)
m1f21 = read.csv("Fall2021/milestone1.csv",header = TRUE)

m1f19_1 = m1f19[grepl("1",m1f19$attempt),]
m1f21_1 = m1f21[grepl("1",m1f21$attempt),]


#m1f18[,c(1,2,3,5)] = NULL
#m1f19[,c(2,3,4,5,6)] = NULL
#m1f21[,c(2,3,4,5,6)] = NULL

#1st attempt
slicef18 = c(
  length(which(m1f18_1$Grade.100.00> 79.99)),
  length(which(m1f18_1$Grade.100.00< 79.99 & m1f18_1$Grade.100.00 > 69.99)),
  length(which(m1f18_1$Grade.100.00< 69.99))
)
pct18 = round(slicef18/sum(slicef18)*100)
slicef19 = c(
  length(which(m1f19_1$score> 79.99)),
  length(which(m1f19_1$score< 79.99 & m1f19_1$score > 69.99)),
  length(which(m1f19_1$score< 69.99))
)
pct19 = round(slicef19/sum(slicef19)*100)
slicef21 = c(
  length(which(m1f21_1$score> 79.99)),
  length(which(m1f21_1$score< 79.99 & m1f21_1$score > 69.99)),
  length(which(m1f21_1$score< 69.99))
)
pct21 = round(slicef21/sum(slicef21)*100)

lbls = c("Above 80:","Btween 70-80:","Below 70:")
lbls18 = paste(lbls,pct18,"%",sep = "")
lbls19 = paste(lbls,pct19,"%",sep = "")
lbls21 = paste(lbls,pct21,"%",sep = "")

pie(slicef18,labels = lbls18, col=rainbow(length(lbls)), main = "M1 1st attempt Fall 2018")

pie(slicef19,labels = lbls19, col=rainbow(length(lbls)), main = "M1 1st attempt Fall 2019")

pie(slicef21,labels = lbls21, col=rainbow(length(lbls)), main = "M1 1st attempt Fall 2021")

3 Preclass assignments

Preclass assignments can be understood as entrance tickets to the class. For them to get attendance credit they must complete the preclass. This graph should not include those who may be not attending class due to COVID reasons. These absences are excused and therefore not counted. This is specially problematic because missing more than 11 sessions in total will result in the failure of the whole course. This document explains further this policy.

f18preclass = f18[,grepl("class",names(f18)) & grepl("X",names(f18)) & !grepl("Score",names(f18))]
f19preclass = f19[,grepl("class",names(f19)) & grepl("X",names(f19)) & !grepl("Score",names(f19))]
f21preclass = f21[,grepl("class",names(f21)) & grepl("X",names(f21)) & !grepl("Score",names(f21))]
l = length(colnames(f21preclass))
f21preclass[,l] = NULL
f21preclass[,l-1] = NULL
plot(0+colSums(f18preclass == 0, na.rm = TRUE),type="l",col="red",ylim=c(0,40),xlab = "class day",ylab = "students missing preclass")
lines(0+colSums(f19preclass == 0,na.rm = TRUE),type="l",col="blue")
lines(0+colSums(f21preclass == 0,na.rm = TRUE),type="l",col="black")
legend(1, 40, legend=c( paste("F2018 n=",nf18), 
                        paste("F2019 n=",nf19), 
                        paste("F2021 n=",nf21)), col=c("red", "blue","black"),lty=1:1, cex=0.8)
title("Number of students missing each Preclass")

4 Video watching

Probably the most remarkable difference that we have seen is in “Video watching”. We noticed a couple of times that a lot of people were not watching the videos and we sent some alert messages. That may explain the drops and changes this year. Video watching is remarkable because it shows how “on top of things” students are. Video watching is not graded and it relies on student responsibility to come to class prepared.

Granted many students always watch a fraction of the video. What is new this year is the number of students who are not even watching one second of it.

f18video = read.csv("Fall2018/videowatching_resultsf18.csv",header = TRUE)
f19video = read.csv("Fall2019/CHEM1331/videowatching_resultsf19.csv",header = TRUE)
f21video = read.csv("Fall2021/videowatching_resultsf21.csv",header = TRUE)
f21video[,c(1,3,4,5,6)] = NULL
rownames(f18video) = f18video$X
f18video[,1] = NULL
rownames(f19video) = f19video$X
f19video[,1] = NULL
rownames(f21video) = f21video$name
f21video[,1] = NULL

f18video = f18video[1:(length(f18video)-2)]
f19video = f19video[1:(length(f19video)-2)]
f21video = f21video[1:(length(f21video)-3)]

mis18 = as.numeric(f18video[length( f18video[[1]]), ])
mis19 = as.numeric(f19video[length( f19video[[1]]), ])
mis21 = as.numeric(f21video[length( f21video[[1]]), ])

#the last row counts how many NA and zeroes
plot( mis18 ,type="l",col="red",ylim=c(0,150),xlab="Video item",ylab="Number of students who didnt even open the video")
lines(mis19,type="l",col="blue")
lines(mis21,type="l",col="black")
legend(1, 140, legend=c( paste("F2018 n=",nf18), 
                        paste("F2019 n=",nf19), 
                        paste("F2021 n=",nf21)), col=c("red", "blue","black"),lty=1:1, cex=0.8)
title("Number of students not having opened the video")