1 Préparation

1.1 Objectif & sources

Ce document analyse les finances de la Ville de Lyon à partir des bases OFGL :

  • Commune : ofgl-base-communes (lecture “budgétaire brute”)
  • Consolidée : ofgl-base-communes-consolidee (lecture “économique nette”, neutralisation des flux internes BP–BA)

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)

# 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_lyon       <- readRDS(file.path(out_dir, "df_lyon.rds"))
df_lyon_conso <- readRDS(file.path(out_dir, "df_lyon_conso.rds"))
glimpse(df_lyon_conso)
## Rows: 392
## Columns: 28
## $ Exercice                                <int> 2017, 2017, 2020, 2020, 2020, …
## $ `Tranche revenu par habitant`           <fct> 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, …
## $ `Code Insee 2024 Commune`               <fct> 69123, 69123, 69123, 69123, 69…
## $ `Nom 2024 Commune`                      <fct> Lyon, Lyon, Lyon, Lyon, Lyon, …
## $ Catégorie                               <fct> Commune, Commune, Commune, Com…
## $ `Code Siren Collectivité`               <fct> 216901231, 216901231, 21690123…
## $ `Code Insee Collectivité`               <fct> 69123, 69123, 69123, 69123, 69…
## $ `Libellé Budget`                        <fct> LYON, LYON, LYON, LYON, LYON, …
## $ Agrégat                                 <fct> Achats et charges externes, Au…
## $ `Montant BP`                            <dbl> 101212133.0, 3913073.0, 853856…
## $ `Montant BA`                            <dbl> 14191325.03, 0.00, 0.00, 28014…
## $ `Montant flux BP-BA`                    <dbl> 0.00, 0.00, 0.00, 16182484.52,…
## $ Montant                                 <dbl> 115403458.0, 3913073.0, 853856…
## $ `Montant en millions`                   <dbl> 115.4034580, 3.9130730, 85.385…
## $ `Population totale`                     <dbl> 514707, 514707, 522679, 522679…
## $ `Montant en € par habitant`             <dbl> 224.211946, 7.602525, 163.3616…
## $ ordre_analyse1_section1                 <lgl> NA, NA, NA, NA, NA, NA, NA, NA…
## $ ordre_analyse1_section2                 <chr> NA, NA, NA, "4", NA, NA, "5", …
## $ ordre_analyse1_section3                 <chr> NA, NA, NA, NA, NA, NA, NA, NA…
## $ ordre_analyse2_section1                 <chr> NA, NA, "3", NA, NA, NA, NA, N…
## $ ordre_analyse2_section2                 <chr> "3", NA, NA, "1", NA, "4", NA,…
## $ ordre_analyse2_section3                 <chr> NA, NA, NA, "2", NA, NA, NA, N…
## $ ordre_analyse3_section1                 <lgl> NA, NA, NA, NA, NA, NA, NA, NA…
## $ ordre_analyse3_section2                 <chr> NA, NA, NA, NA, "2", NA, "1", …
## $ ordre_analyse3_section3                 <chr> NA, NA, NA, NA, NA, NA, "1", N…
## $ ordre_analyse4_section1                 <chr> NA, NA, NA, NA, NA, NA, NA, "2…
## $ annee_join                              <int> 2017, 2017, 2020, 2020, 2020, …
## $ `Population totale du dernier exercice` <dbl> 528550, 528550, 528550, 528550…

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
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_
      )
    ) %>%
    select(Exercice, Agrégat, montant)
}

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

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
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), ~./unit))
  )
}

# Graphes "qualité de gestion" (pack minimal, sans facettes)
plot_indicateurs_gestion <- function(df, titre_prefix = "") {

  # CAF / Epargne
  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()

  # 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()

  # 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()

  # 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()

  # Dette & désendettement
  dette <- series(df, "Encours de dette") %>% rename(dette = val)
  eb2 <- series(df, "Epargne brute") %>% rename(eb = val)
  des <- dette %>% left_join(eb2, by="Exercice") %>%
    mutate(dette_m = dette/1e6,
           capacite = ifelse(eb<=0, NA_real_, dette/eb))

  p5 <- ggplot(des, aes(x=Exercice, y=dette_m)) +
    geom_line(linewidth=1) + geom_point() +
    labs(title=paste0(titre_prefix, "Encours de dette (M€)"), x="Exercice", y="M€") +
    theme_minimal()

  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()

  # 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
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" : volontairement hors DF (SIG)
)

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
inv_dep_total  <- "Dépenses d'investissement"
inv_dep_detail <- c(
  "Dépenses d'investissement hors remb",
  "Remboursements d'emprunts hors GAD"
)

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_lyon_conso, "BP")

2.1 Indicateurs de gestion

plots <- plot_indicateurs_gestion(df_bp, "BP — ")
plots$p1; plots$p2; plots$p3; plots$p4; plots$p5; plots$p6; 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 155.5 137.0 194.8 147.3 133.4 140.6 165.7 184.6
Dépenses d’investissement hors remb 102.8 93.6 119.2 112.7 92.3 102.1 125.6 146.5
Remboursements d’emprunts hors GAD 52.8 43.4 75.6 34.6 41.1 38.6 40.1 38.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 155.513 155.513 0 0
2018 137.034 137.034 0 0
2019 194.797 194.797 0 0
2020 147.279 147.279 0 0
2021 133.373 133.373 0 0
2022 140.645 140.645 0 0
2023 165.743 165.743 0 0
2024 184.640 184.640 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 91.2 60.6 83.3 63.5 48.7 47.8 33.4 64.1
Emprunts hors GAD 70.0 35.0 55.0 45.0 20.0 20.0 0.0 35.1
Recettes d’investissement hors emprunts 21.2 25.5 28.3 18.5 28.7 27.8 33.4 29.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 91.209 91.209 0 0
2018 60.558 60.558 0 0
2019 83.304 83.304 0 0
2020 63.500 63.500 0 0
2021 48.731 48.731 0 0
2022 47.810 47.810 0 0
2023 33.358 33.358 0 0
2024 64.130 64.130 0 0

2.4 Dépenses de fonctionnement

Note : “Autres dotations de fonctionnement” est laissé hors ventilation “dépenses de fonctionnement” par défaut (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 566.7 561.1 561.4 578.6 584.4 605.5 645.5 673.7
Achats et charges externes 101.2 99.5 102.0 106.9 106.0 111.3 134.8 135.5
Autres dépenses de fonctionnement 23.2 22.0 22.3 28.5 24.7 23.2 26.7 26.2
Charges financières 9.1 7.7 6.0 5.0 4.3 3.9 5.3 5.6
Dépenses d’intervention 100.6 101.5 103.9 106.0 111.5 115.8 113.0 120.0
Frais de personnel 332.5 330.3 327.2 332.3 338.0 351.3 365.7 386.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 566.652 566.652 0 0
2018 561.068 561.068 0 0
2019 561.390 561.390 0 0
2020 578.556 578.556 0 0
2021 584.411 584.411 0 0
2022 605.519 605.519 0 0
2023 645.529 645.529 0 0
2024 673.698 673.698 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 647.0 672.7 678.4 654.2 676.6 711.5 767.7 779.7
Autres recettes de fonctionnement 16.5 22.4 16.0 15.9 12.1 11.9 13.9 15.7
Concours de l’Etat 87.0 85.2 85.7 85.4 77.4 78.1 77.7 78.1
Impôts et taxes 465.6 463.3 475.7 477.9 499.1 524.9 580.9 578.8
Subventions reçues et participations 31.0 31.1 27.7 26.3 25.5 27.8 24.5 28.6
Ventes de biens et services 46.8 70.8 73.4 48.6 62.4 68.8 70.6 78.6
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 647.028 647.028 0 0
2018 672.679 672.679 0 0
2019 678.423 678.423 0 0
2020 654.157 654.157 0 0
2021 676.614 676.614 0 0
2022 711.540 711.540 0 0
2023 767.654 767.654 0 0
2024 779.740 779.740 0 0

3 Budgets annexes

df_ba <- make_view(df_lyon_conso, "BA")

3.1 Indicateurs de gestion

plots <- plot_indicateurs_gestion(df_ba, "BA — ")
plots$p1; plots$p2; plots$p3; plots$p4; plots$p5; plots$p6; plots$p7

## Warning: Removed 1 row containing missing values or values outside the scale range
## (`geom_line()`).
## Warning: Removed 2 rows containing missing values or values outside the scale range
## (`geom_point()`).

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 0.7 1.6 2.2 2.6 1.2 1.0 1.5 2.1
Dépenses d’investissement hors remb 0.5 1.4 2.0 2.3 1.0 0.9 1.3 2.0
Remboursements d’emprunts hors GAD 0.3 0.2 0.2 0.2 0.2 0.2 0.1 0.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 0.749 0.749 0 0
2018 1.613 1.613 0 0
2019 2.207 2.207 0 0
2020 2.575 2.575 0 0
2021 1.226 1.226 0 0
2022 1.032 1.032 0 0
2023 1.460 1.460 0 0
2024 2.087 2.087 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 0.4 0.8 1.3 1.8 0.6 0.6 0.8 1.2
Emprunts hors GAD 0.2 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Recettes d’investissement hors emprunts 0.2 0.8 1.3 1.8 0.6 0.6 0.8 1.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 0.361 0.361 0 0
2018 0.806 0.806 0 0
2019 1.333 1.333 0 0
2020 1.831 1.831 0 0
2021 0.647 0.647 0 0
2022 0.580 0.580 0 0
2023 0.803 0.803 0 0
2024 1.240 1.240 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 30.6 30.6 32.1 28.0 28.9 32.6 33.2 35.7
Achats et charges externes 14.2 14.1 15.2 11.0 11.9 14.8 15.2 16.9
Autres dépenses de fonctionnement 1.0 0.7 0.9 2.2 1.9 0.9 0.9 1.0
Charges financières 0.1 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Dépenses d’intervention 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1
Frais de personnel 15.3 15.6 15.9 14.8 15.0 16.7 17.1 17.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 30.620 30.620 0 0
2018 30.570 30.570 0 0
2019 32.147 32.147 0 0
2020 28.014 28.014 0 0
2021 28.877 28.877 0 0
2022 32.570 32.570 0 0
2023 33.186 33.186 0 0
2024 35.739 35.739 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 31.2 31.9 32.7 28.9 30.9 32.0 35.5 35.4
Autres recettes de fonctionnement 15.8 15.9 16.0 16.8 17.2 15.8 16.9 17.9
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 0.0 0.0 0.0 0.0 0.0
Subventions reçues et participations 7.6 7.6 7.7 7.7 8.3 8.3 10.1 9.1
Ventes de biens et services 7.9 8.5 9.0 4.4 5.5 7.9 8.5 8.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 31.248 31.248 0 0
2018 31.939 31.939 0 0
2019 32.724 32.724 0 0
2020 28.856 28.856 0 0
2021 30.948 30.948 0 0
2022 31.981 31.981 0 0
2023 35.486 35.486 0 0
2024 35.419 35.419 0 0

4 Budget consolidé

df_conso <- make_view(df_lyon_conso, "CONSO")

4.1 Indicateurs de gestion

plots <- plot_indicateurs_gestion(df_conso, "CONSO — ")
plots$p1; plots$p2; plots$p3; plots$p4; plots$p5; plots$p6; 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 155.7 138.6 197.0 149.9 134.6 141.7 167.2 185.4
Dépenses d’investissement hors remb 102.7 94.9 121.1 115.0 93.3 103.0 127.0 147.2
Remboursements d’emprunts hors GAD 53.0 43.6 75.9 34.8 41.3 38.7 40.2 38.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 155.717 155.717 0 0
2018 138.573 138.573 0 0
2019 197.003 197.003 0 0
2020 149.855 149.855 0 0
2021 134.600 134.600 0 0
2022 141.676 141.676 0 0
2023 167.193 167.193 0 0
2024 185.410 185.410 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 91.0 61.3 84.6 65.3 49.4 48.4 34.2 64.1
Emprunts hors GAD 70.2 35.0 55.0 45.0 20.0 20.0 0.0 35.1
Recettes d’investissement hors emprunts 20.8 26.3 29.6 20.3 29.4 28.4 34.1 29.0
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 91.025 91.025 0 0
2018 61.290 61.290 0 0
2019 84.638 84.638 0 0
2020 65.332 65.332 0 0
2021 49.378 49.378 0 0
2022 48.390 48.390 0 0
2023 34.150 34.150 0 0
2024 64.054 64.054 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 583.2 577.3 579.4 590.4 597.7 623.5 663.0 692.7
Achats et charges externes 115.4 113.7 117.1 117.6 117.6 125.9 149.6 151.9
Autres dépenses de fonctionnement 10.1 8.4 9.1 14.7 11.3 9.8 12.2 10.9
Charges financières 9.2 7.7 6.1 5.0 4.3 3.9 5.3 5.6
Dépenses d’intervention 100.7 101.6 104.0 106.0 111.6 115.9 113.1 120.1
Frais de personnel 347.8 345.9 343.1 347.1 353.0 368.0 382.7 404.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 583.196 583.196 0 0
2018 577.261 577.261 0 0
2019 579.350 579.350 0 0
2020 590.388 590.388 0 0
2021 597.655 597.655 0 0
2022 623.510 623.510 0 0
2023 662.988 662.988 0 0
2024 692.711 692.711 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 664.2 690.2 697.0 666.8 691.9 728.9 787.4 798.4
Autres recettes de fonctionnement 18.2 23.9 17.9 16.8 13.9 13.3 15.4 17.3
Concours de l’Etat 87.0 85.2 85.7 85.4 77.4 78.1 77.7 78.1
Impôts et taxes 465.6 463.3 475.7 477.9 499.1 524.9 580.9 578.8
Subventions reçues et participations 38.6 38.7 35.4 34.0 33.8 36.2 34.6 37.8
Ventes de biens et services 54.7 79.3 82.4 52.7 67.6 76.4 78.8 86.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 664.200 664.200 0 0
2018 690.241 690.241 0 0
2019 696.960 696.960 0 0
2020 666.831 666.831 0 0
2021 691.928 691.928 0 0
2022 728.941 728.941 0 0
2023 787.413 787.413 0 0
2024 798.432 798.432 0 0