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.
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
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:
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.
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:
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.
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.
This chart shows the top 10 course units with the highest number of BASS students enrolled. These units are either:
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 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 |
The interactive table below shows all Year 2 course units, including:
You can filter or sort the table in several ways:
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:
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
# 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")
This chart shows the percentage of total enrolments in each discipline that come from BASS students.
This view helps assess which disciplines are most dependent on BASS enrolments, which can inform:
# 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 %")
This gives a trend-style comparison of how BASS student numbers shift year-by-year within each discipline.
What does it show:
This helps reveal:
How to use it:
## Interactive BASS Enrolment Trends by Discipline (Legend Below)
## Interactive BASS Enrolment Trends by Discipline (Legend Further Below)
library(plotly)
# Summarise BASS enrolment by discipline and year group
bass_trends <- df %>%
filter(Measure == "Number by BASS pathway") %>%
group_by(Discipline, `Student Group`) %>%
summarise(BASS_Enrolment = sum(Value, na.rm = TRUE), .groups = "drop")
# Create ggplot
bass_plot <- ggplot(bass_trends, aes(x = `Student Group`, y = BASS_Enrolment,
color = Discipline, group = Discipline)) +
geom_line(size = 1.2) +
geom_point(size = 2) +
theme_minimal(base_size = 14) +
labs(title = "Interactive: BASS Enrolment Trends by Discipline Over Time",
x = "Year Group (Student Group Code)",
y = "BASS Student Enrolment")
# Convert to interactive and push legend further down
ggplotly(bass_plot) %>%
layout(legend = list(orientation = "h",
x = 0.1,
y = -0.35)) # moved further down
We’ll look at total student numbers (not just BASS) across Student Group codes for each Unit Code.
This chart shows the trend in total student enrolments over time for a selected unit (e.g., POLI20902).
Use this view to:
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)
This helps you understand whether BASS student engagement with a specific unit is:
Show both:
Using the same selected_unit set earlier (e.g., “POLI20902”).
# 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:
This dual view helps identify whether the unit is becoming more or less BASS-focused over time either through rising enrolment or stronger representation.
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:
This helps flag:
# 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 |
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:
# 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 |
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:
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
)
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:
The table below lists these units, showing total enrolment, BASS numbers, and the percentage of BASS representation.
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
)
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:
The table below lists all units that fall into either extreme.
The scatter plot visualises the full dataset, highlighting:
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:
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
)
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)
)
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:
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`)))
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)
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:
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.
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.
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:
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
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)
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.
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
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:
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.