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)
Pré-requis : exécuter le script
.Rde préparation qui lit
data/ofgl-base-gfp-consolidee-METLYON.xlsxet génèreoutput/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…
# 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"
)
df_bp <- make_view(df_metropole_conso, "BP")
bp_plots <- plot_indicateurs_gestion(df_bp, "BP — ")
bp_plots$p1
bp_plots$p2
bp_plots$p3
bp_plots$p4
bp_plots$p5
bp_plots$p6
bp_plots$p7
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 |
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 |
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 |
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 |
df_ba <- make_view(df_metropole_conso, "BA")
ba_plots <- plot_indicateurs_gestion(df_ba, "BA — ")
ba_plots$p1
ba_plots$p2
ba_plots$p3
ba_plots$p4
ba_plots$p5
ba_plots$p6
ba_plots$p7
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 |
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 |
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 |
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 |
df_conso <- make_view(df_metropole_conso, "CONSO")
conso_plots <- plot_indicateurs_gestion(df_conso, "CONSO — ")
conso_plots$p1
conso_plots$p2
conso_plots$p3
conso_plots$p4
conso_plots$p5
conso_plots$p6
conso_plots$p7
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 |
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 |
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 |
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 |