Les salaires dans la fonction publique en 2024 - ECRT2026_F28

Données - INSEE

Figure 1 : salaires nets moyens en EQTP en 2024

Code
fig1 |>
  filter(is.na(section), caracteristique %in% c("Fonctionnaires", "Non-fonctionnaires (hors personnels médicaux)")) |>
  select(caracteristique, fpe_salaire, fpt_salaire, fph_salaire, ensemble_salaire) |>
  pivot_longer(-caracteristique, names_to = "fonction_publique", values_to = "salaire") |>
  mutate(fonction_publique = recode(fonction_publique, fpe_salaire = "État", fpt_salaire = "Territoriale",
                                     fph_salaire = "Hospitalière", ensemble_salaire = "Ensemble"),
         fonction_publique = fct_relevel(fonction_publique, "État", "Territoriale", "Hospitalière", "Ensemble")) |>
  ggplot(aes(x = fonction_publique, y = salaire, fill = caracteristique)) +
  geom_col(position = "dodge") +
  scale_fill_manual(values = c("Fonctionnaires" = "#1B3F8B", "Non-fonctionnaires (hors personnels médicaux)" = "#E8737A"),
                     name = NULL) +
  theme_minimal(base_size = 11) +
  labs(x = NULL, y = "€ par mois",
       title = "Salaire net moyen en EQTP, fonctionnaires vs. non-fonctionnaires",
       subtitle = "2024") +
  theme(legend.position = "bottom", panel.grid.minor = element_blank())

Code
fig1 |>
  filter(is.na(section), caracteristique %in% c("Fonctionnaires", "Catégorie A", "Catégorie B", "Catégorie C",
                                                  "Non-fonctionnaires (hors personnels médicaux)")) |>
  select(caracteristique, fpe_evolution, fpt_evolution, fph_evolution, ensemble_evolution) |>
  pivot_longer(-caracteristique, names_to = "fonction_publique", values_to = "evolution") |>
  mutate(fonction_publique = recode(fonction_publique, fpe_evolution = "État", fpt_evolution = "Territoriale",
                                     fph_evolution = "Hospitalière", ensemble_evolution = "Ensemble"),
         fonction_publique = fct_relevel(fonction_publique, "État", "Territoriale", "Hospitalière", "Ensemble"),
         caracteristique = fct_relevel(caracteristique, "Catégorie A", "Catégorie B", "Catégorie C",
                                        "Fonctionnaires", "Non-fonctionnaires (hors personnels médicaux)")) |>
  ggplot(aes(x = caracteristique, y = evolution, fill = fonction_publique)) +
  geom_col(position = "dodge") +
  geom_hline(yintercept = 0, color = "grey30") +
  coord_flip() +
  scale_fill_brewer(palette = "Set2", name = NULL) +
  theme_minimal(base_size = 9) +
  labs(x = NULL, y = "% (euros constants, IPC)",
       title = "Évolution du salaire net moyen en EQTP entre 2023 et 2024",
       subtitle = "en euros constants au sens de l'IPC") +
  theme(legend.position = "bottom", panel.grid.minor = element_blank())

Figure 2a : salaires dans la fonction publique de l’État depuis 2000

Code
fig2a |>
  select(annee, all_of(names(categories_labels))) |>
  pivot_longer(-annee, names_to = "categorie", values_to = "salaire") |>
  filter(!is.na(salaire)) |>
  mutate(categorie = recode(categorie, !!!categories_labels),
         categorie = fct_relevel(categorie, unname(categories_labels))) |>
  ggplot(aes(x = annee, y = salaire, color = categorie)) +
  geom_line(linewidth = 1) +
  scale_color_brewer(palette = "Set1", name = NULL) +
  theme_minimal(base_size = 10) +
  labs(x = NULL, y = "€ 2024",
       title = "Salaires nets moyens en EQTP, fonction publique de l'État",
       subtitle = "euros constants (IPC), depuis 2000") +
  theme(legend.position = "bottom", panel.grid.minor = element_blank()) +
  guides(color = guide_legend(ncol = 2))

Code
plot_ipc_vs_ipch(fig2a, "Salaire réel dans la fonction publique de l'État depuis 2000")

Figure 2b : salaires dans la fonction publique territoriale depuis 2000

Code
fig2b |>
  select(annee, all_of(names(categories_labels))) |>
  pivot_longer(-annee, names_to = "categorie", values_to = "salaire") |>
  filter(!is.na(salaire)) |>
  mutate(categorie = recode(categorie, !!!categories_labels),
         categorie = fct_relevel(categorie, unname(categories_labels))) |>
  ggplot(aes(x = annee, y = salaire, color = categorie)) +
  geom_line(linewidth = 1) +
  scale_color_brewer(palette = "Set1", name = NULL) +
  theme_minimal(base_size = 10) +
  labs(x = NULL, y = "€ 2024",
       title = "Salaires nets moyens en EQTP, fonction publique territoriale",
       subtitle = "euros constants (IPC), depuis 2000") +
  theme(legend.position = "bottom", panel.grid.minor = element_blank()) +
  guides(color = guide_legend(ncol = 2))

Code
plot_ipc_vs_ipch(fig2b, "Salaire réel dans la fonction publique territoriale depuis 2000")

Figure 2c : salaires dans la fonction publique hospitalière depuis 2011

Code
fig2c |>
  select(annee, all_of(names(categories_labels))) |>
  pivot_longer(-annee, names_to = "categorie", values_to = "salaire") |>
  filter(!is.na(salaire)) |>
  mutate(categorie = recode(categorie, !!!categories_labels),
         categorie = fct_relevel(categorie, unname(categories_labels))) |>
  ggplot(aes(x = annee, y = salaire, color = categorie)) +
  geom_line(linewidth = 1) +
  scale_color_brewer(palette = "Set1", name = NULL) +
  theme_minimal(base_size = 10) +
  labs(x = NULL, y = "€ 2024",
       title = "Salaires nets moyens en EQTP, fonction publique hospitalière",
       subtitle = "euros constants (IPC), depuis 2011") +
  theme(legend.position = "bottom", panel.grid.minor = element_blank()) +
  guides(color = guide_legend(ncol = 2))

Code
plot_ipc_vs_ipch(fig2c, "Salaire réel dans la fonction publique hospitalière depuis 2011")

Code
fig2c |>
  filter(!is.na(personnels_medicaux)) |>
  ggplot(aes(x = annee, y = personnels_medicaux)) +
  geom_line(linewidth = 1, color = "#1B3F8B") +
  theme_minimal(base_size = 11) +
  labs(x = NULL, y = "€ 2024",
       title = "Salaire net moyen en EQTP des personnels médicaux",
       subtitle = "fonction publique hospitalière, euros constants (IPC), depuis 2011") +
  theme(panel.grid.minor = element_blank())

Figure 3 : rémunération des personnes en place en 2024 et 2023

Code
fig3 |>
  filter(caracteristique %in% c("Ensemble, dont :", "Fonctionnaires",
                                 "Non-fonctionnaires (hors personnels médicaux)")) |>
  select(caracteristique, fpe_evolution, fpt_evolution, fph_evolution, ensemble_evolution) |>
  pivot_longer(-caracteristique, names_to = "fonction_publique", values_to = "evolution") |>
  mutate(fonction_publique = recode(fonction_publique, fpe_evolution = "État", fpt_evolution = "Territoriale",
                                     fph_evolution = "Hospitalière", ensemble_evolution = "Ensemble"),
         fonction_publique = fct_relevel(fonction_publique, "État", "Territoriale", "Hospitalière", "Ensemble"),
         caracteristique = recode(caracteristique, "Ensemble, dont :" = "Ensemble")) |>
  ggplot(aes(x = fonction_publique, y = evolution, fill = caracteristique)) +
  geom_col(position = "dodge") +
  scale_fill_brewer(palette = "Set2", name = NULL) +
  theme_minimal(base_size = 11) +
  labs(x = NULL, y = "% (euros constants, IPC)",
       title = "Évolution du salaire net moyen des personnes en place en 2023 et 2024",
       subtitle = "en euros constants au sens de l'IPC") +
  theme(legend.position = "bottom", panel.grid.minor = element_blank())

Code
fig3 |>
  filter(caracteristique %in% c("Ensemble, dont :", "Fonctionnaires",
                                 "Non-fonctionnaires (hors personnels médicaux)")) |>
  select(caracteristique, fpe_part, fpt_part, fph_part, ensemble_part) |>
  pivot_longer(-caracteristique, names_to = "fonction_publique", values_to = "part") |>
  mutate(fonction_publique = recode(fonction_publique, fpe_part = "État", fpt_part = "Territoriale",
                                     fph_part = "Hospitalière", ensemble_part = "Ensemble"),
         fonction_publique = fct_relevel(fonction_publique, "État", "Territoriale", "Hospitalière", "Ensemble"),
         caracteristique = recode(caracteristique, "Ensemble, dont :" = "Ensemble")) |>
  ggplot(aes(x = fonction_publique, y = part, fill = caracteristique)) +
  geom_col(position = "dodge") +
  scale_fill_brewer(palette = "Set2", name = NULL) +
  theme_minimal(base_size = 11) +
  labs(x = NULL, y = "%",
       title = "Part des effectifs 2024 présents en 2023",
       subtitle = "2023-2024") +
  theme(legend.position = "bottom", panel.grid.minor = element_blank())