<- PISA_2022 %>%
PISA_2022_food_poverty select(ST258Q01JA, CNT) %>%
filter(!is.na(ST258Q01JA))
<- PISA_2022_food_poverty %>%
never_counts group_by(CNT, ST258Q01JA) %>%
summarise(n = n()) %>%
mutate(prop_never = n / sum(n)) %>%
filter(ST258Q01JA == "Never or almost never") %>%
select(CNT, prop_never)
<- PISA_2022_food_poverty %>%
plot_data group_by(CNT, ST258Q01JA) %>%
summarise(n = n()) %>%
mutate(prop = n / sum(n)) %>%
left_join(never_counts, by = "CNT") %>%
mutate(CNT = factor(CNT, levels = never_counts$CNT[order(-never_counts$prop_never)])) %>%
filter(!is.na(CNT))
ggplot(plot_data, aes(x = CNT, y = prop, fill = ST258Q01JA)) +
geom_bar(stat = "identity") +
labs(x = "Country", y = "Proportion", fill = "Frequency") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 90, hjust = 1, size = 7)) +
scale_fill_brewer(palette = "Reds") +
theme(legend.position = "top", legend.text = element_text(size = 6))
Welcome to the 2025 STEM MA Quantitative methods in Educational Research Blog. Following the success of the blog last year we will continue to use the blog to publish student work from the MA module Quantitative methods in Educational Research. You can see the course book here MASTEMR
An example: Food poverty and achievement in PISA 2022 data
An item on the PISA 2022 survey (ST258Q01JA) asked respondents: “In the past 30 days, how often did you not eat because there was not enough money to buy food?” giving the following response options:
- “Never or almost never”
- “About once a week”
- “2 to 3 times a week”
- “4 to 5 times a week”
- “Every day or almost every day”
- (“Valid Skip” / “Not Applicable” / “Invalid” / “No Response”)
The missing responses were removed and the number of responses in the other categories counted and plotted by country.
The mean achievement score (across reading, science and mathematics) was calculated for each country and a mean food poverty score created (Where, “Never or almost never” ~ 0, “About once a week” ~ 1, …. “Every day or almost every day” ~ 4). The relationship between the mean food poverty score and the mean achievement score was then plotted by country.
<- PISA_2022 %>%
PISA_2022_food_poverty select(ST258Q01JA, PV1SCIE, PV1MATH, PV1READ, CNT) %>%
filter(!is.na(ST258Q01JA)) %>%
mutate(pv_overall = (PV1SCIE + PV1MATH + PV1READ) / 3) %>%
mutate(food_poverty = case_when(
== "Never or almost never" ~ 0,
ST258Q01JA == "About once a week" ~ 1,
ST258Q01JA == "2 to 3 times a week" ~ 2,
ST258Q01JA == "4 to 5 times a week" ~ 3,
ST258Q01JA == "Every day or almost every day" ~ 4,
ST258Q01JA .default = NA
%>%
)) group_by(CNT) %>%
summarise(mean_pv_overall = mean(pv_overall), mean_food_poverty = mean(food_poverty))
ggplot(PISA_2022_food_poverty, aes(y = mean_pv_overall, x = mean_food_poverty, colour = mean_food_poverty)) +
geom_point() +
geom_text_repel(aes(label = CNT), size = 2) +
labs(title = "Mean Food Poverty vs Overal PISA 2022 score", y = "PISA Overall Score", x = "Food Poverty") +
theme_minimal() +
theme(legend.position = "none")
The plot shows a broadly negative relationship between food poverty and achievement score, with countries with higher food poverty scores having lower achievement scores. The plot also shows that there is a wide range of achievement scores for countries with the same food poverty score, suggesting that other factors are also important in determining achievement scores.