Last data update: 19 Sep 2026, 18:59
Last compile: 19 Sep 2026, 19:49
Salaire moyen (masse salariale / effectifs, ramené au mois), plutôt que le niveau des effectifs salariés : une mesure intensive, qui ne favorise pas mécaniquement les zones les plus peuplées. Une carte par région métropolitaine, zoomée sur son emprise, avec le nom de chaque zone d’emploi.













# 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)
`etab-effectifs-ms-ze` |>
filter(annee == max(annee)) |>
group_by(code_zone_d_emploi) |>
summarise(masse_salariale = sum(masse_salariale, na.rm = TRUE),
effectifs_salaries_moyens = sum(effectifs_salaries_moyens, na.rm = TRUE),
.groups = "drop") |>
mutate(salaire_moyen = masse_salariale / effectifs_salaries_moyens / 12) |>
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())
`etab-effectifs-ms-ze` |>
group_by(annee) |>
summarise(effectifs_salaries_moyens = sum(effectifs_salaries_moyens, na.rm = TRUE),
nombre_d_etablissements = sum(nombre_d_etablissements, na.rm = TRUE),
.groups = "drop") |>
select(annee, `Effectifs salariés` = effectifs_salaries_moyens,
`Établissements` = nombre_d_etablissements) |>
gather(variable, value, -annee) |>
ggplot() + geom_line(aes(x = annee, y = value)) +
facet_wrap(~variable, scales = "free_y", ncol = 1) +
theme_minimal() + xlab("") + ylab("") +
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))
`etab-effectifs-ms-ze` |>
filter(annee == max(annee)) |>
slice_max(effectifs_salaries_moyens, n = 20) |>
mutate(zone_d_emploi = fct_reorder(zone_d_emploi, effectifs_salaries_moyens)) |>
ggplot() + geom_col(aes(x = zone_d_emploi, y = effectifs_salaries_moyens)) +
coord_flip() +
theme_minimal() + xlab("") + ylab("Effectifs salariés moyens") +
scale_y_continuous(labels = label_number(big.mark = " "))
annee_max <- max(`etab-effectifs-ms-ze`$annee)
annee_min <- annee_max %m-% years(5)
`etab-effectifs-ms-ze` |>
filter(annee %in% c(annee_min, annee_max)) |>
select(code_zone_d_emploi, zone_d_emploi, region, annee, effectifs_salaries_moyens) |>
mutate(periode = ifelse(annee == annee_max, "recent", "ancien")) |>
select(-annee) |>
distinct(code_zone_d_emploi, periode, .keep_all = TRUE) |>
pivot_wider(names_from = periode, values_from = effectifs_salaries_moyens) |>
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(annee_min, "%Y")) := ancien,
!!paste("Effectifs", format(annee_max, "%Y")) := recent) %>%
{if (is_html_output()) datatable(., filter = 'top', rownames = F) else .}