Jouons avec les tarifs

Ça y est ! Ils sont enfin parus ces tant attendus tarifs 2024 !
Et si nous en profitions pour jouer avec ?

Aujourd’hui donc nous allons utiliser des éléments déjà appris et développés pour explorer les données de l’arrêté tarifaire MCO 2024.

Les fichiers

Nous allons avoir besoin de sources officielles. Elles sont récupérables sur le site de l’ATIH à https://www.atih.sante.fr/tarifs-mco-et-had
Prenez les csv de 2 années qui vous intéressent (probablement les 2 dernières, à la date d’écriture 2023 et 2024)

Dézippez les archives et récupérez les fichiers ghs_***.csv qui vous concernent. Rangez-les de façon pertinente.

Dans la suite de l’article, je vais utiliser les GHS publics donc j’ai besoin de chacun des ghs_pub.csv .

Il nous faut aussi un RSA. Idéalement le M12 de l’année de référence.

Le code de base

Nous allons réutiliser une partie code écrit pour notre fonction de valorisation et son utilisation pour les calculs de RAAC à Addendum : exemples de traitements RAAC

Pour plus de rapidité, je vous en remet le principal ici (tout ne servira pas mais par exemple vous pourrez jouer avec les regroupements de ghm, le code pour les charger y est déjà). Pensez à adapter les chemins de fichiers se situant en début de code à votre environnement en vous aidant si besoin de l’article cité juste au dessus.

Les librairies

Nous utiliserons dplyr pour l’interrogation et ggplot2 pour la visualisation. Les autres sont nécessaires pour les fonctions de traitement

library(dplyr)     # pour toute la logique relationnelle
library(tidyr)     # pour certaines sélections de colonnes
library(readr)     # pour lire le RSA et les csv
library(readxl)    # pour lire le fichier excel du regroupement des GHM
library(lubridate) # pour la manipulation de dates
library(ggplot2)   # poue les graphiques

Les paramètres à personnaliser

A vous de les adapter à vos conditions locales

##########################################################
# Paramètres variables
# A paramétrer selon l'emplacement de vos données
motifFichiersGHS <- "~/R/%ANNEE%/ghs_pub.csv"
motifFichiersRGHM <- "~/R/2022/regroupements_racinesghm.xlsx"

statut <- "public"
motifFichiersGHMINFO <- "~/R/2022/GHMINFO_"

ANNEE_R <- 2023
ANNEE_N <- 2024

fichierRSA <- "~/R/330780529.2023.12.rsa"

Les fonctions de traitement déjà développées

##########################################################
# Fonctions nécessaires
# Rien n'est à modifier à partir d'ici

# Fonction de chargement de RSA
chargeRSA <- function(fichierRSA) {
  read_fwf(
    file          = fichierRSA,
    col_positions = fwf_cols(
      NRSA    = c(13,22),
      GHMIN   = c(31, 36),
      RGHMIN  = c(31, 35),
      SEVIN   = c(36, 36),
      GHMOUT  = c(42, 47),
      RGHMOUT = c(42, 46),
      SEVOUT  = c(47, 47),
      AGEA    = c(53, 55),
      AGEJ    = c(56, 58),
      SEXE    = c(59, 59),
      MOIS    = c(62, 63),
      ANNEE   = c(64, 67),
      GHS     = c(96, 99),
      DS      = c(71, 74),
      TOPUHCD = c(111, 111),
      MINORE  = c(112, 112),
      RAAC    = c(199, 199),
      DP      = c(212, 217),
      DR      = c(218, 223)
    ),
    col_types = list(
      col_character(),
      col_character(),
      col_character(),
      col_character(),
      col_character(),
      col_character(),
      col_character(),
      col_number(),
      col_number(),
      col_character(),
      col_number(),
      col_number(),
      col_number(),
      col_number(),
      col_character(),
      col_character(),
      col_character()
    )
  )
}

# Génération du chemin selon l'année
genereChemin = function(fp, annees){
  lapply(annees, function(x){sub("%ANNEE%",x, fp)}) %>% as.character
}

# Fonction de chargement des GHSs
chargeGHSs <- function(rsa,fp,simplify = FALSE){
  t <- read_csv2(genereChemin(fp,seq(min(rsa$ANNEE)-1,max(rsa$ANNEE))),
                 col_types = list(
                   col_number(),
                   col_character(),
                   col_character(),
                   col_character(),
                   col_character(),
                   col_number(),
                   col_number(),
                   col_number(),
                   col_number(),
                   col_number(),
                   col_number(),
                   col_date(format="%d/%M/%Y")),
                 col_names = c("GHS", 
                               "CMD",
                               "DCS",
                               "GHM",
                               "LIB",
                               "BB",
                               "BH",
                               "GHSPRIX",
                               "FORFAIT_EXB",
                               "EXBPRIX",
                               "EXHPRIX",
                               "DEFFET"),
                 skip = 1 # On saute une ligne, vu qu'on définit directement les noms de colonnes
  )
  if (simplify == TRUE){
    t <- t %>% group_by(GHS,DEFFET) %>% summarise(
      CMD = first(CMD),
      DCS = first(DCS),
      GHM = first(GHM),
      LIB = first(LIB),
      BB = first(BB),
      BH = first(BH),
      GHSPRIX = first(GHSPRIX),
      FORFAIT_EXB = first(FORFAIT_EXB),
      EXBPRIX = first(EXBPRIX),
      EXHPRIX = first(EXHPRIX),
      DEFFET = first(DEFFET)
    )
  }
  t %>% mutate(ANNEE = as.character(year(DEFFET)))
}

# Fonction de valorisation unitaire
valorise <- function(ghs, ds, bb, bh, ghsprix, forfait_exb = 0, exb, exh){
  dna = !is.na(ghsprix)
  dexb=  dna & (ds < bb) & (forfait_exb == 0)
  dexh = dna & (ds > bh) 
  dforfait = dna & (ds < bb) & (forfait_exb >= 0) 
  dghs = dna & (ds >= bb) & (ds <= bh)
  
  x<-double()
  x[!dna]      <- NA
  x[dghs]     <- ghsprix[dghs]
  x[dforfait] <- ghsprix[dforfait] - forfait_exb[dforfait]
  x[dexb]     <- ghsprix[dexb] + (bb[dexb] - ds[dexb]) * exb[dexb]
  x[dexh]     <- ghsprix[dexh] + (ds[dexh] - bh[dexh]) * exh[dexh]
  x
}

# Fonction de valorisation en masse
valorise.ghs_df <- function (x, ghss, ghs_col = "GHS", ds_col = "DS",
                             annee_col = NA, out_col = "valo",
                             FUN = "valorise"){
  
  if (out_col %in% names(x))
    stop("la colonne de sortie `", out_col, "`` existe déjà.")
  
  if (!(ghs_col %in% names(x)))
    stop("la colonne du GHS `", ghs_col, "` est absente du jeu source.")
  
  if (!(ds_col %in% names(x)))
    stop("la colonne de durée de séjours `", ds_col, "` est absente du jeu source.")
  
  if(is.na(annee_col)) {
    y <- x %>% mutate(anneeValo=as.character(ifelse(MOIS<3,ANNEE-1,ANNEE)))
    annee_col <- "anneeValo"
    
  } else {
    if (annee_col %in% names(x))
      y <- x
    
    else {
      y <- x %>% mutate(anneeValo=as.character(ifelse(MOIS<3,ANNEE-1,ANNEE)))
      
      message("La colonne \"",
              annee_col,
              "\" correspondant au paramètre `annee_col` n'a pas été trouvée. `anneeValo` a été utilisée à sa place en interne.")
      
      annee_col <- "anneeValo"
      
    }
  }
  
  y <- y%>% select(all_of(c(ghs_col,ds_col,
                            annee_col)))
  
  y <- y  %>% left_join(ghss,by=c(setNames(c("GHS", "ANNEE"),c(ghs_col,annee_col))))
  
  x[,out_col] <-  do.call(FUN, args = list(NA,
                                           y[, ds_col],
                                           y[, "BB"],
                                           y[, "BH"],
                                           y[, "GHSPRIX"],
                                           y[, "FORFAIT_EXB"],
                                           y[, "EXBPRIX"],
                                           y[, "EXHPRIX"]))
  x
}

Le code correspondant aux questions sera à rajouter à la fin du fichier.

Posons-nous des questions

Comme d’habitude , essayez de réfléchir et tester avant de regarder la solution.

Vous trouverez les réponses dans l’article suivant.

Analyse des tarifs

Les questions suivantes concernent l’évolution des tarifs indépendamment de nos séjours.

  • Q1 : Y a-t-il de nouveaux GHS ? (Il est nécessaire de vérifier car qui dit nouveaux ghm dit nouvelle fonction groupage donc non équivalence stricte d’une année sur l’autre)
  • Q1bis : Corolaire, des GHS ont-il disparus ?
  • Q2 : Des GHS présentent-ils des modifications de paramètre de calcul (Bornes haute et basse) ?
  • Q3 : De combien est l’évolution moyenne des prix de base pour l’ensemble des GHS en pourcentage ? (c’est le taux qui est utilisé larga manu par les tutelles pour communiquer vers le grand public)
  • Q4 : De combien le prix de base (GHSPRIX) a-t-il évolué pour chaque GHS en valeur absolue et en pourcentage ?
    • Représenter graphiquement la fréquence du pourcentage d’évolution en fonction de la CMD
    • Puis en fonction du type de GHM

Etude de la valorisation

Préambule

il existe 2 possibilités pour étudier notre activité. Soit se baser sur l’activité réelle, soit se baser sur le case-mix.

Pour l’activité réelle, nous réalisons la “double-valorisation” de chaque séjour puis additionnons les résultats de chaque séjour.

Pour le case-mix, on peut calculer la DMS par GHM/GHS, appliquer la valorisation à ce séjour moyen et enfin pondérer par le nombre de séjours. L’intérêt est qu’il est possible de comparer avec d’autres (paniers d’) établissements ou régions où France entière via les tableaux de ScanSanté.

  • P1 : Calculez votre case-mix par GHS avec GHS, GHM et DMS

Questions

  • Q1 : Valorisez votre activité réelle
  • Q2 : Et votre casemix
  • Q3 : Qu’est-ce qui explique cette différence ?
  • Q4 : Quel est votre pourcentage d’évolution réel ?

Comme prévu, toutes les réponses dans l’article suivant.


Pour ceux qui ne connaissent pas, le jeu illustrant l’article est Theme Hospital, un “vieux” jeu de 1998 sur PC.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *