Summer 2022 Bash 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("2022-07-12-ucsb-bash")

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

34

Both pre- and post-

11

Only pre-workshop

20

Only post-workshop

3

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
2022-07-12-ucsb-bash To learn how to use Python/R to manage data
2022-07-12-ucsb-bash Foundation and basic knowledge of Shell and Bash
2022-07-12-ucsb-bash shell code for folder organization
2022-07-12-ucsb-bash Basics of R that I can use for statistical data analysis projects
2022-07-12-ucsb-bash A new skill to automate workflow
2022-07-12-ucsb-bash I hope to learn new skills that will serve me well in the workplace and in school
2022-07-12-ucsb-bash new skills
2022-07-12-ucsb-bash Basic shell commands
2022-07-12-ucsb-bash continued programming practice and exposure
2022-07-12-ucsb-bash I suck at bash! I want to get better.
2022-07-12-ucsb-bash I want to diversify my use of R in my research and even utilize it in my literature database and other database management. I would also like to improve my use of for loops in data manipulation and accessing. Additionally, I would like to be comfortable and versatile with the use of the terminal in programming.
2022-07-12-ucsb-bash A more thorough understanding of the bash/shell interface and a more formal training in using the command line interface
2022-07-12-ucsb-bash Handling Shell scripting
2022-07-12-ucsb-bash Frequently used commands and also frequently used options
2022-07-12-ucsb-bash Im hoping to become more familiar with shell scripting and command line so that I can work more efficiently on my research.
2022-07-12-ucsb-bash Basic but essential knowledge and skills for beginners
2022-07-12-ucsb-bash To get comfortable with using and navigating in the command line to improve the reproducibility of my workflow. More comfortable to use command line tools so I can start learning about remote & scalable computing.
2022-07-12-ucsb-bash data analysis
2022-07-12-ucsb-bash Gain crucial skills for industry careers

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
2022-07-12-ucsb-bash Helpers are always able to resolve our difficulties very quickly. Thats quite important cuz we were moving very fast, and instructors wouldn’t stop the whole lecture for an individual. Luckily I didn’t fall behind every time I ask for personal help.
2022-07-12-ucsb-bash the instructors coming over when we held up a red sticky to help us individually
2022-07-12-ucsb-bash Nice clear explanations of the basic commands
2022-07-12-ucsb-bash I think the workshop did a good job in the online accommodation (probably the best experience I have)! It provides a lot of benefit to the people who cannot attend in person (I am having a baby due next week!)
2022-07-12-ucsb-bash The instructors went through step by step how to solve some of the more difficult challenges, which I found pretty helpful.
2022-07-12-ucsb-bash following live code example is helpful.
2022-07-12-ucsb-bash great answers
2022-07-12-ucsb-bash Pulled into a breakout room to solve a problem. We worked through chat which was a bit difficult verses audio

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
2022-07-12-ucsb-bash .
2022-07-12-ucsb-bash many instructors available to answer questions in the zoom chat and in person
2022-07-12-ucsb-bash Easy to implement, good example data sets
2022-07-12-ucsb-bash The content of the material covered
2022-07-12-ucsb-bash The collaborative notebook was very helpful for keeping track of what was going on.
2022-07-12-ucsb-bash Logic and clear.
2022-07-12-ucsb-bash Basic Navigation through shell, and some common command line uses
2022-07-12-ucsb-bash webpage is helpful.
2022-07-12-ucsb-bash examples and exercises
2022-07-12-ucsb-bash almost immediate responses from the staff

Ways to improve the workshop

Code
results %>% 
  group_by(workshop) %>% 
  select(workshop, workshop_improved.post) %>% 
  drop_na()
workshop workshop_improved.post
2022-07-12-ucsb-bash Ventilation? It’s kinda hot and stuffy inside the room.
2022-07-12-ucsb-bash making sure that they are familiar with the lesson and exactly what they are going to show and that there aren’t any issues before they lead the lesson. When the instructors got confused or made mistakes and had to try to fix them, it made learning already confusing things even more confusing because I was lost on what was a mistake and what was correct. In general, I believe it went a little too fast for me
2022-07-12-ucsb-bash Not jumping around directories quickly
2022-07-12-ucsb-bash Better coordination between instructors if other instructors need to interrupt the instructor currently teaching to better explain a point or answer a question
2022-07-12-ucsb-bash Clearer syllabus and more exercises
2022-07-12-ucsb-bash Break time can come a little soon.
2022-07-12-ucsb-bash grep gets a little complicated with escape characters, I think those could be added to the workshop
2022-07-12-ucsb-bash none
2022-07-12-ucsb-bash sharing instructors use for bash-shell and participants briefly sharing relevance to their own work (I mostly work in rstudio on datasets, or morphing datasets into better datasets, I rarely work with tons of files…)
2022-07-12-ucsb-bash I found it particularly difficult to follow along in this hybrid course. Perhaps the workbook and course flow should be reorganized. Or having a cheatsheet available of commands we have learned so far so participants don’t have to scroll through the workbook endlessly when trying to solve a challenge. I think a fully online course would work much better (since I can’t attend in person, but grateful to have access to these courses working remotely, so I’ll take whatever you can swing!). One of the instructors shell was color coded, which was sooo much easier to follow along even though its not what my own shell looks like. Maybe multiple shell windows up at the same time so when working in nano the previous commands are still available for those who are a step or two behind. I think it would be great to emphasize somewhere in the course why command line is still important when working on modern computers. Looking forward to the next course, thanks!

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
2022-07-12-ucsb-bash .
2022-07-12-ucsb-bash C++
2022-07-12-ucsb-bash chatter from instructors helping other in-person participants during the workshop can sound quite loud to online participants, affecting concentration of online participants on the instructor teaching
2022-07-12-ucsb-bash Possibly some more advanced topics on constructing shell scripts that allow for user input. I am also hoping to see a QGIS workshop in the future.
2022-07-12-ucsb-bash python basics
2022-07-12-ucsb-bash continuation of bash things
2022-07-12-ucsb-bash using the command line to write scripts that run & incorporate multiple scripts and languages (python, R, SQL). Intro to Cloud computing?