Une nouvelle R pour le Cereq

SAS R plus a rien

Edmond Noack

2024-08-10

Une présentation inspirée d’un séminaire du Metsem (Séminaire Méthodologie de Sciences Po)

Hugues Pecout (Géographie Cités) présente une séance intitulée “De l’article de données à l’article de code, en passant par les méthodes”, elle concerne la pratique de publication de documents computationnels (Notebooks) dans le cadre du projet Rzine.

Ecouter le séminaire ICI

Les concepts

  • La programmation lettré : Méthode de code intéligible

  • Les documents computationnels : Rmarkdown/Quarto

  • Les forges logicielles : Github ou Gitlab

Literate Programming

Nous devons changer notre attitude traditionnelle envers la construction des programmes : au lieu de considérer que notre tâche principale est de dire à un ordinateur ce qu’il doit faire, appliquons-nous plutôt à expliquer à des êtres humains ce que nous voulons que l’ordinateur fasse…

Tel un auteur, il choisit, avec soin, le dictionnaire à la main, les noms de ses variables et en explique la signification pour chacune d’elles. Il cherche donc à obtenir un programme compréhensible parce que ses concepts sont présentés dans le meilleur ordre possible. Pour cela, il utilise un mélange de méthodes formelles et informelles qui se complètent.

— Donald Knuth, Literate Programming

On est à la recherche de lisibilité pas d’optimisation

Literate Programming

Difficile à lire

head(summarise(group_by(filter(base_efe, tx_acc > 0.2),top1_c5),moyenne = mean(tx_acc), médiane = median(tx_acc)))
# A tibble: 2 × 3
  top1_c5 moyenne médiane
  <chr>     <dbl>   <dbl>
1 C5i        39.7    40.3
2 C5m        12.4    12.4

Literate Programming

Simple à lire

base_efe %>%
  # filtre si le taux accès est superieur à 20 %
    filter(tx_acc > 0.2) %>%
  # en fonction de la variable top1_c5
    group_by(top1_c5) %>%
  # La moyenne et la médiane
    summarise(moyenne = mean(tx_acc), médiane = median(tx_acc)) %>%
    head()
# A tibble: 2 × 3
  top1_c5 moyenne médiane
  <chr>     <dbl>   <dbl>
1 C5i        39.7    40.3
2 C5m        12.4    12.4

Graphique en langage non lettré

library(ggplot2)
data("mpg")
ggplot(data = mpg, 
       aes(x = cut(displ, breaks = c(unname(quantile(displ,na.rm = T,probs = c(0,0.25,0.5,0.75,1)))), 
                   include.lowest = TRUE, labels = c("Très faible","Faible","Haute","Très haute")),
           fill=class)
       ) +
  geom_bar(position = "fill")+
 scale_fill_brewer(palette="Set1")+
  xlab("Cylindré en litre") +
  ylab("") + 
  ggtitle("Cylindré en litre selon le type de vehicule") 

Graphique en langage non lettré

Graphique en langage lettré

#-----------------------------------------------------------------
#            Représentation graphique 
#         de la répartition de vehicules 
#         discrétisés en quatre classes 
#       en fonction de leur cylindré en litre
#
#-----------------------------------------------------------------

# Library de graphique et base
library(ggplot2)


# Discrétisation la variable displ (données mpg)

## Statistiques sur la série statistique displ
summary(mpg$displ)

## Histogramme de la distribution
hist(mpg$displ)

Graphique en langage lettré

   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  1.600   2.400   3.300   3.472   4.600   7.000 

Graphique en langage lettré

## Choix des bornes de classes en quartile
bornes_des_classes <- c(quantile(mpg$displ,na.rm = T,probs = c(0,0.25,0.5,0.75,1)))

## Choix des noms de classes
nom_des_classes <- c("Très faible","Faible","Haute","Très haute")

## Discrétisation de la variable 'displ'
mpg$displ_tranche <- cut(mpg$displ,
                    breaks = bornes_des_classes,
                    labels = nom_des_classes,
                    include.lowest = TRUE)

#---------------------------------------------------------------------

# Représentation de la distribution selon la discrétisation


## Représentation graphique de la distribution
ggplot(data = mpg, #data set mpg
       aes(x = displ_tranche, #axe des x variable displ_tranche discrétisation de displ
           fill=class) # variable de type de véhicule (catégorisation au sein de chaque barre)
       ) +
  geom_bar(position = "fill") + #Type de graphique avec postion empilée
 scale_fill_brewer(palette="Set1") + # Choix de la palette de couleur
  xlab("Cylindré en litre") + # Titre de l'axe des abscisses
  ylab("") + #suppression du titres de l'axe des ordonnés
  ggtitle("Cylindré en litre selon le type de vehicule") # Titre du graphique 

Graphique en langage lettré

Graphique en langage lettré encore mieux

graphique_1 <- ggplot(data = mpg, #data set mpg
       aes(x = displ_tranche, #axe des x variable displ_tranche discrétisation de displ
           fill=class) # variable de type de véhicule (catégorisation au sein de chaque barre)
                    ) 
 #Type de graphique avec postion empilée
graphique_1<-graphique_1 + geom_bar(position = "fill") 
  # Choix de la palette de couleur
graphique_1<-graphique_1 + scale_fill_brewer(palette="Set1")  
 # Titre de l'axe des abscisses
graphique_1<- graphique_1 + xlab("Cylindré en litre") 
  #suppression du titres de l'axe des ordonnés
graphique_1<- graphique_1 + ylab("")  
  # Titre du graphique 
graphique_1<- graphique_1 + ggtitle("Cylindré en litre selon le type de vehicule") 

graphique_1

Graphique en langage lettré encore mieux

Note Book, Document computationnel

Interface de programmation qui combine langage naturel et langage de programmation

Du texte + du code

  • Le texte : Peut etre mis en forme, comptenir des images, des liens etc…

  • Le code : Peut s’executer par bloc

Note Book, Document computationnel

  • Le Note Book est l’outil parfait pour faire du literate programming (programmation lettrée)

  • Le Note Book aide a faire de la recherche reproductible

Note Book, Document computationnel, S. Jugnot et disque R

L’utilisation de notebook permetrait de partir d’une base brute d’enquête jusqu’a une base diffusable. On serait ainsi transparent sur les appurements, imputations, redressements, etc…

Un seul programme pour passer de production à diffusion

Structure Note Book :

Exemple de Note Book R :

Le Note Book permet different format de sorties

  • Du code
  • Des PDF
  • Des PPT
  • Latex
  • Des pages HTML
  • Des docs .qmd .rmd

Quarto est le meilleur outils de Note Book

Les Forges Logicielles

Répondent aux problématiques de :

  • Travail collaboratif (gestion de version/versionning)
  • Historique (retour en arrière)
  • Partage
  • Organisation interne et/ou externe
  • Mise a disposition

Et favorisent la science ouverte, la reproductibilité, la transparence

Les deux principales forges logicielles (GitHub et Gitlab)

Github

Gitlab

Le Cereq a fait le choix de Gitlab

  • Hébergement : GitLab Enterprise Edition, gratuit et auto-hébergé sur les serveurs du SUNI. Le serveur GitLab été créé par Jérémy pour une autre application dans le passé, mais n’a finalement jamais été utilisé.

  • Sécurité 

  • Prix : Une mise à niveau vers une version payante devra être envisagée si la version gratuite ne correspond plus aux besoins du Céreq.

Github Desktop

Interface permettant de relier nos fichier en local et les fichier sur GIT (cloud)

Commit Push Pull Fetch

  • Commit : Commentaire sauvegarder dans le fichier .git

  • Push : Envoi du commit sur le GIT (cloud)

  • Pull : Récuparation en local du GIT (cloud)

  • Fetch : comparaison du cloud et du local

Les repos, Les branches

Un repo est un répertoire qui va contenir un ensemble de fichier.

Un repo peut avoir plusieurs branches qui évoluent en parrallèle et qui peuvent etre merger

Il est de bon usage que chaque intervenant travaille sur sa propre branche.

Il y a une branche principale qui fait office de référence : la branche main

Les indispensables d’un repo

  • Le Readme : fichier markdown explicatif du projet
  • Le dossier .git : enregistre l’historique via les commits
  • Le gitignore : permet d’exclure des dossier ou extension du l’envoi sur la Git (cloud)
  • Le dossier data : contient les bases et est exclu du cloud via le gitigniore
  • Le dossier programme : contient les pgm

Les indispensables d’un repo