Winter 2025 Ml Workshop Survey Responses

Number of responses

Code
library(tidyverse)
library(bslib)
library(shiny)
library(bsicons)
source("scripts/helper_functions.R")

# list of workshop IDs to filter results
workshops <- c("2025-02-25-ucsb-ml")

results <- read_csv("data-joined/all_workshops.csv") %>% 
  filter(workshop %in% workshops)
  
# Fix comma separator
results <- results %>% 
  mutate(findout_select.pre = str_replace_all(
  findout_select.pre, 
  "Twitter, Facebook, etc.", 
  "Twitter; Facebook; etc."))

pre_survey <- results %>%
  select(ends_with(".pre"))

post_survey <- results %>%
  select(ends_with(".post"))

n_pre <- sum(apply(post_survey, 1, function(row) all(is.na(row))))
n_post <- sum(apply(pre_survey, 1, function(row) all(is.na(row))))
n_total <- nrow(results)
n_both <- nrow(results) - n_pre - n_post

layout_columns(
  value_box(
    title = "Total responses", value = n_total, ,
    theme = NULL, showcase = bs_icon("people-fill"), showcase_layout = "left center",
    full_screen = FALSE, fill = TRUE, height = NULL
  ),
  value_box(
    title = "Both pre- and post-", value = n_both, , theme = NULL,
    showcase = bs_icon("arrows-expand-vertical"), showcase_layout = "left center",
    full_screen = FALSE, fill = TRUE, height = NULL
  ),
  value_box(
    title = "Only pre-workshop", value = n_pre, ,
    theme = NULL, showcase = bs_icon("arrow-left-short"), showcase_layout = "left center",
    full_screen = FALSE, fill = TRUE, height = NULL
  ),
  value_box(
    title = "Only post-workshop", value = n_post, , theme = NULL,
    showcase = bs_icon("arrow-right-short"), showcase_layout = "left center",
    full_screen = FALSE, fill = TRUE, height = NULL
  )
)

Total responses

18

Both pre- and post-

5

Only pre-workshop

13

Only post-workshop

0

Departments

Code
depts <- results %>% select(dept_select.pre) %>% 
  separate_rows(dept_select.pre, sep=",") %>%
  mutate(dept_select.pre = str_trim(dept_select.pre)) %>%
  count(dept_select.pre, name = "count") %>% 
  mutate(percent = (count / (n_total - n_post)) * 100,
         text = sprintf("%.0f (%.0f%%)", count, percent))

ggplot(depts, aes(y=reorder(dept_select.pre, count), x=count)) +
    geom_col() +
    geom_label(aes(label = text, hjust = -0.1),
               size = 3) +
    labs(x = "# respondents", y = element_blank()) +  
    theme_minimal() +
    theme(
      panel.grid.minor = element_blank(),
      panel.grid.major.y = element_blank()
      ) +
    expand_limits(x = c(0,max(depts$count)*1.1))

“Other” Departments

Code
other_depts <- results %>% 
  count(dept_other.pre, name = "count") %>% 
  drop_na() %>% 
  mutate(percent = (count / (n_total - n_post)) * 100,
         text = sprintf("%.0f (%.0f%%)", count, percent))

ggplot(other_depts, aes(y=reorder(dept_other.pre, count), x=count)) +
    geom_col() +
    geom_label(aes(label = text, hjust = -0.1),
               size = 3) +
    labs(x = "# respondents", y = element_blank()) + 
    theme_minimal() +
    theme(
      panel.grid.minor = element_blank(),
      panel.grid.major.y = element_blank()
      ) +
    expand_limits(x = c(0,max(other_depts$count)*1.1))

Current occupation / Career stage

Code
ocup <- results %>% select(occupation.pre) %>% 
  separate_rows(occupation.pre, sep=",") %>%
  mutate(occupation.pre = str_trim(occupation.pre)) %>%
  count(occupation.pre, name = "count") %>% 
  drop_na() %>% 
  mutate(percent = (count / (n_total - n_post)) * 100,
         text = sprintf("%.0f (%.0f%%)", count, percent))

ggplot(ocup, aes(y=reorder(occupation.pre, count), x=count)) +
    geom_col() +
    geom_label(aes(label = text, hjust = -0.1),
               size = 3) +
    labs(x = "# respondents", y = element_blank()) + 
    theme_minimal() +
    theme(
      panel.grid.minor = element_blank(),
      panel.grid.major.y = element_blank()
      ) +
    expand_limits(x = c(0,max(ocup$count)*1.2))

Motivation - Why are you participating in this workshop?

Code
motiv <- results %>% select(motivation_select.pre) %>% 
  separate_rows(motivation_select.pre, sep=",")  %>% 
  mutate(motivation_select.pre = str_trim(motivation_select.pre)) %>%
  count(motivation_select.pre, name = "count") %>% 
  drop_na() %>% 
  mutate(percent = (count / (n_total - n_post)) * 100,
         text = sprintf("%.0f (%.0f%%)", count, percent))

ggplot(motiv, aes(y=reorder(motivation_select.pre, count), x=count)) +
    geom_col() +
    geom_label(aes(label = text, hjust = -0.1),
               size = 3) +
    labs(x = "# respondents", y = element_blank()) + 
    theme_minimal() +
    theme(
      panel.grid.minor = element_blank(),
      panel.grid.major.y = element_blank()
      ) +
    expand_limits(x = c(0,max(motiv$count)*1.2))

How did you find out about this workshop?

Code
findw <- results %>% select(findout_select.pre) %>% 
  separate_rows(findout_select.pre, sep=",")  %>% 
  mutate(findout_select.pre = str_trim(findout_select.pre)) %>%
  count(findout_select.pre, name = "count") %>% 
  drop_na() %>% 
  mutate(percent = (count / (n_total - n_post)) * 100,
         text = sprintf("%.0f (%.0f%%)", count, percent))

ggplot(findw, aes(y=reorder(findout_select.pre, count), x=count)) +
    geom_col() +
    geom_label(aes(label = text, hjust = -0.1),
               size = 3) +
    labs(x = "# respondents", y = element_blank()) + 
    theme_minimal() +
    theme(
      panel.grid.minor = element_blank(),
      panel.grid.major.y = element_blank()
      ) +
    expand_limits(x = c(0,max(findw$count)*1.2))

What you most hope to learn?

Code
results %>% group_by(workshop) %>% 
  select(workshop, hopes.pre) %>% 
  drop_na()
workshop hopes.pre
2025-02-25-ucsb-ml Main tools and techniques to do machine learning in Python.
2025-02-25-ucsb-ml How different ML paradigms compare for solving different problems, and when to use them
2025-02-25-ucsb-ml I would like to learn how to use machine learning with python
2025-02-25-ucsb-ml Better understanding of the best scenarios to use machine learning and how to best implement the analysis in R.
2025-02-25-ucsb-ml A general understanding/basic foundation in machine learning to later apply to hyperspectral remote sensing analyses to detect drought and heat stress in plants.
2025-02-25-ucsb-ml Some new machine learning concepts that I can take and make a project with
2025-02-25-ucsb-ml SciKitLearn’s API, parallelization techniques
2025-02-25-ucsb-ml I need to incorporate machine learning processes into my research analysis. I am hoping that this workshop will serve as a good introduction.
2025-02-25-ucsb-ml I’ve never actually implemented any ML and would like to know how to do that
2025-02-25-ucsb-ml fundamentals of machine learning in python
2025-02-25-ucsb-ml python
2025-02-25-ucsb-ml Efficient ways to train, fine-tune, and run models
2025-02-25-ucsb-ml use satellite images to train a model. Also, use this workshop as a gateway for my future projects.

Learning environment in the workshop

Code
orderedq <- c("Strongly Disagree", "Somewhat Disagree", "Neither Agree or Disagree","Somewhat Agree", "Strongly Agree")
addNA(orderedq)
Code
agree_questions <- results %>% 
  select(join_key, agree_apply.post,    agree_comfortable.post, agree_clearanswers.post,
         agree_instr_enthusiasm.post, agree_instr_interaction.post, agree_instr_knowledge.post
) %>% 
  filter(!if_all(-join_key, is.na))

n_agree_questions <- nrow(agree_questions)
  
agree_questions <- agree_questions %>%
  pivot_longer(cols = -join_key, names_to = "Question", values_to = "Response") %>% 
  mutate(Response = factor(Response, levels = orderedq),
         Question = recode(Question,
                     "agree_apply.post" = "Can immediatly apply 
 what they learned",
                     "agree_comfortable.post" = "Comfortable learning in 
 the workshop environment",
                     "agree_clearanswers.post" = "Got clear answers 
 from instructors",
                     "agree_instr_enthusiasm.post" = "Instructors were enthusiastic",
                     "agree_instr_interaction.post" = "Comfortable interacting 
 with instructors",
                     "agree_instr_knowledge.post" = "Instructors were knowledgeable 
 about the material"
      ))

summary_data <- agree_questions %>%
  count(Question, Response, name = "count") %>% 
  mutate(percent = (count / n_agree_questions) * 100,
         text = sprintf("%.0f (%.0f%%)", count, percent))

ggplot(summary_data, aes(x = Question, y = count, fill = Response)) +
  geom_col(position = "fill", color = "black", show.legend = TRUE) +
  scale_y_continuous(labels = scales::percent_format()) + 
  scale_fill_manual(values = c("Strongly Disagree" = "#d01c8b", 
                               "Somewhat Disagree" = "#f1b6da", 
                               "Neither Agree or Disagree" = "#f7f7f7", 
                               "Somewhat Agree" = "#b8e186", 
                               "Strongly Agree" = "#4dac26"), 
                    na.translate = TRUE, na.value = "#cccccc", 
                    breaks = orderedq, drop = FALSE) +
  geom_text(aes(label = text), size = 3,
             position = position_fill(vjust = 0.5)) +
  labs(y = "# respondents (Percentage)", x = element_blank(), fill = "Responses",
       subtitle = paste0("Number of responses: ", n_agree_questions)) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1),
        plot.subtitle = element_text(hjust = 0.5, size = 12))

How an instructor or helper affected your learning experience

Code
results %>% 
  group_by(workshop) %>% 
  select(workshop, instructor_example.post) %>%
  drop_na()
workshop instructor_example.post
2025-02-25-ucsb-ml They were really friendly and enthusiastic.
2025-02-25-ucsb-ml i asked one question and they confirmed my thoughts
2025-02-25-ucsb-ml I wasn’t affraid to let instructors know if I was stuck on a step. Some of the instructors who weren’t directly presenting were still able to provide helpful input on the potential applications of workshop materials to additional fields of research.
2025-02-25-ucsb-ml One of the instructors provided a clear and concise explanation of a complex machine learning concept by breaking it down into smaller steps. For example, when covering decision trees, they used a real-world analogy related to everyday decision-making, which made it much easier to understand. Additionally, a helper guided me through debugging a coding error, ensuring I grasped the logic behind the solution rather than just fixing the issue. Their support significantly enhanced my learning experience.

Skills and perception comparison

Code
# Calculate mean scores and make graph for all respondents (only_matched=FALSE)
tryCatch(
  {
mean_nresp <- get_mean_scores_nresp(results, only_matched=FALSE)
graph_pre_post(mean_nresp$mean_scores, mean_nresp$n_resp_pre, mean_nresp$n_resp_post, mean_nresp$n_resp_pre_post, only_matched=FALSE)
},
error = function(cond) {
message("Could not do the plots as there are no pre or post results to show")
}
)

Code
# Calculate mean scores and make graph for only matched respondents in pre and post (only_matched=TRUE)
tryCatch(
  {
mean_nresp <- get_mean_scores_nresp(results, only_matched=TRUE)
graph_pre_post(mean_nresp$mean_scores, mean_nresp$n_resp_pre, mean_nresp$n_resp_post, mean_nresp$n_resp_pre_post, only_matched=TRUE)
},
error = function(cond) {
message("Could not do the plots as there are no pre or post results to show")
}
)

Workshop Strengths

Code
results %>% 
  group_by(workshop) %>% 
  select(workshop, workshop_strengths.post) %>% 
  drop_na()
workshop workshop_strengths.post
2025-02-25-ucsb-ml The instructors take the time to manually write the code and explain it line by line.
2025-02-25-ucsb-ml The hands-on learning was useful
2025-02-25-ucsb-ml opening picture of what ML is and setup for environment and hand holding through typing
2025-02-25-ucsb-ml Good continuation of the intro to data management in Python workshop. Gave a general/basic overview of machine learning. Kept things simple to facilitate a broad audience with varying experience in related topics.
2025-02-25-ucsb-ml Well-Structured Content – The workshop followed a clear and logical progression, making it easy to build upon foundational concepts.; Engaging and Supportive Instructors – The instructors and helpers were knowledgeable, patient, and responsive to questions.; Hands-On Learning Approach – Practical coding exercises reinforced key machine learning concepts, allowing participants to apply what they learned immediately.; Accessible and Well-Prepared Materials – The provided resources, including notebooks and example datasets, were well-organized and easy to follow.; Encouraging Environment – The collaborative and inclusive atmosphere fostered engagement and active participation.

Ways to improve the workshop

Code
results %>% 
  group_by(workshop) %>% 
  select(workshop, workshop_improved.post) %>% 
  drop_na()
workshop workshop_improved.post
2025-02-25-ucsb-ml The material itself could be improved. It would be helpful to go through a real life example from beginning to end without over simplifying the problem.
2025-02-25-ucsb-ml I wish there was more about using ML for things other than handling large data sets. For example, as an engineer, I’m most interested in ML for design optimization. I know there’s lots of different implementations of this out there, so a review of the strengths and weaknesses of different ML paradigms would be useful
2025-02-25-ucsb-ml pacing felt weird? didn’t learn that much conceptual stuff or when we did it was very slow? Then typing I guess is not slow it’s fine, but sometimes the way we talked about the typing was slow, or rather inefficient/not fluid teaching wise. Like somehow more awkward than it should have been?
2025-02-25-ucsb-ml I would have like to dive a little deeper into additional examples of machine learning. Perhaps using an additional dataset, or at least exploring the use of multiple predictor values rather than only the appache score. Some more basic code was overexplained, while the arguments of more advanced methods/functions related to the sci-kit library were kind of glossed over/rushed. Less time could be spent answering questions/comments from participants that weren’t really in the scope of what we’re learning. EX: spending 5-10 minutes to talk about whether certain predictor variables in the dataset were statistically sound to include because they are correlated with/calculated based on other predictor variables (we didn’t even end up using the variable of question and that participant didn’t even attend the second day).
2025-02-25-ucsb-ml 1. Pacing Adjustments – Some sections felt a bit fast-paced, especially for beginners. Providing additional time for complex topics could enhance understanding.; 2. More Real-World Case Studies – Including more practical, real-world examples of machine learning applications would help connect concepts to industry use cases.; 3. Pre-Workshop Preparation Materials – Offering optional pre-workshop readings or short tutorials could help participants with varying backgrounds start on the same level.; 4. More Breaks – Shorter but more frequent breaks could improve focus and prevent fatigue, especially during intensive coding sessions.; 5. Advanced Follow-Up Sessions – A follow-up session or additional resources for those who want to go beyond the basics would be beneficial.

How likely are you to recommend this workshop? Scale 0 - 10

Code
orderedq <- c("Detractor", "Passive", "Promoter")

nps <- results %>% 
  count(recommend_group.post, recommende_score.post, name = "count") %>% 
  drop_na() %>% 
  mutate(recommend_group.post = factor(recommend_group.post, levels = orderedq),
         percent = (count/sum(count)) * 100,
         text = sprintf("%.0f (%.0f%%)", count, percent))

nps %>% 
ggplot(aes(x=recommende_score.post, y=count, fill=recommend_group.post)) +
  geom_col(color="black", show.legend = TRUE) +
  scale_fill_manual(values = c("Detractor" = "#af8dc3", "Passive" = "#f7f7f7", "Promoter" = "#7fbf7b"), breaks = c("Detractor", "Passive", "Promoter"), drop = FALSE) +
  geom_label(aes(label = text, vjust = -0.5), fill = "white", size= 3) +
  scale_x_continuous(breaks = 1:10) +
  labs(x = "NPS Score", y = "# respondents", subtitle = paste0("Number of responses: ", sum(nps$count), "
 Mean score: ", format(weighted.mean(nps$recommende_score.post, nps$count), digits = 3))) +
  theme_minimal() +
  theme(
    panel.grid.minor = element_blank(),
    panel.grid.major.x = element_blank(),
    plot.subtitle = element_text(hjust = 0.5, size = 12)
  ) +
  expand_limits(x = c(1,10),
                y = c(0, max(nps$count)*1.1))

Topic Suggestions

Code
results %>% 
  group_by(workshop) %>% 
  select(workshop, suggest_topics.post) %>% 
  drop_na()
workshop suggest_topics.post
2025-02-25-ucsb-ml neural networks
2025-02-25-ucsb-ml Hyperspectral data processing and related machine learning would be awesome!
2025-02-25-ucsb-ml 1. Advanced Machine Learning Techniques – A deeper dive into topics like deep learning, neural networks, or ensemble methods.; 2. Data Preprocessing and Feature Engineering – Best practices for handling missing data, scaling, encoding, and selecting important features.; 3. Explainable AI and Model Interpretability – Understanding how machine learning models make decisions using SHAP, LIME, and other interpretability techniques.; 4. Time Series Analysis with Machine Learning – Practical applications for forecasting and analyzing trends in time-dependent data.; 5. Reinforcement Learning Basics – An introduction to reinforcement learning concepts with hands-on coding exercises.; 6. Machine Learning for Environmental and Climate Science – Applying ML techniques to real-world problems related to sustainability, water resources, and climate change.; 7. Automating Machine Learning with AutoML – Exploring tools and techniques for automating model selection, hyperparameter tuning, and feature engineering.