knitr::opts_chunk$set(echo = FALSE, message = FALSE, warning = FALSE)
options(knitr.table.format = "pipe")
library(tidyverse)
library(kpiESR)
library(ggcpesrthemes)

rentrée.d <- 2013
rentrée.f <- 2022

Ce document décrit le processus de mise à jour des données kpiESR, et notamment la constitution d'un jeu de données des établissements, et la fusion de cinq jeux de données (enseignants titulaires, enseignants non permanents, personnel BIATSS, étudiants et finances).

Ces jeux sont notés etab, ens.tit, ens.np, bia, etu et fin.

Le jeu de données sur les patrimoines immobilier est ajouté de façon expérimentale : imo

La constitution du jeu de données etab est effectuées à part.

Méthodologie :

  1. Constitution du jeu de données esr.etab sur les établissements
  2. Vérification et fix des non correspondances des id paysages (pid)
  3. Vérification et fix des données manquantes
  4. Fusion des données DataESR et CPESR
  5. Constitution des jeux de données esr
    1. Fusion de ens.tit, ens.np, bia, etu, fin et imo
    2. Vérification d'éventuels problèmes de fusion
    3. Vérification des outliers
  6. Ecriture des données

Attention

Les données sont agrégées à trois échelles : Ensemble, Groupe et Etablissement, avec trois méthodes de constitution des périmètres d'agrégation :

Fusion de ens.tit, ens.np, bia, etu, fin et imo

Lecture des données

etab <- read.csv2("dataESR/fr-cpesrtmp-etablissements.csv") %>%
  mutate(Groupe = factor(Groupe,levels = unique(Groupe)))
pidfix.raw <- read.csv2("dataESR/fr-cpesrtmp-pidfix.csv") 
pidfix <- pidfix.raw$pid.dst
names(pidfix) <- pidfix.raw$pid.src

ens <- kpiesr_read.ens(pidfix)
bia <- kpiesr_read.bia(pidfix)
etu <- kpiesr_read.etu(pidfix) 
fin <- kpiesr_read.fin(pidfix)
imo <- kpiesr_read.imo(pidfix)
bind_rows(
  ens %>% summarise(data = "ens",
    Rentrée.min = min(Rentrée), Rentrée.max = max(Rentrée), nb_pid = n_distinct(pid,na.rm = TRUE)),
  bia %>% summarise(data = "bia",
    Rentrée.min = min(Rentrée), Rentrée.max = max(Rentrée), nb_pid = n_distinct(pid,na.rm = TRUE)),
  etu %>% summarise(data = "etu",
    Rentrée.min = min(Rentrée), Rentrée.max = max(Rentrée), nb_pid = n_distinct(pid,na.rm = TRUE)),
  fin %>% summarise(data = "fin",
    Rentrée.min = min(Rentrée), Rentrée.max = max(Rentrée), nb_pid = n_distinct(pid,na.rm = TRUE)),
  imo %>% summarise(data = "imo",
    Rentrée.min = min(Rentrée), Rentrée.max = max(Rentrée), nb_pid = n_distinct(pid,na.rm = TRUE))
) %>% spoiler_table()

Fusion des données

esr.src <- ens %>% 
  full_join(etu) %>%
  full_join(bia) %>%
  full_join(fin) %>%
  full_join(imo) %>%
  full_join(etab %>% select(pid,Etablissement,Groupe, Groupe.détaillé, Comparable)) %>%
  select(Groupe,pid,Etablissement, Groupe.détaillé, Comparable, Rentrée, everything())

esr.src <- esr.src %>% arrange(Groupe,Groupe.détaillé,Etablissement,Rentrée) 

esr <- kpiesr_add_ensembles(esr.src)
esr <- kpiesr_add_kpis(esr)
esr.pnl <- kpiesr_pivot_norm_label(esr, rentrée.d)

Vérification des outliers

Vérification manuelle pour les universités

cat("\n<details>\n")
cat("  <summary>Voir les données</summary>\n\n")

df <- esr.pnl %>%
  filter(Groupe == "Universités et assimilés", Rentrée == rentrée.f) %>%
  select(-Groupe, -Rentrée, -Groupe.détaillé) %>%
  filter(!str_detect(kpi,"kpi.....P."))

for(thekpi in unique(df$kpi)) {
  cat("##### ",thekpi,"\n\n")
  df2 <- df %>% filter(kpi == thekpi)

  if(str_detect(thekpi,"kpi.K.")) df2 <- df2 %>% arrange(valeur)
  else df2 <- df2 %>% arrange(norm)

  df2 %>% slice_head(n=5) %>% spoiler_table()
  df2 %>% slice_tail(n=5) %>% spoiler_table()
}

cat("\n\n</details>\n")

Détection automatique

outliers.k <- esr %>% 
  filter(Rentrée == rentrée.f, Groupe!="Groupe") %>%
  filter(kpi.K.titPper < 0.3 |
         kpi.K.ensPetu > 20 |
         kpi.K.biaPper < 0.40 | kpi.K.biaPper > 0.60 |
         kpi.K.resPetu > 30000 |
         kpi.K.forPetu > 5000 )

outliers.n <- esr.pnl %>% 
  filter(Rentrée == rentrée.f, Groupe!="Groupe") %>%
  filter(., kpi == "kpi.ENS.S.titulaires", norm < 0.25)

outliers <- bind_rows(
  outliers.k %>% select(pid, Etablissement),
  outliers.n %>% select(pid, Etablissement)
) %>% unique()

outliers %>% spoiler_table()
etab <- etab %>% mutate(Comparable = replace(Comparable,pid %in% outliers$pid,FALSE))
esr <- esr %>% mutate(Comparable = replace(Comparable,pid %in% outliers$pid,FALSE))
esr.pnl <- esr.pnl %>% mutate(Comparable = replace(Comparable,pid %in% outliers$pid,FALSE))

Ecriture des données

groupes <- c(unique(as.character(kpiESR::esr.etab$Groupe)))
etabs <- list()
etabs["Ensemble"] = list("Ensemble" = "Ensemble")
for(g in groupes) {
  etabs[g] <- list(deframe((kpiESR::esr.etab %>% 
                              filter(Groupe == g) %>%
                              transmute(Etablissement = as.character(Etablissement), pid = as.character(pid)) %>%
                              add_row(Etablissement = g, pid = g, .before = 1) )))
}

groupes <- c("Ensemble", groupes)
fulletabs <- c(list( "Ensemble" = etabs ), etabs)

kpi_list <- list(
  "KPI" = set_names(kpiESR::kpiesr_lfc$K$factors,kpiESR::kpiesr_lfc$K$labels),
  "Etudiants" = set_names(kpiESR::kpiesr_lfc$ETU$factors,kpiESR::kpiesr_lfc$ETU$labels),
  "Enseignants" = set_names(kpiESR::kpiesr_lfc$ENS$factors,kpiESR::kpiesr_lfc$ENS$labels),
  "BIATSS" = set_names(kpiESR::kpiesr_lfc$BIA$factors,kpiESR::kpiesr_lfc$BIA$labels),
  "Finances" = set_names(kpiESR::kpiesr_lfc$FIN$factors,kpiESR::kpiesr_lfc$FIN$labels),
  "Immobilier" = set_names(kpiESR::kpiesr_lfc$IMO$factors,kpiESR::kpiesr_lfc$IMO$labels)
)

kpiesr_shinycfg <- list(
  "groupes" = groupes,
  "etabs" = fulletabs,
  "kpi_list" = kpi_list
)

# kpi_infos <- list()
# 
# for(k in kpiESR::kpiesr_lfc) {
#   for(i in seq(1,length(k$factors))) {
#     kpi_infos[[k$factors[i]]] <- list(
#       "label" = k$labels[i],
#       "desc" = k$desc[i],
#       "y_label" = k$y_labels,
#       "color" = k$color[i]
#     )
#   }
# } 

kpiesr_lfc_labels <- set_names(
  c(kpiESR::kpiesr_lfc$K$labels, kpiESR::kpiesr_lfc$ETU$labels, kpiESR::kpiesr_lfc$ENS$labels, kpiESR::kpiesr_lfc$BIA$labels, kpiESR::kpiesr_lfc$FIN$labels, kpiESR::kpiesr_lfc$IMO$labels),
  c(kpiESR::kpiesr_lfc$K$factors, kpiESR::kpiesr_lfc$ETU$factors, kpiESR::kpiesr_lfc$ENS$factors, kpiESR::kpiesr_lfc$BIA$factors, kpiESR::kpiesr_lfc$FIN$factors, kpiESR::kpiesr_lfc$IMO$factors)
)

kpiesr_lfc_desc <- set_names(
  c(kpiESR::kpiesr_lfc$K$desc, kpiESR::kpiesr_lfc$ETU$desc, kpiESR::kpiesr_lfc$ENS$desc, kpiESR::kpiesr_lfc$BIA$desc, kpiESR::kpiesr_lfc$FIN$desc),
  c(kpiESR::kpiesr_lfc$K$factors, kpiESR::kpiesr_lfc$ETU$factors, kpiESR::kpiesr_lfc$ENS$factors, kpiESR::kpiesr_lfc$BIA$factors, kpiESR::kpiesr_lfc$FIN$factors)
)

kpiesr_lfc_colors <- set_names(
  c(kpiESR::kpiesr_lfc$K$colors, kpiESR::kpiesr_lfc$ETU$colors, kpiESR::kpiesr_lfc$ENS$colors, kpiESR::kpiesr_lfc$BIA$colors, kpiESR::kpiesr_lfc$FIN$colors, kpiESR::kpiesr_lfc$IMO$colors),
  c(kpiESR::kpiesr_lfc$K$factors, kpiESR::kpiesr_lfc$ETU$factors, kpiESR::kpiesr_lfc$ENS$factors, kpiESR::kpiesr_lfc$BIA$factors, kpiESR::kpiesr_lfc$FIN$factors, kpiESR::kpiesr_lfc$IMO$factors)
)

kpiesr_lfc_y_labels <- list()
for(k in kpiESR::kpiesr_lfc) {
  for(i in seq(1,length(k$factors))) {
    kpiesr_lfc_y_labels[[k$factors[i]]] <- k$y_labels
  }
}
esr <- set_encoding_utf8(esr)
esr.pnl <- set_encoding_utf8(esr.pnl)
esr.etab <- etab
esr.stats <- kpiesr_get_stats(esr.pnl)

usethis::use_data(esr, esr.pnl, esr.stats, esr.etab, 
                  kpiesr_shinycfg,
                  kpiesr_lfc_labels, kpiesr_lfc_desc, kpiesr_lfc_y_labels, kpiesr_lfc_colors,
                  overwrite = TRUE)

write.csv2(esr,"data/fr-cpesr-kpiesr.csv",row.names = FALSE)

fr-cpesr-kpiesr.csv



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