Last data update: 19 Sep 2026, 18:53
Last compile: 19 Sep 2026, 19:36













`effectifs-salaries-ze` |>
group_by(dernier_jour_du_trimestre) |>
summarise(effectifs_salaries_cvs = sum(effectifs_salaries_cvs), .groups = "drop") |>
ggplot() + geom_line(aes(x = dernier_jour_du_trimestre, y = effectifs_salaries_cvs)) +
theme_minimal() + xlab("") + ylab("Effectifs salariés CVS") +
scale_x_date(date_breaks = "2 years", labels = date_format("%Y")) +
scale_y_continuous(labels = label_number(big.mark = " ")) +
theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1))
`effectifs-salaries-ze` |>
filter(dernier_jour_du_trimestre == max(dernier_jour_du_trimestre)) |>
slice_max(effectifs_salaries_cvs, n = 20) |>
mutate(zone_d_emploi = fct_reorder(zone_d_emploi, effectifs_salaries_cvs)) |>
ggplot() + geom_col(aes(x = zone_d_emploi, y = effectifs_salaries_cvs)) +
coord_flip() +
theme_minimal() + xlab("") + ylab("Effectifs salariés CVS") +
scale_y_continuous(labels = label_number(big.mark = " "))
date_max <- max(`effectifs-salaries-ze`$dernier_jour_du_trimestre)
date_min <- date_max %m-% years(5)
`effectifs-salaries-ze` |>
filter(dernier_jour_du_trimestre %in% c(date_min, date_max)) |>
select(code_zone_d_emploi, zone_d_emploi, region, dernier_jour_du_trimestre, effectifs_salaries_cvs) |>
mutate(periode = ifelse(dernier_jour_du_trimestre == date_max, "recent", "ancien")) |>
select(-dernier_jour_du_trimestre) |>
distinct(code_zone_d_emploi, periode, .keep_all = TRUE) |>
pivot_wider(names_from = periode, values_from = effectifs_salaries_cvs) |>
filter(!is.na(recent), !is.na(ancien)) |>
mutate(`Croissance 5 ans` = round(100 * (recent / ancien - 1), 1)) |>
arrange(-`Croissance 5 ans`) |>
rename(`Zone d'emploi` = zone_d_emploi, Région = region,
!!paste("Effectifs", format(date_min, "%Y")) := ancien,
!!paste("Effectifs", format(date_max, "%Y")) := recent) %>%
{if (is_html_output()) datatable(., filter = 'top', rownames = F) else .}Salaire moyen (masse salariale / effectifs), plutôt que le niveau des effectifs salariés : une mesure intensive, qui ne favorise pas mécaniquement les zones les plus peuplées.
# France métropolitaine uniquement (les DOM ont une projection Lambert 93
# dégénérée, très loin du cadrage métropole -- cf. data/maps/zones_emploi_2020.R)
ze_metropole <- zones_emploi_2020_details |>
filter(!CODE_REG %in% c("01", "02", "03", "04", "06")) |>
pull(CODE_ZE)
`effectifs-salaries-ze` |>
filter(dernier_jour_du_trimestre == max(dernier_jour_du_trimestre)) |>
group_by(code_zone_d_emploi) |>
summarise(masse_salariale_cvs = sum(masse_salariale_cvs, na.rm = TRUE),
effectifs_salaries_cvs = sum(effectifs_salaries_cvs, na.rm = TRUE),
.groups = "drop") |>
mutate(salaire_moyen = masse_salariale_cvs / effectifs_salaries_cvs / 3) |>
rename(CODE_ZE = code_zone_d_emploi) |>
right_join(zones_emploi_2020_details, by = "CODE_ZE") |>
right_join(zones_emploi_2020 |> filter(CODE_ZE %in% ze_metropole), by = "CODE_ZE") |>
ggplot() + aes(long, lat, group = group, subgroup = subgroup, fill = salaire_moyen) +
coord_equal() + theme_void() + geom_polygon(color = "white", linewidth = 0.1) +
scale_fill_viridis_c(na.value = "grey90",
labels = label_number(big.mark = " ", suffix = " €"),
name = "Salaire moyen\n(mensuel)") +
labs(x = "", y = "") +
theme(axis.text.x = element_blank(),
axis.text.y = element_blank())