1 Préparation

1.1 Objectif & sources

Ce document analyse les finances de la Métropole de Lyon à partir de la base OFGL au format BP / BA / Consolidé.

L’analyse est structurée en trois périmètres : 1. Budget principal (BP) 2. Budgets annexes (BA) 3. Budget consolidé (CONSO)

Pour chaque périmètre, on déroule : - Indicateurs de gestion (CAF/épargne, rigidité, investissement, dette…) - Investissement : dépenses & recettes (tables avec total + détail + contrôle de somme) - Fonctionnement : dépenses & recettes (tables avec total + détail + contrôle de somme)

1.2 Chargement des bases (RDS préparés en amont)

Pré-requis : exécuter le script .R de préparation qui lit
data/ofgl-base-gfp-consolidee-METLYON.xlsx et génère output/df_metropole_conso.rds.

# WD = dossier du Rmd (si exécution sous RStudio)
if (requireNamespace("rstudioapi", quietly = TRUE) &&
    rstudioapi::isAvailable() &&
    nzchar(rstudioapi::getActiveDocumentContext()$path)) {
  setwd(dirname(rstudioapi::getActiveDocumentContext()$path))
}

out_dir <- "output"
df_metropole_conso <- readRDS(file.path(out_dir, "df_metropole_conso.rds"))
dplyr::glimpse(df_metropole_conso)
## Rows: 405
## Columns: 39
## $ exercice                              <int> 2017, 2017, 2017, 2017, 2017, 20…
## $ outre_mer                             <chr> "Non", "Non", "Non", "Non", "Non…
## $ code_insee_2024_region                <chr> "84", "84", "84", "84", "84", "8…
## $ nom_2024_region                       <chr> "Auvergne-Rhône-Alpes", "Auvergn…
## $ code_insee_2024_departement           <chr> "69", "69", "69", "69", "69", "6…
## $ nom_2024_departement                  <chr> "Rhône", "Rhône", "Rhône", "Rhôn…
## $ strate_population_2024                <chr> "5", "5", "5", "5", "5", "5", "5…
## $ nature_juridique_2024_abregee         <chr> "MET69", "MET69", "MET69", "MET6…
## $ mode_de_financement_2024_abrege       <chr> "FPU", "FPU", "FPU", "FPU", "FPU…
## $ tranche_revenu_par_habitant           <chr> "2", "2", "2", "2", "2", "2", "2…
## $ presence_qpv                          <chr> "Oui", "Oui", "Oui", "Oui", "Oui…
## $ code_siren_2024_epci                  <chr> "200046977", "200046977", "20004…
## $ nom_2024_epci                         <chr> "Métropole de Lyon", "Métropole …
## $ categorie                             <chr> "ML", "ML", "ML", "ML", "ML", "M…
## $ code_siren_collectivite               <chr> "200046977", "200046977", "20004…
## $ libelle_budget                        <chr> "MET DE LYON", "MET DE LYON", "M…
## $ agregat                               <chr> "Achats et charges externes", "A…
## $ montant_bp                            <dbl> 272801293.4, 6033367.1, 76454599…
## $ montant_ba                            <dbl> 45455294.8, 0.0, 8637112.6, 0.0,…
## $ montant_flux_bp_ba                    <dbl> 249403.6, 0.0, 30134610.4, 0.0, …
## $ montant                               <dbl> 318007184.6, 6033367.1, 54957102…
## $ montant_en_millions                   <dbl> 318.0071846, 6.0333671, 54.95710…
## $ population_totale                     <dbl> 1374964, 1374964, 1374964, 13749…
## $ montant_en_par_habitant               <dbl> 231.2840079, 4.3880182, 39.96984…
## $ compte_2024_disponible                <chr> "1", "1", "1", "1", "1", "1", "1…
## $ ordre_analyse1_section1               <dbl> NA, NA, NA, NA, NA, NA, NA, NA, …
## $ ordre_analyse1_section2               <dbl> NA, NA, NA, NA, NA, NA, NA, 4, N…
## $ ordre_analyse1_section3               <dbl> NA, NA, NA, NA, NA, NA, NA, NA, …
## $ ordre_analyse2_section1               <dbl> NA, NA, NA, NA, NA, 3, NA, NA, N…
## $ ordre_analyse2_section2               <dbl> 3, NA, NA, NA, 5, NA, NA, 1, NA,…
## $ ordre_analyse2_section3               <dbl> NA, NA, NA, NA, NA, NA, NA, 2, N…
## $ ordre_analyse3_section1               <dbl> NA, NA, 3, NA, NA, NA, NA, NA, N…
## $ ordre_analyse3_section2               <dbl> NA, NA, NA, NA, NA, NA, NA, NA, …
## $ ordre_analyse3_section3               <dbl> NA, NA, NA, NA, NA, NA, NA, NA, …
## $ ordre_analyse4_section1               <dbl> NA, NA, NA, NA, NA, NA, NA, NA, …
## $ siren_24                              <dbl> 200046977, 200046977, 200046977,…
## $ population_totale_du_dernier_exercice <dbl> 1439981, 1439981, 1439981, 14399…
## $ annee_join                            <chr> "2017", "2017", "2017", "2017", …
## $ montant_brut                          <dbl> 318256588.2, 6033367.1, 85091712…

1.3 Préparation commune aux 3 périmètres (BP / BA / CONSO)

# Fabrique une "vue" homogène avec une seule colonne montant, selon périmètre
# (les champs sont supposés déjà normalisés en snake_case dans le RDS)
make_view <- function(df_conso, per = c("BP","BA","CONSO")) {
  per <- match.arg(per)
  df_conso %>%
    mutate(
      exercice = as.integer(exercice),
      montant = dplyr::case_when(
        per == "BP"    ~ as.numeric(montant_bp),
        per == "BA"    ~ as.numeric(montant_ba),
        per == "CONSO" ~ as.numeric(montant),
        TRUE ~ NA_real_
      )
    ) %>%
    transmute(
      Exercice = exercice,
      `Agrégat` = agregat,
      montant = montant
    )
}

# Séries annuelles (un agrégat)
series <- function(df, ag) {
  df %>%
    filter(`Agrégat` == ag) %>%
    group_by(Exercice) %>%
    summarise(val = sum(montant, na.rm = TRUE), .groups = "drop")
}

# Séries annuelles (plusieurs agrégats)
series_multi <- function(df, ag_vec) {
  df %>%
    filter(`Agrégat` %in% ag_vec) %>%
    group_by(Exercice, `Agrégat`) %>%
    summarise(val = sum(montant, na.rm = TRUE), .groups = "drop")
}

# Table "total + détail" avec contrôle de somme (et "reste / non ventilé")
table_total_detail <- function(df, total_ag, detail_ag, unit = 1e6) {

  tot <- series(df, total_ag) %>% rename(total = val)

  det <- series_multi(df, detail_ag) %>%
    tidyr::pivot_wider(names_from = `Agrégat`, values_from = val, values_fill = 0)

  tab <- tot %>%
    left_join(det, by = "Exercice")

  detail_cols <- setdiff(names(tab), c("Exercice", "total"))

  tab <- tab %>%
    rowwise() %>%
    mutate(
      detail_sum = sum(c_across(all_of(detail_cols)), na.rm = TRUE),
      reste      = total - detail_sum,
      ecart      = total - (detail_sum + reste)
    ) %>%
    ungroup()

  long <- tab %>%
    select(Exercice, total, all_of(detail_cols), reste) %>%
    pivot_longer(cols = -Exercice, names_to = "poste", values_to = "val") %>%
    mutate(val = val / unit)

  wide <- long %>%
    pivot_wider(names_from = Exercice, values_from = val) %>%
    mutate(
      poste = factor(poste, levels = c("total", detail_cols, "reste"))
    ) %>%
    arrange(poste) %>%
    mutate(poste = as.character(poste)) %>%
    mutate(
      poste = recode(poste,
        total = paste0("TOTAL — ", total_ag),
        reste = "Reste / non ventilé"
      )
    )

  list(
    table = wide,
    check = tab %>%
      select(Exercice, total, detail_sum, reste, ecart) %>%
      mutate(across(c(total, detail_sum, reste), ~ .x / unit))
  )
}

# Graphes "qualité de gestion" (retourne une liste de graphes)
plot_indicateurs_gestion <- function(df, titre_prefix = "") {

  # 1) CAF / Épargne
  epargne_ag <- c("Epargne de gestion", "Epargne brute", "Epargne nette")
  epargne <- series_multi(df, epargne_ag) %>% mutate(m = val / 1e6)

  p1 <- ggplot(epargne, aes(x = Exercice, y = m, color = `Agrégat`)) +
    geom_hline(yintercept = 0, linetype = 2) +
    geom_line(linewidth = 1) + geom_point() +
    labs(title = paste0(titre_prefix, "CAF / Épargne (M€)"), x = "Exercice", y = "M€") +
    theme_minimal()

  # 2) Taux d’épargne brute = EB / RF
  rf <- series(df, "Recettes de fonctionnement") %>% rename(rf = val)
  eb <- series(df, "Epargne brute") %>% rename(eb = val)
  taux <- rf %>% left_join(eb, by = "Exercice") %>%
    mutate(taux_eb = ifelse(rf == 0, NA_real_, eb / rf))

  p2 <- ggplot(taux, aes(x = Exercice, y = taux_eb)) +
    geom_hline(yintercept = 0, linetype = 2) +
    geom_line(linewidth = 1) + geom_point() +
    scale_y_continuous(labels = percent) +
    labs(title = paste0(titre_prefix, "Taux d’épargne brute (EB/RF)"), x = "Exercice", y = "%") +
    theme_minimal()

  # 3) Rigidité = personnel / dépenses de fonctionnement
  dfct <- series(df, "Dépenses de fonctionnement") %>% rename(dfct = val)
  pers <- series(df, "Frais de personnel") %>% rename(pers = val)
  rigid <- dfct %>% left_join(pers, by = "Exercice") %>%
    mutate(part = ifelse(dfct == 0, NA_real_, pers / dfct))

  p3 <- ggplot(rigid, aes(x = Exercice, y = part)) +
    geom_line(linewidth = 1) + geom_point() +
    scale_y_continuous(labels = percent) +
    labs(title = paste0(titre_prefix, "Rigidité (Personnel/DF)"), x = "Exercice", y = "%") +
    theme_minimal()

  # 4) Investissement : niveau
  inv <- series(df, "Dépenses d'investissement") %>% mutate(m = val / 1e6)
  p4 <- ggplot(inv, aes(x = Exercice, y = m)) +
    geom_line(linewidth = 1) + geom_point() +
    labs(title = paste0(titre_prefix, "Dépenses d’investissement (M€)"), x = "Exercice", y = "M€") +
    theme_minimal()

  # 5) Dette : encours
  dette <- series(df, "Encours de dette") %>% rename(dette = val)
  p5 <- ggplot(dette %>% mutate(m = dette/1e6), aes(x = Exercice, y = m)) +
    geom_line(linewidth = 1) + geom_point() +
    labs(title = paste0(titre_prefix, "Encours de dette (M€)"), x = "Exercice", y = "M€") +
    theme_minimal()

  # 6) Capacité de désendettement = dette / EB
  eb2 <- series(df, "Epargne brute") %>% rename(eb = val)
  des <- dette %>% left_join(eb2, by = "Exercice") %>%
    mutate(capacite = ifelse(eb <= 0, NA_real_, dette / eb))

  p6 <- ggplot(des, aes(x = Exercice, y = capacite)) +
    geom_hline(yintercept = 0, linetype = 2) +
    geom_line(linewidth = 1) + geom_point() +
    labs(title = paste0(titre_prefix, "Capacité de désendettement (dette/EB)"), x = "Exercice", y = "années") +
    theme_minimal()

  # 7) Solde global
  solde <- series(df, "Capacité ou besoin de financement") %>% mutate(m = val / 1e6)
  p7 <- ggplot(solde, aes(x = Exercice, y = m)) +
    geom_hline(yintercept = 0, linetype = 2) +
    geom_line(linewidth = 1) + geom_point() +
    labs(title = paste0(titre_prefix, "Capacité / besoin de financement (M€)"), x = "Exercice", y = "M€") +
    theme_minimal()

  list(p1 = p1, p2 = p2, p3 = p3, p4 = p4, p5 = p5, p6 = p6, p7 = p7)
}

# ---- Décomposition OFGL (une seule fois) ----

# Fonctionnement - dépenses
fct_dep_total  <- "Dépenses de fonctionnement"
fct_dep_detail <- c(
  "Frais de personnel",
  "Achats et charges externes",
  "Dépenses d'intervention",
  "Charges financières",
  "Autres dépenses de fonctionnement"
  # "Autres dotations de fonctionnement" : laissé hors DF (SIG)
)

# Fonctionnement - recettes (formule robuste OFGL)
fct_rec_total  <- "Recettes de fonctionnement"
fct_rec_detail <- c(
  "Concours de l'Etat",
  "Impôts et taxes",
  "Subventions reçues et participations",
  "Ventes de biens et services",
  "Autres recettes de fonctionnement"
)

# Investissement - dépenses
inv_dep_total  <- "Dépenses d'investissement"
inv_dep_detail <- c(
  "Dépenses d'investissement hors remb",
  "Remboursements d'emprunts hors GAD"
)

# Investissement - recettes
inv_rec_total  <- "Recettes d'investissement"
inv_rec_detail <- c(
  "Recettes d'investissement hors emprunts",
  "Emprunts hors GAD"
)

2 Budget principal

df_bp <- make_view(df_metropole_conso, "BP")
bp_plots <- plot_indicateurs_gestion(df_bp, "BP — ")

2.1 Indicateurs de gestion

bp_plots$p1

bp_plots$p2

bp_plots$p3

bp_plots$p4

bp_plots$p5

bp_plots$p6

bp_plots$p7

2.2 Dépenses d’investissement

res <- table_total_detail(df_bp, inv_dep_total, inv_dep_detail)
kable(res$table, digits = 1)
poste 2017 2018 2019 2020 2021 2022 2023 2024
TOTAL — Dépenses d’investissement 597.8 767.5 1038.3 942.7 784.0 691.9 687.4 778.5
Dépenses d’investissement hors remb 407.2 456.5 611.0 754.5 547.5 495.2 555.5 596.4
Remboursements d’emprunts hors GAD 190.6 311.0 427.4 188.2 236.5 196.7 132.0 182.1
Reste / non ventilé 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
kable(res$check, digits = 3)
Exercice total detail_sum reste ecart
2017 597.810 597.810 0 0
2018 767.503 767.503 0 0
2019 1038.315 1038.315 0 0
2020 942.678 942.678 0 0
2021 783.994 783.994 0 0
2022 691.860 691.860 0 0
2023 687.445 687.445 0 0
2024 778.471 778.471 0 0

2.3 Recettes d’investissement

res <- table_total_detail(df_bp, inv_rec_total, inv_rec_detail)
kable(res$table, digits = 1)
poste 2017 2018 2019 2020 2021 2022 2023 2024
TOTAL — Recettes d’investissement 382.6 265.9 475.4 672.5 261.6 267.3 297.6 581.9
Emprunts hors GAD 190.6 105.1 268.5 469.2 51.1 57.1 130.2 374.3
Recettes d’investissement hors emprunts 192.0 160.8 207.0 203.3 210.4 210.1 167.4 207.7
Reste / non ventilé 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
kable(res$check, digits = 3)
Exercice total detail_sum reste ecart
2017 382.599 382.599 0 0
2018 265.945 265.945 0 0
2019 475.421 475.421 0 0
2020 672.469 672.469 0 0
2021 261.561 261.561 0 0
2022 267.272 267.272 0 0
2023 297.576 297.576 0 0
2024 581.932 581.932 0 0

2.4 Dépenses de fonctionnement

Note : “Autres dotations de fonctionnement” est laissé hors ventilation “dépenses de fonctionnement” (lecture SIG).

res <- table_total_detail(df_bp, fct_dep_total, fct_dep_detail)
kable(res$table, digits = 1)
poste 2017 2018 2019 2020 2021 2022 2023 2024
TOTAL — Dépenses de fonctionnement 1984.0 1957.2 1959.7 1909.7 1946.7 2036.9 2248.5 2293.8
Achats et charges externes 272.8 277.7 283.5 202.1 209.8 227.3 281.4 266.6
Autres dépenses de fonctionnement 67.6 29.7 40.0 41.2 26.3 29.8 54.0 52.6
Charges financières 57.3 36.2 28.6 26.9 26.4 25.6 36.4 43.3
Dépenses d’intervention 1201.7 1228.7 1206.9 1258.2 1297.1 1344.1 1444.8 1478.1
Frais de personnel 384.6 384.8 400.7 381.4 387.1 410.1 431.9 453.2
Reste / non ventilé 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
kable(res$check, digits = 3)
Exercice total detail_sum reste ecart
2017 1983.951 1983.951 0 0
2018 1957.153 1957.153 0 0
2019 1959.728 1959.728 0 0
2020 1909.729 1909.729 0 0
2021 1946.740 1946.740 0 0
2022 2036.859 2036.859 0 0
2023 2248.466 2248.466 0 0
2024 2293.754 2293.754 0 0

2.5 Recettes de fonctionnement

res <- table_total_detail(df_bp, fct_rec_total, fct_rec_detail)
kable(res$table, digits = 1)
poste 2017 2018 2019 2020 2021 2022 2023 2024
TOTAL — Recettes de fonctionnement 2308.3 2398.3 2404.2 2300.1 2407.5 2532.2 2498.3 2552.6
Autres recettes de fonctionnement 102.4 95.0 98.0 99.5 111.3 108.0 129.1 120.7
Concours de l’Etat 477.0 475.3 476.5 472.4 507.1 500.1 500.6 500.5
Impôts et taxes 1558.3 1641.7 1620.2 1529.2 1569.1 1690.5 1611.4 1622.3
Subventions reçues et participations 84.7 86.5 110.9 93.6 115.0 114.8 133.5 181.3
Ventes de biens et services 86.0 99.8 98.5 105.5 105.1 118.8 123.7 127.8
Reste / non ventilé 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
kable(res$check, digits = 3)
Exercice total detail_sum reste ecart
2017 2308.314 2308.314 0 0
2018 2398.290 2398.290 0 0
2019 2404.158 2404.158 0 0
2020 2300.124 2300.124 0 0
2021 2407.550 2407.550 0 0
2022 2532.249 2532.249 0 0
2023 2498.282 2498.282 0 0
2024 2552.619 2552.619 0 0

3 Budgets annexes

df_ba <- make_view(df_metropole_conso, "BA")
ba_plots <- plot_indicateurs_gestion(df_ba, "BA — ")

3.1 Indicateurs de gestion

ba_plots$p1

ba_plots$p2

ba_plots$p3

ba_plots$p4

ba_plots$p5

ba_plots$p6

ba_plots$p7

3.2 Dépenses d’investissement

res <- table_total_detail(df_ba, inv_dep_total, inv_dep_detail)
kable(res$table, digits = 1)
poste 2017 2018 2019 2020 2021 2022 2023 2024
TOTAL — Dépenses d’investissement 88.2 95.7 120.0 98.0 90.2 97.5 83.0 86.2
Dépenses d’investissement hors remb 36.8 54.0 62.1 71.1 71.2 78.1 67.4 69.3
Remboursements d’emprunts hors GAD 51.4 41.7 57.9 26.9 19.0 19.4 15.7 16.9
Reste / non ventilé 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
kable(res$check, digits = 3)
Exercice total detail_sum reste ecart
2017 88.212 88.212 0 0
2018 95.738 95.738 0 0
2019 120.001 120.001 0 0
2020 98.047 98.047 0 0
2021 90.210 90.210 0 0
2022 97.524 97.524 0 0
2023 83.050 83.050 0 0
2024 86.209 86.209 0 0

3.3 Recettes d’investissement

res <- table_total_detail(df_ba, inv_rec_total, inv_rec_detail)
kable(res$table, digits = 1)
poste 2017 2018 2019 2020 2021 2022 2023 2024
TOTAL — Recettes d’investissement 8.7 15.4 33.8 47.0 11.4 21.9 35.9 46.3
Emprunts hors GAD 0.0 9.5 25.5 37.5 2.0 13.0 20.0 39.8
Recettes d’investissement hors emprunts 8.7 5.9 8.3 9.5 9.4 8.9 15.9 6.5
Reste / non ventilé 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
kable(res$check, digits = 3)
Exercice total detail_sum reste ecart
2017 8.656 8.656 0 0
2018 15.375 15.375 0 0
2019 33.810 33.810 0 0
2020 47.039 47.039 0 0
2021 11.414 11.414 0 0
2022 21.875 21.875 0 0
2023 35.867 35.867 0 0
2024 46.302 46.302 0 0

3.4 Dépenses de fonctionnement

res <- table_total_detail(df_ba, fct_dep_total, fct_dep_detail)
kable(res$table, digits = 1)
poste 2017 2018 2019 2020 2021 2022 2023 2024
TOTAL — Dépenses de fonctionnement 128.5 97.5 98.8 250.7 247.1 263.1 286.6 295.8
Achats et charges externes 45.5 51.0 47.3 135.8 151.3 161.1 189.8 191.8
Autres dépenses de fonctionnement 44.0 7.2 12.9 29.5 8.6 12.5 11.4 14.0
Charges financières 6.3 5.8 4.7 5.2 4.8 4.4 4.5 4.8
Dépenses d’intervention 0.3 0.2 0.0 0.6 0.8 0.8 1.0 1.0
Frais de personnel 32.5 33.2 34.0 79.7 81.6 84.3 79.9 84.3
Reste / non ventilé 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
kable(res$check, digits = 3)
Exercice total detail_sum reste ecart
2017 128.475 128.475 0 0
2018 97.549 97.549 0 0
2019 98.811 98.811 0 0
2020 250.729 250.729 0 0
2021 247.065 247.065 0 0
2022 263.110 263.110 0 0
2023 286.626 286.626 0 0
2024 295.807 295.807 0 0

3.5 Recettes de fonctionnement

res <- table_total_detail(df_ba, fct_rec_total, fct_rec_detail)
kable(res$table, digits = 1)
poste 2017 2018 2019 2020 2021 2022 2023 2024
TOTAL — Recettes de fonctionnement 199.9 186.7 159.1 328.4 319.1 324.2 335.2 346.5
Autres recettes de fonctionnement 47.6 15.5 14.0 40.3 12.1 12.1 31.1 24.1
Concours de l’Etat 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Impôts et taxes 0.0 0.0 0.0 115.3 116.1 120.8 127.9 140.7
Subventions reçues et participations 13.1 14.2 10.0 17.4 22.9 17.2 17.5 23.6
Ventes de biens et services 139.1 157.1 135.0 155.4 167.9 174.1 158.7 158.1
Reste / non ventilé 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
kable(res$check, digits = 3)
Exercice total detail_sum reste ecart
2017 199.886 199.886 0 0
2018 186.733 186.733 0 0
2019 159.074 159.074 0 0
2020 328.411 328.411 0 0
2021 319.106 319.106 0 0
2022 324.170 324.170 0 0
2023 335.152 335.152 0 0
2024 346.485 346.485 0 0

4 Budget consolidé

df_conso <- make_view(df_metropole_conso, "CONSO")
conso_plots <- plot_indicateurs_gestion(df_conso, "CONSO — ")

4.1 Indicateurs de gestion

conso_plots$p1

conso_plots$p2

conso_plots$p3

conso_plots$p4

conso_plots$p5

conso_plots$p6

conso_plots$p7

4.2 Dépenses d’investissement

res <- table_total_detail(df_conso, inv_dep_total, inv_dep_detail)
kable(res$table, digits = 1)
poste 2017 2018 2019 2020 2021 2022 2023 2024
TOTAL — Dépenses d’investissement 655.9 843.6 1135.5 1027.2 858.5 775.7 754.5 844.7
Dépenses d’investissement hors remb 413.9 490.9 650.3 812.1 603.0 559.6 606.9 645.6
Remboursements d’emprunts hors GAD 242.0 352.7 485.3 215.1 255.5 216.1 147.7 199.1
Reste / non ventilé 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
kable(res$check, digits = 3)
Exercice total detail_sum reste ecart
2017 655.887 655.887 0 0
2018 843.625 843.625 0 0
2019 1135.515 1135.515 0 0
2020 1027.182 1027.182 0 0
2021 858.496 858.496 0 0
2022 775.668 775.668 0 0
2023 754.544 754.544 0 0
2024 844.692 844.692 0 0

4.3 Recettes d’investissement

res <- table_total_detail(df_conso, inv_rec_total, inv_rec_detail)
kable(res$table, digits = 1)
poste 2017 2018 2019 2020 2021 2022 2023 2024
TOTAL — Recettes d’investissement 361.1 261.7 486.4 706.0 257.3 275.4 317.5 608.2
Emprunts hors GAD 190.6 114.6 294.0 506.7 53.1 70.1 150.2 414.1
Recettes d’investissement hors emprunts 170.5 147.1 192.5 199.3 204.1 205.3 167.3 194.2
Reste / non ventilé 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
kable(res$check, digits = 3)
Exercice total detail_sum reste ecart
2017 361.120 361.120 0 0
2018 261.704 261.704 0 0
2019 486.430 486.430 0 0
2020 705.965 705.965 0 0
2021 257.268 257.268 0 0
2022 275.432 275.432 0 0
2023 317.493 317.493 0 0
2024 608.247 608.247 0 0

4.4 Dépenses de fonctionnement

res <- table_total_detail(df_conso, fct_dep_total, fct_dep_detail)
kable(res$table, digits = 1)
poste 2017 2018 2019 2020 2021 2022 2023 2024
TOTAL — Dépenses de fonctionnement 2088.6 2029.8 2034.5 2099.9 2152.1 2250.1 2473.6 2549.2
Achats et charges externes 318.0 328.5 330.5 327.7 353.9 377.5 462.0 446.5
Autres dépenses de fonctionnement 102.4 27.6 44.3 52.1 32.9 35.4 39.8 52.6
Charges financières 63.5 42.0 33.4 32.1 31.2 29.9 40.9 48.2
Dépenses d’intervention 1188.5 1215.0 1193.0 1244.6 1283.5 1330.5 1431.3 1479.1
Frais de personnel 416.1 416.8 433.3 443.4 450.7 476.8 499.6 522.9
Reste / non ventilé 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
kable(res$check, digits = 3)
Exercice total detail_sum reste ecart
2017 2088.562 2088.562 0 0
2018 2029.845 2029.845 0 0
2019 2034.478 2034.478 0 0
2020 2099.947 2099.947 0 0
2021 2152.122 2152.122 0 0
2022 2250.075 2250.075 0 0
2023 2473.615 2473.615 0 0
2024 2549.217 2549.217 0 0

4.5 Recettes de fonctionnement

res <- table_total_detail(df_conso, fct_rec_total, fct_rec_detail)
kable(res$table, digits = 1)
poste 2017 2018 2019 2020 2021 2022 2023 2024
TOTAL — Recettes de fonctionnement 2484.3 2560.2 2539.2 2568.0 2685.0 2806.5 2772.0 2858.8
Autres recettes de fonctionnement 140.8 101.1 103.4 121.2 121.3 113.2 134.6 130.9
Concours de l’Etat 477.0 475.3 476.5 472.4 507.1 500.2 500.6 500.6
Impôts et taxes 1558.3 1641.7 1620.2 1644.5 1685.2 1811.2 1739.3 1763.0
Subventions reçues et participations 84.4 86.8 107.1 96.7 123.5 117.6 136.5 204.9
Ventes de biens et services 223.9 255.3 232.0 233.2 247.8 264.3 260.9 259.4
Reste / non ventilé 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
kable(res$check, digits = 3)
Exercice total detail_sum reste ecart
2017 2484.336 2484.336 0 0
2018 2560.166 2560.166 0 0
2019 2539.171 2539.171 0 0
2020 2568.024 2568.024 0 0
2021 2684.972 2684.972 0 0
2022 2806.525 2806.525 0 0
2023 2771.957 2771.957 0 0
2024 2858.760 2858.760 0 0