Recherche d'un prénom pour un-e enfant

Utilisation de l'open data de l'INSEE pour trouver un prénom correspondant aux critères choisis

Marie Vaugoyeau

82 minutes

Objectif

Le but de cet article est de voir comment on peut trouver une information correspondant à un certain nombre de critères dans un fichier d’open data créé par l’INSEE, l’Institut national de la statistique et des études économiques.

Ici, nous allons chercher un prénom :

  • pour un garçon
  • qui ne soit pas un prénom composé
  • ne commençant pas par S car quand ton nom de famille commence par M, il y a mieux ^^
  • qui ne soit pas déjà présent dans la famille ou les ami-e-s proches, ce qui en retire une petite soixantaine
  • courant mais sans être parmis les plus donnés non plus
  • qui ne soit pas un mot de la langue française, par exemple, pas de Pierre, Colin, Iris,…

Récupération des données en open source de l’INSEE

L’INSEE a sortie un fichier des prénoms de 1900 à 2018, disponible sur le site de l’open data du gouvernement français.

La première colonne donne le sexe des enfants né-e-s, 1 pour les graçons et 2 pour les filles. Rapidement je ne sélectionne que les prénoms donnés aux garçons donc cette colonne n’aparaît plus dans le jeu de données travaillé.
preusuel c’est le prénom usuel donné aux enfants.
annais, l’année de naissance concernée.
nombre, le nombre de naissance pour un sexe, un prénom et une année donnée sauf si celui-ci est inférieur à 3. Dans ce cas, les décomptes sont cumulés sur toutes les années et l’année est remplacée par XXXX ou sous l’appélation _PRENOMS_RARES par année. Au vu de nos limites, ces lignes ont été supprimées du jeu de données.

library(tidyverse)
## -- Attaching packages --------------------------------------- tidyverse 1.3.0 --
## v ggplot2 3.3.3     v purrr   0.3.4
## v tibble  3.0.6     v dplyr   1.0.3
## v tidyr   1.1.2     v stringr 1.4.0
## v readr   1.4.0     v forcats 0.5.1
## Warning: le package 'ggplot2' a été compilé avec la version R 4.0.3
## Warning: le package 'tidyr' a été compilé avec la version R 4.0.3
## Warning: le package 'readr' a été compilé avec la version R 4.0.3
## Warning: le package 'dplyr' a été compilé avec la version R 4.0.3
## Warning: le package 'forcats' a été compilé avec la version R 4.0.3
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
liste_prenom_insee <- read.csv2(
  "nat2018.csv",
  encoding = "UTF-8"
) %>% 
  filter(
    annais != "XXXX", # on retire les lignes sans année
    preusuel != "_PRENOMS_RARES" # on retire les prénoms non communiquées, c'est-à-dire ceux dont le nombre est inférieur à 3 pour une année
  ) %>% 
  mutate(annais = annais %>% as.integer()) # on transforme l'année de naissance en une variable numérique afin de pouvoir représenter graphiquement l'évolution des prénoms  

# format du jdd  
liste_prenom_insee %>% 
  glimpse()
## Rows: 601,221
## Columns: 4
## $ X.U.FEFF.sexe <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,...
## $ preusuel      <chr> "A", "A", "AADAM", "AADAM", "AADAM", "AADAM", "AADAM"...
## $ annais        <int> 1980, 1998, 2009, 2014, 2016, 2017, 2018, 1976, 1978,...
## $ nombre        <int> 3, 3, 4, 3, 4, 4, 3, 5, 3, 3, 5, 4, 3, 5, 4, 6, 6, 6,...
# nombre de prénoms différents
liste_prenom_insee %>% 
  distinct(preusuel) %>% 
  nrow()
## [1] 31707

Application des filtres choisis

Sélection des prénoms masculins uniquement

liste_prenom_m <- liste_prenom_insee %>% 
  filter(X.U.FEFF.sexe == 1) %>% 
  select(- X.U.FEFF.sexe)

liste_prenom_m %>% 
  glimpse()
## Rows: 273,864
## Columns: 3
## $ preusuel <chr> "A", "A", "AADAM", "AADAM", "AADAM", "AADAM", "AADAM", "AA...
## $ annais   <int> 1980, 1998, 2009, 2014, 2016, 2017, 2018, 1976, 1978, 1980...
## $ nombre   <int> 3, 3, 4, 3, 4, 4, 3, 5, 3, 3, 5, 4, 3, 5, 4, 6, 6, 6, 8, 9...
liste_prenom_m %>% 
  distinct(preusuel) %>% 
  nrow()
## [1] 15304
# on divise logiquement le nombre de prénom par deux à peu près

Sélection des prénoms simples

Les prénoms composés ont obligatoirement un - donc la détection de celui-ci permet de les exclure.

liste_prenom_simple <- liste_prenom_m %>% 
  filter(
    preusuel %>% 
      str_detect("-") == FALSE
  )

liste_prenom_simple %>% 
  glimpse()
## Rows: 255,370
## Columns: 3
## $ preusuel <chr> "A", "A", "AADAM", "AADAM", "AADAM", "AADAM", "AADAM", "AA...
## $ annais   <int> 1980, 1998, 2009, 2014, 2016, 2017, 2018, 1976, 1978, 1980...
## $ nombre   <int> 3, 3, 4, 3, 4, 4, 3, 5, 3, 3, 5, 4, 3, 5, 4, 6, 6, 6, 8, 9...
liste_prenom_simple %>% 
  distinct(preusuel) %>% 
  nrow()
## [1] 14142
# et hop 1 000 de moins

Ne commençant pas par S

liste_prenom_sans_s <- liste_prenom_simple %>% 
  mutate(
    initiale = 
      preusuel %>% 
      str_sub(
        start = 1,
        end = 1
      )
  ) %>% 
  filter(
    initiale != "S"
  )

liste_prenom_sans_s %>% 
  glimpse()
## Rows: 236,141
## Columns: 4
## $ preusuel <chr> "A", "A", "AADAM", "AADAM", "AADAM", "AADAM", "AADAM", "AA...
## $ annais   <int> 1980, 1998, 2009, 2014, 2016, 2017, 2018, 1976, 1978, 1980...
## $ nombre   <int> 3, 3, 4, 3, 4, 4, 3, 5, 3, 3, 5, 4, 3, 5, 4, 6, 6, 6, 8, 9...
## $ initiale <chr> "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A"...
liste_prenom_sans_s %>% 
  distinct(preusuel) %>% 
  nrow()
## [1] 13011
# encore 1 000 de moins

# vérification que les prénoms commençant par S ont bien été retirés
liste_prenom_sans_s %>% 
  distinct(preusuel, initiale) %>%
  count(initiale)
##    initiale    n
## 1         A 1572
## 2         Â    1
## 3         B  514
## 4         C  586
## 5         Ç    1
## 6         D  676
## 7         E  721
## 8         É   55
## 9         F  396
## 10        G  505
## 11        H  560
## 12        I  384
## 13        Î    2
## 14        Ï    1
## 15        J  701
## 16        K  736
## 17        L  773
## 18        M 1341
## 19        N  602
## 20        O  258
## 21        Ö    3
## 22        P  221
## 23        Q   25
## 24        R  617
## 25        T  704
## 26        U   45
## 27        V  184
## 28        W  209
## 29        X   11
## 30        Y  416
## 31        Z  191

N’étant pas présent dans la famille et ami-e-s

prenom_dans_la_famille <- tibble(
  prenom = c(
    "Pierre",
    "Pierre-Yves",
    "Alain",
    "Philippe",
    "Christophe",
    "Éric",
    "Stéphane",
    "David",
    "Étienne",
    "Antoine",
    "Clovis",
    "François",
    "Quentin",
    "Jean-Baptiste",
    "Rafael",
    "Zacharrie",
    "Anatole",
    "Auguste",
    "Françis",
    "Christian",
    "Jean-Luc",
    "Thierry",
    "Eric",
    "Jérôme",
    "Sylvain",
    "Grégoire",
    "Greg",
    "Benoît",
    "Alexis",
    "Julien",
    "Florian",
    "Mael",
    "Maël",
    "Gabriel",
    "Edouard",
    "Tom",
    "Amaury",
    "Mathias",
    "Yves",
    "Pierre-Yves",
    "Jean-François",
    "Sebastien",
    "Quentin",
    "Stephane",
    "Thierry",
    "Christian",
    "Charles",
    "Thomas",
    "Alexis",
    "Robin",
    "Arthur",
    "Mathis",
    "Marius",
    "Robin",
    "Sacha",
    "Clément",
    "Medhi",
    "Mehdi",
    "Pierre",
    "Jean-Marie",
    "Jeannot",
    "Julien",
    "Louis"
  )
) %>% 
  distinct() %>% 
  mutate(
    prenom = prenom %>% str_to_upper()
  )


prenom_dans_les_amis <- tibble(
  prenom = c(
    "Thomas",
    "Benoit",
    "Joao",
    "Florian",
    "Bertrand",
    "Aubin",
    "Sébastien",
    "Arthur",
    "Clément",
    "Goulven",
    "Brieuc",
    "Jerome",
    "Jérome",
    "Laurent",
    "Joan",
    "Romain",
    "Armand",
    "Olivier",
    "Christophe",
    "Adrien",
    "Alexis",
    "Grégoire",
    "Eiffel",
    "Gabriel"
    )
) %>% 
  mutate(
    prenom = prenom %>% str_to_upper()
  )

liste_prenom_sans_proche <- 
  liste_prenom_sans_s %>% 
  anti_join(
    prenom_dans_la_famille,
    by = c("preusuel" = "prenom")
  ) %>% 
  anti_join(
    prenom_dans_les_amis,
    by = c("preusuel" = "prenom")
  )

liste_prenom_sans_proche %>% 
  glimpse()
## Rows: 230,465
## Columns: 4
## $ preusuel <chr> "A", "A", "AADAM", "AADAM", "AADAM", "AADAM", "AADAM", "AA...
## $ annais   <int> 1980, 1998, 2009, 2014, 2016, 2017, 2018, 1976, 1978, 1980...
## $ nombre   <int> 3, 3, 4, 3, 4, 4, 3, 5, 3, 3, 5, 4, 3, 5, 4, 6, 6, 6, 8, 9...
## $ initiale <chr> "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A"...
liste_prenom_sans_proche %>% 
  distinct(preusuel) %>% 
  nrow()
## [1] 12953
# une cinquantaine en moins avec les redondances et les prénoms comporsés

Prénoms courants mais pas tendances non plus

Avec mon mari nous avons deux prénoms très courant qui nous ont valu à l’école de n’être quasiment jamais la seule personne à le porter ce qui conduit à des ajout d’adjectif ou de numéros pour nous différencier les uns des autres et ce n’est pas super plaisant…

Même aujourd’hui, nos connaissances connaissent d’autres couples qui portent les mêmes prénoms ce qui peut conduire à des quiproquo plus ou moins drôles…

Bref, nous voulons éviter cela donc nous avons choisi de retirer les 20 prénoms les plus données par an pour ces cinq dernières années.

A l’inverse on ne veut pas d’un prénom que les gens ne connaissent pas, donc on pose la limite que sur les cinquantes dernières années, au moins 20 personnes par an ont eu ce prénom.

Attention : les données de l’INSEE s’arrête en 2018, donc pour avoir l’année 2019, on va la récupérer sur le site du magazine Parents.

# Prénoms rares
liste_prenom_rare <- liste_prenom_m %>% 
  right_join(
    liste_prenom_m %>% 
      filter(annais >= 1970) %>% 
      distinct(preusuel) %>% 
      merge(
        tibble(annais = c(1970:2018))
      )
  ) %>% 
  filter(
    nombre < 20 | is.na(nombre)
  ) %>% 
  distinct(preusuel)
## Joining, by = c("preusuel", "annais")
liste_prenom_rare %>% 
  glimpse()
## Rows: 13,936
## Columns: 1
## $ preusuel <chr> "A", "AADAM", "AADEL", "AADIL", "AAHIL", "AAKASH", "AARON"...
# impressionnant le nombre de prénoms concernés !

# Prénoms tendances
liste_prenom_tendance_2015_2018 <- liste_prenom_m %>% 
  filter(
    annais >= 2015
  ) %>% 
  group_by(annais) %>% 
  arrange(desc(nombre)) %>% 
  slice(1:20) %>% 
  ungroup() %>% 
  distinct(preusuel)

liste_prenom_tendance_2015_2018 %>% 
  glimpse()
## Rows: 24
## Columns: 1
## $ preusuel <chr> "GABRIEL", "JULES", "LUCAS", "LOUIS", "ADAM", "HUGO", "LÉO...
library(rvest)
## Warning: le package 'rvest' a été compilé avec la version R 4.0.3
## Le chargement a nécessité le package : xml2
## 
## Attachement du package : 'rvest'
## The following object is masked from 'package:purrr':
## 
##     pluck
## The following object is masked from 'package:readr':
## 
##     guess_encoding
liste_prenom_tendance_2019 <-
  tibble(
    preusuel = read_html("https://www.parents.fr/prenoms/top-100-des-prenoms-de-garcons-100988") %>% # adresse url de la page
      html_node(xpath = '//*[@id="main"]/article/div/div/div[1]/ol') %>% # sélection du tableau, xpath récupéré en "inspectant" la page internet
      html_text() %>% 
      str_split("\n\t\t", simplify = TRUE) %>% 
      str_remove_all("[:blank:]")
  ) %>% 
  filter(preusuel != "") %>% 
  slice(1:20) %>% 
  mutate(
    preusuel = preusuel %>% str_to_upper()
  )

liste_prenom_tendance_2019 %>% 
  glimpse()
## Rows: 0
## Columns: 1
## $ preusuel <chr>
liste_prenom_tendance <- 
  bind_rows(
    liste_prenom_tendance_2015_2018,
    liste_prenom_tendance_2019
  ) %>% 
  distinct()
# bon étonnament l'intégralité de la liste de 2019 est déjà dans celle de 2015 et 2018 donc ces informations ne semblent pas correct.... Pour avoir fait le tour de plusieurs sites, la liste ne bouge pas entre 2018, 2019 et 2020 donc je suppose que les personnes ayant rédigé les différents articles n'ont pas relévés que les données de l'INSEE s'arrête en 2018.... Bon tant pis...

# maintenant on retire les prénoms rares et tendances de notre liste déjà réduite
liste_prenom_courant <- liste_prenom_sans_proche %>% 
  filter(annais >= 1970) %>% 
  anti_join(liste_prenom_rare) %>% 
  anti_join(liste_prenom_tendance)
## Joining, by = "preusuel"
## Joining, by = "preusuel"
liste_prenom_courant %>% 
  glimpse()
## Rows: 8,673
## Columns: 4
## $ preusuel <chr> "ABDALLAH", "ABDALLAH", "ABDALLAH", "ABDALLAH", "ABDALLAH"...
## $ annais   <int> 1970, 1971, 1972, 1973, 1974, 1975, 1976, 1977, 1978, 1979...
## $ nombre   <int> 68, 57, 52, 68, 51, 64, 52, 48, 34, 38, 49, 49, 67, 43, 55...
## $ initiale <chr> "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A"...
liste_prenom_courant %>% 
  distinct(preusuel) %>% 
  nrow()
## [1] 177
# ouf on est passé sous la barre des 200 prénoms possibles !

Prénom qui ne soit qu’un prénom

Pour faire cette partie j’ai utilisée la liste des mots français de FREELANG, le soucis c’est que cette liste contient des prénoms mais à chaque fois ils ont une majuscule, je vais donc retirer de cette liste tous les mots commençants par une majuscule et là merci les expressions régulières !

liste_mots_francais <- read.table(
  "liste_francais.txt"
) %>% 
  filter(
    V1 %>% 
      str_detect("^[:upper:]") == TRUE
  )

liste_mots_francais %>% 
  glimpse()
## Rows: 1,437
## Columns: 1
## $ V1 <chr> "Aaron", "Abdel", "Abidjan", "Abyssin", "Abyssine", "Abyssinie",...

Bon mon idée n’est pas la bonne car cela supprime aussi les noms de lieux et je ne veux pas…
Après avoir regardé rapidement la liste, je me suis apperçu que seul Ange et Martial seraient concernés donc je vais laisser de côté cette partie, en ne retirant que ces deux là.
En même temps, il est vrai que cela touche plus les prénoms donnés aux filles qu’au garçons…

liste_prenom_final <- liste_prenom_courant %>% 
  anti_join(
    tibble(
      preusuel = c("ANGE", "MARTIAL")
    )
  )
## Joining, by = "preusuel"
liste_prenom_final %>% 
  glimpse()
## Rows: 8,575
## Columns: 4
## $ preusuel <chr> "ABDALLAH", "ABDALLAH", "ABDALLAH", "ABDALLAH", "ABDALLAH"...
## $ annais   <int> 1970, 1971, 1972, 1973, 1974, 1975, 1976, 1977, 1978, 1979...
## $ nombre   <int> 68, 57, 52, 68, 51, 64, 52, 48, 34, 38, 49, 49, 67, 43, 55...
## $ initiale <chr> "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A"...
liste_prenom_final %>% 
  distinct(preusuel) %>% 
  nrow()
## [1] 175

Conclusion

Je me retrouve avec une liste de 175 prénoms soit beaucoup moins que les 15304 prénoms données aux garçons depuis 1900 ^^
Est-ce que cela va nous aider à décider, pas sûr mais bon au moins j’aurais tenté !

Une dernière idée, choisir l’initiale que l’on souhaite ?

Pour cela une petite fonction et l’utilisation de Plotly que j’adore et hop, il ne reste plus qu’à choisir !

library(plotly)
## Warning: le package 'plotly' a été compilé avec la version R 4.0.3
## 
## Attachement du package : 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout
# fonction pour visualiser l'évolution des prénoms concernés depuis les années 70s
graphique_prenom_par_initiale <- function(initiales_choisies){
  return(
      liste_prenom_final %>% 
    filter(initiale %in% initiales_choisies) %>% 
    ggplot() +
    aes(x = annais, y = nombre, colour = preusuel) +
    geom_line() +
    theme_classic() +
    ggtitle(
      paste(initiales_choisies, collapse = ", ")
    )
  )
} 
  
# résumé par initiale
liste_prenom_final %>% 
  distinct(preusuel, initiale) %>% 
  count(initiale)
##    initiale  n
## 1         A 25
## 2         B  6
## 3         C  6
## 4         D 10
## 5         E  8
## 6         F  6
## 7         G 11
## 8         H  7
## 9         I  2
## 10        J 15
## 11        K  4
## 12        L  9
## 13        M 24
## 14        N  5
## 15        O  1
## 16        P  4
## 17        R  7
## 18        T  7
## 19        V  6
## 20        W  2
## 21        X  1
## 22        Y  9
graph <- list(
  "A",
  "B",
  "C",
  "D",
  c("E", "É"),
  "G",
  c("H", "I"),
  "J",
  "K",
  "L",
  "M",
  c("N", "O"),
  c("P", "R"),
  "T",
  c("V", "W", "X"),
  "Y"
) %>% 
  map(graphique_prenom_par_initiale)

graph[[1]] %>% 
  ggplotly()
graph[[2]] %>% 
  ggplotly()
graph[[11]] %>% 
  ggplotly()
graph[[12]] %>% 
  ggplotly()