Optimiser le partage et la reproductibilité de son code
Analyse de données en programmation
La pratique d’un langage de programmation (libre et gratuit) pour l’analyse de données offre des perspectives intéressantes :
Permet d’étendre ses compétences et de gagner en polyvalence
Permet la réproductibilité de son travail d’analyse
Facilite le partage de son travail d’analyse
Permet de gagner en transparence
…
→ Cela Implique de nouvelles méthodes de travail :
Comment rendre mon travail intelligible pour mes collègues (et pour moi) ?
Comment archiver et assurer une certaine reproductibilité de mes scripts ?
Comment mettre à disposition du code source (et ses résultats) ?
I. Pratique du literate programming
II. Utilisation du format de publicationnotebook
III. Gestion, stockage et partage avec Git
Literate programming
La programmation lettrée est une approche de la programmation qui se veut différente du paradigme de programmation structurée.
« 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. (…)
Celui qui pratique la programmation lettrée peut être vu comme un essayiste, qui s’attache principalement à exposer son sujet dans un style visant à l’excellence. 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. »
Le paradigme de la programmation lettrée, pensé et mis en oeuvre par Donald Knuth (1977-78), s’éloigne dans son écriture de l’ordonnancement imposé par l’ordinateur, et à la place autorise les développeurs à utiliser un ordre imposé par la logique et le fil de leur pensée.
#-----------------------------------------------------------------# Représentation graphique # de la répartition d'individus# discrétisés en quatre classes ## H. Pecout# 5 décembre 2022#-----------------------------------------------------------------## Discrétisation la variable Sepal.Length (données iris)# Statistiques sur la série statistique 'Sepal.Length'summary(iris$Sepal.Length)# Histogramme de la distributionhist(iris$Sepal.Length)# Choix des bornes de classes (amplitude égale)bornes_des_classes <-c(min(iris$Sepal.Length), 5, 6, 7, max(iris$Sepal.Length))# Choix des noms de classesnom_des_classes <-c("Trés petites","petites","grandes","Très grandes")# Discrétisation de la variable 'Sepal.length'iris$classe <-cut(iris$Sepal.Length,breaks = bornes_des_classes,labels = nom_des_classes,include.lowest =TRUE)#---------------------------------------------------------------------## Représentation de la distribution selon la discrétisation# Bibliothèque pour la représentation graphiquelibrary(ggplot2)# Représentation graphique de la distributionggplot(data = iris, aes(x = classe)) +# Choix des données et de la variable à représentergeom_bar() +# Choix du type de représentationxlab("") +# Suppression du nom de l'axe xylab("") +# Suppression du nom de l'axe yggtitle("Répartition par classe") +# Titre du graphiquetheme(plot.title =element_text(size=27), # Taille de la police titre axis.text=element_text(size=19)) # Taille des labels d'axe
Quel outil pour la PL ?
Il est possible de faire de la programmation lettrée dans n’importe quel type de document… Ce paradigme n’est pas lié à format ou à un outil. Mais il en existe tout de même un parfait pour mettre en oeuvre ce concept.
Le notebook permet de combiner du langage naturel et du langage de programmation, et d’interpréter les deux :
Mise en forme du texte
Exécution et/ou affichage du code
Les notebooks et la programmation lettrée sont apparus à la même période, celle de l’émergence du concept de recherche reproductible…
💻 70’s show
Les premiers notebooks
1970 : Scratchpad (Axiom)
1987 : MathCad
1988 : Mathematica
1989 : Maple
2011 : IPython
Émergence de la recherche reproductible
Jon Claerbout est l’un des premiers chercheur à exprimer le fait que les méthodes de calcul menacent la reproductibilité de la recherche si l’on ne donne pas un accès libre aux données et aux logiciels qui sous-tendent.
En 1976, il publie un ouvrage référence en traitement de signal :
« Fundamentals of Geophysical Data Processing »
Cette 1ère version - non-reproductible - sera le début d’un long travail de recherche sur la reproductibilité… Via des notebooks !
Émergence du Literate Programming
Le concept de programmation lettrée est pensé et conçu par Donald Knuth (1977-78). Le notebook se présente comme un outil idéal pour mettre en œuvre ce paradigme.
Définition
Interface de programmation qui permet de combiner des sections en langage naturel et des sections en langage informatique.
De nombreuses dénominations existent :
Article exécutable
Document computationnel
Document électronique interactif
Cahiers de programmation
Cahier électronique d’analyse
Calepin électronique
Carnet de code
Manifeste algorithmique
Notebook !
…
Un outil… des pratiques !
La mise en forme du texte se fait à l’aide d’un langage de balisage (Markdown, html…)
Anatomie d’un notebook
Un simple fichier texte (.rmd, .qmd, .ipynb…)
\### Le MarkdownMarkdown est un **langage de balisage léger** créé en 2004 par [John Gruber](https://fr.wikipedia.org/wiki/John_Gruber), avec l'aide d'[Aaron Swartz](https://fr.wikipedia.org/wiki/Aaron_Swartz), dans le but d'offrir une **syntaxe facile à lire et à écrire**. ![](https://upload.wikimedia.org/wikipedia/commons/6/64/John_Gruber%2C_2009_%28cropped%29.jpg)**John Gruber, 2004 : **> « *Un document balisé par Markdown peut être lu en l'état sans donner l’impression d'avoir été balisé ou formaté par des instructions particulières.* »Un document balisé par Markdown peut être converti en : >- HTML>- PDF>- plein d'autres formats[^1][^1]: Un markdown peut également être converti en format word, LaTeX, ePub, odt...\#### Insérer du code ?~~~Rlibrary(ggplot2)ggplot(data = iris, aes(x =cut(Sepal.Length, breaks =c(min(Sepal.Length), 5, 6, 7, max(Sepal.Length)), include.lowest =TRUE, labels =c("Bas","Bas+","Haut","Haut+")))) +geom_bar() +xlab("") +ylab("") +ggtitle("Répartition par classe") +theme(plot.title =element_text(size=27), axis.text=element_text(size=19))~~~
Le Markdown
Markdown est un langage de balisage léger créé en 2004 par John Gruber, avec l’aide d’Aaron Swartz, dans le but d’offrir une syntaxe facile à lire et à écrire.
John Gruber, 2004 :
« Un document balisé par Markdown peut être lu en l’état sans donner l’impression d’avoir été balisé ou formaté par des instructions particulières. »
Un document balisé par Markdown peut être converti en :
Gitest un système de gestion de version distribué pour :
tracker les changements dans les fichiers texte
gérer l’historique du code source
partager le code dans des dépots distants
GitLabet GitHub sont des services web d’hébergement et de gestion de version (issue tracker, collaboration, hébergement web, CI/CD), qui reposent sur le logiciel de version Git
Notebook + GitLab (ou GitHub) = 🔥🔥
Les sources des notebooks sont de simples fichiers texte
➡️ Suivi des modifications (commit, branches, etc.)
➡️ Partage et mise à disposition des fichiers sources (dépôt public ou privé)
GitLab et GitHub permettent de compiler un notebook
➡️ Continuous Integration
Ils permettent de déployer sur le web un notebook compilé en HTML
➡️ Continuous Deployment
Exemple
Ceci est un notebook !
Un peu de code :
##------------------------ PACKAGES utilisés --------------------------## # install.packages("sf")# install.packages("leaflet")# Chargement des librairieslibrary(sf)library(leaflet)##----------------- Création d'un objet sf (point) --------------------## # Cordonnées de l'Institut régional de Santé, Ouidah (Bénin)lat =6.349879282633317lng =2.0875418515099504# Création d'un pointptsfg <-st_point(c(lng, lat)) # Ajout du système géographique de référenceptsfc <-st_sfc(ptsfg, crs = (4326))# Création de l'attribut "name"ptdf <-data.frame(id=1, name ="Institut régional de Santé")# Création de l'objet sf ponctuelHere <-st_sf(ptdf,geometry = ptsfc)##--------------------- Création carte dynamique ----------------------## # Lien vers une photo de l'IRSPfile <-'https://www.centrelogivac.org/wp-content/uploads/2021/09/DJI_0084-450x253.jpg'# Construction du markericons <-awesomeIcons(icon ='ios-people',iconColor ='white',library ='ion',markerColor ='blue')# Affichage du point - carte interactivemamap <-leaflet(Here) %>%setView( lat = lat +12, lng = lng, zoom =3) %>%addProviderTiles("GeoportailFrance.orthos") %>%addAwesomeMarkers(icon = icons,popup =paste("<img src =", file, ">", "<p style='text-align:center;'>Institut Régional</br>de Santé Publique</br>Comlan Alfred Quenum</a></p>"))