diff --git a/_quarto.yml b/_quarto.yml index 71ecc2288..fecf402c5 100644 --- a/_quarto.yml +++ b/_quarto.yml @@ -15,8 +15,10 @@ project: - content/manipulation/01_numpy.qmd - content/manipulation/02a_pandas_tutorial.qmd - content/manipulation/02b_pandas_TP.qmd - - content/modelisation/0_preprocessing.qmd + - content/visualisation/index.qmd + - content/modelisation/index.qmd - content/NLP/index.qmd + - content/annexes/evaluation.qmd website: title: "Python pour la data science" diff --git a/content/annexes/evaluation.qmd b/content/annexes/evaluation.qmd index 4edc0f61c..0b1c6cfb9 100644 --- a/content/annexes/evaluation.qmd +++ b/content/annexes/evaluation.qmd @@ -6,94 +6,190 @@ description: | image: https://minio.lab.sspcloud.fr/lgaliana/generative-art/pythonds/kid.png --- -Résumé : +# Résumé * A la fin du semestre, les étudiants rendront un projet informatique par __groupe de 2-3 personnes.__ -* Ce projet dont le __sujet est libre__ devra comporter - - Un jeu de données (de préférence collecté par le groupe ou _a minima_ enrichi) - - De la visualisation - - De la modélisation +* Ce projet dont le __sujet est libre__ devra comporter: + - Une valorisation d'un ou plusieurs jeux de données _open data_ ou collectés par le biais de _scraping_ ou d'API ; + - De la visualisation ; + - De la modélisation. * Les étudiants sont invités à proposer des sujets qui leur plaisent, à faire valider par le chargé de TD. * __Le projet doit utiliser `Git` et être disponible sous -[Github](https://github.com/) ou [gitlab](https://gitlab.com/)__ (dépôt public ou dépôt privé à partager avec le chargé de TD) +[`Github`](https://github.com/) __ (dépôt public ou dépôt privé à partager avec le chargé de TD) ; +* Le projet doit être __reproductible__ sous peine de sanction forte. Cela implique des morceaux de code reproductibles, une description des dépendances et des explications si nécessaire sur la récupération des données ; * La __date du rendu__ est fixée au : **30 décembre 2023 23h59** * Le **12 janvier 2024**, auront lieu des __soutenances__ -## Attentes du projet +# Attentes du projet Le projet est une problématique à laquelle vous souhaitez répondre à l’aide d’un ou de plusieurs jeu(s) de données. -Il faut donc dans un premier temps se pencher sur la recherche de problématisation et de contextualisation. Nous vous recommandons de prendre un sujet qui vous intéresse pour intéresser également le lecteur. +Il faut donc dans un premier temps se pencher sur la recherche de problématisation et de contextualisation. Nous vous recommandons de prendre un sujet qui vous plaît afin d'être +motivé à impliquer le lecteur dans votre démarche. Trois dimensions doivent être présentes dans le projet. Pour chacune de ces parties, il est possible d’aller plus ou moins loin. Il est recommandé d’aller loin sur au moins une des 3 dimensions. -### La récupération et le traitement des données +## La récupération et le traitement des données -Ces données peuvent être directement disponibles sous la forme de fichiers txt, csv … ou provenir de sites internet (scraping, API). Plus le travail sur la récupération de données est important (par exemple scraping sur plusieurs sites), plus la partie obtiendra de points. Si le jeu de données utilisé est un téléchargement d’un jeu propre existant, il faudra chercher à le compléter d’une manière ou d’une autre pour obtenir des points sur cette partie. +Ces données peuvent être directement disponibles sous la forme de fichiers txt, csv … ou provenir de sites internet (scraping, API). Plus le travail sur la récupération de données est important (par exemple _scraping_ sur plusieurs sites, données croisées récupérées par le biais d'API et de fichiers...), plus la partie obtiendra de points. Si le jeu de données utilisé est un téléchargement d’un jeu propre existant, il faudra chercher à le compléter d’une manière ou d’une autre pour obtenir des points sur cette partie. -Vous obtiendrez vraisemblablement des données qui ne sont pas « propres » du premier coup : mettez en place des protocoles de nettoyage pour obtenir à la fin de cette étape un ou des jeux de données fiable et robuste pour mener ensuite votre analyse. C’est également le moment de créer des variables plus appréhendables, mieux identifiées etc. +Vous obtiendrez vraisemblablement des données qui ne sont pas « propres » du premier coup : mettez en place des protocoles de nettoyage pour obtenir à la fin de cette étape un ou des jeux de données fiable et robuste pour mener ensuite votre analyse. C’est également le moment de créer des variables plus appréhendables, mieux identifiées. N'oubliez pas de justifier les choix méthodologiques que vous avez pu faire car le chargé de TD ne connaît pas forcément la base de données en question. -### L’analyse descriptive et la représentation graphique +## L’analyse descriptive et la représentation graphique -La présence de statistiques descriptives est indispensable dans le projet. De la description de la base aux premières grandes tendances des données, cette partie permet d’avoir une vision globale des données : le lien avec la problématique, comment elle permet d’y répondre, quels sont les premiers éléments de réponse… Chaque résultat doit être interprété : pas la peine de faire un describe et de ne pas le commenter. - En termes de représentation graphique, plusieurs niveaux sont envisageables. Vous pouvez simplement représenter vos données en utilisant matplotlib, aller plus loin avec seaborn ou scikit-plot, (voire D3.js pour les plus motivés). La base d’une bonne visualisation est de trouver le type de graphique adéquat pour ce que vous voulez montrer (faut-il un scatter ou un line pour représenter une évolution ?) et de le rendre visible : une légende qui a du sens, des axes avec des noms etc. Encore une fois, il faudra commenter votre graphique, qu’est ce qu’il montre, en quoi cela valide / contredit votre argumentaire ? +La présence de statistiques descriptives est indispensable dans le projet. De la description de la base aux premières grandes tendances des données, cette partie permet d’avoir une vision globale des données : le lien avec la problématique, comment elle permet d’y répondre, quels sont les premiers éléments de réponse… Chaque résultat doit être interprété : pas la peine de faire un `describe` et de ne pas le commenter. -### La modélisation +En termes de représentation graphique, plusieurs niveaux sont envisageables, selon le degré d'approfondissement de cette partie. La base d’une bonne visualisation est de trouver le type de graphique adéquat pour ce que vous voulez montrer et de le rendre visible : une légende qui a du sens, des axes avec des noms etc. - Vient ensuite la phase de modélisation : un modèle peut être le bienvenu quand des statistiques descriptives ne suffisent pas à apporter une solution complète à votre problématique ou pour compléter / renforcer l’analyse descriptive. Le modèle importe peu (régression linéaire, random forest ou autre) : il doit être approprié (répondre à votre problématique) et justifié. +Encore une fois, il faudra commenter votre graphique: qu’est ce qu’il montre, en quoi cela valide / contredit votre argumentaire ? + + +::: {#nte-appli .callout-note collapse="true"} +## Les applications réactives + +Dans le cadre de ce cours, nous présentons plusieurs librairies graphiques permettant de créer des visualisations de données interactives, notamment `Plotly` ou `Leaflet`. Pour aller plus loin, vous pouvez désirer créer des applications encapsulant plusieurs graphiques construits automatiquement +en fonction de choix de l'utilisateur sur une interface graphique. + +Tout d'abord, ce n'est pas un prérequis pour ce cours. Le cours de 3e année ["Mise en production de projets de _data science_"](https://ensae-reproductibilite.github.io/website/) +que Romain Avouac et moi donnons à l'ENSAE vous permettra de mettre en oeuvre ceci, qui fait appel à des concepts plus avancés qu'une introduction à `Python` pour la science des données. + +C'est néanmoins un plus qui est apprécié et si vous désirez aller dans cette voie, il est recommandé de bien choisir son écosystème. Il vaut mieux mettre en oeuvre des _frameworks web_ modernes comme +`Streamlit` que des clients lourds comme `tkinter` qui rendent le code difficilement reproductible +car adhérant à une configuration logicielle. Pour en savoir plus, se reporter +à l'[introduction de la partie visualisation](/content/visualisation/index.qmd). + +Si vous faites une application réactive, vous n'êtes pas obligé de rédiger un _notebook_. +Cependant, faites en sorte que votre application propose une page présentant votre démarche +afin de faire comprendre à votre lecteur la problématique et les solutions mises en oeuvre. +Cette application doit être reproductible sur le `SSPCloud` par le biais, par exemple, +d'un `streamlit run`. Il est donc vivement recommandé de développer celle-ci sur le SSPCloud +où la reproductibilité est maximale. +::: + +## La modélisation + +Vient ensuite la phase de modélisation : un modèle peut être le bienvenu quand des statistiques descriptives ne suffisent pas à apporter une solution complète à votre problématique ou pour compléter / renforcer l’analyse descriptive. Le modèle importe peu (régression linéaire, random forest ou autre) : il doit être approprié (répondre à votre problématique) et justifié. Vous pouvez aussi confronter plusieurs modèles qui n’ont pas la même vocation : par exemple une CAH pour catégoriser et créer des nouvelles variables / faire des groupes puis une régression. Même si le projet n’est pas celui du cours de stats, il faut que la démarche soit scientifique et que les résultats soient interprétés. -## Format du rendu +# Format du rendu - Sur le format du rendu, vous devrez : +Sur le format du rendu, vous devrez : -* Écrire un rapport sous forme de `Notebook` (quelques exceptions à cette règle peuvent exister, par exemple si vous développer une appli `Dash`) -* Avoir un répertoire `Github` avec le rapport. Les données utilisées doivent être accessibles également, dans le dépôt ou sur internet. +* Écrire un rapport sous forme de _Notebook_ (quelques exceptions à cette règle peuvent exister, par exemple si vous développer une appli `Dash` ou `Streamlit` comme expliqué dans la @nte-appli) ou de `Quarto Markdown`. Soyez vigilant avec le contrôle de version (@imp-gitnb) +* Avoir un projet `Github` avec le rapport. Les données utilisées doivent être accessibles également, dans le dépôt, sur internet ou sur l'espace de stockage du `SSPCloud` (@tip-s3). * Les __dépôts `Github` où seul un *upload* du projet a été réalisé seront pénalisés__. A l'inverse, les dépôts dans lequels le contrôle de version et le travail collaboratif ont été activement pratiqués (`commits` fréquents, `pull requests`, ..) seront valorisés. * Le code contenu dans le rapport devra être un maximum propre (pas de copier coller de cellule, préférez des fonctions) -[Ce post](https://towardsdatascience.com/8-guidelines-to-create-professional-data-science-notebooks-97572894b2e5) donne -quelques conseils pour avoir des notebooks agréables à lire. N'oubliez pas cette règle : -> code is read much more often than written -Lors de l'évaluation, une attention particulière sera donnée à la *reproductibilité* de votre projet. -Chaque étape (récupération et traitement des données, analyses descriptives, modélisation) doit pouvoir être reproduite à partir du notebook final. Pour les opérations qui prennent du temps (ex : web scraping massif, requêtage d'API avec des limites de nombre de requêtes, entraînement de modèle, etc.), vous devez inclure l'output (base de données, modèle entraîné..) dans le dépôt, afin que les étapes suivantes puissent s'éxecuter sans problème. -Le test à réaliser : faire tourner toutes les cellules de votre notebook et ne pas avoir d’erreur est une condition _sine qua non_ pour avoir la moyenne. +::: {#imp-gitnb .callout-important collapse="true"} +## `Git` et les _notebooks_ + +Faites attention au contrôle de version avec les _notebooks_, cela ne fait pas toujours bon ménage. + +Comme expliqué dans le [chapitre sur `Git`](/content/git/exogit.qmd), lorsque vous travaillez sur le même fichier en même temps vous pouvez vous retrouver avec un conflit de version lorsque vous résolvez les différences dans vos dépôts. +Dans les _notebooks_ cela peut se traduire par de multiples conflits de version car deux _notebooks_ en apparence similaires peuvent contenir beaucoup d'éléments différents dans les fichiers bruts (un `JSON` assez complexe, embarquant notamment des _id_ d'exécution de cellules changeant systématiquement). Un _merge_ mal géré peut rendre un _notebook_ invalide. + +Il est recommandé de ne pas travailler sur un même _notebook_ sur une même branche en même temps. Cela fait donc beaucoup de conditions pour arriver à un conflit de version mais dans le _rush_ inhérent à tout projet cela peut vite arriver. Outre la coordination, nous pouvons vous conseiller +de déporter une partie du code dans des fichiers `.py` importés sous forme de module par le _notebook_. De toute manière, c'est une bonne pratique de ne pas accumuler de trop longues instructions de code dans un _notebook_ car cela freine la lisibilité et l'intelligibilité de celui-ci. +::: + + +::: {#tip-s3 .callout-tip collapse="true"} +## Sauvegarder des données sur le système de stockage du `SSPCloud` + +⚠️ __Cette approche n'est pertinente que pour des données dont le temps d'acquisition est suffisamment long pour être dérangeant et ne doit pas être considéré comme une carte blanche à l'absence de reproductibilité.__ +Il peut être pénible de refaire tourner fréquemment le code de récupération des données, notamment +si celui-ci est long. Sous cette condition, il est normal de vouloir écrire des données +intermédiaires pour des analyses ultérieures (au format `CSV` ou encore mieux au format `Parquet`). +Se pose alors la question de l'enregistrement pérenne de celles-ci, les conteneurs sur le +_SSPCloud_ n'étant pas persistant. -## Barème approximatif +Ces données ne doivent pas être mises dans le dépôt `Github`, ce n'est pas le lieu adapté. +Pour le stockage pérenne de données, le _sspcloud_ propose un système de +stockage `S3` (technologie identique à celle des principaux _cloud providers_). +Dans un service ayant moins de 24 heures, afin d'avoir des jetons de connexion +n'étant pas périmés, on instancie la connexion avec -* Données (collecte et nettoyage) : 4 points -* Analyse descriptive : 4 points -* Modélisation : 2 points -* Démarche scientifique et reproductibilité du projet : 4 points -* Format du code (code propre et github) : 2 points -* Soutenance : 4 points +```python +import s3fs +fs = s3fs.S3FileSystem( + client_kwargs={'endpoint_url': 'https://'+'minio.lab.sspcloud.fr'} +) +``` -Le projet doit être réalisé en groupe de trois, voire deux. +Cette connexion permet de créer un système de fichier distant +comme si on était en local. +Pour écrire un fichier au format `Parquet` sur cet espace avec `Pandas`, il suffit +de partir du modèle suivant + +```python +with fs.open("s3///.parquet") as f: + df.to_parquet(f) +``` + +Ce principe peut être utilisé pour tout type d'objet, en prenant +le format adéquat. + +A ce stade, ce fichier est privé. Il n'est donc pas lisible +par un autre utilisateur. Pour le rendre disponible à quelqu'un +d'autre, il faut rendre disponible ce fichier à un accès _anonyme_. Pour +cela, en ligne de commande il faut faire: + +```shell +mc anonymous set download s3///.parquet +``` + +Ce fichier devient disponible à n'importe qui par un lien HTTPS. Pour le +lire, il suffira de faire + +```python +import pandas as pd +pd.read_parquet("https://minio.lab.sspcloud.fr///.parquet") +``` + +Pour en savoir plus sur le système S3, les +librairies `Python` ou les différentes +manières de procéder, consulter [ce chapitre](/content/modern-ds/s3.qmd) + +::: + + + +# Barème approximatif + +| Catégorie | Points | +|---------------------------------------------------|--------| +| Données (collecte et nettoyage) | 4 | +| Analyse descriptive | 4 | +| Modélisation | 2 | +| Démarche scientifique et reproductibilité du projet | 4 | +| Format du code (code propre et github) | 2 | +| Soutenance | 4 | + +Lors de l'évaluation, une attention particulière sera donnée à la *reproductibilité* de votre projet. +Chaque étape (récupération et traitement des données, analyses descriptives, modélisation) doit pouvoir être reproduite à partir du notebook final. + +Le test à réaliser : faire tourner toutes les cellules de votre notebook et ne pas avoir d’erreur est une condition _sine qua non_ pour avoir la moyenne. -## Projets menés par les étudiants +# Projets menés par les étudiants 😍 | Projet | Auteurs | URL projet | Tags | |--------|---------|------------|------| -| GPS vélo intégrant les bornes Vélib, les accidents, la congestion et la météo | Vinciane Desbois ; Imane Fares ; Romane Gajdos | https://github.com/ImaneFa/Projet_Python | Vélib ; Pistes cyclables ; Accidents ; Folium| -| Quiz Generator | Adrien Servière ; Mélissa Tamine | https://github.com/taminemelissa/quiz-generator | Machine Learning ; Natural Language Processing ; Question Generation ; Word2Vec | -| Analyse de sentiments sur les vaccins COVID administrés en France | KOAGNE FONGUIENG Florette ; KONKOBO Idrissa | https://github.com/kidrissa/projetpy | API ; NLP ; Wordcloud ; Modélisation prédictive| -| Estimation de l'empreinte carbone d'une recette de cuisine | Jean-Baptiste Laval ; Hadrien Lolivier ; Sirine Louati | https://github.com/sirinelouati/Plat_CO2 | scraping ; Dashboard ; Empreinte carbone ; Alimentation | -| Le "bon sens du boucher-charcutier de Tourcoing vaut-il mieux que les enquêtes de victimation ?" | Conrad Thiounn ; Gaston Vermersch | https://github.com/cthiounn/python-datascience-ENSAE-2A | API ; Open-data ; ACP ; CAH ; LASSO | -| Prédiction du revenu généré par un film en fonction de ses caractéristiques | Dmitri Lebrun ; Corentin Pernot ; Nina Stizi | https://github.com/NinaStizi/Python_ENSAE_2A | Scrapping ; Cinéma ; Machine Learning | -| Analyse du réseau ferré de la SNCF: Comment expliquer les retards permanents de la compagnie française ? | Diego Renaud ; Victor Parent ; Marion Chabrol | https://github.com/NinaStizi/Python_ENSAE_2A | API ; SNCF ; LASSO | -| Le "bon sens du boucher-charcutier de Tourcoing vaut-il mieux que les enquêtes de victimation ?" | Conrad Thiounn ; Gaston Vermersch | https://github.com/cthiounn/python-datascience-ENSAE-2A | API ; Open-data ; ACP ; CAH ; LASSO | -| Prédiction du revenu généré par un film en fonction de ses caractéristiques | Dmitri Lebrun ; Corentin Pernot ; Nina Stizi | https://github.com/NinaStizi/Python_ENSAE_2A | Scrapping ; Cinéma ; Machine Learning | -| Analyse du réseau ferré de la SNCF: Comment expliquer les retards permanents de la compagnie française ? | Diego Renaud ; Victor Parent ; Marion Chabrol | https://github.com/NinaStizi/Python_ENSAE_2A | API ; SNCF ; LASSO | +| GPS vélo intégrant les bornes Vélib, les accidents, la congestion et la météo | Vinciane Desbois ; Imane Fares ; Romane Gajdos | [https://github.com/ImaneFa/Projet_Python](https://github.com/ImaneFa/Projet_Python) | Vélib ; Pistes cyclables ; Accidents ; Folium| +| Quiz Generator | Adrien Servière ; Mélissa Tamine | [https://github.com/taminemelissa/quiz-generator](https://github.com/taminemelissa/quiz-generator)| Machine Learning ; Natural Language Processing ; Question Generation ; Word2Vec | +| Estimation de l'empreinte carbone d'une recette de cuisine | Jean-Baptiste Laval ; Hadrien Lolivier ; Sirine Louati | [https://github.com/sirinelouati/Plat_CO2](https://github.com/sirinelouati/Plat_CO2) | scraping ; Dashboard ; Empreinte carbone ; Alimentation | +| Le "bon sens du boucher-charcutier de Tourcoing vaut-il mieux que les enquêtes de victimation ?" | Conrad Thiounn ; Gaston Vermersch | [https://github.com/cthiounn/python-datascience-ENSAE-2A](https://github.com/sirinelouati/Plat_CO2) | API ; Open-data ; ACP ; CAH ; LASSO | +| Prédiction du revenu généré par un film en fonction de ses caractéristiques | Dmitri Lebrun ; Corentin Pernot ; Nina Stizi | [https://github.com/NinaStizi/Python_ENSAE_2A](https://github.com/sirinelouati/Plat_CO2) | Scrapping ; Cinéma ; Machine Learning | +| Analyse du réseau ferré de la SNCF: Comment expliquer les retards permanents de la compagnie française ? | Diego Renaud ; Victor Parent ; Marion Chabrol | [https://github.com/NinaStizi/Python_ENSAE_2A](https://github.com/NinaStizi/Python_ENSAE_2A) | API ; SNCF ; LASSO |