Gdzie mężczyźni żyją krócej

Oczekiwana długość życia w Europie systematycznie rośnie od wielu lat, jednak kobiety wciąż żyją dłużej niż mężczyźni w każdym europejskim kraju.
W tym wpisie wykorzystujemy dane Eurostatu z zestawu demo_mlexpec, by zilustrować tę różnicę w roku 2023 — odtwarzamy wykres z tego wpisu na X opublikowanego przez Stowarzyszenie na rzecz Chłopców i Mężczyzn.
W tym zadaniu korzystamy z pakietów eurostat, dplyr, tidyr i ggplot2:
-
pobieramy zestaw danych z Eurostatu,
-
filtrujemy dane (interesuje na oczekiwana długości życia przy urodzeniu: wiek < 1 rok),
-
liczymy różnicę między kobietami a mężczyznami (tzw. lukę),
-
a następnie przygotowujemy czytelną wizualizację.
Najpierw pobieramy dane z Eurostatu:
Kliknij, by zobaczyć kod
library(eurostat)
library(dplyr)
library(tidyr)
library(ggplot2)
life_df <- get_eurostat(id = "demo_mlexpec", time_format = "num")
life_df <- label_eurostat(life_df)
Następnie filtrujemy dane dla roku 2023, pozostawiamy jedynie informacje o długości życia kobiet i mężczyzn przy urodzeniu, obliczamy przewagę kobiet (różnicę w latach), sortujemy kraje według tej różnicy i usuwamy dane zagregowane — pozostawiając UE-27 jako punkt odniesienia.
Kliknij, by zobaczyć kod
df_gap <- life_df %>%
filter(TIME_PERIOD == 2023,
age == "Less than 1 year",
sex %in% c("Males", "Females")
) %>%
select(geo, sex, values) %>%
pivot_wider(names_from = sex, values_from = values) %>%
mutate(
gap = Females - Males) %>%
arrange(desc(gap))
df_gap$geo[df_gap$geo == "European Union - 27 countries (from 2020)"] <- "EU27"
df_gap <- df_gap[nchar(df_gap$geo) < 14,]
Na poniższym wykresie szare słupki przedstawiają oczekiwaną długość życia mężczyzn, zaś niebieskie słupki po lewej pokazują lukę – czyli o ile lat kobiety żyją dłużej.
Tym samym całkowita długość słupka (szary + niebieski) odpowiada oczekiwanej długości życia kobiet.
Kliknij, by zobaczyć kod
gap_plot <- ggplot(df_gap, aes(y = reorder(geo, gap))) +
geom_col(aes(x = Males), fill = "grey80", width = 0.7) +
geom_col(aes(x = -gap), fill = "#0033A0", width = 0.7) +
geom_text(
aes(x = -gap / 2, label = sprintf("%.1f", gap)), color = "white", size = 2, fontface = "bold") +
geom_text(aes(x = 3, label = sprintf("%.1f", Males)), hjust = 0, size = 2) +
expand_limits(y = nrow(df_gap) + 2) +
coord_cartesian(xlim = c(-max(df_gap$gap) - 2, max(df_gap$Males) + 5)) +
annotate(
"text",
x = -max(df_gap$gap) / 2,
y = nrow(df_gap) + 1,
label = "Female advantage",
fontface = "bold",
color = "#0033A0",
size = 2.5
) +
annotate(
"text",
x = max(df_gap$Males) / 2,
y = nrow(df_gap) + 1,
label = "Male life expectancy",
fontface = "bold",
color = "darkgrey",
size = 2.5
) +
labs(
title = "Male Life Expectancy and Female Advantage (Europe, 2023)",
x = "Life expectancy (years)",
y = NULL,
caption = "Source: Eurostat (demo_mlexpec)"
) +
scale_x_continuous(labels = function(x) abs(x)) +
theme_minimal() +
theme(
plot.title = element_text(face = "bold"),
panel.grid.major.y = element_blank(),
panel.grid.minor = element_blank(),
axis.title.y = element_blank(),
axis.text.y = element_text(size = 7)
)
gap_plot