diff --git a/script/onrn.R b/script/onrn.R new file mode 100644 index 0000000000000000000000000000000000000000..b966b564a141396155013ff35bac34003742edf7 --- /dev/null +++ b/script/onrn.R @@ -0,0 +1,280 @@ +# Libraries + +# library(geau) +# library(sf) + +# Updating data from remote + +## Local + +today = Sys.Date() +archive_dir = sprintf("data-common/data/ONRN/archive/%s", today) +dir.create(archive_dir, showWarnings = FALSE, recursive = TRUE) + +## Remote + +remote_dir = "https://files.georisques.fr/onrn" +archive = c( + "ONRN_Population_EAIP_CE", + "ONRN_Population_EAIP_SM", + "ONRN_Emprise_totale_bat_EAIP_CE", + "ONRN_Emprise_totale_bat_EAIP_SM", + "ONRN_Emprise_habitations_sans_etage_EAIP_CE", + "ONRN_Emprise_habitations_sans_etage_EAIP_SM", + "ONRN_Entreprises_EAIP", + "sinistralite/ONRN_nbReco_Inondation", + "sinistralite/ONRN_CoutMoyen_Inondation", + "sinistralite/ONRN_CoutCommune_Inondation", + "sinistralite/ONRN_Frequence_Inondation", + "sinistralite/ONRN_SsurP_Inondation", + "sinistralite/ONRN_CoutParHabitant_Inondation", + "sinistralite/ONRN_nbReco_Inondation", + "sinistralite/ONRN_nbReco_Inondation", + "ONRN_Avancement_PPRNI", + "ONRN_Anciennete_PPRNI" +) + +## Download + +mapply( + utils::download.file, + url = file.path(remote_dir, sprintf("%s.zip", archive)), + destfile = file.path(archive_dir, gsub("sinistralite/", "", sprintf("%s.zip", archive))), + method = "wget" +) + +## Unzip + +mapply( + utils::unzip, + zipfile = file.path(archive_dir, gsub("sinistralite/", "", sprintf("%s.zip", archive))), + exdir = file.path(archive_dir, "raw") +) + +## Convert to UTF-8 + +onrn_raw = file.path(archive_dir, "raw") +for(f in dir(onrn_raw, pattern = ".csv")) { + system(sprintf("iconv -f ISO-8859-1 -t UTF-8 %s -o %s", file.path(onrn_raw, f), file.path(onrn_raw, "temp.csv"))) + system(sprintf("mv %s %s", file.path(onrn_raw, "temp.csv"), file.path(onrn_raw, f))) +} + +## Remove pdf + +unlink(dir(onrn_raw, pattern = ".pdf", full.names = TRUE)) + +# Treatment + +## Selection + +selection = geau::so_ii_scope + +## Nombre reconnaissance Cat-Nat "ONRN_nbRecos_Inon" + +pattern = "ONRN_nbRecos_Inon" +variable = "n_catnat" +temp = rio::import( + dir(onrn_raw, pattern = pattern, full.names = TRUE), + setclass = "data.frame", col_types = "text")[c(1, 3)] +names(temp) = c("commune", variable) +temp[[variable]][temp[[variable]] == "Pas de reconnaissance"] = 0 + +rownames(temp) = temp[["commune"]] +temp = temp[selection, ] + +result = temp + +### Fréquence sinistre: "ONRN_FreqMoyenne_Inon" + +pattern = "ONRN_FreqMoyenne_Inon" +variable = "freq_sin" +temp = rio::import( + dir(onrn_raw, pattern = pattern, full.names = TRUE), + setclass = "data.frame", col_types = "text")[c(1, 3)] +names(temp) = c("commune", variable) + +conversion = data.frame( + freq_sin = c("Pas de sinistre ou de risque répertoriés à CCR", "Entre 0 et 1 ‰", "Entre 1 et 2 ‰", "Entre 2 et 5 ‰", "Entre 5 et 10 ‰", "Plus de 10 ‰"), + freq_sin_min = c(0, 0, 1, 2, 5, 10)/1000, + freq_sin_max = c(0, 1, 2, 5, 10, 1000)/1000) +temp = merge(temp, conversion, all.x = TRUE)[-1] +temp[[variable]] = (temp[[2]] + temp[[3]]) / 2 +temp[[variable]][temp[["freq_sin_max"]] == 1] = 1.5 * temp[[2]][temp[["freq_sin_max"]] == 1] + +rownames(temp) = temp[["commune"]] +temp = temp[selection, ] + +result = merge(result, temp, by = "commune", all.x = TRUE) + +### Coût des inondations: "ONRN_CoutCum_Inon" + +pattern = "ONRN_CoutCum_Inon" +variable = "cost" +temp = rio::import( + dir(onrn_raw, pattern = pattern, full.names = TRUE), + setclass = "data.frame", col_types = "text")[c(1, 3)] +names(temp) = c("commune", variable) + +conversion = data.frame( + cost = c( + "Pas de sinistre répertorié à CCR", + "Entre 0 k€ et 100 k€", + "Entre 100 k€ et 500 k€", + "Entre 500 k€ et 2 M€", + "Entre 2 M€ et 5 M€", + "Entre 5 M€ et 10 M€", + "Entre 10 M€ et 50 M€", + "Entre 50 M€ et 100 M€", + "Supérieur à 100 M€" + ), + cost_min = c(0, 0, 1e5, 5e5, 2e6, 5e6, 10e6, 50e6, 100e6), + cost_max = c(0, 1e5, 5e5, 2e6, 5e6, 10e6, 50e6, 100e6, +Inf) +) +all(unique(temp[[variable]]) %in% conversion[[variable]]) +temp = merge(temp, conversion, all.x = TRUE)[-1] +temp[[variable]] = (temp[[2]] + temp[[3]]) / 2 +temp[[variable]][is.infinite(temp[[variable]])] = 1.5 * temp[[2]][is.infinite(temp[[variable]])] + +rownames(temp) = temp[["commune"]] +temp = temp[selection, ] + +result = merge(result, temp, by = "commune", all.x = TRUE) + +### Coût moyen des inondations: "ONRN_CtMoyen_Inon" + +pattern = "ONRN_CtMoyen_Inon" +variable = "cost_mean" +temp = rio::import( + dir(onrn_raw, pattern = pattern, full.names = TRUE), + setclass = "data.frame", col_types = "text")[c(1, 3)] +names(temp) = c("commune", variable) + +conversion = data.frame( + cost_mean = c( + "Pas de sinistre répertorié à CCR", + "Entre 0 et 2,5 k€", + "Entre 2,5 et 5 k€", + "Entre 5 et 10 k€", + "Entre 10 et 20k€", + "Plus de 20 k€" + ), + cost_mean_min = c(0, 0, 2.5e3, 5e3, 10e3, 20e3), + cost_mean_max = c(0, 2.5e3, 5e3, 10e3, 20e3, +Inf) +) +all(unique(temp[[variable]]) %in% conversion[[variable]]) +temp = merge(temp, conversion, all.x = TRUE)[-1] +temp[[variable]] = (temp[[2]] + temp[[3]]) / 2 +temp[[variable]][is.infinite(temp[[variable]])] = 1.5 * temp[[2]][is.infinite(temp[[variable]])] + +rownames(temp) = temp[["commune"]] +temp = temp[selection, ] + +result = merge(result, temp, by = "commune", all.x = TRUE) + +### Coût par habitant des inondations: "ONRN_CoutInon_parHabitant" + +pattern = "ONRN_CoutInon_parHabitant" +variable = "cost_hab" +temp = rio::import( + dir(onrn_raw, pattern = pattern, full.names = TRUE), + setclass = "data.frame", col_types = "text")[c(1, 3)] +names(temp) = c("commune", variable) + +conversion = data.frame( + cost_hab = c( + "Pas de sinistre répertorié à CCR", + "Moins de 100 €/habitant", + "Entre 100 € et 500€/habitant", + "Entre 500 € et 1 k€/habitant", + "Entre 1 k€ € et 10 k€/habitant", + "Supérieur à 10 k€/habitant", + NA + ), + cost_hab_min = c(0, 0, 100, 500, 1000, 10000, NA), + cost_hab_max = c(0, 100, 500, 1000, 10000, +Inf, NA) +) +all(unique(temp[[variable]]) %in% conversion[[variable]]) +temp = merge(temp, conversion, all.x = TRUE)[-1] +temp[[variable]] = (temp[[2]] + temp[[3]]) / 2 +temp[[variable]][is.infinite(temp[[variable]])] = 1.5 * temp[[2]][is.infinite(temp[[variable]])] + +rownames(temp) = temp[["commune"]] +temp = temp[selection, ] + +result = merge(result, temp, by = "commune", all.x = TRUE) + +### Sinistre sur Prime des inondations : "ONRN_SsurP_Inon" + +pattern = "ONRN_SsurP_Inon" +variable = "ratio" +temp = rio::import( + dir(onrn_raw, pattern = pattern, full.names = TRUE), + setclass = "data.frame", col_types = "text")[c(1, 3)] +names(temp) = c("commune", variable) + +conversion = data.frame( + ratio = c( + "Pas de sinistre ou de prime répertoriés à CCR", + "Entre 0 et 10 %", + "Entre 10 et 50 %", + "Entre 50 et 100%", + "Entre 100 et 200 %", + "Plus de 200%"), + ratio_min = c(0, 0, 0.1, 0.5, 1, 2), + ratio_max = c(0, 0.1, 0.5, 1, 2, +Inf)) +all(unique(temp[[variable]]) %in% conversion[[variable]]) +temp = merge(temp, conversion, all.x = TRUE)[-1] +temp[[variable]] = (temp[[2]] + temp[[3]]) / 2 +temp[[variable]][is.infinite(temp[[variable]])] = 1.5 * temp[[2]][is.infinite(temp[[variable]])] + +rownames(temp) = temp[["commune"]] +temp = temp[selection, ] + +result = merge(result, temp, by = "commune", all.x = TRUE) + +### PPRI approuvé: "PPRi_anciennete_avancement" + +pattern = "PPRi_anciennete_avancement" +variable = c("ppri_year", "ppri_state", "ppri_state_sub", "ppri_age_ori") +temp = rio::import( + dir(onrn_raw, pattern = pattern, full.names = TRUE), + setclass = "data.frame")[c(1, 8, 7, 2, 9)] +names(temp) = c("commune", variable) + +variable = "state" +conversion = data.frame( + ppri_age_ori = c( + "Approuvé depuis moins de 5 ans", + "Approuvé entre 5 et 10 ans", + "Approuvé entre 10 et 20 ans", + "Approuvé depuis plus de 20 ans", + "Prescrit depuis moins de 4 ans", + "Prescrit depuis plus de 4 ans" + ), + ppri_state_age = c("approuve", "approuve", "approuve", "approuve", "prescrit", "prescrit"), + ppri_age_min = c(0, 5, 10, 20, 0, 4), + ppri_age_max = c(5, 10, 20, +Inf, 4, +Inf) +) +all(unique(temp[[variable]]) %in% conversion[[variable]]) +temp = merge(temp, conversion, all.x = TRUE)[-1] + +rownames(temp) = temp[["commune"]] +temp = temp[selection, ] +temp[["commune"]] = selection + +result = merge(result, temp, by = "commune", all.x = TRUE) + +### Bilan Sinistre - Prime : estimation + +# balance = ratio * population * premium_hab +population = 66992159 # INSEE (2018) +premium = 1670000000 # (CCR2019a pour 2018) +premium_hab = premium / population + +result[["balance"]] = (1 - result[["ratio"]]) * geau::so_ii_population[ , "2018"] * premium_hab + +write.csv2(result, sprintf("data-common/so-ii/onrn/onrn-%s.csv", today), row.names = FALSE) + +unlink(onrn_raw, recursive = TRUE, force = TRUE) + +metropole@data$loss.absolute = metropole@data$POPULATION * (metropole@data$loss.ratio - 1) / metropole@data$area