Skip to content

Latest commit

 

History

History
780 lines (616 loc) · 27.9 KB

01_exploratory.md

File metadata and controls

780 lines (616 loc) · 27.9 KB

Carte de France des prénoms

Florian Gaudin-Delrieu 20 janvier 2017

Récupération des données

Les données sont en accès libre sur la plateforme open data du gouvernement français. Les données sont issues d'OpenStreetMap, et sont donc "© les contributeurs d'OpenStreetMap sous licence ODbL".

Les données sur les prénoms sont aussi en open source, fournies par l'INSEE.

library(sp)
library(rgdal)
## rgdal: version: 1.2-5, (SVN revision 648)
##  Geospatial Data Abstraction Library extensions to R successfully loaded
##  Loaded GDAL runtime: GDAL 2.1.2, released 2016/10/24
##  Path to GDAL shared files: /usr/local/share/epsg_csv
##  Loaded PROJ.4 runtime: Rel. 4.9.1, 04 March 2015, [PJ_VERSION: 491]
##  Path to PROJ.4 shared files: (autodetected)
##  Linking to sp version: 1.2-3
library(tmap)
library(raster)
library(stringr)
library(tidyverse)
## Loading tidyverse: ggplot2
## Loading tidyverse: tibble
## Loading tidyverse: tidyr
## Loading tidyverse: readr
## Loading tidyverse: purrr
## Loading tidyverse: dplyr

## Conflicts with tidy packages ----------------------------------------------

## extract(): tidyr, raster
## filter():  dplyr, stats
## lag():     dplyr, stats
## select():  dplyr, raster
library(grid)

J'ai choisi de récupérer les données de 2014 simplifiées à 100m, qui sont moins lourdes à traiter que les données de 2017 non simplifiées.

france <- readOGR("data/original/departements", "departements-20140306-100m", stringsAsFactors = FALSE, use_iconv = TRUE, encoding = "iso-8859-1")
## OGR data source with driver: ESRI Shapefile 
## Source: "data/original/departements", layer: "departements-20140306-100m"
## with 101 features
## It has 4 fields
france
## class       : SpatialPolygonsDataFrame 
## features    : 101 
## extent      : -61.80976, 55.83665, -21.38973, 51.08984  (xmin, xmax, ymin, ymax)
## coord. ref. : +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0 
## variables   : 4
## names       : code_insee,      nom, nuts3,            wikipedia 
## min values  :         01,      Ain, FR101, fr:Ain (département) 
## max values  :        976, Yvelines, FR940,          fr:Yvelines
head(france@data)
##   code_insee                     nom nuts3                  wikipedia
## 0         01                     Ain FR711       fr:Ain (département)
## 1         02                   Aisne FR221     fr:Aisne (département)
## 2         03                  Allier FR721    fr:Allier (département)
## 3         04 Alpes-de-Haute-Provence FR821 fr:Alpes-de-Haute-Provence
## 4         05            Hautes-Alpes FR822            fr:Hautes-Alpes
## 5         06         Alpes-Maritimes FR823         fr:Alpes-Maritimes
str(france@data)
## 'data.frame':    101 obs. of  4 variables:
##  $ code_insee: chr  "01" "02" "03" "04" ...
##  $ nom       : chr  "Ain" "Aisne" "Allier" "Alpes-de-Haute-Provence" ...
##  $ nuts3     : chr  "FR711" "FR221" "FR721" "FR821" ...
##  $ wikipedia : chr  "fr:Ain (département)" "fr:Aisne (département)" "fr:Allier (département)" "fr:Alpes-de-Haute-Provence" ...

Note : Pour ne plus avoir le message d'erreur NOTE: rgdal::checkCRSArgs: no proj_defs.dat in PROJ.4 shared files, j'ai fait comme indiqué à cette adresse'

Essayons un premier graphique à l'aide de tmap

tm_shape(france) +
  tm_borders()

Avec, les départements d'outre-mer (DOM) la carte est illisible. En première approche, nous allons ignorer ces DOM. Pour les exclure, nous allons utiliser le fait que les départements de France métropolitaine sont codés sur 2 chiffres alors que les DOM sont codés sur 3 chiffres.

france <- france[str_length(france$code_insee) == 2, ]
france
## class       : SpatialPolygonsDataFrame 
## features    : 96 
## extent      : -5.142238, 9.560364, 41.33323, 51.08984  (xmin, xmax, ymin, ymax)
## coord. ref. : +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0 
## variables   : 4
## names       : code_insee,      nom, nuts3,            wikipedia 
## min values  :         01,      Ain, FR101, fr:Ain (département) 
## max values  :         95, Yvelines, FR832,          fr:Yvelines
tm_shape(france) + tm_borders()

Lisons maintenant les données des prénoms. L'encodage doit être précisé pour les lettres accentuées.

prenoms <- read_tsv("data/original/dpt2015.txt", locale = locale(encoding = "iso-8859-1"))
## Parsed with column specification:
## cols(
##   sexe = col_integer(),
##   preusuel = col_character(),
##   annais = col_character(),
##   dpt = col_character(),
##   nombre = col_double()
## )
head(prenoms)
## # A tibble: 6 × 5
##    sexe preusuel annais   dpt nombre
##   <int>    <chr>  <chr> <chr>  <dbl>
## 1     1        A   XXXX    XX     27
## 2     1    AADEL   XXXX    XX     53
## 3     1    AADIL   1983    84      3
## 4     1    AADIL   1992    92      3
## 5     1    AADIL   XXXX    XX    162
## 6     1   AAKASH   XXXX    XX     24

Les données manquantes apparaissent comme "XXXX" pour les années de naissance, et "XX" pour les départements.

table(prenoms$dpt == "XX") # Moins de 1% des départements sont manquants
## 
##   FALSE    TRUE 
## 3372275   33036
table(prenoms$annais == "XXXX") # Il y a exactement le même nombre d'années de naissance manquantes
## 
##   FALSE    TRUE 
## 3372275   33036
nrow(filter(prenoms, dpt == "XX", annais != "XXXX")) # Toutes les données manquantes sont sur les mêmes lignes
## [1] 0

Les données manquantes étant sur les mêmes lignes, nous allons les supprimer, puisque nous ne pouvons pas les placer par département. Nous allons renommer les variables pour des noms moins obscurs, et nous changeons le département en code_insee, pour pouvoir joindre les données avec la carte plus facilement.

prenoms <- prenoms %>% 
  rename(prenom = preusuel, annee = annais, code_insee = dpt) %>% 
  mutate(sexe = factor(sexe, levels = c(1, 2), labels = c("M", "F")),
         annee = as.integer(annee)) %>% 
  filter(annee != "XXXX")
## Warning in eval(substitute(expr), envir, enclos): NAs introduits lors de la
## conversion automatique
head(prenoms)
## # A tibble: 6 × 5
##     sexe prenom annee code_insee nombre
##   <fctr>  <chr> <int>      <chr>  <dbl>
## 1      M  AADIL  1983         84      3
## 2      M  AADIL  1992         92      3
## 3      M  AARON  1962         75      3
## 4      M  AARON  1982         75      3
## 5      M  AARON  1984         75      3
## 6      M  AARON  1985         75      4

Carte pour un prénom, toutes années confondues

Essayons de résumer les données pour un prénom (par exemple "Florian"), toutes années confondues

florian <- prenoms %>% 
  filter(prenom == "FLORIAN") %>% 
  group_by(code_insee) %>% 
  summarise(total = sum(nombre))
tm_shape(sp::merge(france, florian)) +
  tm_borders() +
  tm_fill(col = "total")

Il y a de nombreux Florian dans le Nord, intéressant ! La Corse est manquante, cela doit venir du fait que les départements sont 2A et 2B, et doivent être marqués comme 20 dans un des deux jeux de données, ce qui fait que la jointure ne marche pas.

setdiff(unique(france$code_insee), unique(prenoms$code_insee)) # Il n'y a bien que la Corse qui pose problème
## [1] "2A" "2B"

Changeons les départements dans prenoms pour que la jointure soit la bonne.

prenoms_corse <- prenoms %>% 
  filter(code_insee == "20") %>% 
  mutate(code_insee = "2B", nombre = nombre / 2)


prenoms$code_insee[prenoms$code_insee == "20"] <- "2A"
prenoms$nombre[prenoms$code_insee == "2A"] <- prenoms$nombre[prenoms$code_insee == "2A"] / 2
prenoms <- prenoms %>% bind_rows(prenoms_corse) 

florian2 <- prenoms %>% 
  filter(prenom == "FLORIAN") %>% 
  group_by(code_insee) %>% 
  summarise(total = sum(nombre))

# Contrôle rapide
setdiff(florian2, florian)
## # A tibble: 2 × 2
##   code_insee total
##        <chr> <dbl>
## 1         2A 192.5
## 2         2B 192.5

Refaisons la carte

tm_shape(sp::merge(france, florian2)) +
  tm_borders() +
  tm_fill(col = "total")

On ne voit pas bien la région parisienne.

paris <- france[france$code_insee %in% c("75", "92", "93", "94"), ]
tm_shape(sp::merge(paris, florian2))+
  tm_borders() +
  tm_fill(col = "total", breaks = seq(0, 7000, by = 1000))

J'ai modifié la légende manuellement pour avoir la même que sur la carte de toute la France.

Autre approche pour les graphes

Plutôt que de supprimer les données, peut être est-il utile de "facetter" les régions que l'on ne voit pas (DOM et région parisienne) ?

france2 <- readOGR("data/original/departements", "departements-20140306-100m", stringsAsFactors = FALSE, use_iconv = TRUE, encoding = "iso-8859-1")
## OGR data source with driver: ESRI Shapefile 
## Source: "data/original/departements", layer: "departements-20140306-100m"
## with 101 features
## It has 4 fields
france2$facet <- "Métropole"
france2$facet[france2$code_insee %in% c(c("75", "92", "93", "94"))] <- "Paris"
france2$facet[str_length(france2$code_insee) > 2] <- str_sub(france2$wikipedia[str_length(france2$code_insee) > 2], 4) 

tm_shape(france2) +
  tm_borders() +
  tm_facets("facet", free.coords = TRUE)

Ce n'est pas très satisfaisant, la métropole est beaucoup trop petite par rapport au reste. On pourrait partir sur 2 graphes : un pour la métropole et un pour les autres sous forme de facettes.

france_metro <- france2[france2$facet == "Métropole", ]
france_autre <- france2[france2$facet != "Métropole", ]

p1 <- tm_shape(france_metro) +
  tm_borders()
p2 <- tm_shape(france_autre) +
  tm_borders() +
  tm_facets("facet", free.coords = TRUE, ncol = 1)

grid.newpage()
pushViewport(viewport(layout=grid.layout(nrow = 1, ncol = 2, widths = unit(c(0.8, 0.2), "npc"))))
print(p1, vp=viewport(layout.pos.col = 1))
print(p2, vp=viewport(layout.pos.col = 2))

Ce n'est pas trop mal. Testons avec les prénoms

sort(unique(prenoms$code_insee))
##  [1] "01" "02" "03" "04" "05" "06" "07" "08" "09" "10" "11" "12" "13" "14"
## [15] "15" "16" "17" "18" "19" "21" "22" "23" "24" "25" "26" "27" "28" "29"
## [29] "2A" "2B" "30" "31" "32" "33" "34" "35" "36" "37" "38" "39" "40" "41"
## [43] "42" "43" "44" "45" "46" "47" "48" "49" "50" "51" "52" "53" "54" "55"
## [57] "56" "57" "58" "59" "60" "61" "62" "63" "64" "65" "66" "67" "68" "69"
## [71] "70" "71" "72" "73" "74" "75" "76" "77" "78" "79" "80" "81" "82" "83"
## [85] "84" "85" "86" "87" "88" "89" "90" "91" "92" "93" "94" "95" "97"

Le problème est que les DOM ne sont pas détaillés dans le fichier prenoms : ils sont tous indiqués comme 97. On pourrait diviser en 5 le nombre donné dans le fichier, mais ça aurait bien moins de sens que pour la Corse, vu la diversité des territoires.

france_autre <- france2[france2$facet == "Paris", ]

p3 <- tm_shape(sp::merge(france_metro, florian2)) +
  tm_borders() +
  tm_fill(col = "total")
p4 <- tm_shape(sp::merge(france_autre, florian2)) +
  tm_borders() +
  tm_fill(col = "total")

grid.newpage()
pushViewport(viewport(layout=grid.layout(nrow = 1, ncol = 2, widths = unit(c(0.8, 0.2), "npc"))))
print(p3, vp=viewport(layout.pos.col = 1))
print(p4, vp=viewport(layout.pos.col = 2))

Bon, cette approche n'est pas très concluante. Je vais plutôt faire une seule carte avec toute la France métropolitaine, sans les DOM, et sans "zoom" sur la région parisienne.

Proportion de naissances

Le fait de dessiner le nombre de naissances donnera le plus souvent une carte des populations et ne nous renseignera pas sur la particularité d'un prénom. Donc au lieu de remplir en fonction du nombre de naissances, nous allons le faire en fonction du pourcentage de naissance de ce prénomn, dans chaque département.

naissances <- prenoms %>% 
  group_by(code_insee) %>% 
  summarise(naissances = sum(nombre))

florian3 <- inner_join(florian2, naissances, by = "code_insee") %>% 
  mutate(prop = total / naissances)

tm_shape(sp::merge(france, florian3)) +
  tm_borders(alpha = 0.5) +
  tm_fill("prop")

La carte est très différente de la première version ! Le Nord disparaît, et on voit une concentration dans la région Sud-Est, ainsi qu'un gros pic en région parisienne (hors Paris qui est quasiment blanc).

florian3 %>% arrange(-prop) %>% head(10)
## # A tibble: 10 × 4
##    code_insee total naissances        prop
##         <chr> <dbl>      <dbl>       <dbl>
## 1          91  2309     538596 0.004287072
## 2          95  2324     629388 0.003692476
## 3          94  2463     760356 0.003239272
## 4          84  1466     537252 0.002728701
## 5          83  1817     679807 0.002672817
## 6          92  2891    1089192 0.002654261
## 7          93  2249     918799 0.002447761
## 8          06  1881     782180 0.002404817
## 9          77  2118     892659 0.002372687
## 10         74  1480     628855 0.002353484

On voit que la région parisienne (hors Paris) est dans le top 10. Je suis curieux de voir ce qui s'est passé dans le Nord (pourquoi n'est-il plus dans le top des proportions alors que c'était le département avec le plus de naissances en valeur absolue).

naissances_annees <- prenoms %>% 
  group_by(code_insee, annee) %>% 
  summarise(naissances = sum(nombre)) %>% 
  ungroup()

prenoms %>% 
  filter(prenom == "FLORIAN", code_insee %in% c("59", "92")) %>%
  inner_join(naissances_annees, by = c("code_insee", "annee")) %>% 
  ggplot(aes(annee)) + 
    geom_line(aes(y = naissances, col = code_insee))

Voilà l'explication ! Il n'y a pas de données pour certains départements avant environ 1970, alors que pour d'autres il y a des données depuis 1900. Cela fausse donc le total et les proportions.

prenoms %>% 
  group_by(code_insee) %>% 
  summarise(debut = min(annee)) %>% 
  arrange(-debut) %>% 
  head(10)
## # A tibble: 10 × 2
##    code_insee debut
##         <chr> <int>
## 1          91  1968
## 2          92  1968
## 3          93  1968
## 4          94  1968
## 5          95  1968
## 6          01  1900
## 7          02  1900
## 8          03  1900
## 9          04  1900
## 10         05  1900

En fait les départements de la courronne parisienne ont été créés en 1968, cela explique donc l'absence de données rétroactives. D'après la page wikipedia, les départements de la Seine (remplacé par ceux de Paris, des Hauts-de-Seine, de la Seine-Saint-Denis, et du Val-de-Marne) et de Seine-et-Oise (remplacé par ceux de l'Essonne, des Yvelines, et du Val-d'Oise) ont été supprimés.

Création d'un historique

Regardons l'historique des naissances pour Paris et la région parisienne.

ggplot(naissances_annees %>% 
         filter(code_insee %in% c("75", "78", "91", "92", "93", "94", "95")) %>% 
         mutate(groupe = code_insee %in% c("78", "91", "95")), 
       aes(x = annee, y = naissances, color = code_insee)) + 
  geom_line() +
  facet_wrap(~ groupe, scales = "free_y", ncol = 1)

Nous allons faire un faux historique pour ces départements, à partir d'une proportion des départements de Paris et des Yvelines.

prop_seine <- naissances_annees %>% 
  filter(code_insee %in% c("75", "92", "93", "94"),
         annee >= 1968) %>% 
  group_by(code_insee) %>% 
  summarise(total = sum(naissances)) %>% 
  mutate(prop = total/ sum(total)) %>% 
  select(-total)

naissances_recalculees <- naissances_annees %>% 
  filter(code_insee == "75",
         annee < 1968) %>% 
  complete(annee, code_insee = c("75", "92", "93", "94")) %>% 
  fill(naissances) %>% 
  inner_join(prop_seine, by = "code_insee") %>% 
  mutate(naissances = prop * naissances) %>% 
  select(-prop)

naissances_paris <- naissances_annees %>% 
  filter(annee >= 1968, code_insee %in% c("75", "92", "93", "94")) %>% 
  bind_rows(naissances_recalculees)

# Vérification
setequal(naissances_paris %>%
          group_by(annee) %>% 
          summarise(total = sum(naissances)),
        naissances_annees %>% 
          filter(code_insee %in% c("75", "92", "93", "94")) %>% 
          group_by(annee) %>% 
          summarise(total = sum(naissances)))
## TRUE
ggplot(naissances_paris, aes(annee, naissances)) +
  geom_line(aes(color = code_insee)) +
  geom_vline(xintercept = 1968)

La vérification fonctionne et le graphe est plutôt cohérent. Faisons de même pour l'ancienne Seine-et-Oise et recalculons le jeux de naissances_annees. Note : Pour calculer la répartition de la population, je me suis basé sur la période de 1968 à 1998, vu que la répartition change après les années 2000 (les naissances augmentent beaucoup dans le Val d'Oise alors qu'elles diminuent dans les Yvelines).

prop_oise <- naissances_annees %>% 
  filter(code_insee %in% c("78", "91", "95"),
         annee >= 1968, annee <= 1998) %>% 
  group_by(code_insee) %>% 
  summarise(total = sum(naissances)) %>% 
  mutate(prop = total/ sum(total)) %>% 
  select(-total)

naissances_recalculees2 <- naissances_annees %>% 
  filter(code_insee == "78",
         annee < 1968) %>% 
  complete(annee, code_insee = c("78", "91", "95")) %>% 
  fill(naissances) %>% 
  inner_join(prop_oise, by = "code_insee") %>% 
  mutate(naissances = prop * naissances) %>% 
  select(-prop)

naissances_oise <- naissances_annees %>% 
  filter(annee >= 1968, code_insee %in% c("78", "91", "95")) %>% 
  bind_rows(naissances_recalculees2)

# Vérification 
setdiff(naissances_oise %>%
          group_by(annee) %>% 
          summarise(total = sum(naissances)),
        naissances_annees %>% 
          filter(code_insee %in% c("78", "91", "95")) %>% 
          group_by(annee) %>% 
          summarise(total = sum(naissances)))
## # A tibble: 0 × 2
## # ... with 2 variables: annee <int>, total <dbl>
ggplot(naissances_oise, aes(annee, naissances)) +
  geom_line(aes(color = code_insee)) +
  geom_vline(xintercept = c(1968, 1998))

On voit une chute en 1968 que l'on n'observe pas sur le graphe de Paris. La répartition de la population des YVelines avant et après la séparation des départements ne doit pas être exacte, mais dans l'ensemble, l'interpolation ne semble pas trop mauvaise.

Nouveau jeu de données prénoms

Créons le jeu de données naissances dans une version qui fonctionne pour biennous, c'est à dire :

  • Prenant en compte la Corse en tant que 2 départements ;
  • Sans les données des DOM, trop difficiles à interpoler ;
  • Recréant un historique pour les départements de la région parisienne ;
  • Avec des noms de colonne plus simples.
exclure <- tibble(code_insee = c("75", "78", "91", "92", "93", "94", "95", "97"))

naissances_histo <- naissances_annees %>% 
  anti_join(exclure, by = "code_insee") %>% 
  bind_rows(naissances_paris, naissances_oise)

# Vérification
t1 <- naissances_histo %>%
  group_by(code_insee) %>% 
  summarise(naissances = sum(naissances))

t2 <- naissances %>% 
  filter(code_insee != "97")

setdiff(t1, t2) # Il n'y a que la région parisienne
## # A tibble: 7 × 2
##   code_insee naissances
##        <chr>      <dbl>
## 1         75  3458175.3
## 2         78  1230337.7
## 3         91   865536.7
## 4         92  2110400.1
## 5         93  1780249.5
## 6         94  1473253.0
## 7         95  1012197.6
# Vérifions que les totaux sont les bons

setequal(t1 %>% 
          group_by(code_insee %in% c("78", "91", "95")) %>%
          summarise(total = sum(naissances)),
        t2 %>% 
          group_by(code_insee %in% c("78", "91", "95")) %>%
          summarise(total = sum(naissances)))
## TRUE
# write_csv(naissances_histo, "data/recalc/naissances.csv")

En fait, pour avoir des résultats cohérents, il faudrait aussi refaire l'historique pour chaque prénom des départements 75 et 78 avant 1968. Comme cela va me faire copier/coller plus de 2 fois, il est temps de faire une fonction. Pour les prénoms, il faut aussi prendre en compte le sexe, puisque certains prénoms sont mixtes. Il ne faut pas ajouter systématiquement les deux sexes, c'est pourquoi j'utilise nesting à l'intérieur de complete pour ne completer que les cas où les données sont présentes.

modifier_historique_prenoms <- function(data, code_avant, codes_apres, annee_limite, props){
  avant <- data %>% 
    filter(code_insee == code_avant,
           annee < annee_limite) %>% 
    complete(nesting(annee, prenom, sexe), code_insee = codes_apres) %>% 
    fill(nombre) %>% 
    inner_join(props, by = "code_insee") %>%
    mutate(nombre = prop * nombre) %>%
    select(-prop)
  
  apres <- data%>% 
    filter(annee >= annee_limite,
           code_insee %in% codes_apres)
  
  data %>% 
    anti_join(tibble("code_insee" = codes_apres), by = "code_insee") %>% 
    bind_rows(avant, apres) %>% 
    arrange(annee, code_insee, sexe, prenom)
}

modifier_historique_prenoms(prenoms %>% filter(prenom == "CLAUDE"),
                            code_avant = "78",
                            codes_apres = c("78", "91", "95"),
                            annee_limite = 1968,
                            props = prop_oise)
## # A tibble: 10,602 × 5
##      sexe prenom annee code_insee nombre
##    <fctr>  <chr> <int>      <chr>  <dbl>
## 1       M CLAUDE  1900         01     41
## 2       M CLAUDE  1900         03     44
## 3       M CLAUDE  1900         13     12
## 4       M CLAUDE  1900         17      4
## 5       M CLAUDE  1900         21      9
## 6       M CLAUDE  1900         25      6
## 7       M CLAUDE  1900         26      3
## 8       M CLAUDE  1900         29     12
## 9       M CLAUDE  1900         38      8
## 10      M CLAUDE  1900         39      8
## # ... with 10,592 more rows
modifier_historique_oise <- function(data){
  prop_oise <-tibble("code_insee" = c("78", "91", "95"),
                     "prop" = c(0.4105975, 0.2715035, 0.3178990))
  modifier_historique_prenoms(data, code_avant = "78",
                              codes_apres = prop_oise$code_insee,
                              annee_limite = 1968,
                              props = prop_oise)
}  

modifier_historique_seine <- function(data){
  prop_seine <- tibble("code_insee" = c("75", "92", "93", "94"),
                       "prop" = c(0.3919910, 0.2392180, 0.2017948, 0.1669961))
  modifier_historique_prenoms(data, code_avant = "75",
                              codes_apres = prop_seine$code_insee,
                              annee_limite = 1968,
                              props = prop_seine)
}

modifier_historique_corse <- function(data){
  prop_corse <- tibble("code_insee" = c("20", "2A", "2B"),
                       "prop" = c(0, 0.5, 0.5))
  modifier_historique_prenoms(data, code_avant = "20",
                              codes_apres = prop_corse$code_insee,
                              annee_limite = 9999,
                              props = prop_corse) %>% 
    filter(nombre != 0)
}

modifier_historique_tous <- . %>% 
  modifier_historique_corse() %>% 
  modifier_historique_oise() %>% 
  modifier_historique_seine()

Reprenons maintenant depuis le début

prenoms_recalcules <- read_tsv("data/original/dpt2015.txt", locale = locale(encoding = "iso-8859-1")) %>%
  rename(prenom = preusuel, annee = annais, code_insee = dpt) %>% 
  mutate(sexe = factor(sexe, levels = c(1, 2), labels = c("M", "F")),
         annee = as.integer(annee)) %>% 
  filter(annee != "XXXX",
         code_insee != "97") %>%  
  modifier_historique_tous
## Parsed with column specification:
## cols(
##   sexe = col_integer(),
##   preusuel = col_character(),
##   annais = col_character(),
##   dpt = col_character(),
##   nombre = col_double()
## )

## Warning in eval(substitute(expr), envir, enclos): NAs introduits lors de la
## conversion automatique
inner_join(prenoms %>% 
             filter(code_insee != "97") %>% 
             group_by(annee) %>% 
             summarise(total = sum(nombre)),
           prenoms_recalcules %>% 
             group_by(annee) %>% 
             summarise(total_recalc = sum(nombre)),
           by = "annee") %>% 
  mutate(diff = total_recalc - total) %>% 
  summarise(err = mean(diff))
## # A tibble: 1 × 1
##            err
##          <dbl>
## 1 -0.003680123

On a en moyenne une erreur de -0.004 naissance par an, qui doit provenir des erreurs d'arrondi au niveau des proportions. Cela me paraît satisfaisant, je vais sauvegarder le jeu de données pour pouvoir le réutiliser sans avoir à tout refaire. Nous pouvons maintenant refaire de nouveau la carte. Pour avoir le jeu de données spécifique au prénom, je vais refaire une fonction, vu que je vais copier/coller pour la 3eme fois. Je vais aussi rajouter la possibilité de choisir des dates pour lesquelles faire les proportions.

# write_csv(prenoms_recalcules, "data/recalc/prenoms_recalcules.csv")

calculer_prop <- function(Prenom, debut = 1900, fin = 2015){
  naissances_filtre <- naissances_histo %>% 
    filter(between(annee, debut, fin)) %>% 
    group_by(code_insee) %>% 
    summarise(naissances = sum(naissances))
  
  prenoms_recalcules %>%
    filter(prenom == str_to_upper(Prenom),
           between(annee, debut, fin)) %>%
    group_by(code_insee) %>%
    summarise(total = sum(nombre)) %>%
    inner_join(naissances_filtre, by = "code_insee") %>%
    mutate(prop = total/naissances * 100)
}

En fait, il existe un mode interactif dans tmap, qui permet de zoomer. Cela sera mieux pour voir la région parisienne en particulier, et permet de faire apparaître les chifres aussi.

# tmap_mode("view")

creer_carte <- function(Prenom, debut = 1900, fin = 2015){
  data <- sp::merge(france, calculer_prop(Prenom, debut, fin))
  data$nom_dept <- str_c(data$nom, data$code_insee, sep = ", ")
  tm_shape(data) +
    tm_borders(alpha = 0.5) +
    tm_fill(col = "prop", 
            id = "nom_dept", 
            textNA = "Aucune",
            title = "En %",
            popup.vars = c("total", "prop"),
            legend.format = list(text.separator = "à")) +
    tm_view(set.zoom.limits = c(5, 9), legend.position = c("left", "bottom")) +
    tm_layout(title = str_c(str_to_title(Prenom), " entre ", debut, " et ", fin))
}

creer_carte("roger", 1950, 2000)