knitr::opts_chunk$set(echo = FALSE)
#knitr::opts_chunk$set(render = "cairo_pdf")

library(tidyverse)
#library(kpiESR)
library(ggcpesrthemes)
theme_set(theme_cpesr())
rentrée.ref = 2020

source("R/fr-esr-principaux-etablissements-enseignement-superieur.R")

Chargement des données

etabs.all <- bind_rows(
  kpiesr_read.etab() %>% mutate(dataset = "etab.24"),
  kpiesr_read.etab.2022("dataESR/fr-esr-principaux-etablissements-enseignement-superieur.2023.csv") %>% mutate(dataset = "etab.23"),
  kpiesr_read.etab.2022("dataESR/fr-esr-principaux-etablissements-enseignement-superieur.2022.csv") %>% mutate(dataset = "etab.22"),
  kpiesr_read.etab.2022("dataESR/fr-esr-principaux-etablissements-enseignement-superieur.2021.csv") %>% mutate(dataset = "etab.21.2"),
  kpiesr_read.etab.2021v1() %>% mutate(dataset = "etab.21.1"),
  kpiesr_read.etab.2020v1()%>% mutate(dataset = "etab.20"),
  kpiesr_read.etab.2019v1() %>% mutate(dataset = "etab.19") 
) 

etabs <- etabs.all %>%
  group_by(UAI) %>%
  slice_head(n=1)

Sauvegarde SIREN SIRET

etabs.all %>%
  select(siren,siret,Etablissement, Secteur,dataset) %>%
  group_by(siren,siret) %>%
  slice_head(n=1) %>%  
  arrange(desc(dataset)) %>% 
  write.csv2("dataESR/fr-cpesr-siren.csv", row.names = FALSE, quote = TRUE)

Statistiques

etabs %>%
  group_by(dataset) %>%
  summarise(nb_etabs = n()) %>%
  kableExtra::kable()

Fix Typologie manquante

etabs <- etabs %>%
  mutate(Typologie = ifelse(Etablissement == "Université de Lorraine","Université pluridisciplinaire avec santé",Typologie))

Chargement des données data

enstit <- read.csv2("dataESR/fr-esr-enseignants-titulaires-esr-public.csv") %>%
  transmute(
    pid = etablissement_id_paysage_actuel,
    UAI = etablissement_id_uai,
    etab = Etablissement.actuel,
  ) %>%
  unique() 

ensnp <- read.csv2("dataESR/fr-esr-enseignants-nonpermanents-esr-public.csv") %>%
  transmute(
    pid = etablissement_id_paysage_actuel,
    UAI = etablissement_id_uai,
    etab = Établissement.actuel,
  ) %>%
  unique() 

bia <- read.csv2("dataESR/fr-esr-personnels-biatss-etablissements-publics.csv") %>%
  transmute(
    pid = etablissement_id_paysage_actuel,
    UAI = etablissement_id_uai,
    etab = etablissement_actuel_lib,
  ) %>%
  unique() 

etu <- read.csv2("dataESR/fr-esr-statistiques-sur-les-effectifs-d-etudiants-inscrits-par-etablissement-hcp.csv") %>%
  filter(Attention != "* Attention : doubles comptes, établissement-composante") %>%
  transmute(
    pid = etablissement_id_paysage_actuel,
    UAI = Identifiant.s..UAI,
    etab = Établissement,
  ) %>%
  unique() 

fin <- read.csv2("dataESR/fr-esr-operateurs-indicateurs-financiers.csv") %>%
  transmute(
    pid = id...paysage,
    UAI = uai...identifiant,
    etab = Etablissement,
  ) %>%
  unique() 

imo <- read.csv2("dataESR/fr-esr-patrimoine-immobilier-des-operateurs-de-l-enseignement-superieur.csv") %>%
  transmute(
    pid = Paysage_id,
    etab = Etablissement,
  ) %>%
  unique() 


etab.data <- 
  enstit %>% rename(enstit = etab) %>%
  full_join(ensnp %>% rename(ensnp = etab)) %>%
  full_join(bia %>% rename(bia = etab)) %>%
  full_join(etu %>% rename(etu = etab)) %>%
  full_join(fin %>% rename(fin = etab)) %>%
  full_join(imo %>% rename(imo = etab))

etab.data.long <- bind_rows(
  enstit %>% mutate(dataset = "enstit"),
  ensnp %>% mutate(dataset = "ensnp"),
  bia %>% mutate(dataset = "bia"),
  etu %>% mutate(dataset = "etu"),
  fin %>% mutate(dataset = "fin"),
  imo %>% mutate(dataset = "imo") 
  ) %>%
  separate_rows(UAI,sep='[;,]') %>%
  group_by(pid,dataset)

etab.data.milong <- etab.data.long %>%
  summarise(
    UAI = paste0(unique(UAI), collapse = ';'),
    etab = paste0(unique(etab), collapse = ';'))

Détection des pids manquants

etab.data %>%
  filter(is.na(pid)|pid=="") %>%
  spoiler_table()

Détection des doubles pid

etab.data %>%
  filter(str_detect(pid,"[;,]")) %>%
  spoiler_table()

Détection des doubles UAI

etab.data %>%
  filter(str_detect(UAI,";")) %>%
  spoiler_table()

Détection des UAI vers plusieurs pid

etab.data.long %>%
  select(-etab) %>%
  unique() %>%
  group_by(dataset, UAI) %>%
  filter(n_distinct(pid) > 1) %>%
  arrange(UAI) %>%
  left_join(etab.data %>% 
              group_by(pid) %>% 
              summarise(across(enstit:fin, ~ paste0(unique(.x),collapse=';'))),
            by="pid") %>%
  spoiler_table()

Fix fin

AutoFix fin

autofix.fin <- etab.data %>%
  filter(is.na(fin)) %>%
  select(UAI,pid) %>%
  separate_rows(UAI) %>%
  unique() %>% 
  left_join(fin %>% rename(pid.fin=pid), by="UAI") %>%
  filter(!is.na(pid.fin), pid.fin != pid)

autofix.fin %>% spoiler_table()
autofix.fin %>%
  group_by(pid.fin) %>%
  filter(n_distinct(pid) > 1) %>%
  spoiler_table("Check")

Modifications manuelles du fix

fix.fin <- autofix.fin %>% 
  rename(pid.dst=pid, pid.src=pid.fin) %>%
  filter(pid.src != "") %>%
  filter(!str_detect(pid.dst,";")) %>%
  add_row(UAI = "Manuel", pid.dst = "z3hdL", pid.src = "z3hdL;hy4EW") %>%
  add_row(UAI = "Manuel", pid.dst = "z3hdL", pid.src = "XDl91") %>%
  add_row(UAI = "Manuel", pid.dst = "Z2FY5", pid.src = "Z2FY5;zepT6") %>%
  add_row(UAI = "Manuel", pid.dst = "HAU8L", pid.src = "a5ZAn") 


fix.fin %>% spoiler_table()

Fix imo

Autofix imo

autofix.imo.full <- imo %>%
  filter(str_detect(pid,",")) %>%
  mutate(pid.imo = pid) %>%
  rename("etab.imo" = "etab") %>%
  separate_rows(pid, sep=",") %>% 
  group_by(pid, pid.imo) %>%
  slice_head(n=1) %>%
  ungroup() %>%
  left_join(
    bind_rows(enstit, ensnp, etu, bia) %>%
      filter(!str_detect(pid,";")) %>%
      group_by(pid) %>%
      slice_head(n=1)
    )

autofix.imo <- autofix.imo.full %>%
  filter(!is.na(etab)) %>%
  transmute(
    pid.src = pid.imo,
    pid.dst = pid,
    etab = etab
  ) %>%
  na.omit() %>%
  unique() %>%
  group_by(pid.src) %>%
  filter(n_distinct(pid.dst) == 1)
autofix.imo.check <- autofix.imo.full %>%
  group_by(pid.imo) %>%
  mutate(n_match = n_distinct(pid)) %>%
  ungroup() %>%
  arrange(n_match, pid.imo) %>%
  filter(! pid.imo %in% autofix.imo$pid.src) 

autofix.imo.check %>%
  spoiler_table("Check sans correspondance")

Les bâtiments entre plusieurs établissements sont exclus du jeu de données.

read.csv2("dataESR/fr-esr-patrimoine-immobilier-des-operateurs-de-l-enseignement-superieur.csv") %>%
  group_by(Année) %>%
  summarise(
    n_batiments = n(),
    n_exclus = sum(Paysage_id %in% autofix.imo.check$pid.imo)
  ) %>%
  mutate(part = scales::percent(n_exclus / n_batiments, accuracy = 0.01)) %>%
  spoiler_table("Nombre d'exclusion")

Application du fix

fix <- bind_rows(fix.fin, autofix.imo)

pidfix <- fix$pid.dst
names(pidfix) <- fix$pid.src

etab.data.long.fixed <- etab.data.long %>%
  mutate(pid = recode(pid, !!!pidfix)) 

Check : données incomplètes Universités

incomplete.univ <- etab.data.long.fixed %>% 
  group_by(pid) %>%
  filter(n_distinct(dataset) != 6) %>%
  filter(str_detect(etab,"niversité")) %>%
  arrange(pid, etab) %>%
  select(pid, dataset, etab, UAI) %>%
  unique() %>%
  group_by(pid) %>%
  summarise(
    etab = paste(etab, collapse = ";"),
    datasets = paste(dataset, collapse = " ")) %>%
  filter(!pid %in% autofix.imo.check$pid.imo)


incomplete.univ %>%
  kableExtra::kable()

Chargement des données CPESR

etab.cpesr <- read.csv("dataESR/fr-cpesr-etablissements.csv")
etab.cpesr %>% summarise(nb_etabs = n()) %>% kableExtra::kable()

Détection des établissements en double

etab.cpesr %>% group_by(UAI) %>% filter(n() > 1) %>% kableExtra::kable()

Ajout des pid à cpesr

cpesr <- etab.cpesr %>% 
  left_join(etab.data.long.fixed %>% ungroup() %>% select(UAI,pid) %>% unique() ) %>%
  select(pid, everything()) 

Détection double pid

cpesr %>% filter(!is.na(pid)) %>% group_by(pid) %>% filter(n()>1) %>% spoiler_table()

université cpesr sans pid

cpesr %>% filter(Groupe == "Universités et assimilés", is.na(pid)) %>% spoiler_table()

pid hors cpesr

pid.horscpesr <- etab.data.long.fixed %>% 
  group_by(pid) %>%
  select(-dataset) %>%
  slice_head(n=1) %>%
  filter(!pid %in% cpesr$pid) 

pid.horscpesr %>%
  left_join(etabs) %>%
  write.csv2("dataESR/fr-cpesrtmp-etablissements-hors-cpesr.csv")


pid.horscpesr %>% spoiler_table()

pid hors cpesr dans etab

pid.horscpesr %>%
  left_join(etabs) %>%
  filter(!is.na(Etablissement)) %>%
  spoiler_table()

pid hors cpesr hors etab

pid.horscpesr %>%
  left_join(etabs) %>%
  filter(is.na(Etablissement)) %>%
  spoiler_table()

Créations du jeu de données établissement

etab <- left_join(cpesr, etabs %>% select(-Etablissement,-Type)) %>%
  filter(!is.na(pid)) %>%
  rename(Groupe.détaillé = Groupe) %>%
  mutate(Groupe = recode(Groupe.détaillé,
    "Universités et assimilés" = "Universités et assimilés",
    "Ecoles d'ingénieurs" = "Ecoles d'ingénieurs",
    "Ecoles de commerce" = "Autres établissements",
    "Instituts ou écoles nationaux spécialisés et grands établissements (hors écoles d'ingénieurs)" = "Autres établissements",
    "Ecoles d'art et de design" = "Autres établissements",
    "Ecoles d'architecture" = "Autres établissements",
    "Autres écoles écoles spécialisées" = "Autres établissements",
    "Instituts catholiques" = "Autres établissements",
    "Ecoles des arts du spectacle" = "Autres établissements",
    "Instituts d'études politiques" = "Autres établissements",
    "Ecoles françaises à l'étranger" = "Autres établissements",
    "Ecoles normales supérieures" = "Autres établissements",
    "Ecoles vétérinaires" = "Autres établissements",
    "Autres" = "Autres établissements",
    "Regroupements" = "Regroupements"
  ) ) %>%
  mutate(Groupe = factor(Groupe, levels = c(
    "Universités et assimilés","Regroupements","Ecoles d'ingénieurs","Autres établissements"))) %>%
  left_join(
    etab.data.long %>% group_by(pid) %>% summarise(nb_datasets = n_distinct(dataset))
  ) %>%
  select(pid,Etablissement,Groupe,Groupe.détaillé,Type,nb_datasets,everything()) %>%
  ungroup() %>%
  arrange(Groupe,Groupe.détaillé,Etablissement)

etab %>% 
  arrange(nb_datasets) %>%
  group_by(Groupe,nb_datasets) %>% 
  summarise(nb = n()) %>%
  pivot_wider(names_from = nb_datasets, values_from = nb, names_prefix = "nb_ds_", values_fill = 0) %>%
  spoiler_table()

etab <- etab %>%
  mutate( Plotable = 
      ( nb_datasets > 3 ) |
      ( Groupe == "Regroupements" & Etablissement != "Université Bretagne Loire" ) 
  )

Vérification doublons

etab %>% group_by(Etablissement) %>% filter(n() > 1) %>% spoiler_table()
etab %>% group_by(UAI) %>% filter(n() > 1) %>% spoiler_table()

Wikidata manquants

etab %>%
  filter(is.na(url.wikidata)) %>%
  arrange(desc(Groupe)) %>% 
  select(Groupe, pid, Etablissement, url.wikidata) %>% 
  spoiler_table()

Correction manuelle

fix_etab <- function(etab, fixdf) {
  fixdf <- fixdf %>% arrange(pid)
  etab <- etab %>% arrange(pid)

  etab %>% 
    mutate(across(names(fixdf %>% select(-pid)),
                  ~ replace(.x, pid %in% fixdf$pid, fixdf[[cur_column()]])))
}
fix.wikidata <- tribble(
  ~ "pid", ~ "url.wikidata",
  #"qUCQp", "https://www.wikidata.org/entity/Q259388",  
  #"EW53M", "https://www.wikidata.org/entity/Q1548539",
  #"evv7S", "https://www.wikidata.org/entity/Q776223",
  #"K4lR3", "https://www.wikidata.org/entity/Q1319786",
  #"U8a0v", "https://www.wikidata.org/entity/Q3551621",
  #"6kk6n", "https://www.wikidata.org/entity/Q273604",
  "VfvdY", "https://www.wikidata.org/entity/Q630461",
  "J8X6q", "https://www.wikidata.org/entity/Q2826570"
)

etab <- fix_etab(etab, fix.wikidata) 

fix.wikidata %>% spoiler_table()

Sigles manquants

Sigles récupérables sur wikidata

wikidataESR::wdesr_get_cache() 
#wikidataESR::wdesr_clear_cache()

fix.alias.wikidata <- etab %>%
  #filter(UAI %in% esr.uais$dans.tdb) %>%
  filter(is.na(Sigle), !is.na(url.wikidata)) %>%
  arrange(Groupe) %>% 
  mutate(wikidata.alias = wikidataESR::wdesr_get_data(str_replace(url.wikidata,"https://www.wikidata.org/entity/",""))$alias) %>%
  select(pid,Etablissement,Sigle=wikidata.alias) 

wikidataESR::wdesr_save_cache()
etab <- fix_etab(etab, fix.alias.wikidata)

fix.alias.wikidata %>% spoiler_table()

Sigles toujours manquants et fix automatique

etab %>%
  #filter(UAI %in% esr.uais$dans.tdb) %>%
  filter(is.na(Sigle)) %>%
  arrange(Type) %>% 
  select(UAI,pid, Etablissement,Sigle, url.wikidata) %>% 
  spoiler_table()
etab <- etab %>%
  mutate(Sigle = ifelse(is.na(Sigle),Etablissement,Sigle))

Réduction de "Université" à "U." dans les sigles

etab <- etab %>%
  mutate(Sigle = str_replace(Sigle, "Université", "U."))

Ecriture des fichiers

etab <- etab %>%
  ungroup() %>%
  arrange(Groupe,Groupe.détaillé,Etablissement)

etab %>% spoiler_table()
write.csv2(etab, "dataESR/fr-cpesrtmp-etablissements.csv", row.names = FALSE)
write.csv2(fix,"dataESR/fr-cpesrtmp-pidfix.csv", row.names = FALSE)

Autres vérifications

check_dispo <- function(file, vars) {
  read.csv2(file, na.strings = "") %>% 
    select(vars) %>%
    rename(Année = 1) %>%
    mutate(Année = as.character(Année)) %>%
    pivot_longer(-Année) %>%
    group_by(Année,name) %>%
    summarise(
      nb_na = sum(is.na(value)),
      dispo = round(sum(!is.na(value)) / n(), digits = 2)
      ) %>%
    arrange(name,Année) %>%
    ggplot(aes(x=Année,y=name,color=dispo)) +
    geom_point(size=10) +
    geom_text(aes(label=scales::percent(dispo)),color="black", size=3) +
    scale_color_distiller(palette="RdBu", direction = 0) +
    theme(legend.position = "None")
}

Portée variables finances

check_dispo("dataESR/fr-esr-operateurs-indicateurs-financiers.csv",c(
  "exercice",
  "Produits.de.fonctionnement.encaissables",
  "Charges.de.personnel",
  "Ressources.propres.encaissables",
  "Droits.d.inscription",
  "Formation.continue..diplômes.propres.et.VAE",
  "Taxe.d.apprentissage",
  "Valorisation",
  "ANR.hors.investissements.d.avenir",
  "ANR.investissements.d.avenir",
  "Contrats.et.prestations.de.recherche.hors.ANR",
  "Acquisitions.d.immobilisations"))

Portée variables finances 2021

check_dispo("dataESR/fr-esr-operateurs-indicateurs-financiers.2021v1.csv",c(
  "exercice",
  "Produits.de.fonctionnement.encaissables",
  "Dépenses.de.personnel",
  "Ressources.propres.encaissables",
  "Droits.d.inscription",
  "Formation.continue..diplômes.propres.et.VAE",
  "Taxe.d.apprentissage",
  "Valorisation",
  "ANR.hors.investissements.d.avenir",
  "ANR.investissements.d.avenir",
  "Contrats.et.prestations.de.recherche.hors.ANR",
  "Acquisitions.d.immobilisations"))

Incohérence BIATSS

read.csv2("dataESR/fr-esr-personnels-biatss-etablissements-publics.csv") %>%
  select(Année,etablissement_id_paysage_actuel,Etablissement,Catégorie, Corps, Effectif,effectif_femmes,effectif_hommes) %>%
  filter(Effectif != effectif_femmes + effectif_hommes) %>%
  kableExtra::kable()


cpesr/kpiESR documentation built on July 24, 2024, 6:41 a.m.