This report analyses enrolment trends across the BA Social Sciences (BASS) programmes at the University of Manchester from 2019/20 to 2024/25. It explores patterns by programme, academic year, and year of study, identifying areas of growth, stability, and decline.
data <- read_csv("BASS_Pr_Enrolment.csv")
head(data)
no | programme | academic_year | year_study | no_students |
---|---|---|---|---|
1 | BA (Hons) Social Anthropology and Quantitative Methods | 2019/20 | 1 | 0 |
1 | BA (Hons) Social Anthropology and Quantitative Methods | 2019/20 | 2 | 0 |
1 | BA (Hons) Social Anthropology and Quantitative Methods | 2019/20 | 3 | 0 |
1 | BA (Hons) Social Anthropology and Quantitative Methods | 2020/21 | 1 | 2 |
1 | BA (Hons) Social Anthropology and Quantitative Methods | 2020/21 | 2 | 0 |
1 | BA (Hons) Social Anthropology and Quantitative Methods | 2020/21 | 3 | 0 |
What you’re seeing:
This table shows the total number of students enrolled in each BASS
programme across all academic years.
What stands out:
Observations:
The more popular combinations may align better with student interests or
career aspirations?!?!.
programme_summary <- data %>%
group_by(programme) %>%
summarise(total_students = sum(no_students), .groups = "drop") %>%
arrange(desc(total_students))
kable(programme_summary, caption = "Total Enrolment by Programme") %>%
kable_styling()
programme | total_students |
---|---|
BA (Hons) Social Sciences (Politics and Philosophy) | 584 |
BA (Hons) Social Sciences (Sociology & Criminology) | 527 |
BA (Hons) Social Sciences (Politics and Sociology) | 502 |
BA (Hons) Social Sciences (Politics) | 254 |
BA (Hons) Social Sciences (Sociology & Social Anthropology) | 216 |
BA (Hons) Social Sciences (Politics & Criminology) | 176 |
BA (Hons) Social Sciences (Politics & Social Anthropology) | 132 |
BA (Hons) Social Sciences (Sociology and Data Analytics) | 102 |
BA (Hons) Social Sciences (Sociology & Philosophy) | 92 |
BA (Hons) Social Sciences (Sociology) | 79 |
BA (Hons) Social Sciences (Politics and Data Analytics) | 66 |
BA (Hons) Social Sciences (Criminology) | 61 |
BA (Hons) Social Sciences (Philosophy & Criminology) | 54 |
BA (Hons) Social Sciences (Philosophy) | 50 |
BA (Hons) Social Sciences (Social Anthropology & Criminology) | 50 |
BA (Hons) Social Sciences (Social Anthropology & Philosophy) | 48 |
BA (Hons) Social Sciences (Social Anthropology) | 43 |
BA (Hons) Social Sciences (Sociology and Quantitative Methods) | 23 |
BA (Hos) Social Sciences (Criminology and Data Analytics) | 16 |
BA (Hons) Social Sciences (Criminology and Quantitative Methods) | 15 |
BA (Hons) Social Science (Social Anthropology and Data Analytics) | 12 |
BA (Hons) Social Sciences (Politics and Quantitative Methods) | 12 |
BA (Hons) Social Sciences (Philosophy and Data Analytics) | 5 |
BA (Hons) Social Anthropology and Quantitative Methods | 4 |
BA (Hons) Social Sciences (Philosophy and Quantitative Methods) | 1 |
What you’re seeing:
This line chart displays the total enrolment numbers across all
programmes for each academic year.
Trends noticed:
Observations:
The BASS programme has shown resilience and strong demand, even during
uncertain times. This growth suggests consistent appeal and possibly
effective outreach and/or curriculum design.
yearly_trend <- data %>%
group_by(academic_year) %>%
summarise(total_students = sum(no_students), .groups = "drop")
min_val <- min(yearly_trend$total_students)
max_val <- max(yearly_trend$total_students)
ggplot(yearly_trend, aes(x = academic_year, y = total_students, group = 1)) +
geom_line(color = "steelblue", linewidth = 1) +
geom_point(color = "black", size = 2) +
geom_text(aes(label = total_students), vjust = -1, size = 4) +
scale_y_continuous(
limits = c(min_val - 10, max_val + 10),
breaks = pretty(c(min_val, max_val), n = 5)
) +
labs(
title = "Yearly Enrolment Trends",
subtitle = "Total Enrolment by Academic Year",
x = "Academic Year",
y = "No. of Students"
) +
theme_minimal(base_size = 14) +
theme(
plot.title = element_text(face = "bold", size = 18),
plot.subtitle = element_text(size = 14),
axis.text.x = element_text(angle = 45, hjust = 1)
)
What you’re seeing:
This bar chart breaks down student numbers by year of study (Year 1,
Year 2, etc.).
Patterns noticed:
Observations:
This reflects retention and progression as any significant drop-off
between years could warrant further investigation into student support
or satisfaction.
study_year_summary <- data %>%
group_by(year_study) %>%
summarise(total_students = sum(no_students), .groups = "drop")
ggplot(study_year_summary, aes(x = factor(year_study), y = total_students)) +
geom_bar(stat = "identity", fill = "steelblue") +
geom_text(aes(label = total_students), vjust = -0.5, size = 4, color = "steelblue") +
labs(
title = "Enrolment by Year of Study",
subtitle = "Total number of students across study years",
x = "Year of Study",
y = "No. of Students"
) +
theme_minimal(base_size = 14) +
theme(
plot.title = element_text(face = "bold", size = 18),
plot.subtitle = element_text(size = 14),
axis.text.x = element_text(size = 12),
axis.text.y = element_text(size = 12)
) +
scale_y_continuous(expand = expansion(mult = c(0, 0.1)))
What you’re seeing:
This chart shows the enrolment trends over time for the top 5 most
popular programmes.
What’s interesting:
Takeaway:
top_programmes <- programme_summary %>%
top_n(5, total_students) %>%
pull(programme)
filtered_data <- data %>%
filter(programme %in% top_programmes)
ggplot(filtered_data, aes(x = academic_year, y = no_students, color = programme, group = programme)) +
geom_line(linewidth = 1) +
geom_point(size = 3) +
geom_text(aes(label = no_students), vjust = -0.8, size = 3, show.legend = FALSE) +
labs(
title = "Top 5 Programmes Over Time",
subtitle = "Yearly enrolment trends for most popular BASS pathways",
x = "Academic Year",
y = "No. of Students",
color = "Programme"
) +
theme_minimal(base_size = 14) +
theme(
plot.title = element_text(face = "bold", size = 18),
plot.subtitle = element_text(size = 14),
axis.text.x = element_text(angle = 45, hjust = 1),
legend.position = "bottom",
legend.title = element_text(face = "bold"),
legend.text = element_text(size = 10)
) +
scale_y_continuous(expand = expansion(mult = c(0, 0.1)))
What you’re seeing:
This interactive line chart shows enrolment trends over time for all
BASS programmes.
Insights available:
Use case:
Helpful for spotting underperforming or consistently strong programmes
across the full landscape.
all_data_summary <- data %>%
group_by(programme, academic_year) %>%
summarise(no_students = sum(no_students), .groups = "drop") %>%
mutate(tooltip_text = paste0(
"Programme: ", programme, "\n",
"Year: ", academic_year, "\n",
"Students: ", no_students
))
p <- ggplot(all_data_summary, aes(x = academic_year, y = no_students, color = programme, group = programme, text = tooltip_text)) +
geom_line(linewidth = 1) +
geom_point(size = 2) +
labs(
title = "Programme Enrolment Trends Over Time",
x = "Academic Year",
y = "No. of Students"
) +
theme_minimal(base_size = 13)
ggplotly(p, tooltip = "text") %>%
layout(
legend = list(
orientation = "h",
x = 0.5, xanchor = "center",
y = -0.2, yanchor = "top"
)
)
What you’re seeing:
This plot zooms in on the top 5 programmes, allowing comparison by
year.
Observation:
Value added:
A more detailed view that enhances understanding of enrolment health in
key programmes.
filtered_data_summary <- data %>%
filter(programme %in% top_programmes) %>%
group_by(programme, academic_year) %>%
summarise(no_students = sum(no_students), .groups = "drop") %>%
mutate(tooltip_text = paste0(
"Programme: ", programme, "\n",
"Year: ", academic_year, "\n",
"Students: ", no_students
))
p <- ggplot(filtered_data_summary, aes(x = academic_year, y = no_students, color = programme, group = programme, text = tooltip_text)) +
geom_line(linewidth = 1) +
geom_point(size = 2) +
labs(
title = "Top 5 Programmes Over Time",
x = "Academic Year",
y = "No. of Students"
) +
theme_minimal(base_size = 13)
ggplotly(p, tooltip = "text") %>%
layout(
legend = list(
orientation = "h",
x = 0.5, xanchor = "center",
y = -0.2, yanchor = "top"
)
)
What you’re seeing:
This chart breaks down the top 5 programmes further by study year using
shape and colour.
What stands out:
Actionable insight:
Helpful for identifying which years may need targeted retention
support.
filtered_data_detailed <- data %>%
filter(programme %in% top_programmes) %>%
mutate(
tooltip_text = paste0(
"Programme: ", programme, "\n",
"Year: ", academic_year, "\n",
"Study Year: ", year_study, "\n",
"Students: ", no_students
)
)
p <- ggplot(filtered_data_detailed, aes(
x = academic_year,
y = no_students,
color = programme,
shape = factor(year_study),
group = interaction(programme, year_study),
text = tooltip_text
)) +
geom_line(linewidth = 1) +
geom_point(size = 3) +
labs(
title = "Top 5 Programmes Over Time by Year of Study",
x = "Academic Year",
y = "No. of Students",
shape = "Study Year"
) +
theme_minimal(base_size = 13) +
theme(
legend.position = "bottom",
legend.box = "vertical"
)
ggplotly(p, tooltip = "text") %>%
layout(
legend = list(
orientation = "h",
x = 0.5, xanchor = "center",
y = -0.3, yanchor = "top"
)
)
You can also explore an interactive version of this analysis through a Shiny app. This dashboard allows you to:
To launch the app click on the link: https://tanjakeco.shinyapps.io/BASS_Enrolment/
No installation required, just click the link to open the dashboard in your browser.