Reste à charge — décomposition de la dépense totale (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_depense_totale.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_depense_totale.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
r <- d |> filter(unite == "euros")
w_ <- r |> select(bloc, poste, parent, colonne, valeur) |>
  pivot_wider(names_from = colonne, values_from = valeur)
w_ <- w_ |> mutate(dep = coalesce(`Honoraires perçus`, `Dépense totale`),
                   remb = `Dépenses remboursées`, rac = `Total reste à charge`,
                   taux_amo = remb / dep, taux_rac = rac / dep)

Décomposition, cumul de janvier à juillet 2026, de la dépense totale de soins de ville en part prise en charge par l’assurance maladie obligatoire (AMO) et reste à charge avant intervention des complémentaires : ticket modérateur, dépassements d’honoraires, franchises, participations forfaitaires. Deux tableaux : honoraires médicaux et paramédicaux + transports, et médicaments + LPP (optique et audioprothèses détaillées). Montants en euros (le fichier indique « milliers d’euros » mais les ordres de grandeur sont ceux d’euros).

Part remboursée par l’assurance maladie

Code
w_ |> filter(!is.na(dep), poste != "Total", is.na(parent), !is.na(taux_amo)) |>
  mutate(l = forcats::fct_reorder(poste, taux_amo)) |>
  ggplot(aes(l, taux_amo, fill = bloc)) + geom_col() +
  geom_text(aes(label = pct(taux_amo)), 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(col1, col2)) +
  labs(x = NULL, y = NULL, fill = NULL, title = "Part de la dépense totale remboursée par l'AMO") + theme_cnam

Les optique (1,8% remboursé), audioprothèses (21,0%) et dentistes (33,1%) sont les postes où l’AMO prend le moins en charge ; les frais de déplacement, médicaments et laboratoires sont, à l’inverse, bien couverts.

Composition du reste à charge

Code
comp <- r |> filter(poste != "Total", is.na(parent),
                    colonne %in% c("Dépassements", "Participations forfaitaires", "Participation assuré", "Franchises", "Ticket modérateur")) |>
  mutate(l = forcats::fct_reorder(poste, valeur, sum))
ggplot(comp, aes(l, valeur, fill = colonne)) + geom_col() + coord_flip() +
  scale_y_continuous(labels = mdd) + scale_fill_brewer(palette = "Set2") +
  labs(x = NULL, y = NULL, fill = NULL, title = "Reste à charge (avant complémentaires) par poste et par nature") + theme_cnam

Sur les honoraires, le reste à charge de 13,5 Md€ se répartit surtout entre dépassements (médecins spécialistes, dentistes) et ticket modérateur.

Tableau détaillé

Code
w_ |> filter(!is.na(dep)) |>
  transmute(Bloc = bloc, Poste = poste, `Dépense totale` = dep, `Remboursé AMO` = remb, `Reste à charge` = rac,
            `Part AMO` = taux_amo, `Reste à charge / dép.` = taux_rac) |>
  gt::gt(groupname_col = "Bloc") |> gt::fmt_number(c(`Dépense totale`, `Remboursé AMO`, `Reste à charge`), decimals = 0, sep_mark = " ") |>
  gt::fmt_percent(c(`Part AMO`, `Reste à charge / dép.`), decimals = 1) |> gt::tab_options(table.width = "100%")
Poste Dépense totale Remboursé AMO Reste à charge Part AMO Reste à charge / dép.
Honoraires médicaux et paramédicaux + transports
Médecins libéraux 19 730 406 632 14 189 568 080 5 540 838 552 71.9% 28.1%
Généralistes 6 218 627 245 5 002 756 612 1 215 870 633 80.4% 19.6%
Spécialistes 13 511 779 386 9 186 811 468 4 324 967 919 68.0% 32.0%
Dentistes libéraux 7 056 107 394 2 332 844 717 4 723 262 677 33.1% 66.9%
Sages-femmes libérales 374 267 978 320 675 306 53 592 672 85.7% 14.3%
Auxiliaires médicaux 11 157 527 472 9 179 448 846 1 978 078 625 82.3% 17.7%
Laboratoires 2 821 059 822 1 866 371 961 954 687 862 66.2% 33.8%
Frais de déplacement des malades 3 629 913 503 3 423 290 208 206 623 295 94.3% 5.7%
Total 44 769 282 800 31 312 199 117 13 457 083 684 69.9% 30.1%
Médicaments + LPP
Médicaments 21 953 668 789 18 419 355 409 3 534 313 380 83.9% 16.1%
LPP 11 625 495 683 5 328 676 829 6 296 818 854 45.8% 54.2%
Optique 4 155 987 204 72 769 888 4 083 217 316 1.8% 98.2%
Appareils de surdité 1 203 201 098 252 904 345 950 296 753 21.0% 79.0%

Source

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