Subventions aux associations votées par la Ville de Paris

Données - Ville de Paris

Code
source(here::here("_rinit.R"))
invisible(Sys.setlocale("LC_TIME", "fr_FR.UTF-8"))
# cd ~/iCloud/website/data/paris; /usr/local/bin/R -e 'quarto::quarto_render("subventions-associations-votees-.qmd")'

knitr::opts_chunk$set(echo = TRUE, message = FALSE, warning = FALSE,
                      fig.width = 8, fig.height = 4.6, dpi = 150)

subv_path <- here::here("data", "paris", "subventions-associations-votees-.parquet")
subv <- arrow::read_parquet(subv_path) |>
  dplyr::mutate(
    annee   = as.integer(format(annee_budgetaire, "%Y")),
    montant = montant_vote,
    # 1er secteur d'activité (le champ en concatène parfois plusieurs)
    secteur1 = stringr::str_trim(stringr::str_extract(secteurs_d_activites_definies_par_l_association, "^[^,]+")),
    # nom normalisé + clé de regroupement des quasi-doublons (une même
    # association a pu changer de dénomination au fil des ans)
    beneficiaire = stringr::str_squish(stringr::str_to_upper(nom_beneficiaire)),
    benef_key    = substr(beneficiaire, 1, 45)
  )

annee_max <- max(subv$annee)
theme_barres <- theme_minimal(base_size = 12) +
  theme(plot.title = element_text(face = "bold"),
        plot.subtitle = element_text(colour = "grey35"),
        panel.grid.major.y = element_blank())
euro_k <- scales::label_number(scale = 1e-6, suffix = " M€", accuracy = 0.1)

Toutes les subventions aux associations votées par le Conseil de Paris depuis NA : 107 693 lignes de délibération, pour un total voté de 3 935 924 200 €. Une même association apparaît autant de fois qu’elle a reçu de subventions (projet, fonctionnement, investissement, plusieurs directions…).

Code
subv |>
  dplyr::arrange(dplyr::desc(annee_budgetaire), dplyr::desc(montant)) |>
  dplyr::transmute(
    `Année` = annee, `Bénéficiaire` = nom_beneficiaire, Objet = objet_du_dossier,
    Montant = montant, Direction = direction, Nature = nature_de_la_subvention
  ) |>
  head(12) |>
  gt::gt() |>
  gt::fmt_currency(columns = Montant, currency = "EUR", decimals = 0, sep_mark = " ") |>
  gt::tab_options(table.width = "100%")
Année Bénéficiaire Objet Montant Direction Nature
2026 ASSOCIATION D'ACTION SOCIALE EN FAVEUR DES PERSONNELS DE LA VILLE DE PARIS ET DU DEPARTEMENT DE PARIS ASPP Demande de subvention annuelle de fonctionnement 2026 €13 677 000 DRH Fonctionnement
2026 CRESCENDO Budget 2026 EAJE CRESCENDO €10 484 525 DFPE Fonctionnement
2026 THEATRE MUSICAL DE PARIS Acompte 2026 €7 660 000 DAC Fonctionnement
2026 THEATRE DE LA VILLE Acompte 2026 €6 500 000 DAC Fonctionnement
2026 FRANCE HORIZON BP 2026 Matrice Asso EAJE au forfait_FH_20 forfait -Demande de subvention annuelle de fonctionnement €5 689 024 DFPE Fonctionnement
2026 ATELIER PARISIEN D'URBANISME APUR Apur subvention annuelle €5 569 700 DU Fonctionnement
2026 FORUM DES IMAGES Subvention annuelle de Fonctionnement 2026 €5 500 000 DAE Fonctionnement
2026 MISSION LOCALE DE PARIS Fonctionnement 2026 €5 120 000 DAE Fonctionnement
2026 THEATRE DE LA VILLE Demande de subvention annuelle de fonctionnement €3 900 000 DAC Fonctionnement
2026 PARIS JE T'AIME, OFFICE DE TOURISME Demande de subvention annuelle de fonctionnement €3 600 000 DAE Fonctionnement
2026 FRANCE HORIZON CHU Familles/Jeunes - 36 rue Vouillé 75015 Paris €3 138 913 DSOL Fonctionnement
2026 ORCHESTRE DE CHAMBRE DE PARIS Acompte 2026 €2 300 000 DAC Fonctionnement

Évolution du montant voté

Code
subv |>
  dplyr::group_by(annee) |>
  dplyr::summarise(montant = sum(montant, na.rm = TRUE), dossiers = dplyr::n(), .groups = "drop") |>
  dplyr::filter(annee <= annee_max) |>
  ggplot(aes(annee, montant)) +
  geom_col(fill = "#3b5b8a", width = 0.65) +
  geom_text(aes(label = euro_k(montant)), vjust = -0.4, size = 3) +
  scale_x_continuous(breaks = scales::breaks_width(1)) +
  scale_y_continuous(labels = euro_k, expand = expansion(mult = c(0, 0.1))) +
  labs(title = "Montant total des subventions aux associations votées, par an",
       subtitle = "Conseil de Paris — attention : l'année en cours peut être incomplète",
       x = NULL, y = NULL) +
  theme_barres

Qui reçoit ?

Code
subv |>
  dplyr::filter(!is.na(nom_beneficiaire)) |>
  dplyr::group_by(benef_key) |>
  dplyr::summarise(montant = sum(montant, na.rm = TRUE),
                   nom = beneficiaire[which.min(nchar(beneficiaire))], .groups = "drop") |>
  dplyr::slice_max(montant, n = 15) |>
  dplyr::mutate(nom = forcats::fct_reorder(stringr::str_trunc(stringr::str_to_sentence(nom), 46), montant)) |>
  ggplot(aes(montant, nom)) +
  geom_col(fill = "#3b5b8a", width = 0.7) +
  geom_text(aes(label = euro_k(montant)), hjust = -0.15, size = 3) +
  scale_x_continuous(labels = euro_k, expand = expansion(mult = c(0, 0.18))) +
  labs(title = "15 premiers bénéficiaires (cumul depuis 2013)",
       subtitle = "Surtout des institutions culturelles et des fonds sociaux du personnel",
       x = NULL, y = NULL) +
  theme_barres +
  theme(axis.text.y = element_text(size = 8))

Code
b <- subv |>
  dplyr::filter(!is.na(nom_beneficiaire)) |>
  dplyr::group_by(benef_key) |>
  dplyr::summarise(m = sum(montant, na.rm = TRUE), .groups = "drop") |>
  dplyr::arrange(dplyr::desc(m))
top1 <- sum(head(b$m, ceiling(nrow(b) * 0.01))) / sum(b$m)
cat(sprintf(
  "\nLes subventions sont **très concentrées** : les **1 %% de bénéficiaires** les mieux dotés (%s associations sur %s) captent **%s** du montant total voté.\n",
  format(ceiling(nrow(b) * 0.01), big.mark = " "), format(nrow(b), big.mark = " "),
  scales::percent(top1, 1)))

Les subventions sont très concentrées : les 1 % de bénéficiaires les mieux dotés (132 associations sur 13 123) captent 70% du montant total voté.

Par direction, nature, secteur

Code
subv |>
  dplyr::group_by(direction) |>
  dplyr::summarise(montant = sum(montant, na.rm = TRUE), .groups = "drop") |>
  dplyr::slice_max(montant, n = 10) |>
  dplyr::mutate(direction = forcats::fct_reorder(direction, montant)) |>
  ggplot(aes(montant, direction)) +
  geom_col(fill = "#3b5b8a", width = 0.7) +
  scale_x_continuous(labels = euro_k, expand = expansion(mult = c(0, 0.08))) +
  labs(title = "Montant voté par direction de la Ville",
       subtitle = "DAC : affaires culturelles · DJS : jeunesse et sports · DASES : action sociale",
       x = NULL, y = NULL) +
  theme_barres

Code
subv |>
  dplyr::group_by(nature_de_la_subvention) |>
  dplyr::summarise(montant = sum(montant, na.rm = TRUE), .groups = "drop") |>
  dplyr::mutate(nature_de_la_subvention = forcats::fct_reorder(nature_de_la_subvention, montant)) |>
  ggplot(aes(montant, nature_de_la_subvention)) +
  geom_col(fill = "#6a8caf", width = 0.7) +
  scale_x_continuous(labels = euro_k, expand = expansion(mult = c(0, 0.08))) +
  labs(title = "Par nature de subvention", x = NULL, y = NULL) +
  theme_barres

Code
subv |>
  dplyr::filter(!is.na(secteur1)) |>
  dplyr::group_by(secteur1) |>
  dplyr::summarise(montant = sum(montant, na.rm = TRUE), .groups = "drop") |>
  dplyr::slice_max(montant, n = 10) |>
  dplyr::mutate(secteur1 = forcats::fct_reorder(secteur1, montant)) |>
  ggplot(aes(montant, secteur1)) +
  geom_col(fill = "#6a8caf", width = 0.7) +
  scale_x_continuous(labels = euro_k, expand = expansion(mult = c(0, 0.08))) +
  labs(title = "Par secteur d'activité de l'association",
       subtitle = "1ᵉʳ secteur cité (le champ en concatène parfois plusieurs)",
       x = NULL, y = NULL) +
  theme_barres

Rechercher un dossier

Code
subv |>
  dplyr::filter(annee >= annee_max - 1) |>
  dplyr::arrange(dplyr::desc(annee_budgetaire), dplyr::desc(montant)) |>
  dplyr::transmute(
    `Année` = annee, `Bénéficiaire` = nom_beneficiaire, Objet = objet_du_dossier,
    `Montant (€)` = montant, Direction = direction, Nature = nature_de_la_subvention
  ) |>
  DT::datatable(
    rownames = FALSE, filter = "top", extensions = "Buttons",
    options = list(pageLength = 15, dom = "Bfrtip",
                   order = list(list(3, "desc")),
                   buttons = list(list(extend = "csv", filename = "subventions-paris")))
  ) |>
  DT::formatRound("Montant (€)", digits = 0, mark = " ")

Les deux derniers exercices seulement — le fichier complet (107 693 lignes) est dans catalogue.csv / l’API.

Source & données

Code
tibble::tibble(
  ` ` = c("Jeu de données", "Producteur", "Licence", "Fichier", "Mise à jour", "Observations"),
  `  ` = c(
    "[Subventions aux associations votées](https://opendata.paris.fr/explore/dataset/subventions-associations-votees-/)",
    "Secrétariat général du Conseil de Paris — Ville de Paris",
    "Open Database License (ODbL)",
    sprintf("`data/paris/subventions-associations-votees-.parquet` (%s ko)", round(file.size(subv_path) / 1024)),
    format(as.Date(file.mtime(subv_path)), "%d %B %Y"),
    sprintf("%s lignes (%d à %d)", nrow(subv), min(subv$annee), max(subv$annee))
  )
) |>
  gt::gt() |> gt::fmt_markdown(columns = `  `) |>
  gt::tab_options(table.width = "100%", column_labels.hidden = TRUE)
Jeu de données Subventions aux associations votées
Producteur Secrétariat général du Conseil de Paris — Ville de Paris
Licence Open Database License (ODbL)
Fichier data/paris/subventions-associations-votees-.parquet (3575 ko)
Mise à jour 04 septembre 2026
Observations 107693 lignes (NA à NA)