1 Import des données et du modèle cartographique

# Libraries
library(sf)
library(cartography)

# Import données enrichies
hop <- st_read(dsn = "data/geom.gpkg", layer = "hop", quiet = TRUE)
com_insee <- st_read(dsn = "data/geom.gpkg", layer = "com_insee", quiet = TRUE)
com_dist <- st_read(dsn = "data/geom.gpkg", layer = "com_dist", quiet = TRUE)
com_cap <- st_read(dsn = "data/geom.gpkg", layer = "com_cap", quiet = TRUE)

# Jointures noms de régions
com_cap <- merge(com_cap, com_insee[,c("INSEE_COM", "NOM_REG"), drop = T], 
                 all.x = TRUE, by = "INSEE_COM")

com_dist <- merge(com_dist, com_insee[,c("INSEE_COM", "NOM_REG"), drop = T],
                  by = "INSEE_COM", all.x = TRUE)

# Retirer la Corse (no data)
com_dist <- com_dist[com_dist$NOM_REG != "CORSE",]
com_cap <- com_cap[com_cap$NOM_REG != "CORSE",]

# Import couches pour modèle carto
study_area <- st_read(dsn = "data/geom.gpkg", layer = "study_area", quiet = TRUE)
border <- st_read(dsn = "data/geom.gpkg", layer = "border", quiet = TRUE)
dep <- st_read(dsn = "data/geom.gpkg", layer = "dep", quiet = TRUE)
country <- st_read(dsn = "data/geom.gpkg", layer = "country", quiet = TRUE)

# Dimension des cartes à l'export
sizes <- getFigDim(x = dep, width = 3000, mar = c(0,0,1.2,0), res = 400)

# Modèle carto
layChir <- function(title = ""){
  par(mar = c(0,0,1.2,0))
  ghostLayer(study_area)
  
  layoutLayer(title = title,  col = "white", coltitle = "black", bg = "lightblue",
              scale = FALSE)  
  
  plot(country$geom, col = "#d4d4d4", border = "white", lwd = 1, add = TRUE)

  plot(st_geometry(study_area) + c(5000, -5000), col= "#707070", border = NA, add = TRUE)
  plot(st_geometry(study_area), col = "white", border = NA, add = TRUE)
  layoutLayer(title = title, author =  "Réalisation : Ronan Ysebaert, Timothée Giraud, Nicolas Lambert (RIATE), Hugues Pécout (FR-CIST),\nSophie Baudet-Michel (Géographie-cités), Benoit Conti (ENPC), Charlène Le Neindre (IRDES), 2021", 
              col = "white", coltitle = "black",
              sources = "Sources : INSEE, IGN, DREES, (c) OSM et contributeurs, Natural Earth, 2021", scale = 50)
}


2 Hôpitaux et temps d’accès

2.1 Calcul des indicateurs utiles

# 1 - Type hôpitaux (public / privé) les plus proche
com_dist$DIST_TYPE_2000 <- ifelse(com_dist$DIST1_PUB_2000 < com_dist$DIST1_PRIV_2000,
                                  "Public", "Privé")

# Si moins de 5 minutes d'écart, peu de différences
com_dist$DIST_TYPE_2000 <- ifelse(abs(com_dist$DIST1_PUB_2000 - com_dist$DIST1_PRIV_2000) < 5, 
                             "Peu de différences", com_dist$DIST_TYPE_2000)

com_dist$DIST_TYPE_2018 <- ifelse(com_dist$DIST1_PUB_2018 < com_dist$DIST1_PRIV_2018,
                                  "Public", "Privé")

com_dist$DIST_TYPE_2018 <- ifelse(abs(com_dist$DIST1_PUB_2018 - com_dist$DIST1_PRIV_2018) < 5, 
                             "Peu de différences", com_dist$DIST_TYPE_2018)


# 2 - Différence entre le premier et le second hôpital le plus proche 
com_dist$D1_D2_ALL_2018 <- com_dist$DIST2_ALL_2018 - com_dist$DIST1_ALL_2018
com_dist$D1_D2_ALL_2000 <- com_dist$DIST2_ALL_2000 - com_dist$DIST1_ALL_2000
com_dist$D1_D2_PUB_2018 <- com_dist$DIST2_PUB_2018 - com_dist$DIST1_PUB_2018
com_dist$D1_D2_PUB_2000 <- com_dist$DIST2_PUB_2000 - com_dist$DIST1_PUB_2000
com_dist$D1_D2_PRIV_2018 <- com_dist$DIST2_PRIV_2018 - com_dist$DIST1_PRIV_2018
com_dist$D1_D2_PRIV_2000 <- com_dist$DIST2_PRIV_2000 - com_dist$DIST1_PRIV_2000

# 3 - Evolutions 2000-2018
com_dist$DIST1_ALL_EVOL <- com_dist$DIST1_ALL_2018 - com_dist$DIST1_ALL_2000
com_dist$DIST2_ALL_EVOL <- com_dist$DIST2_ALL_2018 - com_dist$DIST2_ALL_2000
com_dist$DIST1_PUB_EVOL <- com_dist$DIST1_PUB_2018 - com_dist$DIST1_PUB_2000
com_dist$DIST2_PUB_EVOL <- com_dist$DIST2_PUB_2018 - com_dist$DIST2_PUB_2000
com_dist$DIST1_PRIV_EVOL <- com_dist$DIST1_PRIV_2018 - com_dist$DIST1_PRIV_2000
com_dist$DIST2_PRIV_EVOL <- com_dist$DIST2_PRIV_2018 - com_dist$DIST2_PRIV_2000
com_dist$D1_D2_ALL_EVOL <- com_dist$D1_D2_ALL_2018 - com_dist$D1_D2_ALL_2000
com_dist$D1_D2_PUB_EVOL <- com_dist$D1_D2_PUB_2018 - com_dist$D1_D2_PUB_2000
com_dist$D1_D2_PRIV_EVOL <- com_dist$D1_D2_PRIV_2018 - com_dist$D1_D2_PRIV_2000

2.2 Résumés statistiques

Création d’une fonction f pour obtenir des résumés statistiques sur des variables (min, 1er décile, 1er quartile, moyenne, médiane, 2e quartile, 9e décile, maximum).

# Fonction
f <- function(x){
  c(min = min(x, na.rm = TRUE), 
    quantile(x, probs = 0.1, na.rm = TRUE),
    quantile(x, probs = 0.25, na.rm = TRUE), 
    Moy = mean(x, na.rm = TRUE) ,  
    Med = median(x, na.rm = TRUE),
    quantile(x, probs = 0.75, na.rm = TRUE),
    quantile(x, probs = 0.9, na.rm = TRUE),
    Max = max(x, na.rm = TRUE))
}

2.2.1 Situation en 2000

On applique la fonction f aux indicateurs de distance pour 2000.

La codification des indicateurs obéit à la logique suivante : - DIST1/2 : Premier-second hôpital le plus proche. - D1_D2 : Différence entre le premier et le second hôpital le plus proche. - ALL-PUB-PRIV : Toute structure confondue, hôpitaux publics, hôpitaux privés. - 2000-2018 : année de référence.

L’unité de mesure est la minute. Le résumé statistique porte sur les valeurs observées sur l’ensemble des communes de France métropolitaine, hors Corse.

df <- com_dist[,c("DIST1_ALL_2000", "DIST2_ALL_2000", "DIST1_PUB_2000", 
                  "DIST2_PUB_2000", "DIST1_PRIV_2000", "DIST2_PRIV_2000",  
                  "D1_D2_ALL_2000",  "D1_D2_PUB_2000", "D1_D2_PRIV_2000"), 
               drop = T]

df <- t(sapply(df, f))
knitr::kable(df, digits = 1)  
min 10% 25% Moy Med 75% 90% Max
DIST1_ALL_2000 0.2 8.5 13.3 21.2 19.9 27.7 35.4 137.7
DIST2_ALL_2000 1.0 12.3 18.4 27.3 26.1 34.7 43.1 149.8
DIST1_PUB_2000 0.2 10.2 15.4 24.1 22.5 30.9 39.7 137.7
DIST2_PUB_2000 1.8 20.9 27.3 36.5 34.9 43.9 53.8 153.3
DIST1_PRIV_2000 0.2 10.3 16.3 26.4 24.8 34.6 44.4 149.8
DIST2_PRIV_2000 1.4 16.2 24.1 35.2 33.7 44.3 55.6 159.4
D1_D2_ALL_2000 0.0 0.3 0.8 6.1 2.3 7.7 18.4 84.6
D1_D2_PUB_2000 0.0 1.1 3.8 12.4 10.0 18.5 26.9 84.6
D1_D2_PRIV_2000 0.0 0.4 1.3 8.8 4.1 13.3 24.7 77.4

2.2.2 Situation en 2018

df <- com_dist[,c("DIST1_ALL_2018", "DIST2_ALL_2018", "DIST1_PUB_2018", 
                  "DIST2_PUB_2018", "DIST1_PRIV_2018", "DIST2_PRIV_2018",  
                  "D1_D2_ALL_2018",  "D1_D2_PUB_2018", "D1_D2_PRIV_2018"), 
               drop = T]

df <- t(sapply(df, f))
knitr::kable(df, digits = 1)  
min 10% 25% Moy Med 75% 90% Max
DIST1_ALL_2018 0.2 9.4 14.8 23.5 22.1 30.6 39.1 149.9
DIST2_ALL_2018 1.0 13.9 20.9 30.6 29.5 38.7 48.2 153.3
DIST1_PUB_2018 0.2 11.0 16.7 26.2 24.6 33.8 43.2 153.3
DIST2_PUB_2018 1.8 23.1 30.1 40.0 38.5 48.0 58.9 166.9
DIST1_PRIV_2018 0.2 11.7 18.5 30.4 28.2 39.2 51.5 149.9
DIST2_PRIV_2018 1.1 19.1 28.5 41.5 39.8 51.7 64.9 166.2
D1_D2_ALL_2018 0.0 0.4 1.0 7.1 3.2 9.8 20.8 84.6
D1_D2_PUB_2018 0.0 1.5 4.5 13.8 11.5 20.3 29.4 84.6
D1_D2_PRIV_2018 0.0 0.5 1.8 11.1 6.1 17.4 28.5 97.6

2.2.3 Évolution 2000-2018

df <- com_dist[,c("DIST1_ALL_EVOL", "DIST2_ALL_EVOL", "DIST1_PUB_EVOL", 
                  "DIST2_PUB_EVOL", "DIST1_PRIV_EVOL", "DIST2_PRIV_EVOL",  
                  "D1_D2_ALL_EVOL",  "D1_D2_PUB_EVOL", "D1_D2_PRIV_EVOL"), 
               drop = T]

df <- t(sapply(df, f))
knitr::kable(df, digits = 1)  
min 10% 25% Moy Med 75% 90% Max
DIST1_ALL_EVOL -36.4 0.0 0 2.3 0.0 0.9 8.1 57.7
DIST2_ALL_EVOL -28.0 0.0 0 3.4 0.2 3.4 12.3 55.4
DIST1_PUB_EVOL -41.4 0.0 0 2.2 0.0 0.0 9.8 59.0
DIST2_PUB_EVOL -47.0 0.0 0 3.5 0.0 5.2 15.9 58.0
DIST1_PRIV_EVOL -13.5 0.0 0 4.0 0.0 2.6 15.8 107.8
DIST2_PRIV_EVOL -28.2 0.0 0 6.3 1.2 8.2 21.8 94.7
D1_D2_ALL_EVOL -44.7 -3.8 0 1.0 0.0 1.6 8.6 55.4
D1_D2_PUB_EVOL -53.3 -5.5 0 1.4 0.0 2.4 12.6 53.3
D1_D2_PRIV_EVOL -64.3 -5.9 0 2.3 0.0 4.2 16.7 79.4

2.2.4 Par régions

2.2.4.1 Public ou privé ?

Résultats ventilés par région. Part des communes plus proches d’une structure privé, publique ou indifférenciée (moins de 5 minutes d’écart entre les deux structures).

df <- com_dist[,c("DIST1_ALL_2018", "DIST1_ALL_2000", "DIST_TYPE_2018",
                  "DIST_TYPE_2000", "NOM_REG"), drop = TRUE] 

# Nombre de communes par catégories
tmp1 <- table(df$NOM_REG, df$DIST_TYPE_2000)
FRANCE <- apply(tmp1, 2, sum)
tmp1 <- rbind(tmp1, FRANCE)
tmp1 <- prop.table(tmp1, 1) * 100

tmp2 <- table(df$NOM_REG, df$DIST_TYPE_2018)
FRANCE <- apply(tmp1, 2, sum)
tmp2 <- rbind(tmp2, FRANCE)
tmp2 <- prop.table(tmp2, 1) * 100

tmp <- cbind(tmp1, tmp2)
colnames(tmp) <- c("INF_5MN_2000", "PRIV_2000", "PUB_2000", "INF_5MN_2000", "PRIV_2000", "PUB_2000" )
knitr::kable(tmp, digits = 1)  
INF_5MN_2000 PRIV_2000 PUB_2000 INF_5MN_2000 PRIV_2000 PUB_2000
AUVERGNE-RHONE-ALPES 57.2 14.2 28.6 58.7 8.9 32.4
BOURGOGNE-FRANCHE-COMTE 61.8 5.7 32.5 65.3 10.5 24.2
BRETAGNE 66.2 8.5 25.3 63.2 5.4 31.4
CENTRE-VAL DE LOIRE 55.3 19.5 25.2 44.9 23.1 32.0
GRAND EST 57.6 13.0 29.4 52.7 16.2 31.2
HAUTS-DE-FRANCE 61.6 18.7 19.7 60.6 12.7 26.7
ILE-DE-FRANCE 72.2 13.3 14.5 69.8 11.2 19.0
NORMANDIE 70.2 11.2 18.6 50.3 16.2 33.5
NOUVELLE-AQUITAINE 62.6 12.5 24.9 58.4 12.9 28.7
OCCITANIE 49.4 27.6 23.0 44.4 17.8 37.8
PAYS DE LA LOIRE 61.2 11.1 27.7 55.1 16.2 28.7
PROVENCE-ALPES-COTE D’AZUR 58.7 21.6 19.6 71.2 8.1 20.7
FRANCE 59.9 15.0 25.1 61.1 14.8 24.2

2.2.4.2 Temps de trajets à l’hôpital le plus proche

# En 2000
coln <- c("2000", "Min", "10%", "25%", "Moy", "Med", "75%", "90%", "Max")

regStats <- do.call(data.frame, aggregate(x = df[,c("DIST1_ALL_2000")], 
                                          by = list(df$NOM_REG),
                                          FUN = f))
colnames(regStats) <- coln

regStats2 <- data.frame(t(f(df[,c("DIST1_ALL_2000")])))
regStats2$`2000` <- "FRANCE"
colnames(regStats2) <- c("Min", "10%", "25%", "Moy", "Med", "75%", "90%", "Max", "2000")

regStats <- rbind(regStats, regStats2)

knitr::kable(regStats, digits = 1, row.names = FALSE)  
2000 Min 10% 25% Moy Med 75% 90% Max
AUVERGNE-RHONE-ALPES 0.5 8.4 13.3 21.6 20.3 28.4 36.5 73.8
BOURGOGNE-FRANCHE-COMTE 0.7 10.1 15.4 23.1 22.5 30.1 36.8 57.7
BRETAGNE 0.4 8.5 12.8 19.6 18.4 24.9 30.4 137.7
CENTRE-VAL DE LOIRE 0.5 10.1 15.1 21.6 21.4 27.9 33.0 45.5
GRAND EST 0.2 9.1 13.8 21.4 20.3 28.4 35.3 56.1
HAUTS-DE-FRANCE 0.5 7.2 11.3 17.0 16.5 22.0 27.9 42.0
ILE-DE-FRANCE 0.4 3.4 6.6 12.1 11.5 16.7 21.4 36.0
NORMANDIE 0.4 7.9 12.0 18.2 17.2 23.5 29.6 46.1
NOUVELLE-AQUITAINE 0.3 10.1 15.6 23.1 22.2 29.7 36.8 78.2
OCCITANIE 0.4 10.1 15.6 24.8 23.4 32.5 41.5 71.6
PAYS DE LA LOIRE 0.5 8.5 13.6 19.5 19.2 24.9 30.5 62.6
PROVENCE-ALPES-COTE D’AZUR 0.2 8.0 12.9 27.2 21.3 37.8 54.8 108.5
FRANCE 0.2 8.5 13.3 21.2 19.9 27.7 35.4 137.7
# En 2018
regStats <- do.call(data.frame, aggregate(x = df[,c("DIST1_ALL_2018")], 
                                          by = list(df$NOM_REG),
                                          FUN = f))
colnames(regStats) <- coln
colnames(regStats)[1] <- "2018"

regStats2 <- data.frame(t(f(df[,c("DIST1_ALL_2018")])))
regStats2$`2018` <- "FRANCE"
colnames(regStats2) <- c("Min", "10%", "25%", "Moy", "Med", "75%", "90%", "Max", "2018")

regStats <- rbind(regStats, regStats2)

knitr::kable(regStats, digits = 1, row.names = FALSE)  
2018 Min 10% 25% Moy Med 75% 90% Max
AUVERGNE-RHONE-ALPES 0.5 9.4 14.9 24.6 22.8 31.7 42.5 84.7
BOURGOGNE-FRANCHE-COMTE 0.7 12.4 18.7 28.6 27.3 36.8 46.1 74.0
BRETAGNE 0.7 10.2 14.5 21.6 20.9 27.0 32.1 149.9
CENTRE-VAL DE LOIRE 0.7 10.6 16.3 23.1 23.2 29.7 35.6 51.8
GRAND EST 0.2 9.9 15.0 23.2 21.9 30.6 38.2 68.4
HAUTS-DE-FRANCE 0.4 7.7 12.2 18.7 17.9 24.4 30.8 45.8
ILE-DE-FRANCE 0.4 4.2 7.3 12.9 12.1 17.4 22.6 36.9
NORMANDIE 0.5 8.8 13.2 19.8 19.0 25.7 31.7 46.1
NOUVELLE-AQUITAINE 0.3 11.2 17.1 25.3 24.3 32.8 40.9 78.2
OCCITANIE 0.9 11.0 17.0 26.5 25.3 34.8 43.2 71.8
PAYS DE LA LOIRE 0.8 10.2 15.1 21.6 21.7 27.7 33.0 62.6
PROVENCE-ALPES-COTE D’AZUR 0.2 8.9 14.4 29.4 23.4 40.5 59.4 111.1
FRANCE 0.2 9.4 14.8 23.5 22.1 30.6 39.1 149.9


2.3 Cartographie

2.3.1 Temps d’accès en 2018

png(file = "fig/04_TIME_ALL_2018.png", width = sizes[1], height = sizes[2], res = 400)

layChir(title = "Temps d'accès à l'hôpital le plus proche - 2018")

choroLayer(x = com_dist, var = "DIST1_ALL_2018",
           breaks = c(0, 15, 30, 45, 60 ,max(com_dist$DIST1_ALL_2018, na.rm = TRUE)),
           col = carto.pal(pal1 = "brown.pal", n1 = 5), border = NA,
           legend.pos = "topleft", legend.values.rnd = 0,
           legend.title.txt = "Temps d'accès par la route\n(source : OSRM)",
           add = TRUE)

plot(st_geometry(border), col = "white", lwd = 1, add = TRUE)

plot(st_geometry(hop[hop$year == 2018,]), add = TRUE, pch = 21, cex = 0.2,
     bg = "red", col = NA) 
dev.off()


png(file = "fig/05_TIME_PRIV_2018.png", width = sizes[1], height = sizes[2], res = 400)
layChir(title = "Temps d'accès à l'hôpital le plus proche (structure privée) - 2018")

choroLayer(x = com_dist, var = "DIST1_PRIV_2018",
           breaks = c(0, 15, 30, 45, 60, max(com_dist$DIST1_PRIV_2018, na.rm = TRUE)),
           col = carto.pal(pal1 = "brown.pal", n1 = 5), border = NA,
           legend.pos = "topleft", legend.values.rnd = 0,
           legend.title.txt = "Temps d'accès par la route\n(source : OSRM)",
           add = TRUE)

plot(st_geometry(border), col = "white", lwd = 1, add = TRUE)

plot(st_geometry(hop[hop$year == 2018 & (hop$stjr == 2 |hop$stjr == 3),]),
     add = TRUE, pch = 21, cex = 0.2, bg = "red", col = NA) 
dev.off()

png(file = "fig/06_TIME_PUB_2018.png", width = sizes[1], height = sizes[2], res = 400)
layChir(title = "Temps d'accès à l'hôpital le plus proche (structure publique) - 2018")

choroLayer(x = com_dist, var = "DIST1_PUB_2018",
           breaks = c(0, 15, 30, 45, 60, max(com_dist$DIST1_PUB_2018, na.rm = TRUE)),
           col = carto.pal(pal1 = "brown.pal", n1 = 5), border = NA,
           legend.pos = "topleft", legend.values.rnd = 0,
           legend.title.txt = "Temps d'accès par la route\n(source : OSRM)",
           add = TRUE)

plot(st_geometry(border), col = "white", lwd = 1, add = TRUE)

plot(st_geometry(hop[hop$year == 2018 & hop$stjr == 1,]),
     add = TRUE, pch = 21, cex = 0.2, bg = "red", col = NA) 
dev.off()


2.3.2 Temps d’accès 2018 (aires urbaines)

# Sélection uniquement dans les grandes aires urbaines
aurb <- com_insee[com_insee$CATAEU2010 %in% c("111", "112", "120"),]
aurbdist <- st_set_geometry(com_dist, NULL)
aurb <- merge(aurb, aurbdist, by = "INSEE_COM", all.x = TRUE)

png(file = "fig/04_TIME_ALL_2018_AURB.png", width = sizes[1], height = sizes[2], res = 400)

layChir(title = "Temps d'accès à l'hôpital le plus proche - 2018 (Aires urbaines")

choroLayer(x = aurb, var = "DIST1_ALL_2018",
           breaks = c(0, 15, 30, 45, 60 ,max(com_dist$DIST1_ALL_2018, na.rm = TRUE)),
           col = carto.pal(pal1 = "brown.pal", n1 = 5), border = NA,
           legend.pos = "topleft", legend.values.rnd = 0,
           legend.title.txt = "Temps d'accès par la route\n(source : OSRM)",
           add = TRUE)

plot(st_geometry(border), col = "white", lwd = 1, add = TRUE)

plot(st_geometry(hop[hop$year == 2018,]), add = TRUE, pch = 21, cex = 0.2,
     bg = "red", col = NA) 
dev.off()

2.3.3 Type de structure la plus proche en 2000 et 2018

png(file = "fig/07_PROX_PRIVPUB_2000.png", width = sizes[1], height = sizes[2], res = 400)
layChir(title = "Proximité aux structures privées ou publiques (2000)")
typoLayer(x = com_dist, var = "DIST_TYPE_2000",  
          col = c("indianred1", "skyblue3", "lightgrey"),
          legend.values.order = c("Public", "Privé", "Peu de différences"),
          border = NA, lwd = .2, legend.pos = "topleft",
          legend.title.txt = "Type de structure\nla plus proche par la route",
          add = TRUE)

plot(st_geometry(hop[hop$year == 2000 & hop$stjr == 1,]),
     add = TRUE, pch = 21, cex = .7, bg = "red3", col = "white") 

plot(st_geometry(hop[hop$year == 2000 & (hop$stjr == 2 |hop$stjr == 3),]),
     add = TRUE, pch = 21, cex = .7, bg = "blue3", col = "white")

plot(st_geometry(border), col = "#b59a82", lwd = 1, add = TRUE)
dev.off()


# En 2018
png(file = "fig/08_PROX_PRIVPUB_2018.png", width = sizes[1], height = sizes[2], res = 400)
layChir(title = "Proximité aux structures privées ou publiques (2018)")
typoLayer(x = com_dist, var = "DIST_TYPE_2018",  
          col = c("indianred1", "skyblue3", "lightgrey"),
          legend.values.order = c("Public", "Privé", "Peu de différences"),
          border = NA, lwd = .2, legend.pos = "topleft",
          legend.title.txt = "Type de structure\nla plus proche par la route",
          add = TRUE)

plot(st_geometry(hop[hop$year == 2018 & hop$stjr == 1,]),
     add = TRUE, pch = 21, cex = .7, bg = "red3", col = "white") 

plot(st_geometry(hop[hop$year == 2018 & (hop$stjr == 2 |hop$stjr == 3),]),
     add = TRUE, pch = 21, cex = .7, bg = "blue3", col = "white")

plot(st_geometry(border), col = "#b59a82", lwd = 1, add = TRUE)
dev.off()


2.3.4 Evolution des temps d’accès

cols <- c("#197230", "#5A9C50", "#B2D6A3", "lightgrey", "#FCE581", 
          "#FCC661", "#FCA842", "#FE8019",  "#FD4A00", "#F80000")

# Tout hôpitaux
png(file = "fig/09_EVOL_ACCESS_ALL.png", width = sizes[1], height = sizes[2], res = 400)
layChir(title = "Evolution du temps d'accès 2000-2018 à l'hôpital le plus proche")

choroLayer(x = com_dist, var = "DIST1_ALL_EVOL",
           breaks = c(min(com_dist$DIST1_ALL_EVOL, na.rm = TRUE),
                      -10, -5, -1, 1, 5, 10, 20, 30, 
                      max(com_dist$DIST1_ALL_EVOL, na.rm = TRUE)),
           col = cols, border = NA, 
           legend.pos = "topleft", legend.values.rnd = 0,
           legend.title.txt = "Temps d'accès par la route 2018 - 2000",
           add = TRUE)

plot(st_geometry(border), col = "white", lwd = 1, add = TRUE)

plot(st_geometry(hop[hop$year == 2000,]), add = TRUE, pch = 21, cex = .7,
     bg = "red3", col = "white") 
plot(st_geometry(hop[hop$year == 2018,]), add = TRUE, pch = 21, cex = .7, 
     bg = "green3", col = "white") 

dev.off()

# Hôpitaux publics
png(file = "fig/10_EVOL_ACCESS_PUB.png", width = sizes[1], height = sizes[2], res = 400)
layChir(title = "Evolution du temps d'accès 2000-2018 à l'hôpital le plus proche (public)")

choroLayer(x = com_dist, var = "DIST1_PUB_EVOL",
           breaks = c(min(com_dist$DIST1_PUB_EVOL, na.rm = TRUE),
                      -10, -5, -1, 1, 5, 10, 20, 30, 
                      max(com_dist$DIST1_PUB_EVOL, na.rm = TRUE)),
           col = cols, border = NA, 
           legend.pos = "topleft", legend.values.rnd = 0,
           legend.title.txt = "Temps d'accès par la route 2018 - 2000",
           add = TRUE)

plot(st_geometry(border), col = "white", lwd = 1, add = TRUE)

plot(st_geometry(hop[hop$year == 2000 & hop$stjr == 1,]),
     add = TRUE, pch = 21, cex = .7, bg = "red3", col = "white") 

plot(st_geometry(hop[hop$year == 2018 & hop$stjr == 1,]),
     add = TRUE, pch = 21, cex = .7, bg = "green3", col = "white") 

dev.off()

# Hôpitaux privés
png(file = "fig/11_EVOL_ACCESS_PRIV.png", width = sizes[1], height = sizes[2], res = 400)
layChir(title = "Evolution du temps d'accès 2000-2018 à l'hôpital le plus proche (privé)")

choroLayer(x = com_dist, var = "DIST1_PRIV_EVOL",
           breaks = c(min(com_dist$DIST1_PRIV_EVOL, na.rm = TRUE),
                      -10, -5, -1, 1, 5, 10, 20, 30, 
                      max(com_dist$DIST1_PRIV_EVOL, na.rm = TRUE)),
           col = cols, border = NA, 
           legend.pos = "topleft", legend.values.rnd = 0,
           legend.title.txt = "Temps d'accès par la route 2018 - 2000",
           add = TRUE)

plot(st_geometry(border), col = "white", lwd = 1, add = TRUE)

plot(st_geometry(hop[hop$year == 2000 & (hop$stjr == 2 |hop$stjr == 3),]),
     add = TRUE, pch = 21, cex = .7, bg = "red3", col = "white")

plot(st_geometry(hop[hop$year == 2018 & (hop$stjr == 2 |hop$stjr == 3),]),
     add = TRUE, pch = 21, cex = .7, bg = "green3", col = "white")

dev.off()


2.3.5 Qui a plus le choix ?

# En 2000 et 2018
png(file = "fig/12_HOP1_HOP2_2018.png", width = sizes[1], height = sizes[2], res = 400)
layChir(title = "Différence de temps d'accès entre le premier et le second hôpital le plus proche (2018)")

choroLayer(x = com_dist, var = "D1_D2_ALL_2018",
           method = "quantile", nclass = 5,
           col = carto.pal(pal1 = "purple.pal" , n1 = 5), border = NA, 
           legend.pos = "topleft", legend.values.rnd = 0,
           legend.title.txt = "Ecart d'accès (minutes par la route)\nQuantiles",
           add = TRUE)

plot(st_geometry(border), col = "white", lwd = 1, add = TRUE)
dev.off()


png(file = "fig/13_HOP1_HOP2_2000.png", width = sizes[1], height = sizes[2], res = 400)
layChir(title = "Différence de temps d'accès entre le premier et le second hôpital le plus proche (2000)")

choroLayer(x = com_dist, var = "D1_D2_ALL_2000",
           method = "quantile", nclass = 5,
           col = carto.pal(pal1 = "purple.pal" , n1 = 5), border = NA, 
           legend.pos = "topleft", legend.values.rnd = 0,
           legend.title.txt = "Ecart d'accès (minutes par la route)\nQuantiles",
           add = TRUE)

plot(st_geometry(border), col = "white", lwd = 1, add = TRUE)

dev.off()


# Différence observée
cols <- c("#197230", "#5A9C50", "#B2D6A3", "lightgrey", "#FCE581", 
          "#FCC661", "#FCA842", "#FE8019",  "#FD4A00", "#F80000")

png(file = "fig/14_HOP1_HOP2_DIFF.png", width = sizes[1], height = sizes[2], res = 400)
layChir(title = "Gain et perte de temps d'accès entre le premier et le second hôpital le plus proche (2000-2018)")

choroLayer(x = com_dist, var = "D1_D2_ALL_EVOL",
           breaks = c(min(com_dist$D1_D2_ALL_EVOL, na.rm = TRUE),
                      -10, -5, -1, 1, 5, 10, 20, 30, 
                      max(com_dist$D1_D2_ALL_EVOL, na.rm = TRUE)),
           col = cols, border = NA, 
           legend.pos = "topleft", legend.values.rnd = 0,
           legend.title.txt = "Temps d'accès par la route 2018 - 2000",
           add = TRUE)

plot(st_geometry(border), col = "white", lwd = 1, add = TRUE)

dev.off()


3 Lits et places en chirurgie

Nous utilisons ici les indicateurs contenus dans les couches hop (à l’échelle de l’hôpital) et com_cap (lits et places disponibles en fonction des temps d’accès à l’échelle de la commune)

3.1 Résumés statistiques

3.1.1 Situation en 2000

On applique la fonction f aux indicateurs capacités hospitalière.

La codification des indicateurs obéit à la logique suivante : - LIT/PLACE : Nombre de lits d’hospitalisation à temps complet et places d’hospitalisation à temps partiel. - 15MN/30MN/45MN/60MN : Places-lits disponibles à moins de 15mn, 30mn, 45mn et 60 mn en voiture (distance de chef-lieux à chef-lieux). - ALL-PUB-PRIV : Toute structure confondue, hôpitaux publics, hôpitaux privés. - 2000-2018 : année de référence.

L’unité de mesure est le lit / la place. Le résumé statistique porte sur les valeurs observées sur l’ensemble des communes de France métropolitaine, hors Corse.

df <- st_set_geometry(com_cap, NULL)

df <- com_cap[,c("LIT_ALL_2000", "LIT_PUB_2000", "LIT_PRIV_2000", 
                 "LIT_15MN_ALL_2000", "LIT_15MN_PUB_2000", "LIT_15MN_PRIV_2000",  
                 "LIT_30MN_ALL_2000", "LIT_30MN_PUB_2000", "LIT_30MN_PRIV_2000",
                 "LIT_45MN_ALL_2000", "LIT_45MN_PUB_2000", "LIT_45MN_PRIV_2000",
                 "LIT_60MN_ALL_2000", "LIT_60MN_PUB_2000", "LIT_60MN_PRIV_2000",
                 "PLACE_ALL_2000", "PLACE_PUB_2000", "PLACE_PRIV_2000", 
                 "PLACE_15MN_ALL_2000", "PLACE_15MN_PUB_2000", "PLACE_15MN_PRIV_2000",  
                 "PLACE_30MN_ALL_2000", "PLACE_30MN_PUB_2000", "PLACE_30MN_PRIV_2000",
                 "PLACE_45MN_ALL_2000", "PLACE_45MN_PUB_2000", "PLACE_45MN_PRIV_2000",
                 "PLACE_60MN_ALL_2000", "PLACE_60MN_PUB_2000", "PLACE_60MN_PRIV_2000"), 
               drop = T]

df <- t(sapply(df, f))
knitr::kable(df, digits = 1)  
min 10% 25% Moy Med 75% 90% Max
LIT_ALL_2000 0 0 0 2.5 0.0 0 0.0 1642
LIT_PUB_2000 0 0 0 1.2 0.0 0 0.0 940
LIT_PRIV_2000 0 0 0 1.4 0.0 0 0.0 774
LIT_15MN_ALL_2000 0 0 0 57.4 0.0 33 142.0 3172
LIT_15MN_PUB_2000 0 0 0 26.5 0.0 0 75.0 1244
LIT_15MN_PRIV_2000 0 0 0 30.9 0.0 0 79.0 2449
LIT_30MN_ALL_2000 0 0 28 313.2 123.0 317 773.0 9667
LIT_30MN_PUB_2000 0 0 0 144.1 63.0 141 390.3 3307
LIT_30MN_PRIV_2000 0 0 0 169.1 58.0 176 419.0 6556
LIT_45MN_ALL_2000 0 78 200 800.3 417.0 928 1596.0 12789
LIT_45MN_PUB_2000 0 41 99 365.4 198.0 475 786.0 4465
LIT_45MN_PRIV_2000 0 0 87 434.9 223.0 471 868.0 8367
LIT_60MN_ALL_2000 0 261 510 1524.8 1016.5 1764 2741.0 13918
LIT_60MN_PUB_2000 0 124 233 695.3 513.0 885 1310.0 5113
LIT_60MN_PRIV_2000 0 117 259 829.5 520.0 909 1470.0 8914
PLACE_ALL_2000 0 0 0 0.2 0.0 0 0.0 143
PLACE_PUB_2000 0 0 0 0.0 0.0 0 0.0 20
PLACE_PRIV_2000 0 0 0 0.2 0.0 0 0.0 123
PLACE_15MN_ALL_2000 0 0 0 4.2 0.0 0 11.0 300
PLACE_15MN_PUB_2000 0 0 0 0.6 0.0 0 2.0 37
PLACE_15MN_PRIV_2000 0 0 0 3.5 0.0 0 9.0 284
PLACE_30MN_ALL_2000 0 0 0 23.1 6.0 23 53.0 895
PLACE_30MN_PUB_2000 0 0 0 3.5 0.0 4 10.0 103
PLACE_30MN_PRIV_2000 0 0 0 19.6 5.0 19 44.0 798
PLACE_45MN_ALL_2000 0 2 9 59.4 28.0 62 113.0 1226
PLACE_45MN_PUB_2000 0 0 0 8.9 5.0 11 20.0 139
PLACE_45MN_PRIV_2000 0 0 7 50.4 23.0 51 99.0 1096
PLACE_60MN_ALL_2000 0 11 32 113.5 66.0 119 201.0 1335
PLACE_60MN_PUB_2000 0 0 4 17.2 11.0 21 35.0 175
PLACE_60MN_PRIV_2000 0 9 25 96.3 55.0 99 174.0 1160

3.1.2 Situation en 2018

df2 <- com_cap[,c("LIT_ALL_2018", "LIT_PUB_2018", "LIT_PRIV_2018", 
                 "LIT_15MN_ALL_2018", "LIT_15MN_PUB_2018", "LIT_15MN_PRIV_2018",  
                 "LIT_30MN_ALL_2018", "LIT_30MN_PUB_2018", "LIT_30MN_PRIV_2018",
                 "LIT_45MN_ALL_2018", "LIT_45MN_PUB_2018", "LIT_45MN_PRIV_2018",
                 "LIT_60MN_ALL_2018", "LIT_60MN_PUB_2018", "LIT_60MN_PRIV_2018",
                 "PLACE_ALL_2018", "PLACE_PUB_2018", "PLACE_PRIV_2018", 
                 "PLACE_15MN_ALL_2018", "PLACE_15MN_PUB_2018", "PLACE_15MN_PRIV_2018",  
                 "PLACE_30MN_ALL_2018", "PLACE_30MN_PUB_2018", "PLACE_30MN_PRIV_2018",
                 "PLACE_45MN_ALL_2018", "PLACE_45MN_PUB_2018", "PLACE_45MN_PRIV_2018",
                 "PLACE_60MN_ALL_2018", "PLACE_60MN_PUB_2018", "PLACE_60MN_PRIV_2018"), 
               drop = T]

df2 <- t(sapply(df2, f))
knitr::kable(df2, digits = 1)  
min 10% 25% Moy Med 75% 90% Max
LIT_ALL_2018 0 0 0 1.7 0 0 0.0 3975
LIT_PUB_2018 0 0 0 0.8 0 0 0.0 2089
LIT_PRIV_2018 0 0 0 0.8 0 0 0.0 2089
LIT_15MN_ALL_2018 0 0 0 35.5 0 0 93.0 5404
LIT_15MN_PUB_2018 0 0 0 16.5 0 0 45.0 2895
LIT_15MN_PRIV_2018 0 0 0 19.0 0 0 54.0 2836
LIT_30MN_ALL_2018 0 0 0 209.9 60 190 520.0 8734
LIT_30MN_PUB_2018 0 0 0 97.5 34 88 256.0 4081
LIT_30MN_PRIV_2018 0 0 0 112.3 24 102 290.0 4770
LIT_45MN_ALL_2018 0 26 99 546.4 241 595 1126.0 10152
LIT_45MN_PUB_2018 0 8 51 253.4 114 293 513.0 4580
LIT_45MN_PRIV_2018 0 0 36 293.1 126 322 607.3 5600
LIT_60MN_ALL_2018 0 123 277 1051.2 631 1143 1940.0 10723
LIT_60MN_PUB_2018 0 65 129 487.1 303 550 907.0 4850
LIT_60MN_PRIV_2018 0 37 141 564.1 336 586 1169.0 5873
PLACE_ALL_2018 0 0 0 0.5 0 0 0.0 910
PLACE_PUB_2018 0 0 0 0.2 0 0 0.0 233
PLACE_PRIV_2018 0 0 0 0.2 0 0 0.0 233
PLACE_15MN_ALL_2018 0 0 0 11.0 0 0 32.0 1419
PLACE_15MN_PUB_2018 0 0 0 3.3 0 0 11.0 334
PLACE_15MN_PRIV_2018 0 0 0 7.7 0 0 24.0 1097
PLACE_30MN_ALL_2018 0 0 0 63.1 20 63 144.3 2482
PLACE_30MN_PUB_2018 0 0 0 18.1 9 21 43.0 543
PLACE_30MN_PRIV_2018 0 0 0 45.1 10 42 106.0 1941
PLACE_45MN_ALL_2018 0 8 33 163.5 82 175 307.0 3045
PLACE_45MN_PUB_2018 0 4 12 46.3 28 55 86.0 665
PLACE_45MN_PRIV_2018 0 0 17 117.2 53 121 230.0 2390
PLACE_60MN_ALL_2018 0 39 90 314.1 186 322 601.0 3302
PLACE_60MN_PUB_2018 0 15 30 88.7 61 98 158.0 753
PLACE_60MN_PRIV_2018 0 20 55 225.4 122 225 462.0 2551

3.1.3 Évolution 2000-2018

df3 <- df2 - df

row.names(df3) <- gsub("2018", "EVOL", row.names(df3))

knitr::kable(df3, digits = 1)  
min 10% 25% Moy Med 75% 90% Max
LIT_ALL_EVOL 0 0 0 -0.8 0.0 0 0.0 2333
LIT_PUB_EVOL 0 0 0 -0.4 0.0 0 0.0 1149
LIT_PRIV_EVOL 0 0 0 -0.6 0.0 0 0.0 1315
LIT_15MN_ALL_EVOL 0 0 0 -21.9 0.0 -33 -49.0 2232
LIT_15MN_PUB_EVOL 0 0 0 -10.1 0.0 0 -30.0 1651
LIT_15MN_PRIV_EVOL 0 0 0 -11.9 0.0 0 -25.0 387
LIT_30MN_ALL_EVOL 0 0 -28 -103.4 -63.0 -127 -253.0 -933
LIT_30MN_PUB_EVOL 0 0 0 -46.6 -29.0 -53 -134.3 774
LIT_30MN_PRIV_EVOL 0 0 0 -56.8 -34.0 -74 -129.0 -1786
LIT_45MN_ALL_EVOL 0 -52 -101 -253.8 -176.0 -333 -470.0 -2637
LIT_45MN_PUB_EVOL 0 -33 -48 -112.0 -84.0 -182 -273.0 115
LIT_45MN_PRIV_EVOL 0 0 -51 -141.8 -97.0 -149 -260.7 -2767
LIT_60MN_ALL_EVOL 0 -138 -233 -473.6 -385.5 -621 -801.0 -3195
LIT_60MN_PUB_EVOL 0 -59 -104 -208.3 -210.0 -335 -403.0 -263
LIT_60MN_PRIV_EVOL 0 -80 -118 -265.4 -184.0 -323 -301.0 -3041
PLACE_ALL_EVOL 0 0 0 0.3 0.0 0 0.0 767
PLACE_PUB_EVOL 0 0 0 0.1 0.0 0 0.0 213
PLACE_PRIV_EVOL 0 0 0 0.0 0.0 0 0.0 110
PLACE_15MN_ALL_EVOL 0 0 0 6.8 0.0 0 21.0 1119
PLACE_15MN_PUB_EVOL 0 0 0 2.6 0.0 0 9.0 297
PLACE_15MN_PRIV_EVOL 0 0 0 4.2 0.0 0 15.0 813
PLACE_30MN_ALL_EVOL 0 0 0 40.0 14.0 40 91.3 1587
PLACE_30MN_PUB_EVOL 0 0 0 14.6 9.0 17 33.0 440
PLACE_30MN_PRIV_EVOL 0 0 0 25.4 5.0 23 62.0 1143
PLACE_45MN_ALL_EVOL 0 6 24 104.2 54.0 113 194.0 1819
PLACE_45MN_PUB_EVOL 0 4 12 37.4 23.0 44 66.0 526
PLACE_45MN_PRIV_EVOL 0 0 10 66.8 30.0 70 131.0 1294
PLACE_60MN_ALL_EVOL 0 28 58 200.5 120.0 203 400.0 1967
PLACE_60MN_PUB_EVOL 0 15 26 71.5 50.0 77 123.0 578
PLACE_60MN_PRIV_EVOL 0 11 30 129.1 67.0 126 288.0 1391


3.2 A l’échelle des régions

3.2.1 Nombre de places / lits par région

On considère ici l’ensemble du jeu de données afin d’évaluer l’évolution du nombre de structures, de lits et de places par région. Les régions sont ordonnées en fonction de l’évolution relative de ces indicateurs. Les régions représentées à gauche de ces graphiques en bâton sont celles qui ont relativement le plus perdu.

hop00 <- hop[hop$year == 2000,]
hop18 <- hop[hop$year == 2018,]

# Combine measures
df1 <- aggregate(data = hop00, fi ~ NOM_REG , length)
df2 <- aggregate(data = hop00, cbind(PLACE,LIT) ~ NOM_REG, sum)

df3 <- aggregate(data = hop18, fi ~ NOM_REG , length)
df4 <- aggregate(data = hop18, cbind(PLACE,LIT) ~ NOM_REG, sum)

df5 <- df1[1]
df5$CS <- c("0","0","1","1","0","0","0","0","0","0","1","0")

df <- Reduce(function(x, y) merge(x, y, by = "NOM_REG"), list(df1, df2, df3, df4, df5))
colnames(df) <- c("NOM_REG", "N_2000", "PLACE_2000", "LIT_2000", "N_2018", "PLACE_2018", "LIT_2018", "CS")

# Diff 
df$N_REL <- df$N_2018 / df$N_2000 * 100
df$PLACE_REL <- df$PLACE_2018 / df$PLACE_2000 * 100
df$LIT_REL <- df$LIT_2018 / df$LIT_2000 * 100


# Plots
par(mar = c(7,4,2,4))

library(stringr)

svg("fig/01_REG_HOP.svg", width = 10, height = 8)
x <- barplot(t(as.matrix(df[, c("N_2000","N_2018")])), 
             beside = TRUE,
             names.arg = str_wrap(df$NOM_REG, width = 15),
             legend.text = c("2000", "2018"),
             col = c("#4aa5fa","#0d4880"),
             las = 2,
             cex.names = 0.7,
             cex.axis = 0.7,
             border = NA,
             xpd = FALSE,
             ylim = c(0,200),
             ylab = "Nombre d'établissements avec des lits en chirurgie")
dev.off()

svg("fig/02_REG_LIT.svg", width = 10, height = 8)
x <- barplot(t(as.matrix(df[, c("LIT_2000","LIT_2018")])), 
             beside = TRUE,
             names.arg = str_wrap(df$NOM_REG, width = 15),
             legend.text = c("2000", "2018"),
             col = c("#4aa5fa","#0d4880"),
             las = 2,
             cex.names = 0.7,
             cex.axis = 0.7,
             border = NA,
             xpd = FALSE,
             ylim = c(0,11000),
             ylab = "Nombre de lits")
dev.off()

svg("fig/03_REG_PLACE.svg", width = 10, height = 8)
x <- barplot(t(as.matrix(df[, c("PLACE_2000","PLACE_2018")])), 
             beside = TRUE,
             names.arg = str_wrap(df$NOM_REG, width = 15),
             legend.text = c("2000", "2018"),
             col = c("#4aa5fa","#0d4880"),
             las = 2,
             cex.names = 0.7,
             cex.axis = 0.7,
             border = NA,
             xpd = FALSE,
             ylim = c(0,4000),
             ylab = "Nombre de places à temps partiel")
dev.off()

3.2.2 Lits dans un voisinage de 30 minutes

Ces résumés statistiques présentent la situation des communes de chaque région.

df <- st_set_geometry(com_cap, NULL)

# En 2000
coln <- c("LIT_30MN_ALL_2000", "Min", "10%", "25%", "Moy", "Med", "75%", "90%", "Max")

regStats <- do.call(data.frame, aggregate(x = df[,c("LIT_30MN_ALL_2000")], 
                                          by = list(df$NOM_REG),
                                          FUN = f))
colnames(regStats) <- coln

regStats2 <- data.frame(t(f(df[,c("LIT_30MN_ALL_2000")])))
regStats2$LIT_30MN_ALL_2000 <- "FRANCE"
colnames(regStats2) <- c("Min", "10%", "25%", "Moy", "Med", "75%", "90%", "Max", "LIT_30MN_ALL_2000")

regStats <- rbind(regStats, regStats2)

knitr::kable(regStats, digits = 1, row.names = FALSE)  
LIT_30MN_ALL_2000 Min 10% 25% Moy Med 75% 90% Max
AUVERGNE-RHONE-ALPES 0 0.0 16 240.4 119.0 267.0 664.0 1605
BOURGOGNE-FRANCHE-COMTE 0 0.0 0 168.3 71.0 213.0 567.0 1222
BRETAGNE 0 0.0 60 269.1 170.0 344.0 770.0 1161
CENTRE-VAL DE LOIRE 0 0.0 33 175.4 90.0 277.0 435.0 1316
GRAND EST 0 0.0 24 301.9 117.0 364.0 982.0 2029
HAUTS-DE-FRANCE 0 30.0 93 402.0 224.0 463.2 875.2 3092
ILE-DE-FRANCE 0 141.5 296 2071.6 852.5 3333.0 6200.0 9667
NORMANDIE 0 0.0 76 280.9 156.0 277.0 940.0 1412
NOUVELLE-AQUITAINE 0 0.0 0 183.7 84.0 243.0 384.0 2776
OCCITANIE 0 0.0 0 182.3 45.0 195.0 390.0 2308
PAYS DE LA LOIRE 0 0.0 52 274.0 99.0 287.0 807.0 1519
PROVENCE-ALPES-COTE D’AZUR 0 0.0 0 218.3 83.0 282.5 723.0 1774
FRANCE 0 0.0 28 313.2 123.0 317.0 773.0 9667
# En 2018
regStats <- do.call(data.frame, aggregate(x = df[,c("LIT_30MN_ALL_2018")], 
                                          by = list(df$NOM_REG),
                                          FUN = f))
colnames(regStats) <- coln
colnames(regStats)[1] <- "LIT_30MN_ALL_2018"

regStats2 <- data.frame(t(f(df[,c("LIT_30MN_ALL_2018")])))
regStats2$LIT_30MN_ALL_2018 <- "FRANCE"
colnames(regStats2) <- c("Min", "10%", "25%", "Moy", "Med", "75%", "90%", "Max", "LIT_30MN_ALL_2018")

regStats <- rbind(regStats, regStats2)

knitr::kable(regStats, digits = 1, row.names = FALSE)  
LIT_30MN_ALL_2018 Min 10% 25% Moy Med 75% 90% Max
AUVERGNE-RHONE-ALPES 0 0 0 186.1 61 174.0 623.0 2200
BOURGOGNE-FRANCHE-COMTE 0 0 0 91.3 42 124.0 284.0 570
BRETAGNE 0 0 26 171.7 98 218.0 496.0 873
CENTRE-VAL DE LOIRE 0 0 0 101.7 44 153.0 211.0 757
GRAND EST 0 0 0 182.4 57 255.0 549.9 1456
HAUTS-DE-FRANCE 0 0 17 258.7 147 311.0 588.0 2048
ILE-DE-FRANCE 0 60 128 1496.4 423 1557.2 6699.5 8734
NORMANDIE 0 0 19 182.1 75 174.0 650.0 1079
NOUVELLE-AQUITAINE 0 0 0 112.8 26 148.0 284.0 1792
OCCITANIE 0 0 0 128.0 23 101.0 350.0 1723
PAYS DE LA LOIRE 0 0 20 174.9 63 223.0 501.8 1101
PROVENCE-ALPES-COTE D’AZUR 0 0 0 217.8 30 186.0 652.4 2665
FRANCE 0 0 0 209.9 60 190.0 520.0 8734

3.2.3 Places dans un voisinage de 30 minutes

# En 2000
coln <- c("PLACE_30MN_ALL_2000", "Min", "10%", "25%", "Moy", "Med", "75%", "90%", "Max")

regStats <- do.call(data.frame, aggregate(x = df[,c("PLACE_30MN_ALL_2000")], 
                                          by = list(df$NOM_REG),
                                          FUN = f))
colnames(regStats) <- coln

regStats2 <- data.frame(t(f(df[,c("PLACE_30MN_ALL_2000")])))
regStats2$PLACE_30MN_ALL_2000 <- "FRANCE"
colnames(regStats2) <- c("Min", "10%", "25%", "Moy", "Med", "75%", "90%", "Max", "PLACE_30MN_ALL_2000")

regStats <- rbind(regStats, regStats2)

knitr::kable(regStats, digits = 1, row.names = FALSE)  
PLACE_30MN_ALL_2000 Min 10% 25% Moy Med 75% 90% Max
AUVERGNE-RHONE-ALPES 0 0 0 16.1 5 23.0 49.0 116
BOURGOGNE-FRANCHE-COMTE 0 0 0 10.3 3 13.0 28.0 109
BRETAGNE 0 0 2 19.0 12 28.0 54.0 80
CENTRE-VAL DE LOIRE 0 0 0 12.6 6 17.0 28.0 89
GRAND EST 0 0 0 14.1 4 26.0 45.0 84
HAUTS-DE-FRANCE 0 0 5 29.1 16 35.0 70.3 251
ILE-DE-FRANCE 0 8 18 195.8 91 318.0 586.0 895
NORMANDIE 0 0 2 18.1 11 20.0 44.0 118
NOUVELLE-AQUITAINE 0 0 0 11.9 4 18.0 32.0 125
OCCITANIE 0 0 0 13.8 2 18.0 36.0 172
PAYS DE LA LOIRE 0 0 0 29.5 9 24.0 102.0 204
PROVENCE-ALPES-COTE D’AZUR 0 0 0 23.2 4 29.5 78.0 214
FRANCE 0 0 0 23.1 6 23.0 53.0 895
# En 2018
regStats <- do.call(data.frame, aggregate(x = df[,c("PLACE_30MN_ALL_2018")], 
                                          by = list(df$NOM_REG),
                                          FUN = f))
colnames(regStats) <- coln
colnames(regStats)[1] <- "PLACE_30MN_ALL_2018"

regStats2 <- data.frame(t(f(df[,c("PLACE_30MN_ALL_2018")])))
regStats2$PLACE_30MN_ALL_2018 <- "FRANCE"
colnames(regStats2) <- c("Min", "10%", "25%", "Moy", "Med", "75%", "90%", "Max", "PLACE_30MN_ALL_2018")

regStats <- rbind(regStats, regStats2)

knitr::kable(regStats, digits = 1, row.names = FALSE)  
PLACE_30MN_ALL_2018 Min 10% 25% Moy Med 75% 90% Max
AUVERGNE-RHONE-ALPES 0 0 0 53.4 18.0 62.0 124.0 715
BOURGOGNE-FRANCHE-COMTE 0 0 0 28.3 10.0 44.0 87.0 204
BRETAGNE 0 0 5 54.2 33.0 84.0 133.0 243
CENTRE-VAL DE LOIRE 0 0 0 31.1 20.0 39.0 73.0 211
GRAND EST 0 0 0 43.5 15.0 71.0 148.0 269
HAUTS-DE-FRANCE 0 0 11 90.4 54.0 106.0 224.0 788
ILE-DE-FRANCE 0 29 57 465.0 180.5 549.2 1891.0 2482
NORMANDIE 0 0 12 54.1 30.0 53.0 172.0 292
NOUVELLE-AQUITAINE 0 0 0 33.7 8.0 45.0 86.0 541
OCCITANIE 0 0 0 34.6 10.0 37.0 89.0 421
PAYS DE LA LOIRE 0 0 5 58.8 23.0 82.0 160.0 385
PROVENCE-ALPES-COTE D’AZUR 0 0 0 72.6 16.0 70.0 233.0 857
FRANCE 0 0 0 63.1 20.0 63.0 144.3 2482


3.3 Cartographie

3.3.1 Lits disponibles à différentes portées de voisinage (2018)

png(file = "fig/15_LIT15MN_2018.png", width = sizes[1], height = sizes[2], res = 400)
layChir(title = "Nombre de lits accessibles dans un voisinage de 15 minutes, 2018")

choroLayer(x = com_cap, var = "LIT_15MN_ALL_2018",
           breaks = c(0, 1, 4, 16, 64, 256, 1024, 4096, max(com_cap$LIT_15MN_ALL_2018)),
           col = carto.pal(pal1 = "sand.pal" , n1 = 8), border = NA, 
           legend.pos = "topleft", legend.values.rnd = 0,
           legend.title.txt = "Lits accessibles depuis le chef-lieu de chaque commune\nà moins de 15 minutes par la route\nQuantiles",
           add = TRUE)

plot(st_geometry(border), col = "white", lwd = 1, add = TRUE)
dev.off()


png(file = "fig/16_LIT30MN_2018.png", width = sizes[1], height = sizes[2], res = 400)
layChir(title = "Nombre de lits accessibles dans un voisinage de 30 minutes, 2018")

choroLayer(x = com_cap, var = "LIT_30MN_ALL_2018",
           breaks = c(0, 1, 4, 16, 64, 256, 1024, 4096, max(com_cap$LIT_30MN_ALL_2018)),
           col = carto.pal(pal1 = "sand.pal" , n1 = 8), border = NA, 
           legend.pos = "topleft", legend.values.rnd = 0,
           legend.title.txt = "Lits accessibles depuis le chef-lieu de chaque commune\nà moins de 30 minutes par la route\nQuantiles",
           add = TRUE)

plot(st_geometry(border), col = "white", lwd = 1, add = TRUE)

dev.off()

png(file = "fig/17_LIT45MN_2018.png", width = sizes[1], height = sizes[2], res = 400)
layChir(title = "Nombre de lits accessibles dans un voisinage de 45 minutes, 2018")

choroLayer(x = com_cap, var = "LIT_45MN_ALL_2018",
           breaks = c(0, 1, 4, 16, 64, 256, 1024, 4096, max(com_cap$LIT_45MN_ALL_2018)),
           col = carto.pal(pal1 = "sand.pal" , n1 = 8), border = NA, 
           legend.pos = "topleft", legend.values.rnd = 0,
           legend.title.txt = "Lits accessibles depuis le chef-lieu de chaque commune\nà moins de 45 minutes par la route\nQuantiles",
           add = TRUE)

plot(st_geometry(border), col = "white", lwd = 1, add = TRUE)
dev.off()


png(file = "fig/18_LIT60MN_2018.png", width = sizes[1], height = sizes[2], res = 400)
layChir(title = "Nombre de lits accessibles dans un voisinage de 60 minutes, 2018")

choroLayer(x = com_cap, var = "LIT_60MN_ALL_2018",
           breaks = c(0, 1, 4, 16, 64, 256, 1024, 4096, max(com_cap$LIT_60MN_ALL_2018)),
           col = carto.pal(pal1 = "sand.pal" , n1 = 8), border = NA, 
           legend.pos = "topleft", legend.values.rnd = 0,
           legend.title.txt = "Lits accessibles depuis le chef-lieu de chaque commune\nà moins de 60 minutes par la route\nQuantiles",
           add = TRUE)

plot(st_geometry(border), col = "white", lwd = 1, add = TRUE)

dev.off()

3.3.2 Évolution 2000 - 2018 (nombre de lits)

# Calculs évolution (indice 100)
com_cap$LIT_15MN_ALL_EVOL <- com_cap$LIT_15MN_ALL_2018 / com_cap$LIT_15MN_ALL_2000 * 100
com_cap$LIT_30MN_ALL_EVOL <- com_cap$LIT_30MN_ALL_2018 / com_cap$LIT_30MN_ALL_2000 * 100
com_cap$LIT_45MN_ALL_EVOL <- com_cap$LIT_45MN_ALL_2018 / com_cap$LIT_45MN_ALL_2000 * 100
com_cap$LIT_60MN_ALL_EVOL <- com_cap$LIT_60MN_ALL_2018 / com_cap$LIT_60MN_ALL_2000 * 100


png(file = "fig/19_LIT15MN_EVOL.png", width = sizes[1], height = sizes[2], res = 400)
layChir(title = "Évolution 2000-2018 du nombre de lits disponibles (2000 = indice 100) dans un voisinage de 15 minutes")

choroLayer(x = com_cap, var = "LIT_15MN_ALL_EVOL",
           breaks = c(0, 1, 50, 80, 100, 125, 200, max(com_cap$LIT_15MN_ALL_EVOL, na.rm = TRUE)),
           col = carto.pal(pal1 = "orange.pal" , n1 = 4, pal2 = "green.pal", n2 = 3), border = NA, 
           legend.pos = "topleft", legend.values.rnd = 0,
           legend.title.txt = "Nombre de lits (2018) / Nombre de lits (2000) * 100\nVoisinage de 15mn",
           add = TRUE)

plot(st_geometry(border), col = "black", lwd = 1, add = TRUE)
dev.off()


png(file = "fig/20_LIT30MN_EVOL.png", width = sizes[1], height = sizes[2], res = 400)
layChir(title = "Évolution 2000-2018 du nombre de lits disponibles (2000 = indice 100) dans un voisinage de 30 minutes")

choroLayer(x = com_cap, var = "LIT_30MN_ALL_EVOL",
           breaks = c(0, 1, 50, 80, 100, 125, 200, max(com_cap$LIT_30MN_ALL_EVOL, na.rm = TRUE)),
           col = carto.pal(pal1 = "orange.pal" , n1 = 4, pal2 = "green.pal", n2 = 3), border = NA, 
           legend.pos = "topleft", legend.values.rnd = 0,
           legend.title.txt = "Nombre de lits (2018) / Nombre de lits (2000) * 100\nVoisinage de 30mn",
           add = TRUE)

plot(st_geometry(border), col = "black", lwd = 1, add = TRUE)
dev.off()


png(file = "fig/21_LIT45MN_EVOL.png", width = sizes[1], height = sizes[2], res = 400)
layChir(title = "Évolution 2000-2018 du nombre de lits disponibles (2000 = indice 100) dans un voisinage de 45 minutes")

choroLayer(x = com_cap, var = "LIT_45MN_ALL_EVOL",
           breaks = c(0, 1, 50, 80, 100, 125, 200, max(com_cap$LIT_45MN_ALL_EVOL, na.rm = TRUE)),
           col = carto.pal(pal1 = "orange.pal" , n1 = 4, pal2 = "green.pal", n2 = 3), border = NA, 
           legend.pos = "topleft", legend.values.rnd = 0,
           legend.title.txt = "Nombre de lits (2018) / Nombre de lits (2000) * 100\nVoisinage de 45mn",
           add = TRUE)

plot(st_geometry(border), col = "black", lwd = 1, add = TRUE)
dev.off()


png(file = "fig/22_LIT60MN_EVOL.png", width = sizes[1], height = sizes[2], res = 400)
layChir(title = "Évolution 2000-2018 du nombre de lits disponibles (2000 = indice 100) dans un voisinage de 60 minutes")

choroLayer(x = com_cap, var = "LIT_60MN_ALL_EVOL",
           breaks = c(0, 1, 50, 80, 100, 125, 200, max(com_cap$LIT_60MN_ALL_EVOL, na.rm = TRUE)),
           col = carto.pal(pal1 = "orange.pal" , n1 = 4, pal2 = "green.pal", n2 = 3), border = NA, 
           legend.pos = "topleft", legend.values.rnd = 0,
           legend.title.txt = "Nombre de lits (2018) / Nombre de lits (2000) * 100\nVoisinage de 60mn",
           add = TRUE)

plot(st_geometry(border), col = "black", lwd = 1, add = TRUE)
dev.off()

3.3.3 Places disponibles à différentes portées de voisinage (2018)

png(file = "fig/23_PLACE15MN_2018.png", width = sizes[1], height = sizes[2], res = 400)
layChir(title = "Nombre de places accessibles dans un voisinage de 15 minutes, 2018")

choroLayer(x = com_cap, var = "PLACE_15MN_ALL_2018",
           breaks = c(0, 1, 4, 16, 64, 256, 1024, max(com_cap$PLACE_15MN_ALL_2018)),
           col = carto.pal(pal1 = "sand.pal" , n1 = 7), border = NA, 
           legend.pos = "topleft", legend.values.rnd = 0,
           legend.title.txt = "Places accessibles depuis le chef-lieu de chaque commune\nà moins de 15 minutes par la route\nQuantiles",
           add = TRUE)

plot(st_geometry(border), col = "white", lwd = 1, add = TRUE)
dev.off()


png(file = "fig/24_PLACE30MN_2018.png", width = sizes[1], height = sizes[2], res = 400)
layChir(title = "Nombre de places accessibles dans un voisinage de 30 minutes, 2018")

choroLayer(x = com_cap, var = "PLACE_30MN_ALL_2018",
           breaks = c(0, 1, 4, 16, 64, 256, 1024, max(com_cap$PLACE_30MN_ALL_2018)),
           col = carto.pal(pal1 = "sand.pal" , n1 = 7), border = NA, 
           legend.pos = "topleft", legend.values.rnd = 0,
           legend.title.txt = "Places accessibles depuis le chef-lieu de chaque commune\nà moins de 30 minutes par la route\nQuantiles",
           add = TRUE)

plot(st_geometry(border), col = "white", lwd = 1, add = TRUE)

dev.off()

png(file = "fig/25_PLACE45MN_2018.png", width = sizes[1], height = sizes[2], res = 400)
layChir(title = "Nombre de places accessibles dans un voisinage de 45 minutes, 2018")

choroLayer(x = com_cap, var = "PLACE_45MN_ALL_2018",
           breaks = c(0, 1, 4, 16, 64, 256, 1024, max(com_cap$PLACE_45MN_ALL_2018)),
           col = carto.pal(pal1 = "sand.pal" , n1 = 7), border = NA, 
           legend.pos = "topleft", legend.values.rnd = 0,
           legend.title.txt = "Places accessibles depuis le chef-lieu de chaque commune\nà moins de 45 minutes par la route\nQuantiles",
           add = TRUE)

plot(st_geometry(border), col = "white", lwd = 1, add = TRUE)
dev.off()


png(file = "fig/26_PLACE60MN_2018.png", width = sizes[1], height = sizes[2], res = 400)
layChir(title = "Nombre de places accessibles dans un voisinage de 60 minutes, 2018")

choroLayer(x = com_cap, var = "PLACE_60MN_ALL_2018",
           breaks = c(0, 1, 4, 16, 64, 256, 1024, max(com_cap$PLACE_60MN_ALL_2018)),
           col = carto.pal(pal1 = "sand.pal" , n1 = 7), border = NA, 
           legend.pos = "topleft", legend.values.rnd = 0,
           legend.title.txt = "Places accessibles depuis le chef-lieu de chaque commune\nà moins de 60 minutes par la route\nQuantiles",
           add = TRUE)

plot(st_geometry(border), col = "white", lwd = 1, add = TRUE)

dev.off()

3.3.4 Évolution 2000 - 2018 (nombre de places)

# Calculs évolution (indice 100)
com_cap$PLACE_15MN_ALL_EVOL <- com_cap$PLACE_15MN_ALL_2018 / com_cap$PLACE_15MN_ALL_2000 * 100
com_cap$PLACE_30MN_ALL_EVOL <- com_cap$PLACE_30MN_ALL_2018 / com_cap$PLACE_30MN_ALL_2000 * 100
com_cap$PLACE_45MN_ALL_EVOL <- com_cap$PLACE_45MN_ALL_2018 / com_cap$PLACE_45MN_ALL_2000 * 100
com_cap$PLACE_60MN_ALL_EVOL <- com_cap$PLACE_60MN_ALL_2018 / com_cap$PLACE_60MN_ALL_2000 * 100


png(file = "fig/27_PLACE15MN_EVOL.png", width = sizes[1], height = sizes[2], res = 400)
layChir(title = "Évolution 2000-2018 du nombre de places disponibles (2000 = indice 100) dans un voisinage de 15 minutes")

choroLayer(x = com_cap, var = "PLACE_15MN_ALL_EVOL",
           breaks = c(0, 1, 50, 80, 100, 125, 200, 400, max(com_cap$PLACE_15MN_ALL_EVOL, na.rm = TRUE)),
           col = carto.pal(pal1 = "orange.pal" , n1 = 4, pal2 = "green.pal", n2 = 4), border = NA, 
           legend.pos = "topleft", legend.values.rnd = 0,
           legend.title.txt = "Nombre de places (2018) / Nombre de places (2000) * 100\nVoisinage de 15mn",
           add = TRUE)

plot(st_geometry(border), col = "black", lwd = 1, add = TRUE)
dev.off()


png(file = "fig/28_PLACE30MN_EVOL.png", width = sizes[1], height = sizes[2], res = 400)
layChir(title = "Évolution 2000-2018 du nombre de places disponibles (2000 = indice 100) dans un voisinage de 30 minutes")

choroLayer(x = com_cap, var = "PLACE_30MN_ALL_EVOL",
           breaks = c(0, 1, 50, 80, 100, 125, 200, 400, max(com_cap$PLACE_30MN_ALL_EVOL, na.rm = TRUE)),
           col = carto.pal(pal1 = "orange.pal" , n1 = 4, pal2 = "green.pal", n2 = 4), border = NA, 
           legend.pos = "topleft", legend.values.rnd = 0,
           legend.title.txt = "Nombre de places (2018) / Nombre de places (2000) * 100\nVoisinage de 30mn",
           add = TRUE)

plot(st_geometry(border), col = "black", lwd = 1, add = TRUE)
dev.off()


png(file = "fig/29_PLACE45MN_EVOL.png", width = sizes[1], height = sizes[2], res = 400)
layChir(title = "Évolution 2000-2018 du nombre de places disponibles (2000 = indice 100) dans un voisinage de 45 minutes")

choroLayer(x = com_cap, var = "PLACE_45MN_ALL_EVOL",
           breaks = c(0, 1, 50, 80, 100, 125, 200, 400, max(com_cap$PLACE_45MN_ALL_EVOL, na.rm = TRUE)),
           col = carto.pal(pal1 = "orange.pal" , n1 = 4, pal2 = "green.pal", n2 = 4), border = NA, 
           legend.pos = "topleft", legend.values.rnd = 0,
           legend.title.txt = "Nombre de places (2018) / Nombre de places (2000) * 100\nVoisinage de 45mn",
           add = TRUE)

plot(st_geometry(border), col = "black", lwd = 1, add = TRUE)
dev.off()


png(file = "fig/30_PLACE60MN_EVOL.png", width = sizes[1], height = sizes[2], res = 400)
layChir(title = "Évolution 2000-2018 du nombre de places disponibles (2000 = indice 100) dans un voisinage de 60 minutes")

choroLayer(x = com_cap, var = "PLACE_60MN_ALL_EVOL",
           breaks = c(0, 1, 50, 80, 100, 125, 200, 400, max(com_cap$PLACE_60MN_ALL_EVOL, na.rm = TRUE)),
           col = carto.pal(pal1 = "orange.pal" , n1 = 4, pal2 = "green.pal", n2 = 4), border = NA, 
           legend.pos = "topleft", legend.values.rnd = 0,
           legend.title.txt = "Nombre de places (2018) / Nombre de places (2000) * 100\nVoisinage de 60mn",
           add = TRUE)

plot(st_geometry(border), col = "black", lwd = 1, add = TRUE)
dev.off()

3.3.5 Gain à se déplacer

Nombre de lits d’hôpitaux supplémentaires accessibles à + 45 minutes.

# Calculs évolution (indice 100)
com_cap$LIT_1545MN_2018 <- com_cap$LIT_45MN_ALL_2018 - com_cap$LIT_15MN_ALL_2018
com_cap$PLACE_1545MN_2018 <- com_cap$PLACE_45MN_ALL_2018 - com_cap$PLACE_15MN_ALL_2018

png(file = "fig/31_LIT_4515MN_2018.png", width = sizes[1], height = sizes[2], res = 400)
layChir(title = "Écart entre le nombre lits disponibles à 45 minutes en voiture et ceux disponibles à 15 minutes (2018)")

choroLayer(x = com_cap, var = "LIT_1545MN_2018",
           method = "quantile", nclass = 8,
           col = carto.pal(pal1 = "red.pal" , n1 = 4, pal2 = "blue.pal", n2 = 4), border = NA, 
           legend.pos = "topleft", legend.values.rnd = 0,
           legend.title.txt = "Nombre de lits à 45 minutes - Nombre de lits à 15 minutes",
           add = TRUE)

plot(st_geometry(border), col = "black", lwd = 1, add = TRUE)
dev.off()


png(file = "fig/32_PLACE_4515MN_2018.png", width = sizes[1], height = sizes[2], res = 400)
layChir(title = "Écart entre le nombre places disponibles à 45 minutes en voiture et celles disponibles à 15 minutes (2018)")

choroLayer(x = com_cap, var = "PLACE_1545MN_2018",
           method = "quantile", nclass = 8,
           col = carto.pal(pal1 = "red.pal" , n1 = 4, pal2 = "blue.pal", n2 = 4), border = NA, 
           legend.pos = "topleft", legend.values.rnd = 0,
           legend.title.txt = "Nombre de places à 45 minutes - Nombre de places à 15 minutes",
           add = TRUE)

plot(st_geometry(border), col = "black", lwd = 1, add = TRUE)
dev.off()


4 Quel impact sur les populations ?

Idée (à affiner) : 1 - Analyses de corrélations 2 à 2 pour voir les facteurs socio-éco qui introduisent des effets significatifs sur les temps d’accès et capa 1 - une typo pour caractériser les distances aux hôpitaux : introduire choix, évolution, distance en 2018 2 - Croiser avec indicateurs socio-éco (zonages = chi2, taux de chômage = analyse de variance

Voilà le truc nul qui avait été réalisé au début.

# Ce bout de code ne fonctionne plus avec la mise à jour des données...
# Pas mis à jour car pas d'intérêt majeur... 

com$PERTE <- cut(com$T01_ALL_DIF,
                 breaks = c(min(com$T01_ALL_DIF),1,5,10,20,30,max(com$T01_ALL_DIF)),
                 labels = c("0-1 minute",
                            "1-5 minutes",
                            "5-10 minutes",
                            "10-20 minutes",
                            "20-30 minutes",
                            "30 minutes et plus"),
                 include.lowest = TRUE)

df <- aggregate(data = com, cbind(POP_TOT_16, POP_65_16, CHOM_16, DIP_A_16) ~ PERTE , sum)
tmp <- apply(df[,c(2:5)], 2, sum)
tmp$PERTE <- "TOTAL"
tmp <- as.data.frame(tmp)
df <- rbind(df, tmp)

df$POP_TOT_16_PERC <- df[,c("POP_TOT_16")] / df[7,"POP_TOT_16"] * 100
df$POP_65_16_PERC <- df[,c("POP_65_16")] / df[7,"POP_65_16"] * 100
df$CHOM_16_PERC <- df[,c("CHOM_16")] / df[7,"CHOM_16"] * 100
df$DIP_A_16_PERC <- df[,c("DIP_A_16")] / df[7,"DIP_A_16"] * 100

knitr::kable(df, row.names = F, digits = 1)












Accessibilité aux soins de chirurgie