Medic’AM 2012-2014 — médicaments remboursés par prescripteur

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("medicam_2012_2014.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", "medicam_2012_2014.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
med <- d
tot <- med |> group_by(prescripteur, annee) |>
  summarise(montant = sum(montant_rembourse, na.rm = TRUE), boites = sum(boites_remboursees, na.rm = TRUE),
            base = sum(base_remboursement, na.rm = TRUE), .groups = "drop")
lab_p <- c(tous = "Tous prescripteurs", ville = "Prescripteurs de ville (libéraux)", salaries = "Prescripteurs salariés (hôpital)")

Medic’AM donne, pour chaque présentation pharmaceutique (code CIP7), la base de remboursement, le nombre de boîtes remboursées et le montant remboursé en 2012, 2013 et 2014, tous régimes, France entière, soins de ville uniquement (hors rétrocession). Trois onglets : tous prescripteurs, prescripteurs de ville (libéraux, y compris en clinique) et prescripteurs salariés (surtout l’hôpital public). Le fichier contient 16 606 présentations et 87 classes ATC de niveau 2.

Évolution globale

Code
tot |> filter(prescripteur != "tous") |>
  ggplot(aes(factor(annee), montant, fill = lab_p[prescripteur])) +
  geom_col() + geom_text(aes(label = mdd(montant)), position = position_stack(vjust = 0.5), colour = "white", size = 3.5) +
  scale_y_continuous(labels = mdd) +
  scale_fill_manual(values = c(col1, col2)) +
  labs(x = NULL, y = NULL, fill = NULL, title = "Médicaments remboursés en ville selon le type de prescripteur") + theme_cnam

Code
tot |> mutate(prescripteur = lab_p[prescripteur], taux = montant / base) |>
  select(Prescripteur = prescripteur, Année = annee, `Remboursé` = montant, `Boîtes` = boites, `Taux de remb.` = taux) |>
  gt::gt() |> gt::fmt_number(c(`Remboursé`, `Boîtes`), decimals = 0, sep_mark = " ") |>
  gt::fmt_percent(`Taux de remb.`, decimals = 1) |> gt::tab_options(table.width = "100%")
Prescripteur Année Remboursé Boîtes Taux de remb.
Prescripteurs salariés (hôpital) 2012 5 528 278 730 259 984 524 91.0%
Prescripteurs salariés (hôpital) 2013 5 868 139 612 272 387 651 91.6%
Prescripteurs salariés (hôpital) 2014 6 054 238 175 284 901 913 91.7%
Tous prescripteurs 2012 20 990 870 894 2 387 110 004 79.4%
Tous prescripteurs 2013 20 860 107 975 2 400 782 354 80.4%
Tous prescripteurs 2014 20 632 344 655 2 406 378 986 80.8%
Prescripteurs de ville (libéraux) 2012 15 462 592 164 2 127 125 480 76.0%
Prescripteurs de ville (libéraux) 2013 14 991 968 363 2 128 394 703 76.7%
Prescripteurs de ville (libéraux) 2014 14 578 106 480 2 121 477 073 76.9%

La dépense en médicaments de ville est quasi stable sur la période (effet des baisses de prix et de la diffusion des génériques compensant la hausse des volumes) ; les prescripteurs salariés pèsent une part croissante.

Par classe thérapeutique

Code
med |> filter(prescripteur == "tous", annee == 2014) |>
  group_by(atc2, libelle_atc2) |> summarise(montant = sum(montant_rembourse, na.rm = TRUE), .groups = "drop") |>
  slice_max(montant, n = 20) |>
  mutate(l = paste0(atc2, " — ", str_to_sentence(str_trunc(libelle_atc2, 55)))) |>
  barh(l, montant) + labs(title = "Classes ATC2 les plus remboursées, 2014")

Code
med |> filter(prescripteur == "tous") |>
  group_by(atc2, libelle_atc2, annee) |> summarise(m = sum(montant_rembourse, na.rm = TRUE), .groups = "drop") |>
  pivot_wider(names_from = annee, values_from = m, names_prefix = "a") |>
  filter(a2012 > 1e8) |> mutate(var = a2014 / a2012 - 1) |>
  mutate(l = paste0(atc2, " — ", str_to_sentence(str_trunc(libelle_atc2, 50)))) |>
  slice_max(abs(var), n = 20) |>
  mutate(l = forcats::fct_reorder(l, var), signe = var > 0) |>
  ggplot(aes(l, var, fill = signe)) + geom_col(show.legend = FALSE) + coord_flip() +
  scale_y_continuous(labels = pct) + scale_fill_manual(values = c(`TRUE` = col1, `FALSE` = col2)) +
  labs(x = NULL, y = NULL, title = "Plus fortes variations 2012-2014 (classes > 100 M€ en 2012)") + theme_cnam

Part de l’hôpital dans la prescription de ville

Code
med |> filter(prescripteur %in% c("tous", "salaries"), annee == 2014) |>
  group_by(atc2, libelle_atc2, prescripteur) |> summarise(m = sum(montant_rembourse, na.rm = TRUE), .groups = "drop") |>
  pivot_wider(names_from = prescripteur, values_from = m) |>
  filter(tous > 1.5e8) |> mutate(part = salaries / tous) |>
  mutate(l = paste0(atc2, " — ", str_to_sentence(str_trunc(libelle_atc2, 50)))) |>
  barh(l, part, fmt = pct, fill = "#8e6cb8") +
  labs(title = "Part des prescripteurs salariés dans le remboursé, classes > 150 M€ (2014)")

Les traitements les plus « hospitaliers » (antiviraux de l’hépatite C, anticancéreux, immunosuppresseurs) apparaissent en tête : ils sont prescrits à l’hôpital mais délivrés en ville.

Les produits les plus remboursés en 2014

Code
med |> filter(prescripteur == "tous", annee == 2014) |>
  group_by(produit) |> summarise(montant = sum(montant_rembourse, na.rm = TRUE), boites = sum(boites_remboursees, na.rm = TRUE), .groups = "drop") |>
  slice_max(montant, n = 20) |>
  mutate(l = str_to_sentence(produit)) |> barh(l, montant, fill = col2) +
  labs(title = "Top 20 des produits (nom commercial), 2014")

Source

Caisse nationale de l’Assurance Maladie (Cnam) — Medic’AM (Cnamts / DSES, édition avril 2016). Conversion Excel → Parquet : cnam.R (dossier data/cnam).