Direction régionale de l’Insee Île-de-France
17/07/2025
🥈
Depuis 2016, la Seine-Saint-Denis est le deuxième département, derrière Paris, le plus peuplé d’Île-de-France.
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
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.
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 RP 2020 décrit un changement de lieu de résidence survenu au cours de l’année 2019.
| 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 |
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") )
)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)
)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.
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.
# 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 | - |
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 |
# 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 | - |
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.# 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