Chapitre 5 Modèle de données (CG)

Ce cours propose de construire une structure de donnée permettant l’analyse à la fois sociologique et géographique des données individuelles qui ont fait l’objet des chapitres précédent. Ce modèle de donnée servira par la suite au développement d’applications shiny.
Claude Grasland (Professeur à l’Université de Paris)


Objectif

L’objectif de ce chapitre est de construire une structure de données croisant une dimension spatiale \(i\) et une dimension sociale \(j\) à partir d’un comptage du nombre d’individus ou du nombre de ménages \(X_{ij}\) localisés dans l’unité spatiale \(i\) et ayant l’attribut sociologique \(j\).

La structure de donnée devra permettre la représentation cartographique des résultats (ajout de la geométrie des unités spatiales \(i\)).

Elle devra également permettre d’agréger les unités spatiale et sociales élémentaires vers des niveaux d’agrégation supérieur qu’on notera \(i2,i3, ...\) pour les niveaux géographiques et \(j2,j3,...\) pour les niveaux sociologiques.

L’ensemble des données utiles devra être stockée dans un objet unique, si possible de petite taille, sous la forme d’une liste.

Nous allons prendre comme exemple l’analyse de la distribution des CSP (variable CS1) par IRIS dans le Val-de-Marne lors du RP de 2017 pour les personnes âgées de 18 ans et plus

5.1 tableau de contingence tab

Notre tableau de contingence ne contiendra que trois variables

  • i : code géographique de l’IRIS
  • j : code socioloqiue de la CSP
  • Pij : effectif de personnes appartenant à la CSP i et résidant dans l’unité spatiale j

La création sera effectuée par le programme suivant où l’on retire les personnes résidant dans des communes non découpées en IRIS.

# Sélection des individus de 18 ans et +
ind18 <- readRDS("data/indiv2017.Rdata") %>% 
         filter(as.numeric(AGEREV)>=18) %>%
         filter(IRIS != "ZZZZZZZZZ")

# Création du tableau de contingence
tab <- ind18 %>% select(i =IRIS,
                        j = CS1,
                        Xij = IPONDI) %>%
                  group_by(i,j) %>%
                  summarise(Xij = round(sum(Xij),0))

# Visualisation du résultat
kable(head(tab))
i j Xij
940020101 2 97
940020101 3 421
940020101 4 480
940020101 5 428
940020101 6 263
940020101 7 292

5.2 Attributs sociologiques soc

Nous avons besoin d’ajouter des renseignements sur les modalités sociologiques \(j\) que l’on va chercher dans le fichier des métadonnées.

  • j : code de la modalité
  • var_j : nom de la variable
  • lab_j : label de la modalité j
# Chargement du fichier des méta données 
meta <- readRDS("data/indiv_2017_meta.Rdata")

# Identification des modalités à extraire
listmod <- unique(tab$j)

# extraction des informations
soc<-meta %>% filter(COD_VAR == "CS1" ) %>%
              filter(COD_MOD %in% listmod) %>%
              select(j = COD_MOD,
                     var_j = LIB_VAR,
                     lab_j = LIB_MOD)

kable(soc)
j var_j lab_j
1 Catégorie socioprofessionnelle en 8 postes Agriculteurs exploitants
2 Catégorie socioprofessionnelle en 8 postes Artisans, commerçants et chefs d’entreprise
3 Catégorie socioprofessionnelle en 8 postes Cadres et professions intellectuelles supérieures
4 Catégorie socioprofessionnelle en 8 postes Professions Intermédiaires
5 Catégorie socioprofessionnelle en 8 postes Employés
6 Catégorie socioprofessionnelle en 8 postes Ouvriers
7 Catégorie socioprofessionnelle en 8 postes Retraités
8 Catégorie socioprofessionnelle en 8 postes Autres personnes sans activité professionnelle

On peut ajouter à ce tableau un niveau d’agrégation supérieur en ajoutant une liste de variables :

  • j2 : code d’agrégation
  • var_j2 : nom de la variable agrégée
  • lab_j2 : label des modalités de la variable agrégée
soc$j2 <-as.factor(soc$j)
levels(soc$j2) <-c("B","A","A","B","C","C",NA,NA)
soc$var_j2 <- "CSP des actifs en 3 classes"
soc$lab_j2 <-soc$j2
levels(soc$lab_j2) <-list("Haut" = "A","Moyen" = "B","Bas" = "C")
kable(soc)
j var_j lab_j j2 var_j2 lab_j2
1 Catégorie socioprofessionnelle en 8 postes Agriculteurs exploitants B CSP des actifs en 3 classes Moyen
2 Catégorie socioprofessionnelle en 8 postes Artisans, commerçants et chefs d’entreprise A CSP des actifs en 3 classes Haut
3 Catégorie socioprofessionnelle en 8 postes Cadres et professions intellectuelles supérieures A CSP des actifs en 3 classes Haut
4 Catégorie socioprofessionnelle en 8 postes Professions Intermédiaires B CSP des actifs en 3 classes Moyen
5 Catégorie socioprofessionnelle en 8 postes Employés C CSP des actifs en 3 classes Bas
6 Catégorie socioprofessionnelle en 8 postes Ouvriers C CSP des actifs en 3 classes Bas
7 Catégorie socioprofessionnelle en 8 postes Retraités NA CSP des actifs en 3 classes NA
8 Catégorie socioprofessionnelle en 8 postes Autres personnes sans activité professionnelle NA CSP des actifs en 3 classes NA

5.3 Attributs géographiques geo

Les attributs géographiques comportent le nom des unités spatiales observées, le nom et le code des unités spatiales de nbiveau supérieur (s’il y en a) et enfin la géométrie des unités spatiales. Soit la structure :

  • i : code de l’unité géographique
  • lab_i : nom de l’unité géographique
  • i2 : code de l’unité géographique englobante (facultatif)
  • lab_i2 : nom de l’unité géographique englobante (facultatif)
  • lat : latitude du centroïde de l’unité géographique
  • lng : longitude du centroïde de l’unité géographique
  • geometry : contours de l’unité géographique s’il s’agit d’une surface en latitude longitude (WGS94 soit crs = 4326)
# Chargement du fonds de carte et projection en WGS94
map <- readRDS("data/map_iris.Rdata") %>% st_as_sf() %>% st_transform (crs=4326)


# Définition de la liste des unités spatiales utiles
listgeo <- unique(tab$i)

# Extraction et recodage des informations utiles
geo <-map %>% select(i = CODE_IRIS,
                     lab_i = NOM_IRIS,
                     i2 = INSEE_COM,
                     lab_i2 = NOM_COM,
                     geometry) %>%
              mutate(var_i = "quartier IRIS",
                     var_i2 = "Communes")

# Ajout des centroïdes
coo <- st_coordinates(st_centroid(geo))
geo$lng <-coo[,1]
geo$lat <-coo[,2]

kable(head(geo))
i lab_i i2 lab_i2 geometry var_i var_i2 lng lat
940210107 Sorbiers 94021 Chevilly-Larue MULTIPOLYGON (((2.357357 48… quartier IRIS Communes 2.357553 48.77377
940680204 Le Vieux Saint-Maur 4 94068 Saint-Maur-des-Fossés MULTIPOLYGON (((2.483923 48… quartier IRIS Communes 2.481153 48.80862
940810308 Robespierre 94081 Vitry-sur-Seine MULTIPOLYGON (((2.388071 48… quartier IRIS Communes 2.388817 48.79110
940760109 Centre Ville Est 94076 Villejuif MULTIPOLYGON (((2.368424 48… quartier IRIS Communes 2.367894 48.79224
940460105 Centre_Vert de Maison 5 94046 Maisons-Alfort MULTIPOLYGON (((2.433334 48… quartier IRIS Communes 2.433856 48.79129
940650105 Le Sud 94065 Rungis MULTIPOLYGON (((2.337343 48… quartier IRIS Communes 2.342378 48.74465

5.4 Assemblage et sauvegarde

Il peut être intéressant d’ajouter à la liste des objets quelques variables supplémentaires comme la source, l’auteur et un bref résumé du contenu du tableau :

count = "Population 18 ans et +"
source = c("Source : INSEE - RP 2017 - Fichier individu & IGN - Geofla - IRIS")
author = "Claude Grasland - contact : claude.grasland@parisgeo.cnrs.fr"
info = "Fichier élaboré dans le cadre du projet Data Mining 2021 portant sur les CSP des individus de 18 ans et plus résidant dans le Val de Marne à l'échelon des IRIS lors du RP 2017"

Pour éviter la prolifération des fichiers, on va assembler toutes nos composantes dans un unique objet servant de base de données à l’aide de la fonction list() :

base = list("tab" = tab,
            "soc" = soc,
            "geo" = geo,
            "count" = count,
            "source" = source,
            "author" = author,
            "info" = info)

saveRDS(base,"myproject/data/VDM_RP2017_CS1_IRIS_POP.rds")

5.5 Prolongements

Notre base de donnée tient désormais dans un seul fichier qui ne pèse que 382 Ko et pourra être facilement mobilisé dans toute une série d’applications de visualisation statistique ou cartographique interactives. On peut évidemment créer autant de bases que l’on veut selon le même format, ce qui permettra de standardiser les procédures d’exploitation ultérieures.

On va créer à titre d’exemple un second fichier donnant le mode de transport le plus souvent utilisé pour se rendre au travail pour les personnes mobiles

# Sélection des personnes mobiles
mob <- readRDS("data/indiv2017.Rdata") %>% 
         filter(TRANS!="Z") %>% # Elimine les personnes non concernées
         filter(TRANS!="1") %>% # Elimine les actifs non mobiles
         filter(IRIS != "ZZZZZZZZZ")

# ----------------------------------------
# Création du tableau de contingence
tab <- mob %>% select(i =IRIS,
                        j = TRANS,
                        Xij = IPONDI) %>%
                  group_by(i,j) %>%
                  summarise(Xij = round(sum(Xij),0))

# Visualisation du résultat
kable(head(tab))
i j Xij
940020101 2 102
940020101 3 56
940020101 4 53
940020101 5 424
940020101 6 769
940020102 2 103
#----------------------------------------------
# Chargement du fichier des méta données 
meta <- readRDS("data/indiv_2017_meta.Rdata")

# Identification des modalités à extraire
listmod <- unique(tab$j)

# extraction des informations
soc<-meta %>% filter(COD_VAR == "TRANS" ) %>%
              filter(COD_MOD %in% listmod) %>%
              select(j = COD_MOD,
                     var_j = LIB_VAR,
                     lab_j = LIB_MOD)

# Agrégation en modes "doux" et "dur"

soc$j2 <-as.factor(soc$j)
levels(soc$j2)
[1] "2" "3" "4" "5" "6"
levels(soc$j2) <-c("A","A","B","B","C")
soc$var_j2 <- "Modes de déplacement en 3 classes"
soc$lab_j2 <-soc$j2
levels(soc$lab_j2) <-list("Marche ou en vélo" = "A","Véhicule à moteur" = "B","Transports en commun" = "C")
kable(soc)
j var_j lab_j j2 var_j2 lab_j2
2 Mode de transport principal le plus souvent utilisé pour aller travailler Marche à pied (ou rollers, patinette) A Modes de déplacement en 3 classes Marche ou en vélo
3 Mode de transport principal le plus souvent utilisé pour aller travailler Vélo (y compris à assistance électrique) A Modes de déplacement en 3 classes Marche ou en vélo
4 Mode de transport principal le plus souvent utilisé pour aller travailler Deux-roues motorisé B Modes de déplacement en 3 classes Véhicule à moteur
5 Mode de transport principal le plus souvent utilisé pour aller travailler Voiture, camion, fourgonnette B Modes de déplacement en 3 classes Véhicule à moteur
6 Mode de transport principal le plus souvent utilisé pour aller travailler Transports en commun C Modes de déplacement en 3 classes Transports en commun
#--------------------------------------------

# Chargement du fonds de carte et projection en WGS94
map <- readRDS("data/map_iris.Rdata") %>% st_as_sf() %>% st_transform (crs=4326)


# Définition de la liste des unités spatiales utiles
listgeo <- unique(tab$i)

# Extraction et recodage des informations utiles
geo <-map %>% select(i = CODE_IRIS,
                     lab_i = NOM_IRIS,
                     i2 = INSEE_COM,
                     lab_i2 = NOM_COM,
                     geometry) %>%
              mutate(var_i = "quartier IRIS",
                     var_i2 = "Communes")

# Ajout des centroïdes
coo <- st_coordinates(st_centroid(geo))
geo$lng <-coo[,1]
geo$lat <-coo[,2]

kable(head(geo))
i lab_i i2 lab_i2 geometry var_i var_i2 lng lat
940210107 Sorbiers 94021 Chevilly-Larue MULTIPOLYGON (((2.357357 48… quartier IRIS Communes 2.357553 48.77377
940680204 Le Vieux Saint-Maur 4 94068 Saint-Maur-des-Fossés MULTIPOLYGON (((2.483923 48… quartier IRIS Communes 2.481153 48.80862
940810308 Robespierre 94081 Vitry-sur-Seine MULTIPOLYGON (((2.388071 48… quartier IRIS Communes 2.388817 48.79110
940760109 Centre Ville Est 94076 Villejuif MULTIPOLYGON (((2.368424 48… quartier IRIS Communes 2.367894 48.79224
940460105 Centre_Vert de Maison 5 94046 Maisons-Alfort MULTIPOLYGON (((2.433334 48… quartier IRIS Communes 2.433856 48.79129
940650105 Le Sud 94065 Rungis MULTIPOLYGON (((2.337343 48… quartier IRIS Communes 2.342378 48.74465
#----------------------------------------------
count = "Actifs mobiles"
source = c("Source : INSEE - RP 2017 - Fichier individu & IGN - Geofla - IRIS")
author = "Claude Grasland - contact : claude.grasland@parisgeo.cnrs.fr"
info = "Fichier élaboré dans le cadre du projet Data Mining 2021 portant sur déplacements des actifs mobiles résidant dans le Val de Marne à l'échelon des IRIS lors du RP 2017"

base = list("tab" = tab,
            "soc" = soc,
            "geo" = geo,
            "count" = count,
            "source" = source,
            "author" = author,
            "info" = info)

saveRDS(base,"myproject/data/VDM_RP2017_TRANS_IRIS_ACT.rds")

Puis un fichier de l’ancienneté d’installation des ménages dans leur logement actuel, ce qui donnera une idée transversale de leur mobilité.

# Sélection des ménages ordinaires
mob <- readRDS("data/indiv2017.Rdata") %>% 
         filter(LPRM=="1") %>% # sélectionne les ménages ordinaires
         filter(ANEMR!="ZZ") %>% # élimine les personnes non concernées 
         filter(IRIS != "ZZZZZZZZZ")

# ----------------------------------------
# Création du tableau de contingence
tab <- mob %>% select(i =IRIS,
                        j = ANEMR,
                        Xij = IPONDI) %>%
                  group_by(i,j) %>%
                  summarise(Xij = round(sum(Xij),0))

# Visualisation du résultat
kable(head(tab))
i j Xij
940020101 00 269
940020101 01 411
940020101 02 503
940020101 03 169
940020101 04 72
940020101 05 40
#----------------------------------------------
# Chargement du fichier des méta données 
meta <- readRDS("data/indiv_2017_meta.Rdata")

# Identification des modalités à extraire
listmod <- unique(tab$j)

# extraction des informations
soc<-meta %>% filter(COD_VAR == "ANEMR" ) %>%
              filter(COD_MOD %in% listmod) %>%
              select(j = COD_MOD,
                     var_j = LIB_VAR,
                     lab_j = LIB_MOD)

# Agrégation en modes "doux" et "dur"

soc$j2 <-as.factor(soc$j)
levels(soc$j2)
 [1] "00" "01" "02" "03" "04" "05" "06" "07" "08" "09"
levels(soc$j2) <-c("A","A","B","B","C","C","C","C","C","C")
soc$var_j2 <- "Ancienneté d'emménagement en 3 classes"
soc$lab_j2 <-soc$j2
levels(soc$lab_j2) <-list("Moins de 4 ans" = "A","5 à 19 ans" = "B","20 ans et plus" = "C")
kable(soc)
j var_j lab_j j2 var_j2 lab_j2
00 Ancienneté d’emménagement dans le logement (regroupée) Moins de 2 ans A Ancienneté d’emménagement en 3 classes Moins de 4 ans
01 Ancienneté d’emménagement dans le logement (regroupée) De 2 à 4 ans A Ancienneté d’emménagement en 3 classes Moins de 4 ans
02 Ancienneté d’emménagement dans le logement (regroupée) De 5 à 9 ans B Ancienneté d’emménagement en 3 classes 5 à 19 ans
03 Ancienneté d’emménagement dans le logement (regroupée) De 10 à 19 ans B Ancienneté d’emménagement en 3 classes 5 à 19 ans
04 Ancienneté d’emménagement dans le logement (regroupée) De 20 à 29 ans C Ancienneté d’emménagement en 3 classes 20 ans et plus
05 Ancienneté d’emménagement dans le logement (regroupée) De 30 à 39 ans C Ancienneté d’emménagement en 3 classes 20 ans et plus
06 Ancienneté d’emménagement dans le logement (regroupée) De 40 à 49 ans C Ancienneté d’emménagement en 3 classes 20 ans et plus
07 Ancienneté d’emménagement dans le logement (regroupée) De 50 à 59 ans C Ancienneté d’emménagement en 3 classes 20 ans et plus
08 Ancienneté d’emménagement dans le logement (regroupée) De 60 à 69 ans C Ancienneté d’emménagement en 3 classes 20 ans et plus
09 Ancienneté d’emménagement dans le logement (regroupée) 70 ans ou plus C Ancienneté d’emménagement en 3 classes 20 ans et plus
#--------------------------------------------

# Chargement du fonds de carte et projection en WGS94
map <- readRDS("data/map_iris.Rdata") %>% st_as_sf() %>% st_transform (crs=4326)


# Définition de la liste des unités spatiales utiles
listgeo <- unique(tab$i)

# Extraction et recodage des informations utiles
geo <-map %>% select(i = CODE_IRIS,
                     lab_i = NOM_IRIS,
                     i2 = INSEE_COM,
                     lab_i2 = NOM_COM,
                     geometry) %>%
              mutate(var_i = "quartier IRIS",
                     var_i2 = "Communes")

# Ajout des centroïdes
coo <- st_coordinates(st_centroid(geo))
geo$lng <-coo[,1]
geo$lat <-coo[,2]

kable(head(geo))
i lab_i i2 lab_i2 geometry var_i var_i2 lng lat
940210107 Sorbiers 94021 Chevilly-Larue MULTIPOLYGON (((2.357357 48… quartier IRIS Communes 2.357553 48.77377
940680204 Le Vieux Saint-Maur 4 94068 Saint-Maur-des-Fossés MULTIPOLYGON (((2.483923 48… quartier IRIS Communes 2.481153 48.80862
940810308 Robespierre 94081 Vitry-sur-Seine MULTIPOLYGON (((2.388071 48… quartier IRIS Communes 2.388817 48.79110
940760109 Centre Ville Est 94076 Villejuif MULTIPOLYGON (((2.368424 48… quartier IRIS Communes 2.367894 48.79224
940460105 Centre_Vert de Maison 5 94046 Maisons-Alfort MULTIPOLYGON (((2.433334 48… quartier IRIS Communes 2.433856 48.79129
940650105 Le Sud 94065 Rungis MULTIPOLYGON (((2.337343 48… quartier IRIS Communes 2.342378 48.74465
#----------------------------------------------
count= "Ménages"
source = c("Source : INSEE - RP 2017 - Fichier individu & IGN - Geofla - IRIS")
author = "Claude Grasland - contact : claude.grasland@parisgeo.cnrs.fr"
info = "Fichier élaboré dans le cadre du projet Data Mining 2021 portant sur l'ancienneté d'instalklation des ménages résidant dans le Val de Marne à l'échelon des IRIS lors du RP 2017"

base = list("tab" = tab,
            "soc" = soc,
            "geo" = geo,
            "count" = count,
            "source" = source,
            "author" = author,
            "info" = info)

saveRDS(base,"myproject/data/VDM_RP2017_ANEMR_IRIS_MEN.rds")