1,68 million d’habitants en Seine-Saint-Denis au 1er janvier 2022


🥈

Depuis 2016, la Seine-Saint-Denis est le deuxième département, derrière Paris, le plus peuplé d’Île-de-France.


  • La population de la Seine-Saint-Denis a augmenté, en moyenne, de plus de 13 000 personnes, chaque année, entre 2016 et 2022.

Le département représente une proportion presque inchangée de la population d’Ile-de-France : en 2016, son poids dans la région atteignait 13,26 %, et en 2022, il s’élève à 13,58 %.


Source : Insee, recensements et estimations de population

L’excédent des naissances sur les décès, principal moteur de l’accroissement démographique de la Seine-Saint-Denis


  • 16 000 naissances de plus que de décès au cours de l’année 2021.

  • Le solde naturel s’est néanmoins réduit.

  • 3 000 habitants au cours de l’année 2021 sont perdus dans le département, en raison d’un nombre de départs supérieur à celui des arrivées. Les migrations résidentielles freinent l’excédent naturel.

📌 À retenir

Solde migratoire et solde naturel sont deux composantes de l’évolution de la population intimement liées. L’Ile-de-France attire de jeunes adultes de province qui, bien souvent, commencent une vie de couple dans cette région. Ils y ont leurs premiers enfants puis repartent en province quelques années plus tard. Ainsi une première immigration contribue à gonfler le nombre de naissances, naissances qui quelques années plus tard contribuent à gonfler l’émigration. Pour les décès, c’est la même chose. Les départs nombreux de retraités vers la province contribuent à faire diminuer le nombre de décès dans la région capitale. Le mouvement naturel de l’Ile-de-France est particulièrement élevé grâce aux migrations, et l’ampleur du déficit migratoire est renforcée par ce même mouvement naturel : les mouvements des jeunes adultes et des retraités renforcent l’excédent naturel, et les naissances renforcent le déficit migratoire par le mouvement des jeunes familles.

La source servant habituellement à mesurer la mobilité résidentielle : le recensement de la population (RP), exploitation complémentaire

Depuis 2011, on peut retracer les changements de résidence un an avant l’enquête, le recensement permet alors de mettre en avant, soit un maintien dans le logement, soit un déménagement à l’échelle la plus fine, c’est-à-dire communale.


📍 Le fichier national des migrations résidentielles

  • Données : Fichier FD_MIGCOM 2020
  • Objectif : Données bilocalisées à la commune de résidence et à la commune de résidence antérieure en 2020, décrivant les caractéristiques de l’individu ainsi que celles du ménage auquel il appartient
  • Champ : Individus âgés de 1 an ou plus
  • Source : Insee

Le RP 2020 décrit un changement de lieu de résidence survenu au cours de l’année 2019.

EXPLOITATION DES INFORMATIONS DU RP, INSEE

  • Le jeu de données contient 33 variables et 19 501 103 observations
fichier_migcom_2020 = data.table::fread("./_DATA/FD_MIGCOM_2020.csv")
  • C’est à partir de la variable IRAN obtenue à partir de la question « Où habitiez-vous un an auparavant ? » que l’on va dénombrer les migrations infra et supra communales.

Indicateur de résidence antérieure
COD_VAR LIB_VAR COD_MOD LIB_MOD
IRAN Indicateur de résidence antérieure au 1er janvier de l'année précédente 0 Commune ou arrondissement de rattachement
IRAN Indicateur de résidence antérieure au 1er janvier de l'année précédente 1 Dans le même logement
IRAN Indicateur de résidence antérieure au 1er janvier de l'année précédente 2 Dans un autre logement de la même commune
IRAN Indicateur de résidence antérieure au 1er janvier de l'année précédente 3 Dans une autre commune du département
IRAN Indicateur de résidence antérieure au 1er janvier de l'année précédente 4 Dans un autre département de la région
IRAN Indicateur de résidence antérieure au 1er janvier de l'année précédente 5 Hors de la région de résidence actuelle : en métropole
IRAN Indicateur de résidence antérieure au 1er janvier de l'année précédente 6 Hors de la région de résidence actuelle : dans un DOM
IRAN Indicateur de résidence antérieure au 1er janvier de l'année précédente 7 Hors de la région de résidence actuelle : dans un TOM-COM
IRAN Indicateur de résidence antérieure au 1er janvier de l'année précédente 8 A l'étranger dans l'Union Européenne (28 pays membres)
IRAN Indicateur de résidence antérieure au 1er janvier de l'année précédente 9 A l'étranger hors Union Européenne

LE CHAMP

  • En France, le solde migratoire est déduit en l’absence d’un enregistrement continu des émigrations. On va alors s’intéresser au solde migratoire de la Seine-Saint-Denis avec le reste de la France, sans prise en compte des mouvements avec l’étranger 🚫🌍.

  • 🚫🏝 On va également exclure les arrivées depuis Mayotte et les collectivités d’outre-mer.

# DEPARTEMENT DE RESIDENCE EN N et N-1 #########################################
fichier_migcom_2020 = mutate( fichier_migcom_2020,
                              DEP_N_1 = ifelse(substr(DCRAN, 1, 2) %in% c("97", "98"), 
                                               substr(DCRAN, 1, 3),
                                               substr(DCRAN, 1, 2) ),
                              DEP_N = ifelse(substr(COMMUNE, 1, 2) %in% c("97", "98"), 
                                             substr(COMMUNE, 1, 3),
                                             substr(COMMUNE, 1, 2) ) 
                              )
# IRAN == 7 Hors de la région de résidence actuelle : dans un TOM-COM
# IRAN == 8 A l'étranger dans l'Union Européenne (28 pays membres)
# IRAN == 9 A l'étranger hors Union Européenne
# Arrivées depuis Mayotte DEP_N_1 == 976
# DEP_N_1 == 99 -> hors France

fichier_migcom_2020 = filter( fichier_migcom_2020, 
                              !c( IRAN %in% c( "7", "8", "9" ) ), 
                              !c( DEP_N_1 %in% c( "976", "99") ) 
                              )
  • 🏠 Enfin, on exclut les individus en logement hors ordinaire.
fichier_migcom_2020 = fichier_migcom_2020 |> filter( LPRM != "Z" )

CRÉATION DES VARIABLES AUTOUR DES MIGRATIONS

fichier_migcom_2020 =   mutate( fichier_migcom_2020,
  # 1 Dans même logement ou même établissement
  # Z Individu né après le 01/01/N-1
  STABLES_TER = ifelse(IRAN %in% c("1","Z"), IPONDI, 0),
  
  #Mobilité infra-communale au sein du territoire:
  # 2 Dans autre logt même commune ou Conv.
  MIGRANTS_INFRACO_TER = ifelse(IRAN =="2", IPONDI, 0),
  
  # Mobilité supra-communale au sein du territoire:
  # 3 Dans une autre commune du département
  MIGRANTS_SUPRACO_TER = ifelse(IRAN == "3", IPONDI, 0),
  
  # Mobilité supra-départementale au sein de la région d'appartenance du territoire
  # 4 Dans autre département de la région
  MIGRANTS_SUPRADEP_REG_TER = ifelse(IRAN == "4", IPONDI, 0),
  
  # Mobilité avec le reste de la France:
  # 5 Dans une autre région de métropole
  # 6 Hors région résidence actuelle dans DOM
  MIGRANTS_RESTE_FR = ifelse(IRAN %in% c("5","6"), IPONDI, 0)
  )

Quel est le volume des emménagements dans la Seine-Saint-Denis ?

46 216 personnes se sont installées dans un logement ordinaire en Seine-Saint-Denis, au cours de l’année 2019, alors qu’elles n’y résidaient pas un an auparavant.


tab_iranr_93 = fichier_migcom_2020 |>
  filter( DEP_N == "93" ) |>
  mutate( MIGRATIONS = case_when( IRAN == "1" ~ "Stables", 
                                  IRAN %in% c("2", "3") ~ "Migrants internes",
                                  TRUE ~ "Entrants" ),
          IRAN = as.character(IRAN)
          ) |>
  arrange(IRAN) |>
  tab_build( var_rows = c(MIGRATIONS, IRAN), var_stat = IPONDI, stat = "sum" )
MIGRATIONS IRAN Effectif LIB_MOD
Stables 1 1 473 708 Dans le même logement
Migrants internes 2 40 942 Dans un autre logement de la même commune
Migrants internes 3 33 595 Dans une autre commune du département
Migrants internes Ensemble 74 537 -
Entrants 4 35 207 Dans un autre département de la région
Entrants 5 10 226 Hors de la région de résidence actuelle : en métropole
Entrants 6 782 Hors de la région de résidence actuelle : dans un DOM
Entrants Ensemble 46 216 -
Ensemble Ensemble 1 594 461 -
fichier_migcom_2020 |> filter(DEP_N == "93") |> group_by(DEP_N) |>
  summarise( MIGRANTS_INFRACO = sum(MIGRANTS_INFRACO_TER, na.rm =TRUE),
             MIGRANTS_SUPRACO = sum(MIGRANTS_SUPRACO_TER, na.rm=TRUE),
             ENTR_FRANCILIENS = sum(MIGRANTS_SUPRADEP_REG_TER, na.rm=TRUE),
             ENTR_NONFRANCILIENS = sum(MIGRANTS_RESTE_FR, na.rm=TRUE),
             .groups="drop" ) 
# A tibble: 1 × 5
  DEP_N MIGRANTS_INFRACO MIGRANTS_SUPRACO ENTR_FRANCILIENS ENTR_NONFRANCILIENS
  <chr>            <dbl>            <dbl>            <dbl>               <dbl>
1 93              40942.           33595.           35207.              11009.
fichier_migcom_2020 = fichier_migcom_2020 |> 
  mutate(ENTR = MIGRANTS_RESTE_FR + MIGRANTS_SUPRADEP_REG_TER)
fichier_migcom_2020 |> filter(DEP_N == "93")|> group_by(DEP_N) |>
  summarise( ENTR = sum(ENTR, na.rm=TRUE), .groups="drop" ) 
# A tibble: 1 × 2
  DEP_N   ENTR
  <chr>  <dbl>
1 93    46216.

Quel est le volume des déménagements dans la Seine-Saint-Denis ?

62 654 personnes ont quitté la Seine-Saint-Denis, au cours de l’année 2019, pour un autre département de l’Île-de-France ou une autre région de France


tab_iranr_93 = fichier_migcom_2020 |>
  filter( DEP_N_1 == "93" ) |>
  mutate( MIGRATIONS = case_when( IRAN == "1" ~ "Stables", 
                                  IRAN %in% c("2", "3") ~ "Migrants internes",
                                  TRUE ~ "Sortants" ),
          IRAN = as.character(IRAN)
  ) |>
  arrange(IRAN) |>
  tab_build( var_rows = c(MIGRATIONS, IRAN), var_stat = IPONDI, stat = "sum" )
MIGRATIONS IRAN Effectif LIB_MOD
Stables 1 1 473 708 Dans le même logement
Migrants internes 2 40 942 Dans un autre logement de la même commune
Migrants internes 3 33 595 Dans une autre commune du département
Migrants internes Ensemble 74 537 -
Sortants 4 39 790 Dans un autre département de la région
Sortants 5 22 864 Hors de la région de résidence actuelle : en métropole
Sortants Ensemble 62 654 -
Ensemble Ensemble 1 610 899 -
fichier_migcom_2020 |> filter(DEP_N_1 == "93")|> group_by(DEP_N_1) |>
  summarise( MIGRANTS_INFRACO = sum(MIGRANTS_INFRACO_TER, na.rm =TRUE),
             MIGRANTS_SUPRACO = sum(MIGRANTS_SUPRACO_TER, na.rm=TRUE),
             ENTR_FRANCILIENS = sum(MIGRANTS_SUPRADEP_REG_TER, na.rm=TRUE),
             ENTR_NONFRANCILIENS = sum(MIGRANTS_RESTE_FR, na.rm=TRUE),
             .groups="drop" ) 
# A tibble: 1 × 5
  DEP_N_1 MIGRANTS_INFRACO MIGRANTS_SUPRACO ENTR_FRANCILIENS ENTR_NONFRANCILIENS
  <chr>              <dbl>            <dbl>            <dbl>               <dbl>
1 93                40942.           33595.           39790.              22864.
fichier_migcom_2020 = fichier_migcom_2020 |> 
  mutate(SORT = MIGRANTS_RESTE_FR + MIGRANTS_SUPRADEP_REG_TER)
fichier_migcom_2020 |> filter(DEP_N_1 == "93")|> group_by(DEP_N_1) |>
  summarise( SORT = sum(SORT, na.rm=TRUE), .groups="drop" ) 
# A tibble: 1 × 2
  DEP_N_1   SORT
  <chr>    <dbl>
1 93      62654.

Qui s’installe dans le département ?

# Plus des cadres ou des employés ?
cs_entrants = fichier_migcom_2020 |> filter(DEP_N == "93") |> group_by(CS1) |>
  summarise(
    STABLES = sum(STABLES_TER , na.rm=TRUE),
    `MIGRANTS INTERNES` = sum(c(MIGRANTS_INFRACO_TER, MIGRANTS_SUPRACO_TER), na.rm=TRUE),
    ENTRANTS = sum(ENTR, na.rm=TRUE),
    Ensemble = STABLES + `MIGRANTS INTERNES` + ENTRANTS,
    .groups="drop" ) |>
  mutate(
    `Parmi les migrants internes %` = `MIGRANTS INTERNES` / sum(`MIGRANTS INTERNES`),
    `Parmi les stables %` = STABLES / sum(STABLES),
    `Parmi les entrants %`  = ENTRANTS/ sum(ENTRANTS),
    `Parmi l'ensemble de la population présente en 2020 %` = Ensemble/ sum(Ensemble),
    ) |>
  janitor::adorn_totals(where = "row") |>
  mutate(across(  .cols = starts_with("Parmi"), .fns = ~ round(.x * 100, 2) ) ) |>
  mutate(across( .cols = where(is.numeric), .fns = ~ round(.x), .names = "{.col}" ) )
CS1 STABLES MIGRANTS INTERNES ENTRANTS Ensemble Parmi les migrants internes % Parmi les stables % Parmi les entrants % Parmi l'ensemble de la population présente en 2020 % LIB_MOD
1 88 4 8 100 0 0 0 0 Agriculteurs exploitants
2 37537 2008 1429 40974 3 3 3 3 Artisans, commerçants et chefs d'entreprise
3 108061 6129 8841 123031 8 7 19 8 Cadres et professions intellectuelles supérieures
4 163060 10031 8422 181513 13 11 18 11 Professions Intermédiaires
5 233255 13754 8566 255574 18 16 19 16 Employés
6 151930 9429 4278 165637 13 10 9 10 Ouvriers
7 191741 2207 924 194872 3 13 2 12 Retraités
8 588036 30976 13748 632760 42 40 30 40 Autres personnes sans activité professionnelle
Total 1473708 74537 46216 1594461 100 100 100 100 -

Profil croisé des entrants

fichier_migcom_2020 |> 
  filter(DEP_N == "93") |> 
  tab_build(var_rows = CS1_LIB,
            var_cols = STOCD_LIB,
            var_stat = ENTR, 
            stat = "sum"
            ) |>
  mutate(across( .cols = where(is.numeric), .fns = ~ round(.x), .names = "{.col}" ) )  %>%
  knitr::kable() %>%
  kableExtra::kable_styling(font_size = 20)
CS1_LIB Locataire ou sous-locataire d'un logement loué meublé ou d'une chambre d'hôtel Locataire ou sous-locataire d'un logement loué vide non HLM Propriétaire Locataire ou sous-locataire d'un logement loué vide HLM Logé gratuitement Ensemble
Professions Intermédiaires 1190 3481 2525 957 268 8422
Autres personnes sans activité professionnelle 2160 5331 3268 2641 349 13748
Ouvriers 462 2022 860 853 80 4278
Employés 1199 3730 1649 1600 388 8566
Cadres et professions intellectuelles supérieures 1386 3000 3838 415 202 8841
Artisans, commerçants et chefs d'entreprise 151 629 489 119 40 1429
Retraités 28 277 464 132 24 924
Agriculteurs exploitants 0 6 1 1 0 8
Ensemble 6576 18476 13094 6718 1351 46216

Qui quitte le département ?

# Plus des cadres ou des employés ?
cs_sortants = fichier_migcom_2020 |> filter(DEP_N_1 == "93") |> group_by(CS1) |>
  summarise(
    STABLES = sum(STABLES_TER , na.rm=TRUE),
    `MIGRANTS INTERNES` = sum(c(MIGRANTS_INFRACO_TER, MIGRANTS_SUPRACO_TER), na.rm=TRUE),
    SORTANTS = sum(SORT, na.rm=TRUE),
    Ensemble = STABLES + `MIGRANTS INTERNES` + SORTANTS,
    .groups="drop" ) |>
  mutate(
    `Parmi les migrants internes` = `MIGRANTS INTERNES` / sum(`MIGRANTS INTERNES`),
    `Parmi les stables %` = STABLES / sum(STABLES),
    `Parmi les sortants %`  = SORTANTS/ sum(SORTANTS),
    `Parmi l'ensemble de la population présente en 2019 %` = Ensemble/ sum(Ensemble),
    ) |>
  janitor::adorn_totals(where = "row") |>
  mutate(across(  .cols = starts_with("Parmi"), .fns = ~ round(.x * 100, 2) ) ) |>
  mutate(across( .cols = where(is.numeric), .fns = ~ round(.x), .names = "{.col}" ) )
CS1 STABLES MIGRANTS INTERNES SORTANTS Ensemble Parmi les migrants internes Parmi les stables % Parmi les sortants % Parmi l'ensemble de la population présente en 2019 % LIB_MOD
1 88 4 16 109 0 0 0 0 Agriculteurs exploitants
2 37537 2008 1575 41121 3 3 3 3 Artisans, commerçants et chefs d'entreprise
3 108061 6129 9383 123573 8 7 15 8 Cadres et professions intellectuelles supérieures
4 163060 10031 10557 183648 13 11 17 11 Professions Intermédiaires
5 233255 13754 10803 257812 18 16 17 16 Employés
6 151930 9429 5597 166956 13 10 9 10 Ouvriers
7 191741 2207 5189 199137 3 13 8 12 Retraités
8 588036 30976 19533 638545 42 40 31 40 Autres personnes sans activité professionnelle
Total 1473708 74537 62654 1610899 100 100 100 100 -

📦 PACKAGES


Voici la liste des packages nécessaires à l’exploitation des données

  • melodi : permet d’interroger l’API de l’Insee et d’accéder aux jeux de données diffusés dans le Dossier Complet.
install.packages("melodi", repos = "https://nexus.insee.fr/repository/r-public/")
library(melodi)
# 👉 Pour explorer les jeux disponibles
View(get_catalog())
# Populations de référence
pop_ref_dep = get_all_data("DS_ESTIMATION_POPULATION") |>
  filter( SEX == "_T", 
          AGE == "_T", 
          GEO_OBJECT %in% c("DEP", "REG"),
          EP_MEASURE == "POP")
  • tabloid : permet de réaliser facilement des statistiques descriptives sous forme de tableaux croisés
remotes::install_github("inseefrlab/tabloid", dependencies = TRUE)
library(tabloid)