#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")
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.
somme_CANCERO_A11 <- sum(cancer$CANCERO_A11, na.rm = TRUE)
somme_CANCERO_A11
## [1] 356899
# 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 %
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()
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.
# 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"
# 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
# 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()
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é.
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
# 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
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()
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.
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.
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.
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.
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.
data_model <- urgences_2021 %>%
select(PASSU, LIT_UHCD, HMED, HIDE, SEJ_UHCD, dtMCO) %>%
na.omit() # Suppression des valeurs manquantes
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.
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.