The NASA Pathways Program is a structured internship and employment initiative designed to provide students and recent graduates with opportunities to work at NASA. It aims to develop the next generation of scientists, engineers, and professionals by offering hands-on experience in various fields related to space exploration and aeronautics.
The data used in this analysis was obtained through a Freedom of Information Act (FOIA) request submitted on December 16, 2024, to the NASA Pathways Program office. This request aimed to collect demographic information about program participants to better understand diversity and inclusion within NASA’s workforce. NASA responded to the request on 02/05/24 and provided a dataset that covers the years 2021 to 2024, a period before President Donald Trump’s executive order that sought to eliminate Diversity, Equity, and Inclusion initiatives in federal agencies. It includes information on applicants and hires, broken down by race and gender, as well as data on the high schools attended by hired applicants.
State the purpose of your analysis: What questions are you trying to answer? (e.g., demographics, trends, program effectiveness, diversity)
The purpose of the analysis is to explore the demographic composition of the NASA Pathways Program participants, identify trends in participation over time, and assess the program’s effectiveness in promoting diversity and inclusion.
Key questions include:
Briefly mention the relevance or potential impact of your findings.
The dataset includes:
Variables include fiscal year, demographic categories (race, gender), applicant/hire totals, and institutional status.
Data cleaning steps included:
Initial observations:
The analysis follows this workflow:
Visualizations include:
# Load necessary libraries
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.5
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ ggplot2 3.5.1 ✔ tibble 3.2.1
## ✔ lubridate 1.9.3 ✔ tidyr 1.3.1
## ✔ purrr 1.0.4
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(readxl)
library(rio)
library(janitor)
##
## Attaching package: 'janitor'
##
## The following objects are masked from 'package:stats':
##
## chisq.test, fisher.test
library(ggplot2)
library(scales)
##
## Attaching package: 'scales'
##
## The following object is masked from 'package:purrr':
##
## discard
##
## The following object is masked from 'package:readr':
##
## col_factor
library(googlesheets4)
# Load the dataset
# URL or Sheet ID of your Google Sheet
sheet_url <- "https://docs.google.com/spreadsheets/d/1Q6PkpHHbxN6xLqDUhYBhohQUFN4JI1Ms_3-5cKhbxsE/edit?gid=0#gid=0"
# Get all sheet/tab names
sheet_info <- gs4_get(sheet_url)
## ! Using an auto-discovered, cached token.
## To suppress this message, modify your code or options to clearly consent to
## the use of a cached token.
## See gargle's "Non-interactive auth" vignette for more details:
## <https://gargle.r-lib.org/articles/non-interactive-auth.html>
## ℹ The googlesheets4 package is using a cached token for
## 'tiasia.tcms@gmail.com'.
# Extract sheet names
sheet_names <- sheet_info$sheets$name
print(sheet_names)
## [1] "Applicants by Race" "Applicants Group by Gender"
## [3] "Hired Group by Gender" "MSI versus Non-MSI Schools"
## [5] "MSI-Type" "Hired Group by Race "
## [7] "Applicant Group by Fiscal Year"
all_sheets <- lapply(sheet_names, function(sheet) {
read_sheet(sheet_url, sheet = sheet)
})
## ✔ Reading from "NASA Pathway Program Data ".
## ✔ Range ''Applicants by Race''.
## ✔ Reading from "NASA Pathway Program Data ".
## ✔ Range ''Applicants Group by Gender''.
## ✔ Reading from "NASA Pathway Program Data ".
## ✔ Range ''Hired Group by Gender''.
## ✔ Reading from "NASA Pathway Program Data ".
## ✔ Range ''MSI versus Non-MSI Schools''.
## ✔ Reading from "NASA Pathway Program Data ".
## ✔ Range ''MSI-Type''.
## ✔ Reading from "NASA Pathway Program Data ".
## ✔ Range ''Hired Group by Race ''.
## ✔ Reading from "NASA Pathway Program Data ".
## ✔ Range ''Applicant Group by Fiscal Year''.
# Name the list elements by sheet/tab names
names(all_sheets) <- sheet_names
# Suppose these are your sheet names
names(all_sheets)
## [1] "Applicants by Race" "Applicants Group by Gender"
## [3] "Hired Group by Gender" "MSI versus Non-MSI Schools"
## [5] "MSI-Type" "Hired Group by Race "
## [7] "Applicant Group by Fiscal Year"
# Assign each to its own variable
applicants_race <- all_sheets[["Applicants by Race"]]
applicants_gender <- all_sheets[["Applicants Group by Gender"]]
hired_gender <- all_sheets[["Hired Group by Gender"]]
hired_race <- all_sheets[["Hired Group by Race "]]
msi_non_msi <-all_sheets[["MSI versus Non-MSI Schools"]]
msi_type <-all_sheets [["MSI-Type"]]
summary(applicants_gender)
## Fiscal Year (FY).Length Fiscal Year (FY).Class Fiscal Year (FY).Mode
## 1 -none- numeric
## 1 -none- numeric
## 1 -none- numeric
## 1 -none- numeric
## 1 -none- numeric
## 1 -none- numeric
## 1 -none- numeric
## 1 -none- numeric
## 1 -none- numeric
## 1 -none- numeric
## 1 -none- numeric
## 1 -none- numeric
## 1 -none- numeric
## 1 -none- numeric
## 1 -none- numeric
## 1 -none- numeric
## 1 -none- character
## Applicant Group Total Applicants
## Length:17 Min. : 601
## Class :character 1st Qu.: 3865
## Mode :character Median : 5806
## Mean :10774
## 3rd Qu.:11195
## Max. :61050
##
##
##
##
##
##
##
##
##
##
##
summary(applicants_race)
## Fiscal Year Race Applicants Hired
## Min. :2021 Length:29 Min. : 12 Min. : 0.00
## 1st Qu.:2022 Class :character 1st Qu.: 76 1st Qu.: 1.00
## Median :2022 Mode :character Median : 1129 Median : 13.00
## Mean :2022 Mean : 2951 Mean : 44.28
## 3rd Qu.:2023 3rd Qu.: 2347 3rd Qu.: 35.00
## Max. :2024 Max. :42791 Max. :642.00
## NA's :1
summary(hired_gender)
## Fiscal Year (FY).Length Fiscal Year (FY).Class Fiscal Year (FY).Mode
## 1 -none- character
## 1 -none- numeric
## 1 -none- numeric
## 1 -none- numeric
## 1 -none- character
## 1 -none- numeric
## 1 -none- numeric
## 1 -none- numeric
## 1 -none- character
## 1 -none- numeric
## 1 -none- numeric
## 1 -none- numeric
## 1 -none- character
## 1 -none- numeric
## 1 -none- numeric
## 1 -none- numeric
## 1 -none- character
## Group Hires Total
## Length:17 Min. : 11.0
## Class :character 1st Qu.: 57.0
## Mode :character Median : 93.0
## Mean :148.1
## 3rd Qu.:127.0
## Max. :839.0
##
##
##
##
##
##
##
##
##
##
##
summary(hired_race)
## Fiscal Year (FY) Group Hires
## Min. :2021 Length:29 Min. : 0.00
## 1st Qu.:2022 Class :character 1st Qu.: 1.00
## Median :2022 Mode :character Median : 13.00
## Mean :2022 Mean : 44.34
## 3rd Qu.:2023 3rd Qu.: 35.00
## Max. :2024 Max. :643.00
## NA's :1
summary(msi_non_msi)
## Fiscal Year MSI NON-MSI Total
## Length:7 Min. : 21.0 Min. : 58.0 Min. : 79.0
## Class :character 1st Qu.: 38.0 1st Qu.: 96.0 1st Qu.:139.0
## Mode :character Median : 49.0 Median :101.0 Median :145.0
## Mean : 62.8 Mean :144.4 Mean :207.2
## 3rd Qu.: 49.0 3rd Qu.:106.0 3rd Qu.:155.0
## Max. :157.0 Max. :361.0 Max. :518.0
## NA's :2 NA's :2 NA's :2
applicants_gender_filtered <- applicants_gender |>
clean_names() |>
mutate(
fiscal_year = as.numeric(unlist(fiscal_year_fy)))
## Warning: There was 1 warning in `mutate()`.
## ℹ In argument: `fiscal_year = as.numeric(unlist(fiscal_year_fy))`.
## Caused by warning:
## ! NAs introduced by coercion
applicants_gender_filtered <- applicants_gender_filtered |>
filter(applicant_group %in% c("Male", "Female"))
# Plot Male vs Female over years
ggplot(applicants_gender_filtered, aes(x = fiscal_year, y = total_applicants, color = applicant_group)) +
geom_line(size = 1.2) +
geom_point(size = 3) +
labs(title = "Applicants by Gender Over Time",
x = "Fiscal Year",
y = "Number of Applicants",
color = "Gender",
caption = "Source: NASA Pathways Program Data | Analysis by Tiasia Saunders",
)
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
applicants_race <- applicants_race |>
clean_names()
ggplot(applicants_race, aes(x = fiscal_year, y = applicants, color = race)) +
geom_line(size = 1.2) +
geom_point(size = 3) +
scale_color_manual(
values = c(
"2 or More Races" = "#D62728",
"American Indian or Alaska Native" = "#9467BD",
"Asian" = "#1F77B4",
"Black or African American" = "#FF7F0E",
"Hispanic or Latino" = "#2CA02C",
"Native Hawaiian or Other Pacific Islander" = "#8C564B",
"White" = "#17BECF"
)
) +
labs(title = "Applicants by Race Over Time",
x = "Fiscal Year",
y = "Number of Applicants",
color = "Gender",
caption = "Source: NASA Pathways Program Data | Analysis by Tiasia Saunders",
) +
coord_cartesian(ylim = c(0, 10000))
## Warning: Removed 1 row containing missing values or values outside the scale range
## (`geom_line()`).
## Warning: Removed 1 row containing missing values or values outside the scale range
## (`geom_point()`).
hired_gender <- hired_gender |>
clean_names() |>
mutate(
fiscal_year = as.numeric(unlist(fiscal_year_fy)))
## Warning: There was 1 warning in `mutate()`.
## ℹ In argument: `fiscal_year = as.numeric(unlist(fiscal_year_fy))`.
## Caused by warning:
## ! NAs introduced by coercion
hired_gender_filtered <- hired_gender |>
filter(group %in% c("Male", "Female"))
# Plot Male vs Female over years
ggplot(hired_gender_filtered, aes(x = fiscal_year, y = hires_total, color = group)) +
geom_line(size = 1.2) +
geom_point(size = 3) +
labs(title = " Hired Applicants by Gender Over Time",
x = "Fiscal Year",
y = "Number of Applicants",
color = "Gender",
caption = "Source: NASA Pathways Program Data | Analysis by Tiasia Saunders",
)
hired_race <- hired_race |>
clean_names()
ggplot(hired_race, aes(x = fiscal_year_fy, y = hires, color = group)) +
geom_line(size = 1.2) +
geom_point(size = 3) +
labs(title = "Hired Applicants by Race Over Time",
x = "Fiscal Year",
y = "Number of Applicants",
color = "Gender",
caption = "Source: NASA Pathways Program Data | Analysis by Tiasia Saunders",
) +
coord_cartesian(ylim = c(0, 300))
## Warning: Removed 1 row containing missing values or values outside the scale range
## (`geom_line()`).
## Warning: Removed 1 row containing missing values or values outside the scale range
## (`geom_point()`).
msi_non_msi <- msi_non_msi |>
clean_names() |>
pivot_longer(cols = c(msi, non_msi),
names_to = "msi_status",
values_to = "total_applicants")
ggplot(msi_non_msi, aes(x = fiscal_year, y = total_applicants, fill = msi_status)) +
geom_bar(stat = "identity", position = "dodge") +
scale_fill_manual(values = c("msi" = "lightblue", "non_msi" = "lavender")) +
labs(title = "Applicants from MSI vs Non-MSI Schools Over Time",
x = "Fiscal Year",
y = "Number of Applicants",
fill = "MSI Status",
caption = "Source: NASA Pathways Program Data | Analysis by Tiasia Saunders",
)
## Warning: Removed 4 rows containing missing values or values outside the scale range
## (`geom_bar()`).
** HSI: Hispanic-Serving Institution **
** AANAPISI: Asian American and Native American Pacific Islander-Serving
Institution **
** HBCU: Historically Black Colleges and Universities **
** PBI: Predominantly Black Institution **
msi_type <- msi_type |>
clean_names()
# Example data frame
msi_data <- tibble(
MSI_Type = c("HSI", "HSI, AANAPISI", "AANAPISI", "HBCU", "PBI"),
Percentage = c("28.0%", "43.3%", "21.7%", "6.4%", "0.64%")
)
# Remove % sign and convert to numeric
msi_data <- msi_data %>%
mutate(
Percentage_num = as.numeric(gsub("%", "", Percentage))
)
# Calculate positions for labels
msi_data <- msi_data %>%
arrange(desc(MSI_Type)) %>%
mutate(
ypos = cumsum(Percentage_num) - 0.5 * Percentage_num
)
# Plot pie chart
ggplot(msi_data, aes(x = "", y = Percentage_num, fill = MSI_Type)) +
geom_col(width = 1, color = "white") +
coord_polar(theta = "y") +
geom_text(aes(y = ypos,
label = paste0(MSI_Type, "\n", round(Percentage_num, 2), "%")),
color = "white", size = 3, lineheight = 0.9) +
labs(
title = "Applicant Percentage by MSI Type",
fill = "MSI Type",
caption = "Source: NASA Pathways Program Data | Analysis by Your Name"
) +
theme_void() +
theme(
legend.position = "right",
plot.title = element_text(hjust = 0.5)
)
The NASA Pathways Program has made strides toward inclusivity, but gaps remain in racial and gender representation. By identifying where disparities exist—especially in MSI engagement and racial equity—NASA can take targeted steps to ensure a more representative workforce that reflects the diverse talent pool across the nation.
The Unsurprising Lack of DEIA in NASA’s Pathways Program Hiring Patterns
FOIA Request to NASA Pathways Program (Submitted Dec 16, 2024)
GitHub Repository with R Markdown & Data
Contact: Tiasia Saunders – Data Journalist & Analyst