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.

Load Data

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

Overview of Programmes

What you’re seeing:
This table shows the total number of students enrolled in each BASS programme across all academic years.

What stands out:

  • Some programmes like Politics & Philosophy and Sociology & Criminology have consistently high enrolment.
  • Less popular pathways have significantly fewer students.

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()
Total Enrolment by Programme
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

Enrolment by Year of Study

What you’re seeing:
This bar chart breaks down student numbers by year of study (Year 1, Year 2, etc.).

Patterns noticed:

  • Typically, Year 1 has the highest numbers, with some drop-off in Years 2 and 3.

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)))

Enrolment by Programme Over Time (Top 5)

What you’re seeing:
This chart shows the enrolment trends over time for the top 5 most popular programmes.

What’s interesting:

  • Some pathways show consistent growth (e.g., Politics & Philosophy).
  • Others fluctuate or plateau, which may reflect changes in course appeal or external influences.

Takeaway:

  • This view highlights which programmes consistently attract high enrolment.
  • It provides a benchmark for identifying underperforming pathways.
  • Useful for informing decisions around programme restructuring or potential rationalisation.
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)))

Interactive Plot: All Programmes Over Time

What you’re seeing:
This interactive line chart shows enrolment trends over time for all BASS programmes.

Insights available:

  • You can hover to explore exact numbers per year.
  • Differences between programmes become clearer.

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"
    )
  )

Top 5 Programmes (Interactive Tooltip)

What you’re seeing:
This plot zooms in on the top 5 programmes, allowing comparison by year.

Observation:

  • You can trace how each programme has grown or dipped year by year.
  • Interactivity offer quick insights into each value.

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"
    )
  )

Top 5 Programmes by Study Year (Shape Differentiated)

What you’re seeing:
This chart breaks down the top 5 programmes further by study year using shape and colour.

What stands out:

  • Shapes differentiate cohorts (Year 1, 2, 3).
  • Some programmes may lose students after Year 1, while others remain stable.

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"
    )
  )

Explore the Interactive Shiny Dashboard

You can also explore an interactive version of this analysis through a Shiny app. This dashboard allows you to:

  • Filter and select a specific BASS programme
  • View enrolment trends by year and year of study
  • See visual summaries with interactive plots
  • Access a detailed summary table for each selected programme

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.