Summer 2024 Python 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("2024-07-09-ucsb-python")

results <- read_csv("data-joined/all_workshops.csv") %>% 
  filter(workshop %in% workshops)

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

33

Both pre- and post-

11

Only pre-workshop

21

Only post-workshop

1

Departments

Code
depts <- results %>% select(dept_select.pre) %>% 
  separate_rows(dept_select.pre, sep=",") %>% 
  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=",") %>% 
  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=",")  %>% 
  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=",")  %>% 
  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
2024-07-09-ucsb-python I’d like to get familiar with Python so that I can understand how to use it to do Retrieval-Augmented Generation with AI for some research that I’m doing.
2024-07-09-ucsb-python I hope to learn enough coding so that I can confidently apply it to my work and research. Key word: confidently apply. I don’t want to fear screwing up my work / not trusting my results because I don’t understand what the code is doing behind the scenes.
2024-07-09-ucsb-python I’d like to make the switch from primarily analyzing data in R to primarily analyzing data in python and other “industry standard” languages
2024-07-09-ucsb-python I would like to become familiar with computational skills and how to use Jupyter notebook.
2024-07-09-ucsb-python I hope to feel comfortable coding in the future
2024-07-09-ucsb-python A general understanding of the python language so I may manipulate some existing codes or scripts in our database’s API.
2024-07-09-ucsb-python The basics of how to code in python
2024-07-09-ucsb-python Python and a better understanding on the best preactices and methods to work with AI
2024-07-09-ucsb-python Getting started in python. I am worried about frying my computer for some reason.
2024-07-09-ucsb-python open
2024-07-09-ucsb-python Holistic framework for writing and interpreting Python code! I can write Python when I know exactly what I need to accomplish, but I could use a refresher for my overall comprehension and problem-solving
2024-07-09-ucsb-python How to generate diverse plots from the workshop
2024-07-09-ucsb-python Basics of data representation
2024-07-09-ucsb-python Some python basic
2024-07-09-ucsb-python More comfort using the python environment
2024-07-09-ucsb-python Financial Modeling
2024-07-09-ucsb-python basic skills in python
2024-07-09-ucsb-python Reinforce the basics and start using the tools more in my daily work
2024-07-09-ucsb-python basic understanding of the programming language
2024-07-09-ucsb-python I don’t work with data at all for my research, but many industry jobs are looking for candidates who can work with data.
2024-07-09-ucsb-python how to apply these tools to future research
2024-07-09-ucsb-python learn more about how python can be used in data analysis or to process data for analysis
2024-07-09-ucsb-python Skills used in bioinformatics

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
2024-07-09-ucsb-python They’re SUPER patient and friendly. I really appreciated that a lot.
2024-07-09-ucsb-python They were quick to help when needed and troubleshoot; nobody was left behind.
2024-07-09-ucsb-python They always answered my questions and answered them well! Additionally, they went above and beyond by showing me how to implement best practices and other coding tips for python outside of the lesson material.
2024-07-09-ucsb-python convenient method to request help without interrupting the workshop
2024-07-09-ucsb-python They answered all my questions in detail and helped me overcome the technical difficulties I encountered throughout the workshop with patience and nice attitude
2024-07-09-ucsb-python They answered all my questions in detail and helped me overcome the technical difficulties I encountered throughout the workshop with patience and nice attitude
2024-07-09-ucsb-python Maybe we are too many students a few helpers?

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
2024-07-09-ucsb-python The people were patient and weren’t condescending. They respected the questions that were asked
2024-07-09-ucsb-python Good accessibility / free workshop
2024-07-09-ucsb-python I liked being challenged to learn on my own at some points
2024-07-09-ucsb-python Multiple instructors; this allowed “floaters” to help those struggling rather than the whole class getting caught up.
2024-07-09-ucsb-python Great workshop for beginners. Instructors were very helpful and attentive when students needed help. I took this course because I wanted to learn how to do a specific task in python that was outside of the scope of this class, but the instructors provided a good foundation for me to start the project on my own.
2024-07-09-ucsb-python I think the tutorials were a major strength of the workshop
2024-07-09-ucsb-python screens on every desk so everyone can follow along
2024-07-09-ucsb-python It is general, so people of any discipline can participate and learn.; It starts with the basics and builds up.
2024-07-09-ucsb-python It is general, so people of any discipline can participate and learn.; It starts with the basics and builds up.
2024-07-09-ucsb-python Frequency and access

Ways to improve the workshop

Code
results %>% 
  group_by(workshop) %>% 
  select(workshop, workshop_improved.post) %>% 
  drop_na()
workshop workshop_improved.post
2024-07-09-ucsb-python This class should’ve been called “Python for Amateurs” …not beginners. There were a few times where the instructors broke down the code, explaining what each piece did and that was AWESOME! I wish the whole class would’ve been like that. But most of the time, it was like just watching somebody code. I had no idea why they were typing the things they were typing. I felt like a monkey, just typing whatever the instructors typed with 0% understanding of why I was typing it.
2024-07-09-ucsb-python I wish there had been a little more challenges in class. Or, it might be a good idea to assign a challenge as homework.
2024-07-09-ucsb-python It was unclear where to find the reading materials and learning module and that we are expected to keep up with those materials. There was no following along between the in-class learning and what was in the reading materials on the site because it was never referenced (we’re now on page ‘blah’).
2024-07-09-ucsb-python At times it was difficult to follow and I wasn’t always sure how I could apply what I learned to my work after the workshop. Or why we were learning the particular things we were working on in the course. ; ; ; Since this course is a “data analysis and visualization” class I think it would be best to have the workshop follow a small project. Get some datasets where the population is people instead of animals. And, work together to answer a very simple but specific research question throughout the course and generate some graphs at the end.
2024-07-09-ucsb-python I think less time reviewing the previous weeks material would improve the workshop
2024-07-09-ucsb-python slower at some points
2024-07-09-ucsb-python We lost time in all sessions because people were lost on where they had organized their files, so maybe thinking of a more general and accessible way to managing folders and files can be useful
2024-07-09-ucsb-python We lost time in all sessions because people were lost on where they had organized their files, so maybe thinking of a more general and accessible way to managing folders and files can be useful
2024-07-09-ucsb-python Maybe applied into a single project so there’s one thread of logic (instead of broken up into chunks). But thats how I feel, may not be possible.

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
2024-07-09-ucsb-python Computational works with genomics
2024-07-09-ucsb-python Data Analysis for social scientists in python. I think it would be cool to use the Current Population Survey from IPUMS.
2024-07-09-ucsb-python A workshop covering R would be nice
2024-07-09-ucsb-python R studio
2024-07-09-ucsb-python Big data wrangling and using python to process by chuncks or in multiple servers
2024-07-09-ucsb-python Big data wrangling and using python to process by chuncks or in multiple servers
2024-07-09-ucsb-python Build applications