Birth control availability was a liberating step towards women having full control of their reproduction. However, female contraceptives being the most effective birth control means that women have to put up with an extensive list of side effects with no equivalent male alternatives. In recent years, health risks associated with hormonal contraceptive usage started being discussed more [1]. Social media plays a significant role in shaping opinions about hormonal contraceptives and in turn their decline in various Western countries [2]. Female contraceptives have been critiqued for their extensive list of side effects. In contrast, the dismissive attitude of general health practitioners when it comes to contraceptive choice has sparked distrust [2].
Nevertheless, female contraceptives remain the most reliable way to prevent unwanted pregnancy [3]. The changes in birth control usage probe the question of how this correlates with further measures to terminate unwanted pregnancies. This report will explore female contraceptive trends in Scotland between 2018 and 2023 and look at how this trend correlated with pregnancy termination statistics.
AIMS of this report:
Abortion and prescription data used in this report has been obtained from Public Health Scotland. For showing the contraceptive usage trend in 8 years all age data was used that includes females under 20 to females over 40.
To ensure comparable figures between different boards the number of pregnancy termination events was calculated per 1000 women in the health board per 2022 Census data (Scotland’s Census 2022 - National Records of Scotland Table UV102a - Age (single year) by sex). While the total population might change over the years we are expecting that the change won’t be significant to impact the overall trends. Only women of biological reproductive age were included as the members of this group were the most likely to get pregnant. The chosen reproductive age span was from 13 (average age of first menstruation) to 50 (average age of natural menopause) [4].
# Health board name and codes selected
health_boards <- read_csv("https://www.opendata.nhs.scot/dataset/9f942fdb-e59e-44f5-b534-d6e17229cc7b/resource/652ff726-e676-4a20-abda-435b98dd7bdc/download/hb14_hb19.csv") %>%
clean_names() %>%
select(hb, hb_name)
# Combined Boards for NHS Orkney, NHS Shetland and NHS Western Isles that represent the Islands group
other_health_boards <- read_csv("https://www.opendata.nhs.scot/dataset/65402d20-f0f1-4cee-a4f9-a960ca560444/resource/8f0c3067-7b10-44c6-af36-37f87a9e6efa/download/grouped-geography.csv") %>%
clean_names() %>%
rename(hb_name = "grouped_geography_name", hb = "grouped_geography") %>%
select(hb_name, hb)
# add Islands heath board to the main list
health_boards <- bind_rows(health_boards, other_health_boards)
# get health board population data and extract female of reproductive age population numbers for each health board
health_board_population <- read_csv(here( "data", "Table_UV102a_Age_by_sex.csv"), skip = 10) %>%
clean_names() %>%
rename(hb_name = "health_board_area_2019") %>%
filter(age %in% c(13:50), sex == "Female") %>%
group_by(hb_name) %>%
summarise(female_repro_population = sum(count)) %>%
mutate(hb_name = paste("NHS", hb_name))
## Warning: One or more parsing issues, call `problems()` on your data frame for details,
## e.g.:
## dat <- vroom(...)
## problems(dat)
boards_to_sum <- c("NHS Orkney", "NHS Shetland", "NHS Western Isles")
# Calculate the population for the Islands board
islands_population <- health_board_population %>%
filter(hb_name %in% boards_to_sum) %>%
summarise(total_population = sum(female_repro_population, na.rm = TRUE)) %>%
pull(total_population)
# combining health board names and populations, removing NHS from Health board name, and adding Islands population
health_board_population <- full_join(health_board_population, health_boards, by = "hb_name") %>%
mutate(hb_name = str_remove(hb_name, "NHS ")) %>%
mutate(female_repro_population = case_when(hb_name == "Island Boards" ~ islands_population, .default = female_repro_population))
# data on abortion 2016-2023
abortion_data <- read_csv("https://www.opendata.nhs.scot/dataset/d684d4a5-f7ae-4a1a-ae8d-adf55304274e/resource/342f9627-dfdd-41f5-a27c-0a3c7bcb8672/download/residence_age_2023.csv") %>%
clean_names() %>%
rename(hb = "hbr", year = "yearof_termination") %>%
filter(age_group == "All Ages") %>%
select(year, hb, numberof_terminations) %>%
left_join(health_board_population, by = "hb") %>%
mutate(abortion_per_1000_women = numberof_terminations/female_repro_population * 1000) %>%
filter(!is.na(hb_name)) %>%
filter(year %in% c(2016:2023))
Prescription data has been filtered based on the BNF item code. Codes beginning with 0703 and 21040 were selected as representing contraceptive medication and devices. The data was then further divided into long-term contraceptives (IUD, coil, and implant) lasting several years and short-term contraceptives that have to be taken regularly (oral tablets, cervical caps, and injections). The division was based on the BNF codes with 0703022P representing implants, 0703023 representing IUDs, and 210400002 representing copper coils. The remaining birth control was assigned to the short-term category. Same as abortion data the contraceptive data was normalised by women of reproductive age number in the health board for health board comparison.
columns_needed_from_prescription <- c("BNFItemCode", "NumberOfPaidItems", "HBT", "HBT2014", "PaidDateMonth")
read_and_clean <- function(url) {
# only columns with prescription drug name, health board, and number of items paid selected
# older data files have column named HBT2014, newer have HBT
data <- vroom(url, col_select = any_of(c(columns_needed_from_prescription)), skip_empty_rows = TRUE)
#data filtered for contraceptives (including contraceptive devices) only (based on the BNF code)
data_filtered <- data %>%
filter(str_starts(BNFItemCode, "0703") | str_starts(BNFItemCode, "21040")) %>%
clean_names() %>%
rename(year = "paid_date_month") %>%
mutate(year = as.numeric(substr(as.character(year), 1, 4)))
colnames(data_filtered)[3] ="hb"
# assign function used to create an object with the name of the url from named list and assign preprocessed data to it
name <- names(prescription_data_urls)[which(prescription_data_urls == url)]
assign(name, data_filtered, envir = .GlobalEnv)
}
# apply the outlined function to all data urls in named list or URLs -> prescription_data_urls
lapply(prescription_data_urls, read_and_clean)
# join full prescription dataset with health board names and women populations
full_prescirption_dataset <- bind_rows(mget(names(prescription_data_urls))) %>%
left_join(health_board_population, by = "hb") %>%
mutate(type = case_when(str_detect(bnf_item_code, "0703022P|0703023|210400002") ~ "long-term", .default = "short-term"))
# contraceptives per 1000 women of reproductive age for each health board added as a new column
contraception_data_hb <- full_prescirption_dataset %>%
group_by(year, hb_name, female_repro_population) %>%
summarise(total_contraceptives_per_hb=sum(number_of_paid_items)) %>%
select(-female_repro_population)
# total contraceptives for all health boards representing Islands health board for each year
boards_to_sum <- str_remove(boards_to_sum, "NHS ")
islands_contraceptives <- full_prescirption_dataset %>%
filter(hb_name %in% boards_to_sum) %>%
group_by(year) %>%
summarise(total_contraceptives_per_hb = sum(number_of_paid_items)) %>%
mutate(hb_name = "Island Boards")
# contraception data combined with Islands health board totals
contraception_data_hb <- bind_rows(contraception_data_hb,islands_contraceptives)
#combined dataframe created from abortion data and contraception data
combined_data <- left_join(abortion_data, contraception_data_hb, by = c("year", "hb_name")) %>%
select(year, hb_name, abortion_per_1000_women, total_contraceptives_per_hb, female_repro_population) %>%
mutate(contraceptives_per_1000_women = total_contraceptives_per_hb/female_repro_population*1000)
It has been shown that over the past 8 years, there has been a decline in combined oral contraceptives being prescribed while the progesterone-only pill prescriptions increased [5]. While it shows that women’s preference might be shifting away from estrogen-containing products it doesn’t tell much about the overall trend in contraceptive usage.
Figure 1 shows values normalised to 2016 for long-term and short-term contraceptives. There seems to be a nationwide decline in birth control usage for both types of contraceptives. It can be seen that short-term contraception has been on a consistent decline over the past 8 years. COVID-19 doesn’t seem to have had a significant impact on these prescriptions. However, COVID-19 hindered access to long-term contraceptives. That is likely because the application of intravaginal devices and implants requires medical professionals and during COVID-19 clinics’ had to focus their resources on emergency medical care.
Because of the strong COVID-19 effect on long-term contraceptives, it is difficult to see its overall trend. In years before the COVID-19 pandemic, there was a downward trend from 2016 to 2018 but contraception usage spiked in 2019 for both types of contraceptives. It is unclear whether long-term contraceptive use would have continued to increase if the pandemic didn’t happen. However, it doesn’t look like the decline in short-term contraceptive usage can be explained by the shift towards long-term options since trends for both types are very similar outside of the COVID-19 pandemic period. This trend might be explained by so-called “hormonophobia” [1]. Most of the female contraceptives contain hormones and people, in recent years, are increasingly worried about their side effects.
base_theme <- theme_classic() + #base these for all upcoming plots created
theme(plot.title = element_text(size = 13, hjust = 0, face = "bold", margin = margin(10, 10, 10, 10)),
axis.title.x = element_text(size = 11, margin = margin(10, 0, 0, 0)),
axis.title.y = element_text(size = 11, margin = margin(0, 10, 0, 0))
)
full_prescirption_dataset %>%
group_by(year, type) %>%
summarise(total = sum(number_of_paid_items, na.rm = TRUE), groups = 'drop') %>%
group_by(type) %>%
mutate(total_2016 = total[year == 2016], total_normalised = total / total_2016) %>%
ggplot(aes(y = total_normalised, x = year, colour = type)) +
geom_line(linewidth = 2) +
geom_point(size = 3) +
geom_vline(xintercept = c(2020,2022), color="grey", linewidth=.5, linetype = "dashed") +
scale_x_continuous(breaks=c(2016:2023)) +
base_theme +
labs(title = "Normalised prescription of long-term and short-term contraceptives", x = "Year", y = "Normalised value of items dispensed per year", colour = "Legend") +
annotate(geom="text", x=2021, y=1, label="COVID period", colour = "#71797E")
Fig. 1: Normalised prescription of long-term and short-term contraceptives
A negative trend in contraceptive usage can be seen across all health boards (Fig. 2). Most of the health boards have very similar use rates and contraception trends, except for Lothian and Dumfries and Galloway. Lothian has a significantly lower dispensation of contraceptives, while Dumfries and Galloway have substantially higher. Further analysis is needed to better understand the reasons behind these differences. An important aspect to explore in future studies is whether the deprivation levels in the region might be causing these differences.
# dataframe created with duplicated health board column with different name to allow for plotting all healthboards in grey and one highlighted in each facet grid
plot_prescription <- combined_data %>%
ungroup() %>%
mutate(hb_name1 = hb_name) %>%
select(-hb_name)
color_vector <- setNames(cols25(length(unique(combined_data$hb_name))), unique(combined_data$hb_name))
ggplot() +
geom_line(data=plot_prescription , aes(group=hb_name1, y = contraceptives_per_1000_women, x = year), color="grey", linewidth=0.5, alpha=0.5) +
geom_line(data = combined_data, aes(color = hb_name, y = contraceptives_per_1000_women, x = year), linewidth=1.2 ) +
geom_point(data = combined_data, aes(color = hb_name, y = contraceptives_per_1000_women, x = year), size=1.2 ) +
base_theme +
theme(legend.position="none",
strip.text.x = element_text(size = 10, face = "bold"),
strip.background = element_rect(color=NA, fill=NA)) +
labs(title = "Contraceptive item prescription across NHS Scotland boards", x = "Year", y = "Number of items per 1000 women") +
facet_wrap(~hb_name, nrow = 3, labeller = label_wrap_gen(18)) +
scale_colour_manual(values = color_vector)
Fig. 2: Contraceptives prescription in each NHS Scotland health board
# get a difference of 2016 and 2023 for each board
combined_data_2016_2023_diff <- combined_data %>%
filter(year %in% c(2016, 2023)) %>%
group_by(hb_name) %>%
summarise(diff_contr = contraceptives_per_1000_women[year == 2023] - contraceptives_per_1000_women[year == 2016], diff_abor = abortion_per_1000_women[year == 2023] - abortion_per_1000_women[year == 2016])
Table 1 shows a change from 2016 to 2023 in dispensed contraceptives and number of pregnancies terminated for each health board in Scotland. Values higher than the mean are highlighted in red. It can be seen that all health boards experienced an increase in the number of terminated pregnancies with Lanarkshire having almost double the average of an increase. Therefore, there is a decrease in contraception use and an increase in pregnancy terminations. This leads to our next aim to explore if there is a correlation between these trends.
combined_data_2016_2023_diff %>%
gt() %>%
tab_header(title = md("**Table 1.** Change in Abortion and Contraceptives Prescription Rate Across Scotland Health Boards from 2016 to 2023"), subtitle = "Values higher than the mean are highlighted in red.") %>%
cols_label(diff_abor = md("**Abortion Rate Change**"), diff_contr = md("**Contraceptives Rate Change**"), hb_name = md("**Health Board**"))%>%
cols_align(align = "center", columns = c(diff_abor, diff_contr)) %>%
tab_spanner(label = "Calculated per 1000 of women", columns = c("diff_abor", "diff_contr")) %>%
grand_summary_rows(columns = c(diff_abor, diff_contr), fns = list("Overall Mean Change" = ~mean(., na.rm = TRUE)), fmt = list(~ fmt_number(., decimals = 2))) %>%
fmt_number(columns = everything(), decimals = 2) %>%
opt_align_table_header(align = "left") %>%
tab_style(locations = cells_body(columns = `diff_abor`,rows = `diff_abor` > mean(diff_abor)),
style = list(cell_text(color = 'red'))) %>%
tab_style(locations = cells_body(columns = `diff_contr`, rows = `diff_contr` < mean(diff_contr)),
style = list(cell_text(color = 'red'))) %>%
tab_options(table.font.size = "small")
| Table 1. Change in Abortion and Contraceptives Prescription Rate Across Scotland Health Boards from 2016 to 2023 | |||
| Values higher than the mean are highlighted in red. | |||
| Health Board |
Calculated per 1000 of women
|
||
|---|---|---|---|
| Abortion Rate Change | Contraceptives Rate Change | ||
| Ayrshire and Arran | 3.32 | −112.69 | |
| Borders | 2.86 | −69.19 | |
| Dumfries and Galloway | 3.42 | −85.83 | |
| Fife | 1.64 | −93.89 | |
| Forth Valley | 3.79 | −62.21 | |
| Grampian | 4.33 | −185.14 | |
| Greater Glasgow and Clyde | 5.71 | −104.85 | |
| Highland | 3.30 | −115.92 | |
| Island Boards | 3.14 | −147.87 | |
| Lanarkshire | 7.24 | −122.82 | |
| Lothian | 4.38 | −103.57 | |
| Tayside | 5.30 | −107.44 | |
| Overall Mean Change | — | 4.03 | −109.29 |
Each coloured point in Figure 3 represents a data value from a single year, plotted with abortion rates on the y-axis and contraceptive use on the x-axis. Abortion decreases in all health boards when contraceptive prescriptions increase. However, several health boards stand out with slightly different rates from other boards. Dumfries and Galloway has been mentioned before as the board with the highest contraceptive consumption. Interestingly, the abortion rate in this region doesn’t seem to deviate from the values of the cluster of other boards. On the other hand, the Islands have much lower contraceptive use compared to Dumfries and Galloway but have around half of the abortions. Lothian, with the lowest usage of contraceptives, doesn’t display much higher abortion rates. Therefore, abortion rate and contraceptive usage correlate within health boards but such consensus is not maintained across health boards.
combined_data %>%
ggplot(aes(x = contraceptives_per_1000_women, y = abortion_per_1000_women, colour = hb_name)) +
geom_point(size = 1) +
geom_smooth(method = "lm", se = FALSE, aes(colour = hb_name)) +
theme_classic() +
base_theme +
labs( title = "Contraceptives and Abortion Trends between 2016 and 2023", x = "Total Contraceptives per year", y = "Total Abortion per year", colour = "Health Boards"
) +
scale_colour_manual(values = color_vector)
Fig 3. Correlation between aboirtion and ocntraception figures in each health board
To better understand the changes over the 8 years discussed in this it is crucial to examine the reasons these changes occur. A decline in contraception use might be a direct outcome of social media portrayal of hormonal contraceptives. However, it is not fully understood what other reasons might encourage people to stop using contraception. This report showcases the negative relationship between contraception use and termination of pregnancy occurrence, however, the outlined relationship is not necessarily fatalistically significant. This needs to be explored further to draw more solid conclusions. The relationship between contraceptive use and the number of pregnancy termination procedures might be indirect and influenced by a measure now reflected in the data. Therefore, further analysis is important to understand these trends. Nevertheless, understanding which health boards need further inspection allows a proportionate distribution of resources to tackle these issues.
M. L. Guen, C. Schantz, A. Régnier-Loilier, E. de L. Rochebrochard, Social Science & Medicine. 284, 114247 (2021).
A. Schneider-Kamp, J. Takhar, Social Science & Medicine. 331, 116081 (2023).
P. I. Diana Mansour, K. Gemzell-Danielsson, The European Journal of Contraception & Reproductive Health Care. 15, 4–16 (2010).
A. F. Nabhan et al., Human Reproduction Open. 2022, hoac005 (2022).
E. Johnson-Hall, BMJ Sexual & Reproductive Health (2024).