setwd("/Users/isaiahmireles/Desktop/Misconceptions")
cohorts <- read.csv("cohorts.csv")
cohorts$exam <- factor(cohorts$exam)
library(tidyverse)# percent per q dat
PPQ <-
cohorts |>
filter(unidentified==F) |>
pivot_longer(
# select starts w/ Q, then 1 digit
cols = matches("^Q\\d+$"),
# grab q,
names_to = "question",
values_to = "correct"
) |>
group_by(term, exam, question) |>
# ct std (matches above)
summarize(
n_students = n(),
PPQ = mean(correct),
.groups = "drop"
) # add grouping
PPQ <-
PPQ |>
group_by(term, exam)
PPQ_lst <-
PPQ |>
group_split() |>
set_names(
PPQ |>
group_keys() |>
transmute(name = paste(term, exam, sep = "_")) |>
pull(name)
)Exam length
Ordering
Problem type
varies across exam, below we manually label this fact
Midterms_lst$S24_Midterm <- Midterms_lst$S24_Midterm |>
mutate(
difference = factor(
"Same",
levels = c("Same", "Similar", "insignificant", "Not Included")
),
description = "No difference",
comment = NA_character_,
Question_Order = paste(question, "-- Spring")
)difference, description,
commentMidterms_lst$W24_Midterm <- Midterms_lst$W24_Midterm |>
mutate(
difference = case_when(
question == "Q27" ~ "insignificant",
question %in% c("Q32", "Q33") ~ "Not Included",
TRUE ~ "Same"
),
difference = factor(
difference,
levels = c("Same", "Similar", "insignificant", "Not Included")
),
description = case_when(
difference == "Same" ~ "No difference",
difference == "Similar" ~ "Similar type of problem with different wording",
difference == "insignificant" ~ "Very small changes in wording",
difference == "Not Included" ~ "Question not included in Spring class"
),
comment = case_when(
question == "Q27" ~ "He vs. Ry : histogram main title naming difference",
question == "Q32" ~ "Same Q Across Fall, Winter Quarter",
question == "Q33" ~ "Unique to Winter Exam",
TRUE ~ NA_character_
)
)Midterms_lst$W24_Midterm |>
filter(question %in% c("Q27", "Q32", "Q33")) |>
select(term, exam, question, difference, description, comment)Question_OrderMidterms_lst$F23_Midterm <- Midterms_lst$F23_Midterm |>
mutate(
Question_Order = case_when(
question %in% c("Q11", "Q24", "Q30", "Q32", "Q33", "Q34") ~ NA_character_,
question == "Q2" ~ "Q3 -- Spring",
question == "Q4" ~ "Q7 -- Spring",
question == "Q5" ~ "Q8 -- Spring",
question == "Q6" ~ "Q9 -- Spring",
question == "Q7" ~ "Q11 -- Spring",
question == "Q8" ~ "Q12 -- Spring",
question == "Q9" ~ "Q13 -- Spring",
question == "Q10" ~ "Q14 -- Spring",
question == "Q12" ~ "Q6 -- Spring",
question == "Q13" ~ "Q10 -- Spring",
question == "Q14" ~ "Q23 -- Spring",
question == "Q15" ~ "Q24 -- Spring",
question == "Q16" ~ "Q25 -- Spring",
question == "Q17" ~ "Q26 -- Spring",
question == "Q18" ~ "Q27 -- Spring",
question == "Q19" ~ "Q28 -- Spring",
question == "Q21" ~ "Q30 -- Spring",
question == "Q22" ~ "Q31 -- Spring",
question == "Q23" ~ "Q16 -- Spring",
question == "Q25" ~ "Q16 -- Spring",
question == "Q26" ~ "Q18 -- Spring",
question == "Q27" ~ "Q19 -- Spring",
question == "Q28" ~ "Q17 -- Spring",
question == "Q31" ~ "Q22 -- Spring",
TRUE ~ paste(question, "-- Spring")
),
difference = case_when(
question %in% c("Q11", "Q24", "Q30", "Q32", "Q33", "Q34") ~ "Not Included",
question %in% c("Q17", "Q18", "Q19", "Q21") ~ "insignificant",
question %in% c("Q23", "Q25", "Q26", "Q27", "Q28", "Q31") ~ "Similar",
TRUE ~ "Same"
),
difference = factor(
difference,
levels = c("Same", "Similar", "insignificant", "Not Included")
),
description = case_when(
difference == "Same" ~ "No difference",
difference == "Similar" ~ "Similar type of problem with different wording",
difference == "insignificant" ~ "Very small changes in wording",
difference == "Not Included" ~ "Question not included in Spring class"
),
comment = case_when(
question %in% c("Q11", "Q30", "Q33", "Q34") ~ "Unique to Fall Exam",
question == "Q17" ~ "Different amount (400 not 500) and different correct response (30% not 15%)",
question == "Q18" ~ "He vs. Ry : histogram main title naming difference; Same as winter",
question == "Q19" ~ "problem context : Ice cream instead of tea",
question == "Q21" ~ "correlation of .128 instead of .129",
question == "Q23" ~ "Type of Study Problem (experiment vs. observational study)",
question == "Q24" ~ "Best visualized by which plot Problem",
question == "Q25" ~ "Reg. Estimate given x-value, context difference",
question == "Q26" ~ "Reg. intercept interpretation, context difference",
question == "Q27" ~ "Reg. slope interpretation, context difference",
question == "Q28" ~ "coef of determination interpretation, context difference",
question == "Q31" ~ "Choosing the correct mdl",
question == "Q32" ~ "Same Q Across Fall, Winter Quarter",
TRUE ~ NA_character_
)
)Midterms_lst$F23_Midterm |>
filter(
difference != "Same" |
Question_Order != paste(question, "-- Spring")
) |>
select(term, exam, question, difference, description, comment)difference_colors <- c(
"Same" = "grey65",
"Similar" = "#0072B2",
"insignificant" = "#E69F00",
"Not Included" = "#D55E00"
)
Midterm_plots <- map(Midterms_lst, function(data) {
plot_data <- data |>
mutate(
spring_number = parse_number(Question_Order),
original_number = parse_number(question),
question_label = if_else(
is.na(Question_Order),
paste0(question, " (Not Included)"),
paste0(Question_Order, " [", question, "]")
)
) |>
arrange(is.na(spring_number), spring_number, original_number) |>
mutate(
question_label = factor(
question_label,
levels = unique(question_label)
)
)
ggplot(plot_data, aes(x = question_label, y = PPQ, fill = difference)) +
geom_col() +
scale_fill_manual(values = difference_colors, drop = FALSE) +
scale_y_continuous(
labels = scales::label_percent(),
limits = c(0, 1)
) +
labs(
title = paste(unique(data$term), "Midterm"),
x = "Spring question order [original question]",
y = "Percent correct",
fill = "Difference"
) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5))
})
Midterm_plots$F23_Midterm## Warning: Removed 1 row containing missing values or values outside the scale range
## (`geom_col()`).