(Acest articol a fost publicat pentru prima dată pe r.iresmi.netși cu amabilitate a contribuit la R-bloggeri). (Puteți raporta problema legată de conținutul acestei pagini aici)
Doriți să vă distribuiți conținutul pe R-bloggeri? dați clic aici dacă aveți un blog, sau aici dacă nu aveți.
Ziua 2 din 30DayMapChallenge: «Linii» (anterior).
Vom face o hartă cu genul numelui străzii din Lyon. Avem nevoie de o bază de date cu prenume franceze unde vom găsi genul. Vom extrage străzile Lyon din OpenStreetMap.
library(arrow) library(dplyr) library(tidyr) library(readr) library(purrr) library(ggplot2) library(stringr) library(sf) library(osmdata) library(ggspatial) library(glue) library(knitr) set.seed(42)
Prenume
if (!file.exists("freq_prenoms.rds")) { freq_prenoms <- read_parquet("https://www.insee.fr/fr/statistiques/fichier/8205621/prenoms-2023-nat.parquet") |> filter(preusuel != "_PRENOMS_RARES") |> mutate(preusuel = iconv(preusuel, to = "ASCII//TRANSLIT")) |> group_by(preusuel, sexe) |> summarise(n = sum(nombre, na.rm = TRUE), .groups = "drop_last") |> mutate(total = sum(n)) |> ungroup() |> mutate(sexe = case_when(sexe == 1 ~ "M", sexe == 2 ~ "F", .default = NA_character_)) |> pivot_wider(names_from = sexe, values_from = n, values_fill = 0) |> mutate(across(c(M, F), (x) x / total)) |> write_rds("freq_prenoms.rds") } else { freq_prenoms <- read_rds("freq_prenoms.rds") }
Avem 34234 de prenume și frecvențele de gen din 1900.
ZENABOU | 48 | 0 | 1 |
EMILIENE | 25 | 0 | 1 |
KINGSLEY | 878 | 1 | 0 |
DOLOVAN | 73 | 1 | 0 |
ERCOLE | 67 | 1 | 0 |
YVA | 178 | 0 | 1 |
ISSEY | 79 | 1 | 0 |
SAWSSEN | 121 | 0 | 1 |
MISBAH | 24 | 0 | 1 |
GOHANN | 20 | 1 | 0 |
Date de hartă
lyon_bbox <- getbb("Lyon, France", featuretype = "city") if (!file.exists("osm.rds")) { lyon <- opq(lyon_bbox) |> add_osm_features(features = c( '"highway"="motorway"', '"highway"="trunk"', '"highway"="primary"', '"highway"="secondary"', '"highway"="tertiary"', '"highway"="motorway_link"', '"highway"="trunk_link"', '"highway"="primary_link"', '"highway"="secondary_link"', '"highway"="tertiary_link"', '"highway"="motorway_junction"', '"highway"="unclassified"', '"highway"="service"', '"highway"="pedestrian"', '"highway"="living_street"', '"highway"="residential"')) |> osmdata_sf() |> pluck("osm_lines") |> select(osm_id, name) |> drop_na(name) |> group_by(name) |> summarise() |> write_rds("osm.rds") } else { lyon <- read_rds("osm.rds") }
Găsirea prenumelor în numele străzilor
Folosim o metodă de forță brută: pentru fiecare stradă verificăm dacă o parte a etichetei sale este prezentă în lista noastră de prenume feminine sau masculine. Păstrăm doar prenume cu o frecvență mare în oricare dintre genuri.
female <- freq_prenoms |> filter(F > .8, str_length(preusuel) > 1, preusuel != "LA") |> pull(preusuel) male <- freq_prenoms |> filter(M > .8, str_length(preusuel) > 1) |> pull(preusuel) street_gender <- lyon |> mutate(name = str_to_upper(iconv(name, to = "ASCII//TRANSLIT")), m = str_extract_all(name, glue_collapse(male, sep = "\b|\b", last = "\b")), f = str_extract_all(name, glue_collapse(female, sep = "\b|\b", last = "\b")), gender = unlist(map2(f, m, ~ case_when(length(.y) > length(.x) ~ "male", length(.x) > length(.y) ~ "female", identical(.x, character(0)) & identical(.y, character(0)) ~ "not concerned", length(.x) == length(.y) ~ "undecidable", .default = NA_character_))))
COURS DE VERDUN RECAMIER | LINIE (4,830426 45,748… | nu este preocupat | ||
IMASSE DES ANGLAIS | LINIE (4,795807 45,753… | nu este preocupat | ||
RUE DES PROVENCE | LINIE (4,79335 45,7369… | nu este preocupat | ||
CHEMIN DES PEUPLIERS | LINIE (4,866587 45,801… | nu este preocupat | ||
ALLEE DU LEVANT | LINIE (4,878859 45,759… | nu este preocupat | ||
RUE ROPOSTE | LINIE (4,866353 45,760… | nu este preocupat | ||
ALLEE NELLIE BLY | LINIE (4,84882 45,7429… | NELIE | femeie | |
QUAI JEAN MOULIN | MULTILINESTRING ((4,837853 … | JEAN | bărbat | |
RUTA LA VIEILLE | LINIE (4,769782 45,720… | nu este preocupat | ||
AVENUE DE CHAMPAGNE | MULTILINESTRING ((4,796801 … | nu este preocupat |
Hartă
street_gender |> mutate(gender = factor(gender, levels = c("female", "male", "undecidable", "not concerned"))) |> st_set_crs("EPSG:4326") |> ggplot() + geom_sf(aes(color = gender), linewidth = .5, key_glyph = "timeseries") + scale_color_manual(values = c("female" = "lightpink1", "male" = "lightskyblue", "undecidable" = "lightyellow4", "not concerned" = "seashell2")) + annotation_scale(bar_cols = c("darkgrey", "white"), line_col = "darkgrey", text_col = "darkgrey", height = unit(0.1, "cm")) + coord_sf(xlim = lyon_bbox(c(1, 3)), ylim = lyon_bbox(c(2, 4))) + labs(title = "Gender in Lyon street names", color = "", caption = glue("Map data © OpenStreetMap contributors using INSEE Fichier des prénoms 2023 r.iresmi.net - {Sys.Date()}")) + theme_void() + theme(plot.background = element_rect(color = NA, fill = "white"), plot.caption = element_text(size = 5, color = "darkgrey"))
Posibile clasificări greșite
O mulțime de părtiniri fac această hartă nesigură și ar avea nevoie de editare manuală…
prenume epicene
- unele prenume pot fi masculine sau feminine (GWEN, CAMILLE, DOMINIQUE)
nu este preocupat
- nume de străzi ale persoanelor, dar fără prenumele (RUE VILLON),
- titlu în loc de prenume (RUE DE L’AMIRAL COURBET),
are un gen, dar nu ar trebui
- nume comune folosite ca prenume (CHEMIN DE LA POMME), în principal pentru fete…
- prenume ciudate (AUTOROUTE DU SOLEIL, Soleil pare a fi un nume de fată…)
accidental bine clasificat
- numele de familie este, de asemenea, un prenume (COURS BAYARD)