Reproduction d’indicateurs cibles

Allocataires du RSA pour un mois donné : nombre de foyers, d’adultes bénéficiaires et d’autres personnes à charge

Cette fiche propose un code permettant de reproduire les indicateurs publiés par la Cnaf sur les allocataires du RSA pour un mois donné : nombre de foyers sociaux, nombre d’adultes (responsable du dossier et éventuel conjoint), et nombre d’éventuels enfants et autres personnes à charge. Plusieurs sous-catégories de bénéficiaires du RSA sont également reproduites, en fonction de l’âge, de la situation familiale et du département de résidence.

Pour calculer ces indicateurs, les tables ménages, minimas sociaux et top_conj sont utilisées.

Remarque : la chaîne de caractère fournie à la fonction as.Date doit être de la forme “AAAA-MM-JJ”.

Le code proposé ci-dessous utilise sparklyr et dplyr.

# définition du répertoire
dir_spark <- paste0("file:///C:/Users/Public/Documents/MiDAS_parquet/Vague 4")

# création d'un calendrier avec les dates de début et de fin de mois
calendrier <- data.frame(debut_mois = seq.Date(as.Date("2010/01/01"),
                                              as.Date("2030/01/01"),
                                              by = "+1 months")) %>%
  mutate(fin_mois = (debut_mois + months(1)) -1,
         mois = paste0(substr(debut_mois,1,4),substr(debut_mois,6,7)))

# mois d'intérêt
mois <- "2023-06-01"
mois_cnaf <- paste0(substr(ymd(as.Date(mois)),6,7), substr(ymd(as.Date(mois)),3,4))
mois_m <- paste0(substr(mois,1,4),substr(mois,6,7))
fin_mois_m = pull(calendrier %>% filter(mois == mois_m) %>% select(fin_mois))
debut_mois_m = pull(calendrier %>% filter(mois == mois_m) %>% select(debut_mois))



### A. Indicateurs RSA ------------


# Table Ménage
table_menage <- spark_read_parquet(sc, paste0(dir_spark,"/Allstat/menage/cnaf_menage_", mois_cnaf, ".parquet"), 
                                   memory = FALSE) %>%
  dplyr::mutate(id_menage = paste0(NORDALLC,NUMCAF)) %>% # création d'un identifiant ménage
  window_order(id_menage) %>%
  group_by(id_menage) %>%
  filter(row_number() == 1) %>% # Dédoublonne
  ungroup()


# Table minimas sociaux
table_ms_rsa <- spark_read_parquet(sc, paste0(dir_spark, 
                                          "/Allstat/minsoc/cnaf_minsoc_", mois_cnaf, ".parquet"), memory=FALSE) %>%
  dplyr::filter(RSAVERS %in% c("RSA droit commun", "RSA droit local",
                               "RSA jeune", "RSA expérimental", "C", "L", "J", "E")) %>%
  dplyr::mutate(id_menage = paste0(NORDALLC,NUMCAF)) %>% # création d'un identifiant ménage
  window_order(id_midas) %>%
  group_by(id_midas) %>%
  filter(row_number() == 1) %>% # Dédoublonne
  ungroup()


# left_join des tables prestations et ménage
ms_rsa <- table_ms_rsa %>%
  left_join(table_menage, by="id_menage", suffix=c("_ms","_men")) %>%
  #left_join(table_topconj, by=c("id_midas"="id_midas", "id_menage"="id_menage")) %>% # dans la vague 4, la variable TOPCONJ est présente directement dans la table ménage. Pour les autres vagues, il faut exécuter ce left_join.
  collect() %>%
  dplyr::mutate(
    # situation familiale :
    COUPLE = ifelse(RSSITFAM %in% c("Couple", "3"), 1,0),
    ISOLE_FEMME = ifelse(RSSITFAM %in% c("Isolé femme", "2"), 1,0),
    ISOLE_HOMME = ifelse(RSSITFAM %in% c("Isolé homme", "1") ,1,0),
    SIT_FAM_INCONNUE = ifelse(RSSITFAM %in% c("Sans signification ou inconnue", "0"),1,0),
    # age à la fin du mois d'intérêt :
    AGE = ifelse(TOP_CONJ == 1, # rajouter l'âge du conjoint
                 trunc(time_length(interval(as.Date(DTNAICON), fin_mois_m), "years")),
                 trunc(time_length(interval(as.Date(DTNAIRES), fin_mois_m), "years"))),
    AGE_25 = ifelse(AGE < 25, 1,0),
    AGE_25_34 = ifelse(AGE >= 25 & AGE < 35, 1,0),
    AGE_35_44 = ifelse(AGE >= 35 & AGE < 45, 1,0),
    AGE_45_54 = ifelse(AGE >= 45 & AGE < 55, 1,0),
    AGE_55 = ifelse(AGE >= 55, 1,0),
    AGE_inconnu = ifelse(is.na(AGE),1,0),
    # nombre d'enfants et autres personnes à charge :
    RSENAUTC = as.numeric(RSENAUTC),
    ENFCHAR_0 = ifelse(RSENAUTC == 0,1,0),
    ENFCHAR_1 = ifelse(RSENAUTC == 1,1,0),
    ENFCHAR_2 = ifelse(RSENAUTC == 2,1,0),
    ENFCHAR_3plus = ifelse(RSENAUTC >= 3,1,0),
    # département  :
    departement = if_else(nchar(CODEPOSD) == 4, # retraiter les départements 1 à 9 en leur rajoutant 0 (01 à 09)
                          paste0("0",substr(CODEPOSD, 1, 1)),
                          substr(CODEPOSD, 1 ,2)),
    dep_numcaf = substr(NUMCAF_ms,1,2),
    outremer = ifelse(dep_numcaf %in% c("97", "98"), 1, 0) # département d'outre-mer
  ) %>%
  dplyr::mutate(
    metropole = ifelse(outremer == 0, 1, 0), # résident en France métropolitaine
    isole_senf = ifelse(COUPLE == 0 & RSENAUTC == 0, 1, 0), # personne seule sans enfant
    parent_isole = ifelse(COUPLE == 0 & RSENAUTC > 0, 1, 0), # personne seule avec enfant
    couple_senf = ifelse(COUPLE == 1 & RSENAUTC == 0, 1, 0), # couple sans enfant
    couple_enf = ifelse(COUPLE == 1 & RSENAUTC > 0, 1, 0), # couple avec enfant
    homme_seul = ifelse(ISOLE_HOMME == 1 & RSENAUTC == 0, 1, 0), # homme seul sans enfant
    femme_seule = ifelse(ISOLE_FEMME == 1 & RSENAUTC == 0, 1, 0),  # femme seule sans enfant 
    rsa_maji = ifelse(RSAMAJI == "1", 1, 0), # RSA majoré parent isolé
    sans_rsa_maji = ifelse(RSAMAJI %in% c("0", "2"), 1, 0), # pas de RSA majoré
    rsa_jeunes = ifelse(RSAVERS_ms %in% c("RSA jeune", "J"), 1, 0), # RSA jeunes
    cumul_rsa_ppa = ifelse(PPAVERS != "0", 1, 0) # cumul RSA et prime d'activité
  )



# nombre de foyers bénéficiaires du RSA
nb_foyers_rsa <- ms_rsa %>%
  group_by(id_menage) %>%
  summarise(nb_menage = n())


# nombre de bénéficiaires du RSA (responsables de dossier + conjoints)
verif_externe_rsa <- ms_rsa %>%
  dplyr::mutate(TOP_CONJ = as.numeric(TOP_CONJ)) %>%
  summarise(
    nb_rsa = n(), # nb de bénéficiaires du RSA : responsables dossiers + conjoints
    nb_conjoints = sum(TOP_CONJ, na.rm=TRUE), # nb conjoints
  ) %>%
  dplyr::mutate(
    nb_rspd = nb_rsa - nb_conjoints, # nb de responsables de dossier
  )


# catégories d'allocataires du RSA : selon l'âge, la situation familiale, le département de résidence
# A partir de là toutes les statistiques sont calculées au niveau individuel, sur les responsables dossiers uniquement (TOP_CONJ == 0) afin de reproduire les indicateurs publiés par la Cnaf
verif_externe_rsa_rspd <- ms_rsa %>%
  dplyr::filter(TOP_CONJ == 0) %>% # ne garder que les responsables de dossier
  summarise(
    nb_enfcha = sum(RSENAUTC, na.rm=TRUE), # nb enfants ou autres personnes à charge
    nb_metropole = sum(metropole, na.rm=TRUE), # nb de résidents metropole
    nb_outremer = sum(outremer, na.rm=TRUE), # nb de résidents DROM
    nb_hommes_seuls = sum(homme_seul, na.rm=TRUE), # nb hommes seuls sans enfants
    nb_femmes_seules = sum(femme_seule, na.rm=TRUE), # nb femmes seules sans enfants
    nb_parent_isole = sum(parent_isole, na.rm=TRUE), # nb personnes seules avec enfants
    nb_couple_senf = sum(couple_senf, na.rm=TRUE), # nb couples sans enfants 
    nb_couple_enf = sum(couple_enf, na.rm=TRUE), # nb couples avec enfants 
    nb_25 = sum(AGE_25, na.rm=TRUE),
    nb_25_34 = sum(AGE_25_34, na.rm=TRUE),
    nb_35_44 = sum(AGE_35_44, na.rm=TRUE),
    nb_45_54 = sum(AGE_45_54, na.rm=TRUE),
    nb_55 = sum(AGE_55, na.rm=TRUE),
    nb_sans_rsamaji = sum(sans_rsa_maji, na.rm=TRUE), #sans majoration pour parent isole
    nb_rsamaji = sum(rsa_maji, na.rm=TRUE), # avec majoration pour parent isole
    nb_rsa_jeunes = sum(rsa_jeunes, na.rm=TRUE), # RSA jeune
    nb_cumul_rsa_ppa = sum(cumul_rsa_ppa, na.rm=TRUE) # cumul RSA et prime activité
  )