# Mission 1: 26/09/23 ## Exo 1: Recherche Gitlab 1. Retrouver une chaîne de caractères dans un dépôt de fichiers versionnés. Les deux fichiers contenant la chaîne de caractères **"LE MOOC RECHERCHE REPRODUCTIBLE C'EST GENIAL"** sont: - module1/exo1/aebef6b0a5.txt - module1/exo1/f683bbad4b.txt 2. Retrouver des modifications effectuées dans un dépôt avec l'historique - Numéro du commit: **505c4e26afaeaae6f563fe8b593155ec9d6210ca** - Auteur du commit: **Arnaud Legrand** ## Exo 2: Ecrire un fichier Markdown On devait reproduire ce [fichier PDF](https://lms.fun-mooc.fr/asset-v1:inria+41016+self-paced+type@asset+block/module1_exo2_fichier-markdown.pdf). - Pour écrire en **itallique**, on met le texte entre deux * - Pour écrire en **gras**, on met le texte entre deux ** - Pour **barrer le texte**, on le met entre deux tildes - Pour mettre un **lien hypertexte**: [Nom du lien] Puis l'adress du lien entre (). - Pour les **listes à puces**, on met des tirets, puis espace/tiret pour les sous-items - Pour les **numérotations**, idem que les tirets: 1. 2. ... - Pour les extraits de **code**: entre deux ` - Pour les **images**, c'est pareil que les liens mais avec un ! devant. ## Exo 3: Journal de bord J'ai commencé de journal de bord que je completerai à chaque mission. Pour cela je me suis servie de ce que j'ai appris sur le Mooc pour la mise en page. ## En résumé Dans Gitlab on peut: - Rechercher un fichier avec la barre "Search or jump to" - Retrouver des modifications effectuées dans un dépôt comprenant un grand nombre de commits par divers contributeurs du projet - Retrouver les noms des auteurs de ces commits En Markdown, on peut: 1. Faire des listes comme celle-ci 2. Ecrire en gras, itallique, barré, ... 3. Ecrire du code 4. Mettre des images 5. Insérer des liens hypertexte # Mission 2: 03/10/23 ## Exo 1: Savoir utiliser un notebook On devait refaire un pdf à partir d'un Jupyter vierge. J'ai déjà utilisé Jupyter notebook donc c'était la partie simple. - Pour les titres, c'est avec les # en mettant le format de la cellule en "markdown". - Pour les textes, on met aussi le format de la cellule en "markdown". - Pour les paramètres spéciaux de textes (gras, itallique, hyperline, ...) c'est en langage markdown. - Pour les maths dans le texte, on écrit en langage Latex. - Pour le code, on écrit simplement du code. Ensuite on compare avec le modèle, on commit et on valide tout. ## Exo 2: Savoir faire un calcul simple soi-même Calculer les valeurs statistiques avec Jupyter: on utilise juste les fonctions python. ``` import numpy as np # Tableau de base: a= 14.0, 7.6, 11.2, 12.8, 12.5, 9.9, 14.9, 9.4, 16.9, 10.2, 14.9, 18.1, 7.3, 9.8, 10.9,12.2, 9.9, 2.9, 2.8, 15.4, 15.7, 9.7, 13.1, 13.2, 12.3, 11.7, 16.0, 12.4, 17.9, 12.2, 16.2, 18.7, 8.9, 11.9, 12.1, 14.6, 12.1, 4.7, 3.9, 16.9, 16.8, 11.3, 14.4, 15.7, 14.0, 13.6, 18.0, 13.6, 19.9, 13.7, 17.0, 20.5, 9.9, 12.5, 13.2, 16.1, 13.5, 6.3, 6.4, 17.6, 19.1, 12.8, 15.5, 16.3, 15.2, 14.6, 19.1, 14.4, 21.4, 15.1, 19.6, 21.7, 11.3, 15.0, 14.3, 16.8, 14.0, 6.8, 8.2, 19.9, 20.4, 14.6, 16.4, 18.7, 16.8, 15.8, 20.4, 15.8, 22.4, 16.2, 20.3, 23.4, 12.1, 15.5, 15.4, 18.4, 15.7, 10.2, 8.9, 21.0 np.mean(a) 14.113000000000001 np.min(a) 2.8 np.max(a) 23.4 np.median(a) 14.5 np.std(a, ddof=1) 4.334094455301447 ``` ## Exo 3: Réaliser un affichage graphique On devait reproduire les graphiques du modèle. Python normal. ``` import matplotlib.pyplot as plt a=14.0, 7.6, 11.2, 12.8, 12.5, 9.9, 14.9, 9.4, 16.9, 10.2, 14.9, 18.1, 7.3, 9.8, 10.9,12.2, 9.9, 2.9, 2.8, 15.4, 15.7, 9.7, 13.1, 13.2, 12.3, 11.7, 16.0, 12.4, 17.9, 12.2, 16.2, 18.7, 8.9, 11.9, 12.1, 14.6, 12.1, 4.7, 3.9, 16.9, 16.8, 11.3, 14.4, 15.7, 14.0, 13.6, 18.0, 13.6, 19.9, 13.7, 17.0, 20.5, 9.9, 12.5, 13.2, 16.1, 13.5, 6.3, 6.4, 17.6, 19.1, 12.8, 15.5, 16.3, 15.2, 14.6, 19.1, 14.4, 21.4, 15.1, 19.6, 21.7, 11.3, 15.0, 14.3, 16.8, 14.0, 6.8, 8.2, 19.9, 20.4, 14.6, 16.4, 18.7, 16.8, 15.8, 20.4, 15.8, 22.4, 16.2, 20.3, 23.4, 12.1, 15.5, 15.4, 18.4, 15.7, 10.2, 8.9, 21.0 plt.plot(a, color='b') plt.grid(color='gray', linestyle='--') plt.hist(a, color='b', edgecolor = 'k') plt.grid(color='gray', linestyle='--') ``` # Mission 3: 10/10/23 ## Exo 1: Analyse de l'incidence du syndrôme grippal avec une copie locale des données - Apprendre à télécharger des données depuis un fichier local - Tester que le fichier local n'existe pas encore avant de le télécharger - Faire un fichier Jupyter structuré avec certaines cellules de commentaires pour s'y retrouver - Commit & Push dans Gitlab, pour avoir une trace dans Gitlab - Comparer avec la solution, corriger et valider l'exercice ## Exo 2: Analyse de l'incidence de la varicelle On fait le même code Jupyter qu'avec la grippe, mais avec d'autres données. J'ai téléchargé les données de l'incidence de la varicelle sur le site du Réseau Sentinelles, puis j'ai déroulé les volets. Il faut néanmoins corriger certaines choses puisque les odnnées ne sont pas identique à la grippe (obv), donc c'était galère. Ensuite on fait les plots de l'incidence, on classe les quantités dans l'ordre et on regarde le minimum et le maximum. Conclusion: L'année où la varicelle a fait le plus de contaminations est l'année 2009, et l'année la plus tranquille est l'année 2020. # Mission 4: 17/10/23 ## Exo1: Écrire un document computationnel Il fallait choisir un des sujets dans la liste faire une analyse des données associées sous forme d'un document computationnel. J'ai choisi le Sujet 5 : Analyse des dialogues dans l'Avare de Molière. Pour ce sujet, il fallait: - Classer les personnages selon la quantité de parole grâce à une analyse syntaxique du texte (scènes / répliques / mots). En particulier, quel est celui qui parle le plus ? Quel est celui qui ne parle pas du tout ? - Réaliser un graphique qui montrera le nombre de mots que chaque acteur prononce dans chaque scène en s'inspirant de l'étude de l'Avare de Molière réalisée par l'OBVIL. J'ai d'abord importé le texte et séparé toutes les scènes et toutes les lignes. Pour savoir combien de fois un personnage prenait la parole, il fallait chercher combien de fois son nom apparaissait seul sur une ligne (annonce du nom du personnage avant qu'il parle), sinon ça marche pas car ils peuvent dire le nom de quelqu'un sans que cette personne ne parle. J'ai noté ce nombre (le nombre de fois où le personnage intervient dans la scène) pour chaque scène et pour chaque personnage dans des tableaux. Comme il y a 32 scènes et 13 personnages (14 mais yen a un qui parle pas), cela donne quelque chose comme ça: | | HARPAGON | VALÈRE | ÉLISE | ... 13 | | :---------: |:---------:| :-----:| :-----:|:-----:| | Scène 1 | 2 | 0 | 8 | 44 | | Scène 2 | 32 | 6 | 0 | 2 | | Scène 3 | 0 | 6 | 5 | 1 | | ... 32 | ... | ... | ... | ... | Les 0 signifient que les personnages ne parlent pas de toute la scène. Maintenant on doit tracer les diagrammes pour chaque scène. Pour cela, j'ai choisi de faire 32 graphiques en camembert. Pour finir, j'ai fait un gros diagramme pour montrer la proportion des interventions des personnages dans la pièce entière. Pour voir tous les graphiques, cf fichier jupyter. # Mission 5: 21/11/23 Sujet 5 : Analyse des dialogues dans l'Avare de Molière. J'avais déjà un peu expliqué les étapes pour la mission 4, donc voici les étapes plus détaillées. Objectifs du projet: - Classer les personnages selon la quantité de parole grâce à une analyse syntaxique du texte (scènes / répliques / mots). En particulier, quel est celui qui parle le plus ? Quel est celui qui ne parle pas du tout ? - Réaliser un graphique qui montrera le nombre de mots que chaque acteur prononce dans chaque scène en s'inspirant de l'étude de l'Avare de Molière réalisée par l'OBVIL. ## 1) Importation des données Pour utiliser n'importe quelle donnée dans un code python, il faut évidemment y avoir accès. Il faut alors importer le texte de la pièce dans le code. D'abord on écrit l'URL du fichier texte: ``` url = "https://dramacode.github.io/markdown/moliere_avare.txt" ``` Puis on ouvre l'URL et on lit le contenu en tant que fichier texte: ``` with urllib.request.urlopen(url) as response: data = response.read() ``` On appelle "texte" tous les caractères du texte en entier, c'est à dire le fichier texte qu'on utilisera: ``` texte = io.StringIO(data.decode('utf-8')).read() % ``` ## 2) Compter le nombre d'interventions de chaque personnage La variable suivante est le compteur pour stocker le nombre d'occurrences du mot. Le "[]" signifie que c'est un tableau vide pour l'instant. ``` compteurs_occurrences = [] ``` Les scènes de la pièce sont séparées par des "###" dans le fichier texte. Donc on va séparer les scènes en utilisant cela: le "split("###")" sépare donc les scènes: ``` with urllib.request.urlopen(url) as response: parties_texte = response.read().decode('utf-8').split('###')[1:] ``` Une fois que les scènes sont séparées (on appellera une scène une "partie" à partir de maintenant), on doit trouver combien de fois chaque personnage parle pour chaque partie. On ne peut pas juste rechercher combien de fois le nom du personnage apparaît, puisqu'il peut être mentionné par un autre sans pour autant parler. Quand un personnage parle, il est noté **seul sur une ligne** de cette façon: **"HARPAGON."** (ne pas oublier le point). Donc on doit parcourir chaque partie du texte, et on compte combien de fois le mot apparaît seul sur une ligne: ``` mot_a_chercher = "HARPAGON." # C'est un exemple, mais il faudra faire cela pour tous les personnages. Dans le code il y a une liste de tous les personnages commentés for partie in parties_texte: # = "Pour chaque partie du texte:" lignes = partie.strip().splitlines() # on divise la partie en lignes compteur_occurrences = 0 # On définit le "Compteur d'occurrences" pour cette partie, il est égal à 0 pour l'instant. for ligne in lignes: # = "Pour chaque ligne de la partie en question:" if ligne.strip() == mot_a_chercher: # Si le mot apparaît seul sur la ligne (par exemple si la ligne = "HARPAGON."), compteur_occurrences += 1 # On ajoute +1 au décompte du total de combien de fois le mot apparaît dans la partie compteurs_occurrences.append(compteur_occurrences) # Ajoute le compteur d'occurrences de cette partie à la liste des compteurs ``` Si on veut savoir le résultat de cette boucle, on peut afficher le nombre d'occurrences du mot dans chaque partie du texte: ``` for i, occurrences in enumerate(compteurs_occurrences, start=1): # Pour chaque valeur de "compteurs_occurences", print(f"Le mot '{mot_a_chercher}' apparaît {occurrences} fois dans la partie {i} du texte.") # Ecrire "Le mot 'HARPAGON.' apparaît 6 fois dans la partie 2 du texte." (exemple) ``` Autrement dit, le résultat du print est que le nom "HARPAGON." apparaît x fois dans la partie 1, y fois dans la partie 2, etc. Mais pour stocker ces résultats, on va les mettre dans des tableaux. ## 3) Stocker les données du nombre d'interventions de chaque personnage D'abord, on fait un tableau avec chaque personnage. Ce sera la base du tableau qu'on va construire. ``` personnages=["HARPAGON", "VALÈRE", "ÉLISE", "CLÉANTE", "LA FLÈCHE", "MARIANE", "ANSELME", "FROSINE", "MAÎTRE SIMON", "MAÎTRE JACQUES", "BRINDAVOINE", "LA MERLUCHE", "LE COMMISSAIRE"] ``` J'ai alors recopié les résultats des compteurs pour chaque personnage et chaque scène dans des tableaux sous cette forme (Les 0 signifient que les personnages ne parlent pas de toute la scène): | | HARPAGON | VALÈRE | ÉLISE | CLEANTE | ... 13 | | :---------: |:---------:| :-----:| :-----:|:-----:|:-----:| | Partie 1 | 0 | 8 | 8 | 0 |... | | Partie 2 | 0 | 0 | 9 | 10 |... | | Partie 3 | 34 | 0 | 0 | 0 |... | | ... 32 | ... | ... | ... | ... |... | Comme il y a 32 scènes et 13 personnages (14 mais yen a un qui parle pas), on a 32 tableaux d'une ligne sous le tableau des noms. Voici les 32 tableaux pour chaque partie, le premier chiffre correspond au nombre d'interventions d'Harpagon, le deuxième chiffre pour Valère, etc: ``` partie1=[0,8,8,0,0,0,0,0,0,0,0,0,0] partie2=[0,0,9,10,0,0,0,0,0,0,0,0,0] partie3=[34,0,0,0,32,0,0,0,0,0,0,0,0] partie4=[53,0,23,29,0,0,0,0,0,0,0,0,0] partie5=[20,22,4,0,0,0,0,0,0,0,0,0,0] partie6=[0,0,0,21,20,0,0,0,0,0,0,0,0] partie7=[9,0,0,6,1,0,0,0,5,0,0,0,0] partie8=[1,0,0,0,0,0,0,1,0,0,0,0,0] partie9=[0,0,0,0,6,0,0,5,0,0,0,0,0] partie10=[35,0,0,0,0,0,0,35,0,0,0,0,0] partie11=[34,11,1,3,0,0,0,0,0,27,1,2,0] partie12=[0,11,0,0,0,0,0,0,0,11,0,0,0] partie13=[0,0,0,0,0,0,0,2,0,1,0,0,0] partie14=[0,0,0,0,0,0,0,5,0,0,0,0,0] partie15=[2,0,0,0,0,0,0,1,0,0,0,0,0] partie16=[6,0,1,0,0,1,0,1,0,0,0,0,0] partie17=[9,0,0,20,0,10,0,5,0,0,0,0,0] partie18=[2,0,0,0,0,0,0,0,0,0,2,0,0] partie19=[6,2,0,2,0,0,0,0,0,0,0,3,0] partie20=[0,0,2,10,0,6,0,6,0,0,0,0,0] partie21=[3,0,1,1,0,0,0,0,0,0,0,0,0] partie22=[23,0,0,22,0,0,0,0,0,0,0,0,0] partie23=[8,0,0,8,0,0,0,0,0,17,0,0,0] partie24=[18,0,0,19,0,0,0,0,0,0,0,0,0] partie25=[0,0,0,5,5,0,0,0,0,0,0,0,0] partie26=[1,0,0,0,0,0,0,0,0,0,0,0,0] partie27=[6,0,0,0,0,0,0,0,0,0,0,0,7] partie28=[19,0,0,0,0,0,0,0,0,22,0,0,8] partie29=[30,30,0,0,0,0,0,0,0,0,0,0,0] partie30=[4,1,1,0,0,0,0,1,0,0,0,0,0] partie31=[11,14,0,0,0,3,14,0,0,0,0,0,0] partie32=[10,0,0,4,0,1,6,0,0,0,0,0,2] ``` Il est plus facile de comprendre ces listes en les comparant avec le tableau ci-dessus. ## 4) Tracer les données Pour que les données soient plus visuelles (sous forme de tableau c'est moins visuel), on fait des diagrammes proportionnels (camemberts). ``` %matplotlib notebook # Amélioration des graphiques sur Jupyter fig, axs = plt.subplots(2, 4, figsize=(14,6)) # "fig, axs" sont les paramètres de la fenêtre de plot (plot=graphique): longueur = 6 et largeur = 14 for i in range(2): # On veut 2 lignes... for j in range(4): # ...de 4 graphiques axs[i, j].set_title(f'Scène {i * 4 + j + 1}') # Le titre de chaque graphique est "Scène 1", "Scène 2", ... axs[0, 0].pie(partie1, labels=personnages) # "axs[0,1]" c'est pour dire de quel plot on parle. C'est les coordonnées du plot. Là c'est [0,0] donc dans la première colonne de la première ligne. axs[0, 1].pie(partie2, labels=personnages) # "pie" = tarte, le mot anglais pour le graphique camembert. Là on plot le camembert de la partie 2 axs[0, 2].pie(partie3, labels=personnages) # "labels" c'est pour dire que les titres des parts du camembert sont dans le tableau "personnages", cad qu'on attribue les parts du camembert aux personnages qui correspondent. axs[0, 3].pie(partie4, labels=personnages) # Idem pour la partie 4, etc. axs[1, 0].pie(partie5, labels=personnages) axs[1, 1].pie(partie6, labels=personnages) axs[1, 2].pie(partie7, labels=personnages) axs[1, 3].pie(partie8, labels=personnages) ``` J'ai pas mis toutes les lignes, mais on fait pareil jusqu'à la partie 32. ## 5) Proportion d'intervention dans toute la pièce On fait la même chose mais sans séparer les scènes. Cette fois on veut savoir la proportion de parole de chaque personnage dans toute la pièce. Pour cela, c'est le même code sans séparer les parties: ``` url = "https://dramacode.github.io/markdown/moliere_avare.txt" # On importe l'URL du fichier texte mot_a_chercher = "HARPAGON." # C'est un exemple, après on change le nom def get_text_from_url(url): # Fonction pour récupérer le contenu du fichier texte à partir d'une URL. Pas intéressant. response = requests.get(url) if response.status_code == 200: return response.text else: return None text_content = get_text_from_url(url) # texte_content = le résultat de la fonction, cad le texte. if text_content: # "Dans le texte," lignes = text_content.lower().splitlines() # On sépare les lignes. occurrences = sum(1 for ligne in lignes if ligne.strip() == mot_a_chercher.lower()) # Occurence = la somme de tous les "HARPAGON." dans le texte. print(f"Le mot '{mot_a_chercher}' apparaît seul sur une ligne {occurrences} fois dans le texte.") # Ecrire le nombre de fois que le personnage intervient en tout. else: print("Impossible de récupérer le contenu du fichier texte depuis l'URL.") # Uniquement si il y a un problème dans l'importation du texte. ``` Résultats: ``` HARPAGON=344 VALERE=99 ELISE=50 CLEANTE=160 LA_FLECHE=64 MARIANE=27 ANSELME=20 FROSINE=59 MAITRE_SIMON=5 MAITRE_JACQUES=84 BRINDAVOINE=3 LA_MERLUCHE=5 LE_COMMISSAIRE=17 ``` Maintenant il faut tracer ces résultats, un ultime camembert: ``` Donnees=[344, 99, 50, 160, 64, 27, 20, 59, 5, 84, 3, 5, 17] # Les nombres d'interventions de chaque personnage dans l'ordre Noms=["HARPAGON", "VALERE", "ELISE", "CLEANTE", "LA_FLECHE", "MARIANE", "ANSELME", "FROSINE", "MAITRE_SIMON", "MAITRE_JACQUES", "BRINDAVOINE", "LA_MERLUCHE", "LE_COMMISSAIRE"] plt.figure(figsize=(10,10)) # Faire une figure de 10 fois 10 de côté. plt.title("Proportions d'interventions par personnages dans \"l'Avare\" de Molière") # Mettre le titre du graphique plt.pie(Donnees, labels=Noms) # Pie = camembert, labels = nom des personnages pour chaque part plt.show() # Afficher le graphique ``` ## Résumé - On commence par importer la pièce en fichier texte - On sépare le texte par scènes et par lignes - On compte combien de fois chaque personnage intervient - On fait des tableaux pour regrouper ces quantités - A partir des tableaux on plot les données sous forme de pie - On recommence pour les valeurs dans le texte entier: - On sépare le texte par lignes seulement - On compte combien de fois chaque personnage intervient - On en fait un tableau (bcp plus petit que dans la première partie) - On plot le résultat pour savoir à quelles proportions les personnages interviennent dans la pièce l'Avare de Molière. Pour aller plus loin, on pourrait compter le nombre de caractères de chaque personnage, pour savoir la proportion réelle de parole (en termes de longueur d'intervention).