Les ZFE renforcent le verdissement du parc automobile et contribuent au recul de ses émissions polluantes - IA124

Données - INSEE

Figure 1 : répartition des catégories Crit’Air dans le parc de voitures

Code
fig1 |>
  mutate(zone = factor(zone, levels = zones_levels), annee = factor(annee)) |>
  ggplot(aes(x = annee, y = part, fill = critair)) +
  geom_col(position = position_stack(reverse = TRUE)) +
  facet_wrap(~ zone, ncol = 3) +
  scale_fill_manual(values = c("1 et électrique (E)" = "#1B3F8B", "2" = "#8FB0DE",
                                "3" = "#E8C547", "4" = "#E8737A", "5 et non classé" = "#8B0000"),
                     name = "Crit'Air") +
  theme_minimal(base_size = 11) +
  labs(x = NULL, y = NULL,
       title = "Répartition des catégories Crit'Air dans le parc de voitures",
       subtitle = "2015 vs 2025, selon le type d'intercommunalité (%)") +
  theme(legend.position = "bottom",
        panel.grid.minor = element_blank(),
        panel.grid.major.x = element_blank())

Figure 2 : évolution des émissions polluantes des voitures, 2014-2024

Code
fig2 |>
  mutate(zone = str_remove(zone, "¹"), zone = factor(zone, levels = zones_levels)) |>
  ggplot(aes(x = zone, y = evolution_pct, fill = polluant)) +
  geom_col(position = position_dodge(width = 0.8), width = 0.7) +
  geom_hline(yintercept = 0, color = "grey40", linewidth = 0.4) +
  coord_flip() +
  scale_fill_brewer(palette = "Set2", name = NULL) +
  theme_minimal(base_size = 12) +
  labs(x = NULL, y = "Évolution 2014-2024 (%)",
       title = "Évolution des émissions polluantes des voitures",
       subtitle = "entre 2014 et 2024, selon le type d'intercommunalité") +
  theme(legend.position = "bottom",
        panel.grid.minor = element_blank(),
        panel.grid.major.y = element_blank())

Figure 3 : effet des ZFE sur le parc de voitures, par catégorie Crit’Air

Estimation en différence de différences : variation observée du parc en ZFE comparée à une évolution contrefactuelle (ce qui se serait passé sans ZFE) ; l’écart entre les deux est l’« effet de la ZFE », avec son intervalle de confiance.

Code
fig3 |>
  select(critair, `Observée (avec ZFE)` = variation_observee,
         `Contrefactuelle (sans ZFE)` = variation_contrefactuelle) |>
  pivot_longer(-critair, names_to = "scenario", values_to = "variation") |>
  ggplot(aes(x = critair, y = variation, fill = scenario)) +
  geom_col(position = position_dodge(width = 0.75), width = 0.7) +
  geom_hline(yintercept = 0, color = "grey40", linewidth = 0.4) +
  scale_fill_manual(values = c("Observée (avec ZFE)" = "#1B3F8B",
                                "Contrefactuelle (sans ZFE)" = "#8FB0DE"), name = NULL) +
  theme_minimal(base_size = 13) +
  labs(x = "Catégorie Crit'Air", y = "Variation du parc (%)",
       title = "Évolution du parc de voitures, observée vs contrefactuelle",
       subtitle = "entre trois ans avant et deux ans après la mise en place de la ZFE") +
  theme(legend.position = "bottom",
        panel.grid.minor = element_blank(),
        panel.grid.major.x = element_blank())

Effet estimé de la ZFE (en points de pourcentage)

Code
fig3 |>
  filter(!is.na(effet_zfe)) |>
  # Seule la contrefactuelle est estimée (modèle) ; l'observée vient du
  # registre RSVERO (comptage, pas d'incertitude d'échantillonnage) -- l'IC de
  # l'effet (observée - contrefactuelle) hérite donc directement de l'IC de la
  # contrefactuelle, translaté par la valeur observée.
  mutate(effet_ic_inf = variation_observee - ic_sup,
         effet_ic_sup = variation_observee - ic_inf) |>
  ggplot(aes(x = critair, y = effet_zfe)) +
  geom_hline(yintercept = 0, linetype = "dashed", color = "grey50") +
  geom_pointrange(aes(ymin = effet_ic_inf, ymax = effet_ic_sup),
                   color = "#1B3F8B", size = 0.8) +
  theme_minimal(base_size = 13) +
  labs(x = "Catégorie Crit'Air", y = "Effet de la ZFE (points de %)",
       title = "Effet de la ZFE sur le parc de voitures, par catégorie Crit'Air",
       subtitle = "estimation en différence de différences ; barres = intervalle de confiance") +
  theme(panel.grid.minor = element_blank())

Figure 4 : effet des ZFE sur les émissions polluantes des voitures

Code
fig4 |>
  select(polluant, `Observée (avec ZFE)` = variation_observee,
         `Contrefactuelle (sans ZFE)` = variation_contrefactuelle) |>
  pivot_longer(-polluant, names_to = "scenario", values_to = "variation") |>
  ggplot(aes(x = polluant, y = variation, fill = scenario)) +
  geom_col(position = position_dodge(width = 0.75), width = 0.7) +
  geom_hline(yintercept = 0, color = "grey40", linewidth = 0.4) +
  coord_flip() +
  scale_fill_manual(values = c("Observée (avec ZFE)" = "#1B3F8B",
                                "Contrefactuelle (sans ZFE)" = "#8FB0DE"), name = NULL) +
  theme_minimal(base_size = 13) +
  labs(x = NULL, y = "Évolution des émissions (%)",
       title = "Évolution des émissions polluantes, observée vs contrefactuelle",
       subtitle = "entre trois ans avant et deux ans après la mise en place de la ZFE") +
  theme(legend.position = "bottom",
        panel.grid.minor = element_blank(),
        panel.grid.major.y = element_blank())

Effet estimé de la ZFE (en points de pourcentage)

Code
fig4 |>
  mutate(effet_ic_inf = variation_observee - ic_sup,
         effet_ic_sup = variation_observee - ic_inf) |>
  ggplot(aes(x = polluant, y = effet_zfe)) +
  geom_hline(yintercept = 0, linetype = "dashed", color = "grey50") +
  geom_pointrange(aes(ymin = effet_ic_inf, ymax = effet_ic_sup),
                   color = "#E8737A", size = 0.8) +
  coord_flip() +
  theme_minimal(base_size = 13) +
  labs(x = NULL, y = "Effet de la ZFE (points de %)",
       title = "Effet de la ZFE sur les émissions polluantes, par polluant",
       subtitle = "estimation en différence de différences ; barres = intervalle de confiance") +
  theme(panel.grid.minor = element_blank())