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)
  )
Midterms <- PPQ_lst[str_detect(names(PPQ_lst), "_Midterm$")]
Midterms_lst <- as.list(Midterms)

1 Comment :

  • Exam length

  • Ordering

  • Problem type

varies across exam, below we manually label this fact

2 Manual Labels

2.1 Midterm

2.1.1 Spring

  • we are doing everything relative to spring so all labels are boring in a sense
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")
  )
Midterms_lst$S24_Midterm |> 
  distinct(difference, description, comment, question, Question_Order)

2.1.2 Winter

  • difference, description, comment
Midterms_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_Order
Midterms_lst$W24_Midterm <- Midterms_lst$W24_Midterm |>
  mutate(
    Question_Order = case_when(
      question %in% c("Q32", "Q33") ~ NA_character_,
      TRUE ~ paste(question, "-- Spring")
    )
  )

2.1.3 Fall

Midterms_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)

3 Graph(s)

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

Midterm_plots$W24_Midterm
## Warning: Removed 1 row containing missing values or values outside the scale range
## (`geom_col()`).

Midterm_plots$S24_Midterm