Commit ec2e1f2e authored by gossa's avatar gossa

effectifs.esr non fonctionnel

parent 9a92f4b3
Libellé;sigle.grp
Université Paris-Saclay;ComUE U. Paris-Saclay
Université Paris-Sud;ComUE U. Paris-Saclay
Université de Versailles Saint-Quentin-en-Yvelines;ComUE U. Paris-Saclay
Université d'Évry-Val d'Essonne;ComUE U. Paris-Saclay
École normale supérieure de Cachan;ComUE U. Paris-Saclay
CentraleSupélec;ComUE U. Paris-Saclay
Université Lille Nord de France;ComUE Lille-Nord-de-France
Université de Lille;ComUE Lille-Nord-de-France
Université d'Artois;ComUE Lille-Nord-de-France
Université du Littoral Côte d'Opale;ComUE Lille-Nord-de-France
Université de Valenciennes et du Hainaut-Cambrésis;ComUE Lille-Nord-de-France
# Tableaux de bord des établissements du MESRI
# Doit être utilisé après chargement des données par effectifs.esr.R
ggpt.tdb.etab <- function(df, subtitle="") {
ggp <- ggplot(df,
aes(
x=rentrée,
y=effectif,
fill=type.détaillé)) +
geom_col(position = position_stack(reverse = FALSE)) +
scale_fill_manual(name="Corps",values=color.type.détaillé) +
facet_grid(type.effectif ~ sigle, scales="free_y") +
theme(legend.position="bottom") +
ggtitle(paste("Tableau de bord",subtitle))
return(ggp)
}
ggpt.tdb.etab(df.all[grep("Lyon",df.all$sigle),], "du site de Lyon")
ggpt.tdb.etab(subset(df.all, sigle == "U. de Strasbourg"))
ggpt.tdb.etab(subset(df.all, sigle.grp == "ComUE Lille-Nord-de-France"))
# Cartographie des effectifs titulaires du MESRI
# Doit être utilisé après chargement des données par effectifs.esr.R
## Fonctions
ggp.carte <- function (df, title="",xlabel="",ylabel="", guide="") {
ggp <- ggplot(df, aes(x=effectif.x,y=effectif.y)) +
geom_point() +
geom_hline(yintercept=0) +
geom_vline(xintercept=0) +
geom_label_repel(aes(label = sigle,
fill=effectif.c),
label.padding=0.1) +
scale_fill_gradient(low="red",high="green", name=guide) +
xlab(xlabel) +
ylab(ylabel) +
ggtitle(title)
return(ggp)
}
## plots
### Carte évolution EC titulaires (hors santé)
df <- subset(df.all,
type.détaillé %in% c("Professeur et assimilés","Maître de conférences et assimilés") &
secteur != "santé" &
rentrée %in% c(rentrée.d,rentrée.f),)
df <- aggregate(effectif ~ rentrée + sigle.grp, df, sum)
df <- spread(df,rentrée,effectif)
colnames(df) <- c("sigle","effectif.x","effectif.2016")
df$effectif.y <- df$effectif.2016-df$effectif.x
df$effectif.c <- df$effectif.2016-df$effectif.x
maxfill <- max(abs(df$effectif.c),na.rm=TRUE)
ggp.carte( df,
"Evolution des effectifs enseignants-chercheurs (hors santé) des établissements du MESRI",
"Effectif enseignant-chercheur en 2010",
"Variation de l'effectif enseignant-chercheur entre 2010 et 2016",
"Variation\n2010-2016"
) +
scale_fill_gradient(low="red",high="green", limits=c(-maxfill,maxfill), name="Variation\n2010-2016") +
xlim(-1000,3000)
ggsave("carte_evolution_EC.png", width = width, height = height, dpi = dpi)
### Carte rapport titulaires / etu
df <- subset(df.all,
type.effectif %in% c("titulaire","non permanent") &
rentrée %in% c(2016))
df <- aggregate(effectif ~ type.effectif + sigle.grp, df, sum)
df <- spread(df,type.effectif,effectif)
colnames(df) <- c("sigle","effectif.y","effectif.x")
df$effectif.c <- df$effectif.x / df$effectif.y
ggp.carte( df,
"Effectifs enseignants titulaire et non-permanent des établissements du MESRI en 2016",
"Effectif titulaire",
"Effectif non permanent",
"Ratio titulaires/non-permanent"
) + xlim(-1000,4500) + ylim(-1000,1800)
ggsave("carte_titulaires_nonpermanents.png", width = width, height = height, dpi = dpi)
#!/bin/R
# DataSets :
# https://data.enseignementsup-recherche.gouv.fr/explore/dataset/fr-esr-enseignants-titulaires-esr-public/
# https://data.enseignementsup-recherche.gouv.fr/explore/dataset/fr-esr-sise-effectifs-d-etudiants-inscrits-esr-public/
# https://data.enseignementsup-recherche.gouv.fr/explore/dataset/fr-esr-principaux-etablissements-enseignement-superieur/
# https://data.enseignementsup-recherche.gouv.fr/explore/dataset/fr-esr-enseignants-nonpermanents-esr-public/
library(ggplot2)
library(ggrepel)
library(plotly)
library(tidyverse)
library(data.table)
## plots
width <- 14
height <- 8
dpi <- 200
ggs <- function(filename) {
ggsave(filename, width = width, height = height, dpi = dpi)
}
rentrée.d <- 2010
rentrée.f <- 2016
## Fonctions
multi_spread <- function(df, key, value) {
# quote key
keyq <- rlang::enquo(key)
# break value vector into quotes
valueq <- rlang::enquo(value)
s <- rlang::quos(!!valueq)
df %>% gather(variable, value, !!!s) %>%
unite(temp, !!keyq, variable, sep='.') %>%
spread(temp, value)
}
scale_effectif <- function(df, référence = 2012) {
df.r <- subset(df,rentrée == référence,)
colnames(df.r)[colnames(df.r)=="effectif"] <- "référence"
df.r <- subset(df.r,,-rentrée)
df.r <- merge(df,df.r,all.x=TRUE)
df.r$effectif.scalé <- df.r$effectif/df.r$référence
return(df.r)
}
## Préparation des données #####################################################
### Chargement données personnels titulaires
df.enst.raw <- read.table("fr-esr-enseignants-titulaires-esr-public.csv",
header=TRUE, sep=';', quote='"')
df.enst <-df.enst.raw
df.enst$type.effectif <- "titulaire"
Code.grande.discipline.sante = c("4P","5M","6O")
df.enst$secteur <- ifelse(
df.enst$Code.grande.discipline %in% Code.grande.discipline.sante,
"santé", "autre")
df.enst <- aggregate(effectif ~ Rentrée + Établissement + type.effectif + Categorie.de.personnels + secteur, df.enst, sum)
colnames(df.enst) <- c("rentrée","établissement","type.effectif","type.détaillé","secteur","effectif")
### Chargement données personnels non-permanents
df.ensnp.raw <- read.table("fr-esr-enseignants-nonpermanents-esr-public.csv",
header=TRUE, sep=';', quote='"')
df.ensnp <- df.ensnp.raw
df.ensnp$type.effectif <- "non permanent"
df.ensnp$secteur <- ifelse(
df.ensnp$Grande.discipline == "Sciences pharmaceutiques",
"santé", "autre")
df.ensnp$type.détaillé <- ifelse(
df.ensnp$Categorie.de.personnels %in% c(
"Autres catégories>Lecteur de langues étrangères",
"Autres catégories>Maître de langues étrangères",
"Autres catégories>Répétiteur"),
"Répétiteur, Lecteur et Maître de langues",
gsub("unversités", "universités",
gsub("^.*>","",as.character(df.ensnp$Categorie.de.personnels))))
df.ensnp$type.détaillé = factor(df.ensnp$type.détaillé, ordered=TRUE,
levels = c(
"Doctorant contractuel sans service d'enseignement",
"Doctorant contractuel avec service d'enseignement",
"Attaché temporaire d'enseignement et de recherche",
"Répétiteur, Lecteur et Maître de langues",
"Contractuel 2nd degré",
"Maître de conférences associé ou invité",
"Professeur des universités associé ou invité",
"Contractuel LRU"
)
)
df.ensnp <- aggregate(EFFECTIF ~ Rentrée + Établissement + type.effectif + type.détaillé + secteur, df.ensnp, sum)
colnames(df.ensnp) <- c("rentrée","établissement","type.effectif","type.détaillé","secteur","effectif")
### chargement des données étudiants
df.etu <- read.table("fr-esr-sise-effectifs-d-etudiants-inscrits-esr-public.csv",
header=TRUE, sep=';', quote='"')
df.etu$type.effectif <- "étudiant"
df.etu$secteur <- ifelse(
df.etu$Grande.discipline == "Santé",
"santé", "autre")
df.etu <- aggregate(Nombre.d.étudiants.inscrits..inscriptions.principales. ~ RENTREE + Etablissement + type.effectif + CURSUS_LMD + secteur, df.etu, sum)
colnames(df.etu) <- c("rentrée","établissement","type.effectif","type.détaillé","secteur","effectif")
df.etu$type.détaillé <- factor(df.etu$type.détaillé,levels=c("L","M","D"), ordered=TRUE)
levels(df.etu$type.détaillé) <- c("Niveau Licence","Niveau Maîtrise","Niveau Doctorat")
### Chargement données établissements
df.etab.raw <- read.table("fr-esr-principaux-etablissements-enseignement-superieur.csv",
header=TRUE, sep=';', quote='"', fill=TRUE)
df.comue <- read.table("comue.csv",
header=TRUE, sep=';', quote='"', fill=TRUE)
df.etab <- unique(df.etab.raw[,c("Libellé","type.d.établissement","sigle")])
df.etab <- df.etab[row.names(unique(as.data.frame(df.etab[,c("Libellé")]))),]
df.etab$sigle <- ifelse(df.etab$sigle == "",
gsub("^Université","U.", df.etab$Libellé), as.character(df.etab$sigle))
df.etab <- merge(df.etab,df.comue, all.x=TRUE)
df.etab$sigle.grp <- ifelse(is.na(df.etab$sigle.grp),
as.character(df.etab$sigle), as.character(df.etab$sigle.grp))
colnames(df.etab) <- c("établissement", "type.établissement", "sigle", "sigle.grp")
df.etab$établissement <- as.character(df.etab$établissement)
df.etab[df.etab$établissement == "Avignon Université",]$établissement <- "Université d'Avignon et des Pays de Vaucluse"
df.etab[df.etab$établissement == "École centrale de Nantes",]$établissement <- "Ecole centrale de Nantes"
#### Regroupement
df.etab.grp <- subset(df.etab.raw,,c(1:4,8,60)) #1:4,8:9,60:61
### Fusion des données
df.all <- rbind(df.enst,df.ensnp,df.etu)
df.all <- df.all[order(df.all$établissement),]
df.all <- merge(df.all, df.etab)
df.all$type.détaillé <- fct_rev(df.all$type.détaillé)
df.all$type.effectif <- as.factor(df.all$type.effectif)
### Colors
color.type.effectif <- c("cadetblue","firebrick","chartreuse")
scale.values.effectif=setNames(color.type.effectif,levels(df.all$type.effectif))
color.type.détaillé <- c(
"cadetblue4", "cadetblue3", "cadetblue1",
"firebrick4", "firebrick3", "firebrick1",
"deeppink3", "deeppink1",
"darkorchid4", "darkorchid3", "darkorchid1",
"chartreuse4", "chartreuse3", "chartreuse1"
)
scale.values.détaillé=setNames(color.type.détaillé,levels(df.all$type.détaillé))
scale_fill_esr <- function(type="none") {
return(switch(type,
"effectif"=scale_fill_manual(name="Catégorie",values=scale.values.effectif),
"détaillé"=scale_fill_manual(name="Catégorie",values=scale.values.détaillé),
"none"=scale_fill_discrete(name="Catégorie")
))
}
scale_color_esr <- function(type="none") {
return(switch(type,
"effectif"=scale_color_manual(name="Catégorie",values=scale.values.effectif),
"détaillé"=scale_color_manual(name="Catégorie",values=scale.values.détaillé),
"none"=scale_color_discrete(name="Catégorie")
))
}
## Plots #######################################################################
#source(effectifs.cartes.R)
#source(effectifs.etablissement.R)
#source(effectifs.etudiants.R)
#source(effectifs.evolutions.R)
#source(effectifs.precaires.R)
#source(effectifs.TDB.R)
# Evolution des effectifs du MESRI par établissement
# Doit être utilisé après chargement des données par effectifs.esr.R
rentrée.d <- 2010
rentrée.f <- 2016
## Plot évolution tout type de perso hors santé ComUE ##########################
ggp.evolution.abs <- function(df, subtitle="", scale.values=NA) {
df.e <- df
df.e$evolution <- df.e$effectif.f - df.e$effectif.d
df.e <- aggregate(evolution ~ sigle, df.e, sum)
df.e <- na.omit(merge(df, df.e, all.x=TRUE))
ggp <- ggplot(df.e, aes(
x=reorder(sigle,evolution),
y=effectif.f-effectif.d,
fill=type.détaillé)) +
geom_col() +
scale_fill_manual(name="Corps", values=scale.values) +
xlab("") +
ylab("Evolution des effectifs de 2010 à 2016") +
theme(
axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5),
legend.position="top") +
ggtitle(paste("Evolution des effectifs des établissements du MESRI",subtitle))
return(ggp)
}
ggp.evolution.rel <- function(df, subtitle="", scale.values=NA) {
df.tot <- aggregate(cbind(effectif.d,effectif.f) ~ sigle,df,sum)
colnames(df.tot) <- c("sigle","etot.d","etot.f")
df.v <- na.omit(merge(df, df.tot, all.x=TRUE))
ggp <- ggplot(df.v, aes(
x=reorder(sigle,(etot.f - etot.d) / etot.d),
y=(effectif.f-effectif.d)/etot.d,
fill=type.détaillé)) +
geom_col() +
scale_fill_manual(name="Corps", values=scale.values) +
xlab("") +
ylab("Evolution des effectifs enseignant-chercheur de 2010 à 2016") +
scale_y_continuous(labels = scales::percent) +
theme(
axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5),
legend.position="top") +
ggtitle(paste("Evolution relative des effectifs des établissements du MESRI",subtitle))
return(ggp)
}
### COMUE
df <- subset(df.all,
type.effectif == "titulaire" &
secteur != "santé" &
rentrée %in% c(rentrée.d,rentrée.f),)
df <- aggregate(effectif ~ rentrée + type.détaillé + sigle.grp, df, sum)
df <- spread(df,rentrée,effectif)
colnames(df) <- c("type.détaillé","sigle","effectif.d","effectif.f")
ggp.evolution.abs(df,"(hors santé, avec COMUE UPS et LNF)", scale.values.détaillé)
ggsave("evolution_effectifs_titulaires_comue.png", width = width, height = height, dpi = dpi)
ggp.evolution.rel(subset(df, sigle != "EHESP",),"(hors santé, avec COMUE UPS et LNF)", scale.values.détaillé)
ggsave("evolution_effectifs_titulaires_prop_comue.png", width = width, height = height, dpi = dpi)
### Sans COMUE
df <- subset(df.all,
type.effectif == "titulaire" &
secteur != "santé" &
rentrée %in% c(rentrée.d,rentrée.f),)
df <- aggregate(effectif ~ rentrée + type.détaillé + sigle, df, sum)
df <- spread(df,rentrée,effectif)
colnames(df) <- c("type.détaillé","sigle","effectif.d","effectif.f")
ggp.evolution.abs(df,"(hors santé)", scale.values.détaillé)
ggsave("evolution_effectifs_titulaires.png", width = width, height = height, dpi = dpi)
ggp.evolution.rel(subset(df, sigle != "EHESP",),"(hors santé, avec COMUE UPS et LNF)", scale.values.détaillé)
ggsave("evolution_effectifs_titulaires_prop.png", width = width, height = height, dpi = dpi)
### Titulaires vs. non-permanents ##############################################
df <- subset(df.all,
type.effectif != "étudiant" &
secteur != "santé" &
rentrée %in% c(2012,rentrée.f),)
df <- aggregate(effectif ~ rentrée + type.effectif + sigle, df, sum)
df <- spread(df,rentrée,effectif)
colnames(df) <- c("type.détaillé","sigle","effectif.d","effectif.f")
ggp.evolution.abs(df,"(hors santé)", scale.values.effectif)
ggsave("evolution_effectifs.png", width = width, height = height, dpi = dpi)
ggp.evolution.rel(subset(df, !sigle %in% c("EHESP","ENSLL","CU de Mayotte"),),"(hors santé)", scale.values.effectif)
ggsave("evolution_effectifs_prop.png", width = width, height = height, dpi = dpi)
# Etudes des effectifs enseignants et étudiants du MESRI
# Doit être utilisé après chargement des données par effectifs.esr.R
rentrée.d <- 2010
rentrée.f <- 2016
### Plot évolution encadrement #################################################
df <- subset(df.all,
secteur != "santé" &
type.effectif != "non permanent" &
rentrée %in% c(rentrée.d,rentrée.f),)
#type.établissement == "Université" | sigle %in% c("U. de Lorraine","Paris-Dauphine")
df <- aggregate(effectif ~ rentrée + type.effectif + sigle.grp, df,sum)
df <- multi_spread(df,c(type.effectif,rentrée),effectif)
df <- na.omit(df)
colnames(df) <- c("sigle","effectif.etu.d", "effectif.etu.f", "effectif.ens.d", "effectif.ens.f")
df$variation.ens <- (df$effectif.ens.f - df$effectif.ens.d) / df$effectif.ens.d
df$variation.etu <- (df$effectif.etu.f - df$effectif.etu.d) / df$effectif.etu.d
df$variation.diff <- df$variation.ens - df$variation.etu
ggplot(subset(df,!sigle %in% c("ENSSIB","EHESP"),),
aes(x=reorder(sigle,variation.diff))) +
geom_segment(aes(
xend=reorder(sigle,variation.diff),
y=variation.etu,yend=variation.ens,
colour=variation.diff), size=2) +
geom_point(aes(y=variation.ens, shape="Enseignants")) +
geom_point(aes(y=variation.etu, shape="Etudiants"), size=2) +
geom_hline(yintercept=0) +
scale_colour_gradient(low="red",high="green", #limits = c(-0.4,+0.4),
name="évolution\n2010-2016") +
xlab("") +
ylab("Variation des effectifs") +
scale_y_continuous(labels = scales::percent) +
scale_size_continuous(guide=FALSE) +
theme(axis.text.x = element_text(angle = 90, hjust = 1)) +
ggtitle("Variation des effectifs enseignant et étudiants de 2010 à 2016 (hors santé)")
ggsave("variations_ens_etu.png", width = width, height = height, dpi = dpi)
df$etu.eec.d <- df$effectif.etu.d / df$effectif.ens.d
df$etu.eec.f <- df$effectif.etu.f / df$effectif.ens.f
df$etu.eec.diff <- df$etu.eec.d - df$etu.eec.f
ggplot(df, aes(x=reorder(sigle,-etu.eec.f))) +
geom_segment(aes(
xend=reorder(sigle,-etu.eec.f),
y=etu.eec.d,yend=etu.eec.f,
colour=etu.eec.diff),
size=2) +
geom_point(aes(y=etu.eec.d, shape="2010"), size=2) +
geom_point(aes(y=etu.eec.f, shape="2016"), size=2) +
scale_colour_gradient(low="red",high="green", #limits = c(-0.4,+0.4),
name="évolution\n2010-2016") +
scale_size_continuous(guide=FALSE) +
xlab("") +
ylab("Nombre d'étudiants par enseignant") +
theme(axis.text.x = element_text(angle = 90, hjust = 1)) +
ggtitle("Evolution du nombre d'étudiants par enseignant entre 2010 et 2016 (hors santé).")
ggsave("evolution_ens_etu.png", width = width, height = height, dpi = dpi)
# Etudes des effectifs titulaires du MESRI
# Doit être utilisé après chargement des données par effectifs.esr.R
ggp.evolution <- function(df,title="",type="none") {
ggp <- ggplot(df, aes(
x=rentrée,
y=effectif.scalé,
color=catégorie)) +
geom_line(size=2) +
scale_color_esr(type) +
xlab("Rentrée") +
ylab("Evolution de l'effectif") +
scale_y_continuous(labels = scales::percent) +
ggtitle(title)
return(ggp)
}
#### proportions etudiants/non permanents/titulaire
df <- aggregate(effectif ~ rentrée + type.effectif, df.all, sum)
df <- scale_effectif(df,2012)
df$catégorie <- df$type.effectif
ggp.evolution(df,
"Evolution des effectifs du MESRI par grande catégorie, avec 2012 pour référence",
"effectif")
ggs("evolution_toute_categories.png")
#### proportions titulaires
df <- subset(df.all, type.effectif == "titulaire")
df <- aggregate(effectif ~ rentrée + type.détaillé, df, sum)
df <- scale_effectif(df,2012)
df$catégorie <- df$type.détaillé
ggp.evolution(df,
"Evolution des effectifs titulaires du MESRI, avec 2012 pour référence",
"effectif")
ggs("evolution_titulaires.png")
#### proportions non permanents
df <- subset(df.all, type.effectif == "non permanent")
df <- aggregate(effectif ~ rentrée + type.détaillé, df, sum)
df <- scale_effectif(df,2016)
colnames(df) <- c("catégorie","rentrée","effectif","référence","effectif.scalé")
ggp.evolution(df,
"Evolution des effectifs non permanents du MESRI, avec 2016 pour référence",
"détaillé")
ggs("evolution_nonpermanents.png")
# Etudes des effectifs précaires du MESRI
# Doit être utilisé après chargement des données par effectifs.esr.R
rentrée.d <- 2010
rentrée.f <- 2016
## Classement précarité
### Proportion titulaires/précaires
df <- subset (df.all, type.effectif != "étudiant" & rentrée == 2016,)
df <- aggregate(effectif ~ type.effectif + sigle, df, sum)
df.s <- spread(df,type.effectif,effectif)
df.s$ratio <- df.s$titulaire/(df.s$titulaire + df.s$"non permanent")
df <- na.omit(merge(df,df.s,all.x=TRUE))
ratio.mean <- mean(df$ratio)
ggplot(df, aes(
x=reorder(sigle,ratio),
y=effectif,
fill=type.effectif)) +
geom_col(position=position_fill()) +
geom_hline(yintercept=ratio.mean) +
scale_fill_manual(name="Effectif",values=color.type.effectif) +
xlab("") +
ylab("Proportion des titulaire/non permanent en 2016") +
scale_y_continuous(labels = scales::percent) +
theme(
axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5),
legend.position="top") +
ggtitle("Proportion des effectifs titulaire/non permanent en 2016 dans les établissements du MESRI (hors vacataires)")
ggs("titulaires_vs_nonpermanents.png")
### MCF/PR/2degré contractuels
df <- subset (df.all,
rentrée == 2016 & type.détaillé %in% c(
"Contractuel 2nd degré",
"Maître de conférences associé ou invité",
"Professeur des universités associé ou invité",