Overview

This report provides an analysis of second-year enrolment data by discipline, unit, and student group. It uses a long-format dataset derived from original course matrices, capturing total student numbers, BASS enrolments, and BASS proportions.

Methods Modules in the BASS Programme (2025–26)

Unit Code Unit Title Credits Notes
SOCY20091 Qualitative Social Research Design & Methods 20
SOST20012 The Survey Method in Social Research 10 Students doing Sociology pathways can choose this as a core methodology course (but not if also taking the Data Analytics pathway). Not available to students on the Data Analytics pathway and instead take SOST20022.
SOST20022 Essentials of Survey Design & Analysis 10 CORE for Data Analytics pathway students. Taking this module enables you to apply for a Q-Step Summer Project, see website for further info*. Not available to students who have selected SOST20012.
CRIM20441 Making Sense of Criminological Data 10 A potential Q-Step Summer Project’ pre-requisite: see website for further info*
CRIM20452 Modelling Criminological Data 10 FA potential Q-Step Summer Project’ pre-requisite: see website for further info*
POLI20902 How to Conduct Politics Research 20 P: 20 credits of Level 1 Politics units and C: 20 credits of Level 2 Politics units.
PHIL20242 20th Century Analytical Philosophy 20 P: 20 credits of Level 1 Philosophy units
SOAN20841 The Ethnographer’s Craft 20 CP or C: 40 credits SOAN units at level 1 or 2

Summary Statistics

## 📊 Summary Statistics
df %>%
  group_by(Measure) %>%
  summarise(Count = n(),
            Avg_Enrolment = mean(Value, na.rm = TRUE),
            Max_Enrolment = max(Value, na.rm = TRUE)) %>%
  kable() %>%
  kable_styling()
Measure Count Avg_Enrolment Max_Enrolment
BASS pathway % 342 20.31069 86.11111
Number by BASS pathway 342 20.15721 73.00000
Number of students overall on the course unit 342 99.98718 264.00000

Interpretation
This table provides a high-level summary of student enrolments across all course units and year groups, based on three key measures:

  • Number of students overall on the course unit: This represents the total enrolment per course unit per year group. The average is ~100 students, with some units reaching as high as 264.
  • Number by BASS pathway: Indicates how many BASS students were enrolled in each unit per year group. The average is ~20 BASS students per unit.
  • BASS pathway %: Reflects the proportion of enrolled students who are on a BASS pathway. On average, BASS students make up about 20% of each unit cohort, but in some units they account for up to 86%.

These statistics show that while BASS students are a significant presence in many course units, their representation varies widely. Some units are clearly more BASS-oriented, while others may be more general or belong to other programmes.

Course-Level Patterns

Q1: Which units have the highest overall enrolments?

This section identifies the course units with the highest total enrolments across all year groups.

## Top 10 Most Enrolled Units (by Unit Code)
library(scales)

# Get top 10 units by total enrolment
top_units <- df %>%
  filter(Measure == "Number of students overall on the course unit") %>%
  group_by(`Unit Code`, `Unit Name`, Discipline) %>%
  summarise(Total_Enrolment = sum(Value, na.rm = TRUE), .groups = 'drop') %>%
  arrange(desc(Total_Enrolment)) %>%
  slice_head(n = 10)

# Plot using Unit Code with black contours and numeric labels
ggplot(top_units, aes(x = reorder(`Unit Code`, Total_Enrolment), y = Total_Enrolment)) +
  geom_col(fill = "steelblue", color = "black") +  # black outline
  geom_text(aes(label = comma(round(Total_Enrolment))), hjust = -0.1, size = 4) +
  coord_flip() +
  theme_minimal(base_size = 14) +
  labs(title = "Top 10 Most Enrolled Units by Unit Code",
       x = "Unit Code", y = "Total Enrolment") +
  theme(plot.title = element_text(hjust = 0.5))

Unit Name Lookup Table

Unit Code Unit Name Total_Enrolment
POLI20902 How to Conduct Politics Research 1233
POLI20722 The Politics of Development 1074
POLI20711 The Politics of Globalisation 932
SOCY20091 Qualitative Social Research Design & Methods 899
POLI20531 British Politics and Society since 1940: From Blitz to Brexit 875
POLI20521 Questions about International Politics 871
POLI20961 Injustice and Resistance: Challenges for Democratic Politics 858
POLI20881 Ideals of Social Justice 828
CRIM20412 Explaining Crime and Deviance 808
CRIM20051 Policing and the Police 715

Interpretation

This chart shows the 10 course units with the highest total enrolments across all students, not just those on the BASS programme. These units are likely:

  • Core courses required by multiple programmes
  • Widely chosen electives
  • Methodology units with broad applicability

For example, “How to Conduct Politics Research” and “The Politics of Development” appear to serve a large student base across disciplines.

We’ll explore how BASS student enrolments differ in the next section.

Q2: Which units have the highest BASS enrolments?

This analysis focuses specifically on the number of BASS students enrolled in each course unit regardless of how many non-BASS students are in the unit.

Top 10 Units by BASS Student Enrolment

This chart shows the top 10 course units with the highest number of BASS students enrolled. These units are either:

  • Core modules required by the BASS programme (especially methodology or research units),
  • Or electives that align strongly with the social sciences focus of BASS students.

The table below provides full unit names and disciplines for clarity. This is useful for curriculum design, pathway planning, and identifying high-demand BASS teaching.

# Get top 10 units by BASS enrolment only
top_bass_units <- df %>%
  filter(Measure == "Number by BASS pathway") %>%
  group_by(`Unit Code`, `Unit Name`, Discipline) %>%
  summarise(BASS_Enrolment = sum(Value, na.rm = TRUE), .groups = 'drop') %>%
  arrange(desc(BASS_Enrolment)) %>%
  slice_head(n = 10)

# Plot using Unit Code
ggplot(top_bass_units, aes(x = reorder(`Unit Code`, BASS_Enrolment), y = BASS_Enrolment)) +
  geom_col(fill = "#1f78b4", color = "black") +
  geom_text(aes(label = round(BASS_Enrolment)), hjust = -0.1, size = 4) +
  coord_flip() +
  theme_minimal(base_size = 14) +
  labs(title = "Top 10 Units by BASS Enrolment",
       x = "Unit Code", y = "BASS Student Enrolment") +
  theme(plot.title = element_text(hjust = 0.5))

Unit Name Lookup Table

Unit Code Unit Name BASS Enrolment Total Enrolment BASS %
POLI20902 How to Conduct Politics Research 387 1233 31.4
SOCY20091 Qualitative Social Research Design & Methods 290 899 32.3
PHIL20242 20th Century Analytical Philosophy 198 525 37.7
SOCY20052 Education and Society 177 572 30.9
POLI20531 British Politics and Society since 1940: From Blitz to Brexit 175 875 20.0
SOCY20892 Gender, Sexuality and Culture 173 590 29.3
SOCY20961 Racism and Ethnicity in the UK 172 661 26.0
CRIM20412 Explaining Crime and Deviance 164 808 20.3
CRIM20692 Understanding Punishment 163 709 23.0
POLI20521 Questions about International Politics 160 871 18.4

Full Table: BASS Enrolment Across All Units

The interactive table below shows all Year 2 course units, including:

  • Unit Code and Unit Name
  • BASS Enrolment: Total number of BASS students across all year groups
  • Total Enrolment: Total number of students enrolled in the unit (BASS and non-BASS)
  • BASS %: The percentage of students in the unit who are on BASS pathways

You can filter or sort the table in several ways:

  • Use the search box to find a specific course by name or code
  • Click any column header to sort by BASS %, enrolment size, or name
  • Copy, print, or download the data using the toolbar

This tool helps explore which units are most (or least) BASS-heavy and may inform curriculum decisions or student engagement strategies.

It will help identify which are the course units where BASS students are a very small minority?

This will help identify units with very low BASS %, say, under 10%, or under 20%.

This is useful to flag:

  • Courses not aligned with BASS interests
  • Units shared with other programmes (e.g. outside Faculty of Humanities)
  • Potential curriculum gaps

Q3: Which disciplines attract the most BASS students overall?

This chart shows which disciplines attract the largest number of BASS students overall (aggregated across all course units and year groups).

Disciplines such as Politics, Sociology, and Philosophy may dominate if they offer many BASS-aligned units or have core modules required by the programme.

This is useful for identifying: - High-demand teaching areas within BASS - Where pathway design most aligns with specific disciplines

Total BASS Enrolment by Discipline

# Aggregate BASS enrolments by discipline
bass_by_discipline <- df %>%
  filter(Measure == "Number by BASS pathway") %>%
  group_by(Discipline) %>%
  summarise(BASS_Enrolment = sum(Value, na.rm = TRUE), .groups = "drop") %>%
  arrange(desc(BASS_Enrolment))

# Plot
ggplot(bass_by_discipline, aes(x = reorder(Discipline, BASS_Enrolment), y = BASS_Enrolment, fill = Discipline)) +
  geom_col(color = "black") +
  geom_text(aes(label = round(BASS_Enrolment)), vjust = -0.5, size = 4) +
#  coord_flip() +
  theme_minimal(base_size = 14) +
  theme(legend.position = "none") +
  labs(title = "Total BASS Enrolment by Discipline",
       x = "Discipline", y = "BASS Student Enrolment")

BASS Representation by Discipline

This chart shows the percentage of total enrolments in each discipline that come from BASS students.

  • A high BASS % suggests the discipline is strongly aligned with BASS pathways.
  • A lower % indicates broader appeal or reliance on other programmes.

This view helps assess which disciplines are most dependent on BASS enrolments, which can inform:

  • Planning of teaching resources
  • Strategic decisions on unit offerings
  • Interdisciplinary course design opportunities
# Total BASS and total enrolment per discipline
discipline_bass_percent <- df %>%
  filter(Measure %in% c("Number by BASS pathway", "Number of students overall on the course unit")) %>%
  group_by(Discipline, Measure) %>%
  summarise(Value = sum(Value, na.rm = TRUE), .groups = "drop") %>%
  pivot_wider(names_from = Measure, values_from = Value) %>%
  rename(
    BASS_Enrolment = `Number by BASS pathway`,
    Total_Enrolment = `Number of students overall on the course unit`
  ) %>%
  mutate(`BASS %` = round((BASS_Enrolment / Total_Enrolment) * 100, 1)) %>%
  arrange(desc(`BASS %`))

# Plot
ggplot(discipline_bass_percent, aes(x = reorder(Discipline, `BASS %`), y = `BASS %`, fill = Discipline)) +
  geom_col(color = "black") +
  geom_text(aes(label = paste0(`BASS %`, "%")), vjust = -0.5, size = 4) +
  coord_flip() +
  theme_minimal(base_size = 14) +
  theme(legend.position = "none") +
  labs(title = "BASS as a Percentage of Enrolment by Discipline",
       x = "Discipline", y = "BASS %")

Q4: How does BASS enrolment vary across disciplines over time?

This gives a trend-style comparison of how BASS student numbers shift year-by-year within each discipline.

What does it show:

  • A line chart (or grouped bar chart) with:
  • X-axis = Year group (Student Group: 1191, 1201, …)
  • Y-axis = Total BASS enrolment
  • One line (or bar group) per discipline

This helps reveal:

  • Growth or decline in BASS demand within a discipline
  • Whether any disciplines are becoming more/less BASS-oriented over time

How to use it:

  • Hover over points to see exact numbers
  • Zoom into specific year groups or disciplines
  • Toggle disciplines on/off from the legend

Q5: How do overall enrolments in a given unit change across year groups?

We’ll look at total student numbers (not just BASS) across Student Group codes for each Unit Code.

Trend: Overall Enrolment per Unit Over Time

This chart shows the trend in total student enrolments over time for a selected unit (e.g., POLI20902).

Use this view to:

  • Track the unit’s popularity over time
  • Identify whether it is growing, stable, or declining
  • Compare it with BASS-specific trends in the next question

You can easily change the unit being examined by modifying the selected_unit value in the code. (Shiny app to be designed).

# Filter total enrolment by unit over time
unit_trends <- df %>%
  filter(Measure == "Number of students overall on the course unit") %>%
  group_by(`Unit Code`, `Unit Name`, `Student Group`) %>%
  summarise(Total_Enrolment = sum(Value, na.rm = TRUE), .groups = "drop")

# Pick a unit to analyse (change this code to explore others)
selected_unit <- "POLI20902"

unit_data <- unit_trends %>%
  filter(`Unit Code` == selected_unit)

# Plot trend over time
ggplot(unit_data, aes(x = `Student Group`, y = Total_Enrolment)) +
  geom_line(group = 1, color = "steelblue", size = 1.2) +
  geom_point(size = 3, color = "steelblue") +
  geom_text(aes(label = round(Total_Enrolment)), vjust = -0.8, size = 4) +
  labs(title = paste("Overall Enrolment Trend for Unit:", selected_unit),
       x = "Year Group (Student Group Code)",
       y = "Total Enrolment") +
  theme_minimal(base_size = 14)

Q6: Does BASS representation (count or %) change in later cohorts?

This helps you understand whether BASS student engagement with a specific unit is:

  • Increasing
  • Declining
  • Or stable over time

Show both:

  1. BASS enrolment count over time
  2. BASS % of total enrolment over time

Using the same selected_unit set earlier (e.g., “POLI20902”).

BASS Student Representation Over Time for a Unit

# Filter and summarise for both BASS and total
bass_over_time <- df %>%
  filter(Measure %in% c("Number by BASS pathway", "Number of students overall on the course unit")) %>%
  group_by(`Unit Code`, `Unit Name`, `Student Group`, Measure) %>%
  summarise(Value = sum(Value, na.rm = TRUE), .groups = "drop") %>%
  pivot_wider(names_from = Measure, values_from = Value) %>%
  rename(
    BASS_Enrolment = `Number by BASS pathway`,
    Total_Enrolment = `Number of students overall on the course unit`
  ) %>%
  mutate(BASS_Percent = round(BASS_Enrolment / Total_Enrolment * 100, 1)) %>%
  filter(`Unit Code` == selected_unit)

# Plot both lines: BASS count and BASS %
par(mfrow = c(2, 1))  # optional if you want side-by-side plots (requires base R)

# BASS count
ggplot(bass_over_time, aes(x = `Student Group`, y = BASS_Enrolment)) +
  geom_line(group = 1, color = "darkgreen", size = 1.2) +
  geom_point(size = 3, color = "darkgreen") +
  geom_text(aes(label = round(BASS_Enrolment)), vjust = -0.8, size = 4) +
  labs(title = paste("BASS Enrolment Trend for Unit:", selected_unit),
       x = "Year Group", y = "BASS Student Count") +
  theme_minimal(base_size = 14)

# BASS %
ggplot(bass_over_time, aes(x = `Student Group`, y = BASS_Percent)) +
  geom_line(group = 1, color = "firebrick", size = 1.2) +
  geom_point(size = 3, color = "firebrick") +
  geom_text(aes(label = paste0(BASS_Percent, "%")), vjust = -0.8, size = 4) +
  labs(title = paste("BASS % of Enrolment for Unit:", selected_unit),
       x = "Year Group", y = "BASS %") +
  theme_minimal(base_size = 14)

Interpretation

These two charts show BASS student engagement with the selected unit over time:

  • The first chart tracks absolute BASS student enrolment
  • The second shows BASS students as a percentage of total enrolment

This dual view helps identify whether the unit is becoming more or less BASS-focused over time either through rising enrolment or stronger representation.

  • Comparing BASS vs non-BASS presence in units
  • Spotting anomalies: units with BASS over- or under-representation relative to their discipline

Q7: Which units show unusually high or low BASS % given their discipline?

This question helps uncover outliers:
Are there units where the BASS % is much higher or lower than we’d expect, given other units in the same discipline?

For each unit:

  • Compare its BASS % to the average BASS % in its discipline
  • Calculate the difference (delta) from that average
  • Identify outliers (e.g. ±15% or ±20% from the norm)

This helps flag:

  • Units attracting BASS students exceptionally well
  • Units underperforming in BASS engagement
# Create table of BASS % per unit
unit_bass_data <- df %>%
  filter(Measure %in% c("Number by BASS pathway", "Number of students overall on the course unit")) %>%
  group_by(`Unit Code`, `Unit Name`, Discipline, `Student Group`, Measure) %>%
  summarise(Value = sum(Value, na.rm = TRUE), .groups = "drop") %>%
  pivot_wider(names_from = Measure, values_from = Value) %>%
  rename(
    BASS_Enrolment = `Number by BASS pathway`,
    Total_Enrolment = `Number of students overall on the course unit`
  ) %>%
  mutate(BASS_Percent = round(BASS_Enrolment / Total_Enrolment * 100, 1)) %>%
  filter(!is.na(BASS_Percent), Total_Enrolment >= 10)  # Optional threshold

# Calculate discipline-level average BASS %
discipline_averages <- unit_bass_data %>%
  group_by(Discipline) %>%
  summarise(Discipline_Avg = mean(BASS_Percent, na.rm = TRUE), .groups = "drop")

# Join back to original table and calculate deviation
bass_outliers <- unit_bass_data %>%
  left_join(discipline_averages, by = "Discipline") %>%
  mutate(Diff_from_Discipline = round(BASS_Percent - Discipline_Avg, 1)) %>%
  arrange(desc(abs(Diff_from_Discipline)))  # largest deviations first

# Show top 20 outliers
bass_outliers %>%
  select(`Unit Code`, `Unit Name`, Discipline, `Student Group`,
         BASS_Percent, Discipline_Avg, Diff_from_Discipline) %>%
  head(20) %>%
  kable(col.names = c("Unit Code", "Unit Name", "Discipline", "Year Group",
                      "BASS %", "Discipline Avg %", "Difference")) %>%
  kable_styling(full_width = FALSE, position = "center")
Unit Code Unit Name Discipline Year Group BASS % Discipline Avg % Difference
SOST20051 Global Market Research DA 1241 86.1 23.17727 62.9
SOST20151 Introduction to Population Development & Social Change DA 1241 60.0 23.17727 36.8
PHIL20242 20th Century Analytical Philosophy Philosophy 1221 51.6 22.98438 28.6
SOST20142 Applied Statistics for Social Scientists DA 1191 0.0 23.17727 -23.2
PHIL20272 Philosophy of Mind Philosophy 1231 0.0 22.98438 -23.0
SOST20151 Introduction to Population Development & Social Change DA 1221 45.5 23.17727 22.3
SOST20142 Applied Statistics for Social Scientists DA 1241 1.9 23.17727 -21.3
PHIL20242 20th Century Analytical Philosophy Philosophy 1211 42.9 22.98438 19.9
SOST20012 The Survey Method in Social Research DA 1241 3.8 23.17727 -19.4
SOST20022 Essentials of Survey Design & Analysis DA 1191 4.2 23.17727 -19.0
POLI20902 How to Conduct Politics Research Politics 1231 34.7 16.01319 18.7
SOST20012 The Survey Method in Social Research DA 1231 5.0 23.17727 -18.2
PHIL20042 Philosophy of Race Philosophy 1211 5.5 22.98438 -17.5
SOST20012 The Survey Method in Social Research DA 1191 5.7 23.17727 -17.5
POLI20902 How to Conduct Politics Research Politics 1191 33.0 16.01319 17.0
SOCY20272 Global Migration Sociology 1241 45.2 28.20270 17.0
POLI20902 How to Conduct Politics Research Politics 1201 32.7 16.01319 16.7
SOCY20411 Youth Politics and Activism in Contemporary Europe Sociology 1241 44.7 28.20270 16.5
POLI20902 How to Conduct Politics Research Politics 1241 32.2 16.01319 16.2
SOAN20852 Materiality & Representation Anthropology 1201 5.6 21.08182 -15.5

Further Insights

Cluster Units by Enrolment Profile

Interpretation: Enrolment Profiles

This summary groups units by their enrolment patterns and BASS student representation.

Profile Number of Units Interpretation
High enrolment, low BASS % 59 These units are popular overall but have relatively low participation from BASS students. This could suggest they appeal more to students outside the BASS programme, and/or they may not align well with BASS pathways.
Low enrolment, high BASS % 2 These units are smaller in size but have high BASS representation. They may be niche or core to specific BASS pathways. Despite low enrolment, they might be valuable for the programme and could be prioritised for support.
Other 281 The majority of units fall into this general category, indicating moderate enrolment levels or balanced BASS representation. These don’t show standout trends but form the bulk of the curriculum.

This profiling helps identify:

  • Units where BASS students are underrepresented despite high popularity overall
  • Small but potentially high-value units for BASS
  • Opportunities to better align teaching provision with BASS demand
# Build base dataset
unit_profile <- df %>%
  filter(Measure %in% c("Number by BASS pathway", "Number of students overall on the course unit")) %>%
  group_by(`Unit Code`, `Unit Name`, Discipline, `Student Group`, Measure) %>%
  summarise(Value = sum(Value, na.rm = TRUE), .groups = "drop") %>%
  pivot_wider(names_from = Measure, values_from = Value) %>%
  rename(
    BASS_Enrolment = `Number by BASS pathway`,
    Total_Enrolment = `Number of students overall on the course unit`
  ) %>%
  mutate(
    BASS_Percent = round(BASS_Enrolment / Total_Enrolment * 100, 1),
    Cluster = case_when(
      Total_Enrolment >= 100 & BASS_Percent < 20 ~ "High enrolment, low BASS %",
      Total_Enrolment >= 100 & BASS_Percent >= 50 ~ "High enrolment, high BASS %",
      Total_Enrolment < 50 & BASS_Percent >= 50 ~ "Low enrolment, high BASS %",
      TRUE ~ "Other"
    )
  )

# View result
unit_profile %>%
  count(Cluster) %>%
  kable(col.names = c("Profile", "Number of Units")) %>%
  kable_styling(full_width = FALSE)
Profile Number of Units
High enrolment, low BASS % 59
Low enrolment, high BASS % 2
Other 281

List Units: High Enrolment, Low BASS %

Units with High Enrolment but Low BASS Representation

To better understand which specific units fall into the “High enrolment, low BASS %” category, the table below lists all units meeting that profile. These are courses with large total enrolments but relatively low engagement from BASS students.

This may point to:

  • Units that are more popular with other programmes,
  • Missed opportunities for BASS engagement, or
  • Potential barriers to access or appeal for BASS students.

The table includes total and BASS enrolment figures, along with the BASS percentage, and can be filtered or sorted for easier exploration.

unit_profile %>%
  filter(Cluster == "High enrolment, low BASS %") %>%
  arrange(desc(Total_Enrolment)) %>%
  select(`Unit Code`, `Unit Name`, Discipline, `Student Group`, 
         Total_Enrolment, BASS_Enrolment, BASS_Percent) %>%
  datatable(
    caption = "Units with High Total Enrolment but Low BASS Representation",
    options = list(pageLength = 10, autoWidth = TRUE),
    rownames = FALSE
  )

Units with Low Enrolment but High BASS Representation

While smaller in number, it’s also useful to examine units with low total enrolment but a high proportion of BASS students. These units may be more niche or specialised, but they serve an important role in the BASS curriculum.

Understanding which units BASS students cluster in even when overall enrolment is low can help with:

  • Identifying high-value BASS units,
  • Ensuring smaller units receive appropriate support, and
  • Highlighting unique offerings that contribute to the identity of the BASS programme.

The table below lists these units, showing total enrolment, BASS numbers, and the percentage of BASS representation.

List Units: Low Enrolment, High BASS %

unit_profile %>%
  filter(Cluster == "Low enrolment, high BASS %") %>%
  arrange(desc(BASS_Percent)) %>%
  select(`Unit Code`, `Unit Name`, Discipline, `Student Group`, 
         Total_Enrolment, BASS_Enrolment, BASS_Percent) %>%
  datatable(
    caption = "Units with Low Total Enrolment but High BASS Representation",
    options = list(pageLength = 10, autoWidth = TRUE),
    rownames = FALSE
  )

Flag Units with Very Low or Very High BASS

Outlier Units: Extreme BASS Representation

To identify units with unusual BASS participation, we flagged those where BASS students make up less than 10% or more than 90% of total enrolment.

These extremes may indicate:

  • Under-representation, where BASS students are not engaging with widely enrolled units
  • Highly targeted BASS units, where nearly all students come from the BASS programme

Table: Units with Extreme BASS %

The table below lists all units that fall into either extreme.

Visual: BASS % vs Total Enrolment

The scatter plot visualises the full dataset, highlighting:

  • Low BASS % units in red
  • High BASS % units in green
  • All others in grey

This view helps spot outliers and understand their enrolment scale. Some small units may show 100% BASS simply due to low total numbers, while others may indicate genuine curriculum specialisation.

**Note: The code below filters the dataset to highlight course units where BASS students are either significantly under-represented or heavily concentrated. Specifically, it selects units where BASS students make up less than or equal to 10% or greater than or equal to 90% of the total enrolment:
Table: Units with Extremely Low (<10%) or High (>90%) BASS Representation

This table is used to flag outlier units with respect to BASS student participation. These extremes may indicate two types of curricular patterns:

  • Low BASS representation (<10%)
    Units in this group tend to attract mostly non-BASS students. This might suggest a missed opportunity for integration or content that is less relevant or visible to BASS pathways.
  • High BASS representation (>90%)
    These are likely to be targeted units, designed with BASS students in mind or only made available to them. While this can indicate tailored content, it can also imply curricular silos if students from other programmes are rarely enrolled.
extreme_bass <- unit_profile %>%
  filter(BASS_Percent <= 10 | BASS_Percent >= 90) %>%
  arrange(desc(BASS_Percent)) %>%
  select(`Unit Code`, `Unit Name`, Discipline, `Student Group`,
         Total_Enrolment, BASS_Enrolment, BASS_Percent)

datatable(
  extreme_bass,
  caption = "Units with Extremely Low (<10%) or High (>90%) BASS Representation",
  options = list(pageLength = 10, autoWidth = TRUE),
  rownames = FALSE
)
## Interactive Scatter Plot: BASS % vs Total Enrolment with Hover Info
library(plotly)

# Prepare data
unit_profile_plot <- unit_profile %>%
  mutate(Category = case_when(
    BASS_Percent < 10 ~ "Low BASS %",
    BASS_Percent > 90 ~ "High BASS %",
    TRUE ~ "Normal"
  ))

# Base ggplot with legend at bottom
p <- ggplot(unit_profile_plot, aes(x = Total_Enrolment, y = BASS_Percent,
                                   color = Category,
                                   text = paste("Unit Code:", `Unit Code`,
                                                "<br>BASS %:", BASS_Percent,
                                                "<br>Total:", Total_Enrolment))) +
    geom_point(size = 3, alpha = 0.7) +
  scale_color_manual(values = c("Low BASS %" = "firebrick",
                                "High BASS %" = "darkgreen",
                                "Normal" = "grey")) +
  labs(title = "Interactive: BASS % vs Total Enrolment",
       x = "Total Enrolment", y = "BASS %", color = "Category") +
  theme_minimal(base_size = 14)

# Convert to plotly and manually place the legend at bottom
ggplotly(p, tooltip = "text") %>%
  layout(
    legend = list(
      orientation = "h",
      x = 0.5,
      xanchor = "center",
      y = -0.2  # push legend below plot
    ),
    margin = list(b = 80)  # extend bottom margin so legend doesn't overlap
  )

Plotly: Highlight Year Groups by Colour

library(plotly)

# Include Student Group as a variable
p <- ggplot(unit_profile, aes(x = Total_Enrolment, y = BASS_Percent,
                              color = as.factor(`Student Group`),
                              text = paste("Unit Code:", `Unit Code`,
                                           "<br>Year Group:", `Student Group`,
                                           "<br>BASS %:", BASS_Percent,
                                           "<br>Total:", Total_Enrolment))) +
  geom_point(size = 3, alpha = 0.8) +
  labs(title = "BASS % vs Total Enrolment by Year Group",
       x = "Total Enrolment", y = "BASS %",
       color = "Year Group") +
  theme_minimal(base_size = 14)

# Convert to Plotly with legend repositioned
ggplotly(p, tooltip = "text") %>%
  layout(
    legend = list(
      orientation = "h",
      x = 0.5,
      xanchor = "center",
      y = -0.2
    ),
    margin = list(b = 80)
  )

Discipline-Level BASS Engagement Profiles

This section zooms out from individual units to examine BASS engagement at the discipline level. The data is aggregated across all units and year groups to answer questions such as:

  • Which disciplines have the highest average BASS representation?
  • What is the range (min and max) of BASS participation within each discipline?
  • How does BASS engagement trend over time (across year groups) in each discipline?

Below, the summary table presents, for each discipline: - The average BASS % (percentage of students enrolled from the BASS pathway) - The minimum and maximum BASS % observed

The line chart visualises how these percentages change over different student groups (year codes), providing insight into the evolution of BASS engagement within each discipline.

# Aggregate data to get discipline-level trends over time.
disc_engagement <- df %>%
  filter(Measure %in% c("Number by BASS pathway", "Number of students overall on the course unit")) %>%
  group_by(Discipline, `Student Group`, Measure) %>%
  summarise(Value = sum(Value, na.rm = TRUE), .groups = "drop") %>%
  pivot_wider(names_from = Measure, values_from = Value) %>%
  rename(
    Total_Enrolment = `Number of students overall on the course unit`,
    BASS_Enrolment = `Number by BASS pathway`
  ) %>%
  mutate(BASS_Percent = round(BASS_Enrolment / Total_Enrolment * 100, 1))

# Create a summary table per discipline (aggregated across all year groups)
disc_summary <- disc_engagement %>%
  group_by(Discipline) %>%
  summarise(
    Num_YearGroups = n_distinct(`Student Group`),
    Avg_BASS_Percent = round(mean(BASS_Percent, na.rm = TRUE), 1),
    Min_BASS_Percent = min(BASS_Percent, na.rm = TRUE),
    Max_BASS_Percent = max(BASS_Percent, na.rm = TRUE),
    .groups = "drop"
  ) %>%
  arrange(desc(Avg_BASS_Percent))

# Display the summary table
disc_summary %>%
  kable(col.names = c("Discipline", "# Year Groups", "Avg BASS %", "Min BASS %", "Max BASS %")) %>%
  kable_styling(full_width = FALSE, position = "center")
Discipline # Year Groups Avg BASS % Min BASS % Max BASS %
Sociology 6 28.4 25.0 31.7
Other 6 26.9 26.9 26.9
Philosophy 6 25.1 21.4 33.3
Criminology 6 20.1 16.9 22.3
Anthropology 6 18.6 5.6 26.7
DA 6 17.4 4.4 24.8
Politics 6 15.8 14.0 18.5
# Create a line chart: BASS % trend by discipline over time (Student Group)
ggplot(disc_engagement, aes(x = as.numeric(`Student Group`), y = BASS_Percent, color = Discipline)) +
  geom_line(size = 1.2) +
  geom_point(size = 3) +
  labs(title = "BASS Engagement Trends by Discipline Over Time",
       x = "Student Group (Year Code)",
       y = "BASS %") +
  theme_minimal(base_size = 14) +
  scale_x_continuous(breaks = unique(as.numeric(disc_engagement$`Student Group`)))

Core vs Elective Dependency

Understanding how BASS students distribute their enrolments across different types of course units (Core, Methodology, Pathway Option, etc.) helps reveal whether they are concentrating in required units or actively choosing certain electives. This can guide decisions around optional provision and curriculum flexibility.

df %>%
  filter(Measure == "BASS pathway %", !is.na(`Course Type`)) %>%
  group_by(`Course Type`) %>%
  summarise(
    avg_bass_pct = mean(Value, na.rm = TRUE),
    median_bass_pct = median(Value, na.rm = TRUE),
    unit_count = n()
  ) %>%
  arrange(desc(avg_bass_pct)) %>%
  kableExtra::kable("html", caption = "BASS Enrolment by Course Type") %>%
  kableExtra::kable_styling(full_width = FALSE)
BASS Enrolment by Course Type
Course Type avg_bass_pct median_bass_pct unit_count
Pathway Option Data Analytics 29.53933 21.45299 18
Pathway Option Sociology 25.75129 28.57143 66
Core (Optional) Methodology Course 25.51239 28.12500 42
Core for Data Analytics pathway and a Core (Optional) Methodology Course 25.21460 30.04195 6
Pathway Option Criminology 20.97977 21.45896 30
Pathway Option Social Anthropology 20.36137 20.65030 30
Pathway Option Philosophy 18.86920 19.73684 54
Option 18.18182 18.18182 6
Pathway Option Politics 14.90855 14.11765 90

This table summarises how BASS students are distributed across different course unit types. The average and median BASS percentages give an indication of how central BASS students are to each course type, while the unit count reflects how common that course type is in the dataset.

Key takeaways:

  • Pathway Option Data Analytics units have the highest average BASS percentage (~29.5%), although the lower median (~21.5%) suggests some variation between units.
  • Sociology Pathway Options and (Optional) Methodology Courses also show strong and consistent BASS representation, with medians around 28%.
  • Core units for the Data Analytics pathway are few in number (6), but have the highest median BASS percentage (~30%), indicating they are particularly important for this cohort.
  • In contrast, Pathway Option Politics and generic Options tend to have the lowest BASS participation, with average and median percentages both under 20%.

These patterns can help highlight which areas of the curriculum are most and least popular with BASS students, potentially informing future planning or engagement strategies.

Unit Overlap Across BASS Pathways

This table shows the number of different BASS pathways represented in each course unit, alongside the total number of BASS students enrolled.

The methodology modules form a key part of the BASS structure, often shared across multiple disciplines. Their frequent appearance in high-overlap units reflects their central role in unifying students from different academic pathways, and they likely contribute to the interdisciplinary coherence of the programme.

  • Units with high pathway diversity (e.g. 5–6 pathways) are potentially more interdisciplinary and serve a wider cohort.
  • Units with low diversity may be pathway-specific or could indicate a lack of visibility across the BASS programme.

This information is useful for identifying units that could be promoted more broadly, or where collaboration across pathways might be strengthened.

library(tidyverse)
library(ggplot2)

# Prepare the data
plot_data <- df %>%
  filter(Measure == "Number by BASS pathway") %>%
  group_by(`Unit Code`, `Unit Name`) %>%
  summarise(
    `Distinct BASS Pathways` = n_distinct(`Student Group`),
    .groups = "drop"
  ) %>%
  left_join(
    df %>%
      filter(Measure == "Number by BASS pathway") %>%
      group_by(`Unit Code`) %>%
      summarise(`Total BASS Enrolment` = sum(Value, na.rm = TRUE), .groups = "drop"),
    by = "Unit Code"
  ) %>%
  arrange(desc(`Distinct BASS Pathways`)) %>%
  slice_head(n = 25)

# Plot
ggplot(plot_data, aes(x = `Distinct BASS Pathways`, y = reorder(`Unit Code`, `Distinct BASS Pathways`), fill = `Total BASS Enrolment`)) +
  geom_col() +
  labs(
    title = "Top 25 Units by Pathway Overlap (BASS Students)",
    x = "Number of Distinct BASS Pathways",
    y = "Unit Code",
    fill = "Total BASS Enrolment"
  ) +
  scale_fill_viridis_c(option = "viridis") +
  theme_minimal(base_size = 13) +
  theme(
    legend.position = "bottom",
    legend.box = "horizontal"
  )

It shows that high pathway overlap units (e.g. POLI20902 How to Conduct Politics Research, or SOCY20091 Qualitative Social Research Design & Methods) serve as core or methodology units accepted across multiple pathways (like Politics, Sociology, or Data Analytics).
Units with both high overlap and high enrolment could be seen as:

  • Centrally relevant to the BASS degree overall
  • Useful “bridge units” fostering inter-pathway learning

Student Pathway Coverage vs. Discipline Offering

This section compares how well each BASS pathway is served by the available course units. Specifically, it relates the total number of BASS students enrolled in a discipline to the number of units offered within that discipline.

Why this matters

Some pathways may have a large student population but only a few units available for selection, indicating a potential imbalance or undersupply. By calculating the average number of students per unit, we can identify disciplines that may benefit from additional course development.

Interpretation

  • A higher “Students per Unit” value suggests that the discipline has fewer units relative to student interest, potentially signalling a need for expansion.
  • A lower value implies a richer offering of units per student and potentially better curriculum support.
df %>%
  filter(Measure == "Number by BASS pathway") %>%
  group_by(Discipline) %>%
  summarise(
    Total_BASS_Enrolment = sum(Value, na.rm = TRUE),
    Units_Offered = n_distinct(`Unit Code`)
  ) %>%
  mutate(Students_per_Unit = round(Total_BASS_Enrolment / Units_Offered, 2)) %>%
  arrange(desc(Students_per_Unit)) %>%
  kableExtra::kable("html", caption = "BASS Student Coverage vs. Unit Availability by Discipline") %>%
  kableExtra::kable_styling(full_width = FALSE)
BASS Student Coverage vs. Unit Availability by Discipline
Discipline Total_BASS_Enrolment Units_Offered Students_per_Unit
Criminology 658 6 109.67
Politics 1749 16 109.31
Sociology 1093 12 91.08
Philosophy 569 10 56.90
Anthropology 297 6 49.50
DA 243 5 48.60
Other 7 2 3.50

This table highlights the relationship between BASS student demand and the volume of course units offered across disciplines.

  • Disciplines such as Politics or Sociology may show a high number of students per unit, indicating these areas are under pressure and may be underserved in terms of curriculum breadth. This suggests a need for additional course units to better support student choice and manage enrolment distribution.

  • Disciplines with fewer students per unit, such as Philosophy or Social Anthropology (if applicable), may be well resourced or possibly over-offering relative to demand. In such cases, reviewing the efficiency or alignment of unit offerings could be worthwhile.

This analysis supports strategic planning of course unit provision, ensuring that student pathways are equitably supported and that resources are aligned with actual enrolment patterns.

Course Type Dependency

This section examines how BASS students are distributed across different types of course units, such as core, optional, and elective. The aim is to determine whether the BASS learning experience is structured and cohesive or fragmented and overly reliant on optional units.

Why this matters

A balanced curriculum typically includes a strong core structure complemented by optional specialisation. If most BASS enrolments are concentrated in optional or elective units, this may signal a fragmented student experience lacking a unified academic spine.

Interpretation

  • A higher percentage of BASS enrolments in core units suggests a well-integrated curriculum.
  • A high reliance on optional units may indicate the need to review the unit’s learning outcomes to ensure greater consistency and alignment across pathways.
df %>%
  filter(Measure == "Number by BASS pathway") %>%
  group_by(`Course Type`) %>%
  summarise(Total_BASS = sum(Value, na.rm = TRUE)) %>%
  mutate(Percentage = round(100 * Total_BASS / sum(Total_BASS), 1)) %>%
  arrange(desc(Total_BASS)) %>%
  ggplot(aes(x = reorder(`Course Type`, Total_BASS), y = Total_BASS)) +
  geom_col(fill = "lightblue", colour = "black") +
  geom_text(aes(label = paste0(Percentage, "%")), vjust = -0.3, size = 4.5) +
  labs(
    title = "BASS Enrolment by Course Type",
    x = NULL,
    y = "Total BASS Enrolment"
  ) +
  scale_y_continuous(limits = c(0, 2500)) +  # Explicit Y-axis limit
  theme_minimal(base_size = 13) +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1),
    plot.title = element_text(face = "bold"),
    plot.margin = margin(t = 20, r = 15, b = 10, l = 15),  # Add top margin
    legend.position = "none"
  )

The bar chart above illustrates how BASS enrolments are distributed across different course types. It clearly shows that the majority of BASS students are concentrated in a few categories, particularly Pathway Option Politics and Core (Optional) Methodology Courses.

This suggests a strong dependence on certain units to support the student experience, with some disciplines, such as Politics and Methodology, serving as major anchors in the curriculum. While this may reflect student interest or the design of the programme, it also raises questions about:

  • Whether the curriculum is too narrow, lacking diversity across unit types;
  • Whether optional units are truly elective, or effectively functioning as core due to limited alternatives;
  • How well the programme supports cross-pathway integration, especially for underrepresented or emerging areas like Data Analytics.

This report has provided a comprehensive, data-driven overview of Year 2 BASS enrolment patterns. From course-level insights to discipline-wide and pathway-specific patterns, the findings can support programme’s development.