Overview
During the three-week recruitment period, I supported our chapter by analyzing member votes and matching potential new members to ensure the best fit. This project required balancing detailed data analysis with leadership responsibilities, including managing a recruitment team and coordinating with a chapter of over 100 members. Our goal was to make strategic, data-informed decisions that would strengthen the chapter's future.
My role
I collected, cleaned, and analyzed recruitment data to standardize votes across members, ensuring fair evaluation of all candidates. I developed an R script to handle vote standardization and ranking - never done for our chapter before - identifying patterns of consistently high or low voting. Beyond data analysis, I led a recruitment team and managed communication with the full chapter and advisors, fostering respect, confidence, and comfort in a high-stakes environment.
Methodology: standardizing votes with z-scores
Raw vote totals are misleading in a recruitment context - some members rate almost everyone a 9 or 10, while others are more discerning and reserve high scores for standouts. To make every member's vote comparable, I wrote an R script that re-centers each voter's scores around their own personal average and scales them by their own personal spread (a z-score). A member who consistently scores high gets pulled toward neutral, since a high score is normal for them, while a rare high score from a more critical voter carries much more weight, since it stands out against their usual pattern.
# compute global mean and SD as a fallback for single-vote authors
global_avg <- mean(df$Value, na.rm = TRUE)
global_sd <- sd(df$Value, na.rm = TRUE)
df_standardized <- df %>%
# each voter's personal average, spread, and vote count
group_by(Author) %>%
mutate(
author_avg = mean(Value, na.rm = TRUE),
author_sd = sd(Value, na.rm = TRUE),
author_votes = n()
) %>%
ungroup() %>%
# standardize against personal stats, falling back to the whole
# chapter's average/spread for single-vote or zero-spread voters
mutate(
use_avg = ifelse(author_votes > 1 & author_sd > 0, author_avg, global_avg),
use_sd = ifelse(author_votes > 1 & author_sd > 0, author_sd, global_sd),
standardized_value = (Value - use_avg) / use_sd
) %>%
# each PNM's final score is the average of everyone's standardized votes
group_by(PNM.First.Name, PNM.Last.Name) %>%
mutate(
num_votes = n(),
avg_standardized_score = mean(standardized_value, na.rm = TRUE)
) %>%
ungroup() %>%
arrange(PNM.ID)Core standardization logic from StandardizeScores.Rmd - full script linked below.
The script also chains scores across multiple recruitment rounds (open invite, philanthropy, sisterhood, preference) into a single running file, labeling each round's scores separately so nothing gets overwritten as the chapter moves through the recruitment period.
Skills demonstrated
Data Cleaning R Programming Statistical Standardization Leadership Strategic Decision Making