Soins de ville par lieu d’exécution (juillet 2026)

Données - Assurance Maladie (Cnam)

Code
source(here::here("_rinit.R"))
invisible(Sys.setlocale("LC_TIME", "fr_FR.UTF-8"))
# cd ~/iCloud/website/data/cnam; /usr/local/bin/R -e 'quarto::quarto_render("risque_lieu_execution.qmd")'
# (données : Rscript --vanilla cnam.R)

knitr::opts_chunk$set(echo = TRUE, message = FALSE, warning = FALSE,
                      fig.width = 9, fig.height = 5.5, dpi = 150)
library(dplyr); library(tidyr); library(ggplot2); library(stringr)

path <- here::here("data", "cnam", "risque_lieu_execution.parquet")
d <- arrow::read_parquet(path)

mdd <- scales::label_number(scale = 1e-9, suffix = " Md€", accuracy = 0.1, big.mark = " ", decimal.mark = ",")
mde <- scales::label_number(scale = 1e-6, suffix = " M€", accuracy = 1, big.mark = " ", decimal.mark = ",")
pct <- scales::label_percent(accuracy = 0.1, decimal.mark = ",")
nb  <- scales::label_number(big.mark = " ", decimal.mark = ",")

theme_cnam <- theme_minimal(base_size = 12) +
  theme(plot.title = element_text(face = "bold", size = 13), plot.title.position = "plot",
        plot.subtitle = element_text(colour = "grey35"),
        panel.grid.minor = element_blank(), legend.position = "bottom")
col1 <- "#1b7f79"; col2 <- "#c0392b"

# barres horizontales triées
barh <- function(df, lab, val, fmt = mdd, fill = col1, ...) {
  df |>
    mutate(.l = forcats::fct_reorder({{ lab }}, {{ val }})) |>
    ggplot(aes(.l, {{ val }})) +
    geom_col(fill = fill, ...) +
    geom_text(aes(label = fmt({{ val }})), hjust = -0.08, size = 3) +
    coord_flip() +
    scale_y_continuous(labels = fmt, expand = expansion(mult = c(0, 0.2))) +
    labs(x = NULL, y = NULL) + theme_cnam
}
Code
l <- d
postes <- c("Médecins", "Dentistes", "Sages-femmes", "Infirmiers", "Masseurs kinésithérapeutes", "Orthophonistes",
            "Orthoptistes", "Pédicures", "Laboratoires")
ville <- l |> filter(bloc == "Soins de ville hors médicaments", poste %in% postes)

Soins de ville par catégorie de professionnel et lieu d’exécution (cabinets libéraux, établissements privés, centres de santé), résultats cumulés à fin juillet 2026 : dépense totale, montants remboursables et remboursés, avec l’évolution en PCAP (par rapport à la même période de l’année précédente). Un second tableau isole les médicaments délivrés en officines de ville, en établissements publics (rétrocession) et en centres de santé.

Où les soins sont-ils exécutés ?

Code
ville |> filter(lieu != "Total") |>
  mutate(poste = forcats::fct_reorder(poste, depense_totale, sum)) |>
  ggplot(aes(poste, depense_totale, fill = lieu)) + geom_col() + coord_flip() +
  scale_y_continuous(labels = mdd) + scale_fill_manual(values = c(col1, col2, "#e0a030")) +
  labs(x = NULL, y = NULL, fill = NULL, title = "Dépense totale par professionnel et lieu d'exécution") + theme_cnam

Code
part <- \(p, lieu_) ville$depense_totale[ville$poste == p & ville$lieu == lieu_] / ville$depense_totale[ville$poste == p & ville$lieu == "Total"]

Les médecins réalisent 23,6% de leur dépense en établissements privés (cliniques) ; les dentistes 14,0% en centres de santé ; les autres professionnels exercent presque exclusivement en cabinet libéral (les laboratoires : 6,8% en établissements privés).

Taux de prise en charge et croissance

Code
ville |> filter(lieu == "Total") |> mutate(taux = montant_rembourse / depense_totale) |>
  barh(poste, taux, fmt = pct, fill = "#8e6cb8") +
  labs(title = "Remboursé / dépense totale, tous lieux", subtitle = "montants remboursés rapportés à la dépense totale (tarifs libres et dépassements exclus du remboursé)")

Code
ville |> filter(lieu == "Total") |> mutate(l = forcats::fct_reorder(poste, evol_depense_totale)) |>
  ggplot(aes(l, evol_depense_totale, fill = evol_depense_totale > 0)) + geom_col(show.legend = FALSE) +
  geom_text(aes(label = pct(evol_depense_totale)), hjust = -0.1, size = 3.2) +
  coord_flip() + scale_y_continuous(labels = scales::label_percent(), expand = expansion(mult = c(0, .12))) +
  scale_fill_manual(values = c(`TRUE` = col1, `FALSE` = col2)) +
  labs(x = NULL, y = NULL, title = "Évolution de la dépense totale sur un an (PCAP)") + theme_cnam

Tableau

Code
l |> filter(lieu == "Total") |>
  transmute(Bloc = bloc, Poste = poste, `Dépense totale` = depense_totale, PCAP = evol_depense_totale,
            `Remboursé` = montant_rembourse, `PCAP remboursé` = evol_montant_rembourse) |>
  gt::gt(groupname_col = "Bloc") |> gt::fmt_number(c(`Dépense totale`, `Remboursé`), decimals = 0, sep_mark = " ") |>
  gt::fmt_percent(c(PCAP, `PCAP remboursé`), decimals = 1) |> gt::tab_options(table.width = "100%")
Poste Dépense totale PCAP Remboursé PCAP remboursé
Soins de ville hors médicaments
Médecins 20 540 275 685 4.6% 14 809 171 207 4.6%
dont généralistes 6 632 069 322 6.3% 5 318 975 670 8.6%
spécialistes 13 908 206 363 3.8% 9 490 195 537 2.5%
Dentistes 8 202 484 392 3.6% 2 754 749 917 2.9%
Sages-femmes 393 948 755 5.4% 337 528 445 4.6%
Infirmiers 5 861 107 415 1.9% 5 392 720 391 1.9%
Masseurs kinésithérapeutes 4 225 972 890 7.1% 3 042 947 062 6.2%
Orthophonistes 777 326 691 4.1% 563 557 649 3.9%
Orthoptistes 258 267 921 5.8% 166 095 016 6.0%
Pédicures 61 655 505 10.9% 55 572 327 9.6%
Laboratoires 2 821 059 822 3.9% 1 866 371 961 3.7%
Total 43 266 149 849 4.4% 29 067 477 241 4.1%
Médicaments
Médicaments 21 953 668 789 4.7% 18 419 355 409 4.8%

Source

Caisse nationale de l’Assurance Maladie (Cnam) — Cnam (SNDS) — Dépenses par type de risque, résultats cumulés à fin juillet 2026, onglet « Lieu d’exécution ». Conversion Excel → Parquet : cnam.R (dossier data/cnam).