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()
:
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")