Estimated average age of young people leaving the parental household by sex - yth_demo_030

Data - Eurostat

Info

Last observation: Annual: 2025 (N = 99)

First observation: Annual: 2000 (N = 33)

Last data update: 11 aoû 2026, 19:50. Last compile: 12 aoû 2026, 04:06

Structure

Sweden, France, Italy, Spain

Code
yth_demo_030 |>
  filter(geo %in% c("SE", "FR", "IT", "ES"),
         sex == "T") |>
  year_to_date() |>

  left_join(colors, by = c("Geo" = "country")) |>
  ggplot() + geom_line(aes(x = date, y = values, color = color)) + theme_minimal() +
  scale_color_identity() + add_flags +
  scale_x_date(breaks = as.Date(paste0(seq(1990, 2100, 2), "-01-01")),
               labels = date_format("%Y")) +
  theme(legend.position = c(0.2, 0.85), legend.title = element_blank()) +
  xlab("") + ylab("Average age leaving the parental household")

France: Males vs. Females

Code
yth_demo_030 |>
  filter(geo == "FR",
         sex %in% c("F", "M")) |>
  year_to_date() |>
  ggplot() + geom_line(aes(x = date, y = values, color = Sex)) +
  theme_minimal() +
  scale_x_date(breaks = as.Date(paste0(seq(1990, 2100, 2), "-01-01")),
               labels = date_format("%Y")) +
  theme(legend.position = c(0.25, 0.85), legend.title = element_blank()) +
  xlab("") + ylab("Average age leaving the parental household, France")

Latest Year: Cross-Country Snapshot

Code
latest_y_yth <- yth_demo_030 |>
  filter(sex == "T",
         !is.na(values)) |>
  summarise(m = max(time)) |>
  pull(m)

yth_demo_030 |>
  filter(sex == "T",
         time == latest_y_yth,
         !geo %in% c("EA21", "EU27_2020")) |>
  select(Geo, values) |>
  rename(`Average age leaving parental household` = values) |>
  arrange(-`Average age leaving parental household`) |>
  print_table_conditional()

2018 Map

Code
europe_NUTS0_new <- yth_demo_030 |>
  filter(sex == "T",
         time == "2018") |>
  select(geo, values) |>
  right_join(europe_NUTS0 |>
               filter(long >= -10,
                      lat >= 20), by = "geo") |>
  group_by(geo, values) |>
  summarise(long = mean(long), lat = mean(lat))

yth_demo_030 |>
  filter(sex == "T",
         time == "2018") |>
  select(geo, values) |>
  right_join(europe_NUTS0 |>
               filter(long >= -10,
                      lat >= 20), by = "geo") |>
  ggplot(aes(x = long, y = lat)) +
  geom_polygon(aes(group = group, fill = values)) + coord_map() +
  scale_fill_viridis_c(na.value = "white",
                       labels = dollar_format(a = 1, p = "", su = ""),
                       breaks = seq(0, 80, 2)) +
  geom_text(aes(label = values), data = europe_NUTS0_new,  size = 3, hjust = 0.5) +
  theme_void() + theme(legend.position = c(0.25, 0.85)) + 
  labs(fill = "Average age of young people \nleaving the parental household")

Gif

Code
europe_NUTS0_new <- yth_demo_030 |>
  filter(sex == "T") |>
  mutate(year = as.integer(time)) |>
  select(geo, year, values) |>
  right_join(europe_NUTS0 |>
               filter(long >= -10,
                      lat >= 20), by = "geo") |>
  group_by(geo, year, values) |>
  summarise(long = mean(long), lat = mean(lat))

options(gganimate.nframes = 50, gganimate.end_pause = 10)
yth_demo_030 |>
  filter(sex == "T") |>
  mutate(year = as.integer(time)) |>
  select(year, geo, values) |>
  left_join(europe_NUTS0 |>
               filter(long >= -10,
                      lat >= 20), by = "geo") |>
  arrange(year) |>
  na.omit() |>
  ggplot(aes(x = long, y = lat)) +
  geom_polygon(aes(group = group, fill = values)) + coord_map() +
  scale_fill_viridis_c(na.value = "white",
                       labels = dollar_format(a = 1, p = "", su = ""),
                       breaks = seq(0, 80, 2)) +
  theme_void() + theme(legend.position = c(0.25, 0.85)) + 
  labs(fill = "Average age of young people \nleaving the parental household") + 
  {if(!is_latex_output())transition_time(year)} +
  {if(!is_latex_output())labs(title = "Year: {frame_time}")}