Prise en main des données

Chargement des packages et importation des données

#install.packages("tidyverse")

library(dplyr)
library(ggplot2)
library(tidyverse)
# Répertoire de travail
setwd("D:/Home/legachet/Downloads")

cancer <- read.csv("Projet R/CANCERO_2019.csv", sep=";")

urgences_2017 <- read.csv("Projet R/URGENCES2_2017.csv", sep=";")
urgences_2018 <- read.csv("Projet R/URGENCES2_2018.csv", sep=";")
urgences_2019 <- read.csv("Projet R/URGENCES2_2019.csv", sep=";")
urgences_2020 <- read.csv("Projet R/URGENCES2_2020.csv", sep=";")
urgences_2021 <- read.csv("Projet R/URGENCES2_2021.csv", sep=";")

Q20_2019 <- read.csv("Projet R/Q20_2019.csv", sep=";")

Desc_Q20 <- read.csv("Projet R/Desc_Q20.csv")

Cancero

Cette partie est dédiée à l’analyse des données sur les activités liées au traitement du cancer dans les établissements de santé, notamment les traitements par chimiothérapie et radiothérapie, les séjours en hospitalisation complète ou ambulatoire, ainsi que les effectifs du personnel médical et paramédical impliqué dans ces soins.

  1. Nombre de patients adultes ayant eu un traitement par chimiothérapie en MCO
somme_CANCERO_A11 <- sum(cancer$CANCERO_A11, na.rm = TRUE)
somme_CANCERO_A11
## [1] 356899
  1. Comparaison des proportions de traitement par chimiothérapie entre adultes et enfants en MCO et HAD
# Calcul de la proportion des adultes traités en HAD
proportion_adultes_HAD <- sum(cancer$CANCERO_B11, na.rm = TRUE) /( sum(cancer$CANCERO_B11, na.rm = TRUE) + somme_CANCERO_A11)

proportion_adultes_HAD <- proportion_adultes_HAD*100

# Calcul de la proportion des enfants traités en HAD
proportion_enfants_HAD <- sum(cancer$CANCERO_D11, na.rm = TRUE) / (sum(cancer$CANCERO_C11, na.rm = TRUE) + sum(cancer$CANCERO_D11, na.rm = TRUE))

proportion_enfants_HAD <- proportion_enfants_HAD*100


# Résultats
cat("Proportion des adultes ayant reçu une chimiothérapie en HAD :", proportion_adultes_HAD,"%", "\n")
## Proportion des adultes ayant reçu une chimiothérapie en HAD : 1.243522 %
cat("Proportion des enfants ayant reçu une chimiothérapie en HAD :", proportion_enfants_HAD,"%", "\n")
## Proportion des enfants ayant reçu une chimiothérapie en HAD : 4.932004 %
  1. Création de la variable Patients : addition des traitements pour adultes et enfants en MCO et HAD
cancer <- cancer %>%
  mutate(Patients = CANCERO_B11 + CANCERO_C11 + CANCERO_D11 + CANCERO_A11)

head(cancer[,88:89])
##   CANCERO_C34 Patients
## 1        2.98      970
## 2          NA       87
## 3          NA       NA
## 4        0.71      349
## 5          NA        2
## 6        6.88      877
# Filtrer les données pour enlever les lignes avec des valeurs manquantes dans Patients et CANCERO_C28
cancer <- cancer %>%
  filter(!is.na(Patients) & !is.na(CANCERO_C28) & is.finite(Patients) & is.finite(CANCERO_C28))

# Représentation graphique du nombre de médecins oncologues (CANCERO_C28) en fonction du nombre de Patients
ggplot(cancer, aes(x = Patients, y = CANCERO_C28)) +
  geom_point(color = "blue") +
  labs(
    title = "Nombre de médecins oncologues en fonction du nombre de patients",
    x = "Nombre de patients",
    y = "Nombre de médecins oncologues (ETP)"
  ) +
  theme_minimal()

On remarque que le nombre de médecins a tendance a augmenté avec le nombre de patients. Cependant, ce graphique n’est pas très clair car les valeurs extrêmes nous empêche de bien observé la tendance de la plupart des individus qui sont en dessous des 2000 patients.

# Filtrage pour les hôpitaux ayant moins de 2000 patients et zoom sur le graphique
cancer_filtered <- cancer %>%
  filter(Patients < 2000)

ggplot(cancer_filtered, aes(x = Patients, y = CANCERO_C28)) +
  geom_point(color = "blue") +
  labs(
    title = "Nombre de médecins oncologues en fonction du nombre de patients (moins de 2000 patients)",
    x = "Nombre de patients (< 2000)",
    y = "Nombre de médecins oncologues (ETP)"
  ) +
  theme_minimal()

Urgences

Cette partie est dédiée à l’analyse des données sur les unités des urgences générales dans les établissements de santé en France.

  1. Comparaison des passages aux urgences pour les patients de plus de 80 ans et de moins de 18 ans
# Filtre des unités d'urgences générales
urgences_2019_gen <- urgences_2019 %>%
  filter(URG == "GEN")

# Calcule du nombre total de passages pour les patients de plus de 80 ans et pour les patients de moins de 18 ans
total_passages_80_plus <- sum(urgences_2019_gen$dt80, na.rm = TRUE)
total_passages_18_moins <- sum(urgences_2019_gen$dt18, na.rm = TRUE)

# Résultats
cat("Nombre total de passages aux urgences pour les patients de plus de 80 ans :", total_passages_80_plus, "\n")
## Nombre total de passages aux urgences pour les patients de plus de 80 ans : 2007238
cat("Nombre total de passages aux urgences pour les patients de moins de 18 ans :", total_passages_18_moins, "\n")
## Nombre total de passages aux urgences pour les patients de moins de 18 ans : 3406550
# Unité d’urgence générale pour laquelle la proportion de patients de moins de 18 ans est la plus élevée

urgences_2019_gen$proportion_18 <-urgences_2019_gen$dt18/urgences_2019_gen$PASSU

index_max_proportion <- which.max(urgences_2019_gen$proportion_18)

valeur_FI_max <- urgences_2019_gen$FI[index_max_proportion]
print(valeur_FI_max)
## [1] "910000280"
  1. Analyse des lits supplémentaires en 2020
# Filtrage pour les unités des urgences générales
urgences_2020_gen <- urgences_2020 %>%
  filter(URG == "GEN")

cat("Nombre d'unités d'urgences générales en 2019 :", nrow(urgences_2019_gen), "\n")
## Nombre d'unités d'urgences générales en 2019 : 613
cat("Nombre d'unités d'urgences générales en 2020 :", nrow(urgences_2020_gen), "\n")
## Nombre d'unités d'urgences générales en 2020 : 605
merged_data <- merge(urgences_2019_gen, urgences_2020_gen, by = "FI")
merged_data$diff_lits <- merged_data$LIT_UHCD.y-merged_data$LIT_UHCD.x

count_positive_diff_lits <- sum(merged_data$diff_lits > 0, na.rm = TRUE)
cat("Nombre d’unites générales dans laquelle on a rajouté des lits en 2020 :", count_positive_diff_lits, "\n")
## Nombre d’unites générales dans laquelle on a rajouté des lits en 2020 : 40
  1. Evolution de la moyenne annuelle du nombre total de passages aux urgences dans les unités générales entre 2017 et 2021
# Création d'une liste avec les jeux de données pour les années 2017 à 2021
years_data <- list(
  urgences_2017 = urgences_2017,
  urgences_2018 = urgences_2018,
  urgences_2019 = urgences_2019,
  urgences_2020 = urgences_2020,
  urgences_2021 = urgences_2021
)

# Initialisation d'un data frame pour stocker les moyennes annuelles
moyennes_annuelles <- data.frame(Année = 2017:2021, Moyenne_Passages = numeric(5))

# Calcul de la moyenne des passages aux urgences pour chaque année
for (i in seq_along(years_data)) {
  moyennes_annuelles$Moyenne_Passages[i] <- 
    years_data[[i]] %>%
    filter(URG == "GEN") %>%  # Filtrer pour les unités d'urgences générales
    summarize(Moyenne = mean(PASSU, na.rm = TRUE)) %>%
    pull(Moyenne)  # Extraire la valeur de la moyenne
}

# Représentation graphique de l'évolution de la moyenne annuelle des passages
ggplot(moyennes_annuelles, aes(x = Année, y = Moyenne_Passages)) +
  geom_line(color = "blue", size = 1) +  # Ligne pour la tendance
  geom_point(color = "red", size = 3) +  # Points pour chaque année
  labs(
    title = "Évolution de la Moyenne Annuelle des Passages aux Urgences (2017-2021)",
    x = "Année",
    y = "Moyenne des Passages"
  ) +
  theme_minimal()

Q20

Cette partie est dédiée à l’analyse des données sur les effectifs de personnel médical et paramédical dans différents établissements de santé.

  1. Proportion de données manquantes
missing_proportion <- colMeans(is.na(Q20_2019))
print(missing_proportion)
##       BOR        AN        FI     FI_EJ     PERSO EFFSALPLH EFFSALPLF EFFSALPAH 
## 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.5436202 0.5550356 0.5736342 
## EFFSALPAF EFFLIBPLH EFFLIBPLF EFFLIBPAH EFFLIBPAF   ETPSALH   ETPSALF    ETP_PU 
## 0.5595362 0.7574737 0.8114512 0.6808143 0.7657000 0.3907186 0.4016274 0.8265029 
##    ETP_PH    ETP_AS    ETP_HU    ETP_AT    ETP_AU    EFFSAL    ETPSAL    EFFLIB 
## 0.5917856 0.7811690 0.8352061 0.7014992 0.6844207 0.2838365 0.2567733 0.5727698
  1. Proportion d’hommes
# Total d'hommes et femmes par spécialité
summary_data <- Q20_2019 %>%
  filter(PERSO != "M9999") %>% 
  group_by(PERSO) %>%
  summarise(
    total_hommes = sum(EFFSALPLH, na.rm = TRUE),
    total_femmes = sum(EFFSALPLF, na.rm = TRUE)
  )

# Calcul de la proportion d'hommes
summary_data <- summary_data %>%
  mutate(proportion_hommes = total_hommes / (total_hommes + total_femmes))

summary_data
## # A tibble: 46 × 4
##    PERSO total_hommes total_femmes proportion_hommes
##    <chr>        <int>        <int>             <dbl>
##  1 M1010         4446         4189             0.515
##  2 M1020          275          485             0.362
##  3 M1030         3271         2369             0.580
##  4 M1031          858          362             0.703
##  5 M1040         1656          782             0.679
##  6 M1050          162          400             0.288
##  7 M1070          258          654             0.283
##  8 M1090          849          763             0.527
##  9 M1100          837          826             0.503
## 10 M1110          640          531             0.547
## # ℹ 36 more rows
# On affiche le nom des spécialités
table_unique <- Desc_Q20 %>%
  filter(Valeur.Modalité != "M9999") %>% 
  select(Valeur.Modalité, Label.modalité) %>%  
  distinct()                                   

print(table_unique)
##    Valeur.Modalité                                              Label.modalité
## 1                                                                             
## 2            M1010    Médecine générale (hors DES urgentistes, hors gériatrie)
## 3            M1020                         Anatomie et cytologie pathologiques
## 4            M1030                                    Anesthésie - Réanimation
## 5            M1031                                        Réanimation médicale
## 6            M1040                         Cardiologie et maladies vasculaires
## 7            M1050                   Dermatologie - Vénérologie - Allergologie
## 8            M1070                     Endocrinologie et maladies métaboliques
## 9            M1090                           Gastro entérologie et hépatologie
## 10           M1100                    Médecine interne et immunologie clinique
## 11           M1110                                                 Néphrologie
## 12           M1120                                                  Neurologie
## 13           M1130                                          Oncologie médicale
## 14           M1140                                                   Pédiatrie
## 15           M1150                                                 Pneumologie
## 16           M1160                                                  Radiologie
## 17           M1170                                   Oncologie radiothérapique
## 18           M1180                        Médecine physique et de réadaptation
## 19           M1190                                                Rhumatologie
## 20           M1200                                Autres spécialités médicales
## 21           M1210                                          Médecine nucléaire
## 22           M1310                                                   Génétique
## 23           M1320                                                   Gériatrie
## 24           M1330                                                 Hématologie
## 25           M1340                                          Médecine d'urgence
## 26           M2010                                          Chirurgie générale
## 27           M2020 Chirurgie maxillo-faciale  - Stomatologie - Chirurgie orale
## 28           M2030                   Chirurgie orthopédique et traumatologique
## 29           M2040          Chirurgie plastique, reconstructrice et esthétique
## 30           M2050                                   Gynécologie - Obstétrique
## 31           M2060                                             Neuro-chirurgie
## 32           M2070                                               Ophtalmologie
## 33           M2080                                      Oto-Rhino-laryngologie
## 34           M2100                                        Chirurgie urologique
## 35           M2110                            Autres spécialités chirurgicales
## 36           M2120                                         Chirurgie digestive
## 37           M2130                                        Chirurgie vasculaire
## 38           M2140                           Chirurgie thoracique et cardiaque
## 39           M2150                                         Chirurgie infantile
## 40           M3011                   Médecins spécialisés en biologie médicale
## 41           M3012                Pharmaciens spécialisés en biologie médicale
## 42           M3020                                                 Psychiatrie
## 43           M3030                                                 Odontologie
## 44           M3040                              Santé publique (y compris DIM)
## 45           M3050                        Pharmaciens (hors biologie médicale)
## 46           M3060                                         Médecins du travail
## 47           M3070                                                      Autres
# On restructure le tableau pour avoir les libellés et la proportion d'hommes correspondante
merged_data_2 <- summary_data %>%
  left_join(table_unique, by = c("PERSO" = "Valeur.Modalité"))

resultats_final <- merged_data_2 %>%
  select(Label.modalité, proportion_hommes) 

resultats_final
## # A tibble: 46 × 2
##    Label.modalité                                           proportion_hommes
##    <chr>                                                                <dbl>
##  1 Médecine générale (hors DES urgentistes, hors gériatrie)             0.515
##  2 Anatomie et cytologie pathologiques                                  0.362
##  3 Anesthésie - Réanimation                                             0.580
##  4 Réanimation médicale                                                 0.703
##  5 Cardiologie et maladies vasculaires                                  0.679
##  6 Dermatologie - Vénérologie - Allergologie                            0.288
##  7 Endocrinologie et maladies métaboliques                              0.283
##  8 Gastro entérologie et hépatologie                                    0.527
##  9 Médecine interne et immunologie clinique                             0.503
## 10 Néphrologie                                                          0.547
## # ℹ 36 more rows

Spécialité avec la proportion d’hommes la plus haute

max_proportion <- resultats_final %>%
  filter(!is.na(proportion_hommes)) %>%  # On exclu les valeurs manquantes
  slice_max(proportion_hommes) %>%    # On récupère la ligne avec la plus haute proportion
  select(Label.modalité, proportion_hommes)

max_proportion
## # A tibble: 1 × 2
##   Label.modalité                            proportion_hommes
##   <chr>                                                 <dbl>
## 1 Chirurgie orthopédique et traumatologique             0.897

Spécialité avec la proportion d’hommes la plus basse

min_proportion <- resultats_final %>%
  filter(!is.na(proportion_hommes)) %>%
  slice_min(proportion_hommes) %>%    # On récupère la ligne avec la plus basse proportion
  select(Label.modalité, proportion_hommes)

min_proportion
## # A tibble: 1 × 2
##   Label.modalité                          proportion_hommes
##   <chr>                                               <dbl>
## 1 Endocrinologie et maladies métaboliques             0.283

Spécialité avec la proportion d’hommes la plus proche de 0,5

closest_to_half <- resultats_final %>%
  filter(!is.na(proportion_hommes)) %>%
  mutate(diff = abs(proportion_hommes - 0.5)) %>% # Calcul la différence par rapport à 0,5
  slice_min(diff) %>%                 # On récupère la ligne avec la plus petite différence
  select(Label.modalité, proportion_hommes)

closest_to_half
## # A tibble: 1 × 2
##   Label.modalité                       proportion_hommes
##   <chr>                                            <dbl>
## 1 Médecine physique et de réadaptation             0.502
  1. Spécialités ordonnées en fonction du nombre total d’effectif équivalent temps plein (ETP) des hospitaliers universitaires.
Q3 <- Q20_2019 %>%
  filter(PERSO != "M9999") %>%   
  group_by(PERSO) %>%                              
  summarise(effectif = sum(ETP_PU, na.rm = TRUE)) %>%  
  arrange(desc(effectif))

Q3
## # A tibble: 46 × 2
##    PERSO effectif
##    <chr>    <dbl>
##  1 M3011    427. 
##  2 M3030    188. 
##  3 M1100    122. 
##  4 M1160    109. 
##  5 M1120    105. 
##  6 M1040    101. 
##  7 M3050     97.0
##  8 M3040     94.3
##  9 M1020     93.4
## 10 M1090     92.4
## # ℹ 36 more rows
# On associe les noms de spécialités
merged_data_3 <- Q3 %>%
  left_join(table_unique, by = c("PERSO" = "Valeur.Modalité"))

resultats_final_2 <- merged_data_3 %>%
  select(Label.modalité, effectif)  

head(resultats_final_2, 10)
## # A tibble: 10 × 2
##    Label.modalité                            effectif
##    <chr>                                        <dbl>
##  1 Médecins spécialisés en biologie médicale    427. 
##  2 Odontologie                                  188. 
##  3 Médecine interne et immunologie clinique     122. 
##  4 Radiologie                                   109. 
##  5 Neurologie                                   105. 
##  6 Cardiologie et maladies vasculaires          101. 
##  7 Pharmaciens (hors biologie médicale)          97.0
##  8 Santé publique (y compris DIM)                94.3
##  9 Anatomie et cytologie pathologiques           93.4
## 10 Gastro entérologie et hépatologie             92.4
# Représentation graphique pour les 5 premières.
barre <- resultats_final_2 %>%
  slice_head(n = 5) 

ggplot(barre, aes(x = reorder(
Label.modalité, effectif
), y = effectif
)) +
  geom_bar(stat = "identity", fill = "steelblue") +  
  labs(x = "Spécialités", y = "Total ETP", title = "Total ETP par Spécialité (5 premières)") +
  coord_flip() +                                     
  theme_minimal() 

Choix d’étude : Analyse de l’impact des lits d’urgence sur la fréquentation des urgences

L’objectif est de comprendre comment la disponibilité des lits dans les unités d’urgence générale influence le nombre de passages. Cela pourrait permettre de mettre en avant l’impact potentiel sur l’amélioration de la gestion des urgences et la qualité des soins.

Données utilisée

Nous allons utiliser les données de la table URGENCES2_2021.csv qui regroupe les informations utiles sur les services d’urgences en France pour l’année 2021. Elle contient environ 700 lignes, chaque ligne représentant une structure hospitalière, identifiée par son numéro FINESS.

Nous avons choisi cette table car ce sont les données les plus récentes qui permettent d’avoir accès aux variables clés pour notre étude : - LIT_UHCD : Nombre de lits en unité d’hospitalisation de courte durée (UHCD). - PASSU : Nombre total de passages aux urgences.

Statistiques Descriptives

Analysons la distribution des lits d’urgence parmi les structures.

# Statistiques descriptives pour LIT_UHCD
summary(urgences_2021$LIT_UHCD)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##   0.000   4.000   6.000   6.976   9.000  31.000      15
# Histogramme de LIT_UHCD
hist(urgences_2021$LIT_UHCD, 
     main = "Distribution du nombre de lits en UHCD",
     xlab = "Nombre de lits (LIT_UHCD)",
     col = "skyblue",
     border = "white")

La plupart des structures hospitalières ont moins de 10 lits. A partir de 10 lits, les structures hospitalières sont de de plus en plus rares.

Observons maintenant la distribution de la fréquentation des urgences en 2021.

# Statistiques descriptives pour PASSU
summary(urgences_2021$PASSU)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##       0   15751   25135   29380   37696  107777
# Histogramme de PASSU
hist(urgences_2021$PASSU, 
     main = "Distribution du nombre de passages aux urgences",
     xlab = "Nombre de passages (PASSU)",
     col = "lightgreen",
     border = "white",
     xaxt = 'n')

axis(1, at = pretty(urgences_2021$PASSU), labels = format(pretty(urgences_2021$PASSU), scientific = FALSE))

Une grande partie des structures hospitalières ont eu entre 10000 et 40000 passages en 2021. La plus grande fréquentation est de 107 777 passages.

Analyse de Corrélation

Nuage de points entre LIT_UHCD et PASSU

plot(urgences_2021$LIT_UHCD, urgences_2021$PASSU,
     main = "Relation entre le nombre de lits et la fréquentation",
     xlab = "Nombre de lits (LIT_UHCD)",
     ylab = "Nombre de passages (PASSU)",
     col = "blue", pch = 19)

# Ajouter une ligne de tendance
abline(lm(PASSU ~ LIT_UHCD, data = urgences_2021), col = "red", lwd = 2)

Calcul du coefficient de corrélation

cor(urgences_2021$LIT_UHCD, urgences_2021$PASSU, use = "complete.obs")
## [1] 0.751995

On observe une corrélation positive entre le nombre de lits et le nombre de passgage dans les hôpitaux. Cependant, on remarque également une grande dispertion avec pas mal de valeurs éloignées de la droite de régression.

Régression linéaire

Dans cette partie, nous allons réaliser une analyse de régression linéaire afin de déterminer dans quelle mesure le nombre de lits en unité d’hospitalisation de courte durée (LIT_UHCD) influence le nombre de passages aux urgences (PASSU). Pour cela, nous ajoutons d’autres variables explicatives, comme le nombre d’heures postées par les médecins et les infirmiers, pour améliorer la précision de notre modèle.

Sélection des variables d’intérêt

data_model <- urgences_2021 %>%
  select(PASSU, LIT_UHCD, HMED, HIDE, SEJ_UHCD, dtMCO) %>%
  na.omit()  # Suppression des valeurs manquantes

Exploration des relations entre les variables : diagrammes de dispersion entre PASSU et les variables explicatives

pairs(data_model, main = "Relation entre PASSU et les variables explicatives")

Il semble il y avoir une corrélation positives également avec les autres variables explicatives. On peut alors espérer que ces variables soient significatives dans notre modèle.

Ajustement du modèle de régression linéaire

modele <- lm(PASSU ~ LIT_UHCD + HMED + HIDE + SEJ_UHCD + dtMCO, data = data_model)

summary(modele)
## 
## Call:
## lm(formula = PASSU ~ LIT_UHCD + HMED + HIDE + SEJ_UHCD + dtMCO, 
##     data = data_model)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -41962  -4814  -1426   4640  37195 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 5586.1676   712.5452   7.840 2.52e-14 ***
## LIT_UHCD    1194.7159   115.3438  10.358  < 2e-16 ***
## HMED          13.3771     2.2881   5.846 8.82e-09 ***
## HIDE           1.5172     0.6371   2.382  0.01759 *  
## SEJ_UHCD      -0.4828     0.1620  -2.980  0.00301 ** 
## dtMCO          1.9605     0.1139  17.206  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 8618 on 527 degrees of freedom
## Multiple R-squared:  0.7954, Adjusted R-squared:  0.7935 
## F-statistic: 409.7 on 5 and 527 DF,  p-value: < 2.2e-16

Le coefficient de LIT_UHCD est de 1194.72, ce qui indique que chaque lit supplémentaire en unité d’hospitalisation de courte durée est associé à une augmentation d’environ 1195 passages aux urgences, toutes choses égales par ailleurs. Ce coefficient est statistiquement significatif (p < 2e-16), ce qui suggère que l’impact des lits est important.

Les autres variables du modèle ont un coefficient significatif comme le nombre d’heures hebdomadaires des infirmiers (HIDE) dont le coefficient est de 1.52, ce qui signifie que chaque heure postée par un infirmier est liée à environ 1.5 passage en plus aux urgences.

Le R² multiple est de 0.7954, indiquant que le modèle explique environ 79.54 % de la variance dans le nombre de passages aux urgences. C’est un bon ajustement.