Semaine 3 - Étude scientifique complète · 20 % de la note
420-SN1-RE - Programmation en sciences
Carnet de mission - Dre Maya de la Boucle
Quelque part dans l'espace
Dernière mission, et pas la plus petite : l'espace. Après le volcan et la forêt, je veux mener une vraie petite étude scientifique, du début à la fin.
Partir de données, en sortir des statistiques, tracer la relation entre deux grandeurs, et surtout prédire une mesure que je n'ai pas encore observée. - Maya
Ta mission
ENTRÉE
Les données de ton sujet (par URL ou fichier)
➞
TRAITEMENT
Statistiques descriptives avec numpy
Régression : la droite d'ajustement
Prédire la valeur de Maya
➞
SORTIE
Des graphiques habillés, un rapport et une prédiction
Les ingrédients obligatoires
Téléchargement des données (URL ou Drive)
Statistiques descriptives & Comparaisons
Prédiction de formule ou valeur
3 graphiques ou plus, dont le nuage + la droite
Un jeu d'essais (assert) et une conclusion
Les fonctions à programmer
Invente tes propres noms ! Un verbe à l'infinitif qui décrit ce que fait la fonction, adapté à ton sujet. Voici juste des exemples.
lireTrucs()
calculerStatistiquesTrucs()
presenterStatistiques(statistiques)
afficherGraphiqueBlabla()
tracerDescriptif(…)
executer()
Remplace Trucs et Blabla par le nom de ce que tu étudies (ex : lireExoplanetes()).
La même colonne vertébrale technique pour tous les sujets.
Les données
Choisir ton sujet, comprendre le fichier, le charger.
Choisis ton monde (le menu)
#
Sujet
Relation (x → y)
Catégorie
À prédire
1
Exoplanètes
rayon → masse
rocheuse / gazeuse
la masse d'une planète découverte
2
Loi de Hubble
distance → vitesse
proche / lointaine
la vitesse d'une galaxie (+ la constante de Hubble)
3
Étoiles (diagramme HR)
température → luminosité
naine / géante
la luminosité d'une étoile
4
Lunes de Jupiter
distance → période
interne / externe
la période orbitale d'une lune
5
Cratères lunaires
diamètre → profondeur
jeune / ancien
la profondeur d'un cratère
6
Astéroïdes
diamètre → rotation
ceinture / géocroiseur
la période de rotation
7
Un autre monde
un autre jeu que tu trouves toi-même (NASA, USGS, JPL, ESA…) : deux grandeurs reliées + une catégorie + assez de lignes, à faire approuver au jour 1
Un seul sujet à choisir. Tous demandent les mêmes ingrédients : c'est ce qui est corrigé.
Tu déclares ton sujet en classe et sur Zulip dès le premier jour.
Tu l'inscris dans la cellule « Je choisis mon sujet » en haut du calepin.
Pour l'option 7 (tes propres données), tu fais approuver ton jeu par la prof.
Sources pour l'option 7 :
NASA Exoplanet Archive
USGS / NASA Earthquake Catalog
JPL Small-Body Database / NASA NEO
NASA Open Data Portal (data.nasa.gov)
ESA / Gaia (catalogues d'étoiles)
OGSL - Saint-Laurent (l'océan, un monde lointain + satellites) : catalogue.ogsl.ca
Condition : deux grandeurs numériques reliées, une catégorie, et assez de lignes.
Les données de ton sujet
Un fichier .csv : les deux grandeurs étudiées, puis une catégorie.
rayon,masse,categorie
0.58,0.10,rocheuse
1.20,3.05,rocheuse
2.50,7.80,gazeuse
3.50,11.6,gazeuse
4.30,14.1,gazeuse
Tu charges au choix par URL distanteou par URL de fichier téléversé sur le Drive.
⚠ Tes données doivent persister : charge-les par URL ou depuis ton Drive. Ne téléverse pas le fichier dans content/ de Colab - il est effacé à la fermeture de la session. 👉 Voir le truc sur les URL
Les règles d'or des données
✅ Ce qu'il FAUT
Au moins 100 données (100 lignes ou plus).
Une source scientifique, technique ou encyclopédique (NASA, agence, base de données reconnue…).
Charger avec !wget et une URL : soit celle du fournisseur scientifique, soit celle de ton fichier déposé dans le Drive.
❌ Ce qui est INTERDIT
Écrire le fichier toi-même avec open(..., "w") et des données hard-codées dans le code.
Téléverser le fichier avec le bouton upload dans content/ de Colab.
Des données générées par une IA (inventées de toutes pièces).
!wget -O exoplanetes.csv "https://…/donnees.csv"
Une IA peut convertir un format de données (ex : JSON → CSV) si tu le souhaites, mais elle ne fabrique jamais les mesures.
Les calculs mathématiques
Statistiques, droite d'ajustement et prédiction.
Les statistiques à calculer
Pour toutes les données...
Le nombre de données (combien de mesures en tout).
Au moins 2 moyennes et leur écart-type, sur deux grandeurs (champs) différentes.
Pour un seul nouveau champ ajouté ou calculé, on divise le groupe total en au moins deux sous-groupes et...
Au moins un décompte, une énumération, par catégorie (combien dans chaque sous-groupe).
Au moins une moyenne comparée entre sous-groupes.
Le minimum obligatoire - tu peux en calculer davantage.
Découper en sous-groupes
Choisis un critère qui range tes données en familles : tu comptes combien il y en a dans chacune (le décompte) et tu compares leurs moyennes.
Pour des planètes, le critère pourrait être :
le télescope qui les a découvertes ;
un système à une seule étoile ou multistellaire ;
la décennie de découverte ;
une découverte au sol ou dans l'espace ;
gazeuse ou rocheuse - une catégorie calculée à partir de la densité, elle-même obtenue de la masse et du rayon.
Ta prédiction : au choix
Une formule
Une formule linéaire
Trouver la loi ou une constante (pente, ordonnée).
Une formule non-linéaire
L'ajustement d'une courbe à un système du second degré.
Une valeur
Une valeur par interpolation
Estimer une valeur entre deux points connus.
Une valeur future
Prolonger la tendance au-delà des données (extrapolation).
Choisis ce que tu prédis - ton ajustement peut être linéaire ou non-linéaire.
Choix 1 : une formule linéaire
Tu cherches la loi qui relie x et y, ou une constante physique.
np.polyfit(x, y, 1) te donne la pente et l'ordonnée : y = pente × x + ordonnée.
Exemple (loi de Hubble) : la pente de distance → vitesse, c'est la constante de Hubble H₀.
Choix 2 : une formule non-linéaire
Quand la relation n'est pas une droite, ajuste une courbe.
np.polyfit(x, y, 2) (degré 2) ou des axes log-log pour redresser la courbe.
Élégant pour Kepler (période² ∝ distance³) et la loi de Hubble.
La régression : prédire l'inconnu
np.polyfit(x, y, 1) trouve la droite d'ajustement : y = pente × x + ordonnée.
Avec elle, tu calcules une valeur que personne n'a mesurée - la nouvelle observation de Maya.
Exemple (exoplanètes) : masse ≈ 3,3 × rayon - 0,9. Pour un rayon de 3,2, on prédit une masse d'environ 9,7 masses terrestres.
Choix 3 : une valeur par interpolation
Tu estimes une valeur entre deux points déjà mesurés : c'est l'interpolation.
Le x demandé est dans l'intervalle des données, mais sans mesure exacte pour lui.
Exemple : la masse pour un rayon de 2,7 alors que tu as mesuré 2,5 et 3,0.
Choix 4 : une valeur future
Tu prolonges la tendance au-delà des données mesurées : c'est l'extrapolation.
Avec la formule, tu calcules un y pour un x plus grand que tous ceux observés.
Exemple : la masse d'une planète plus grosse que toutes celles du jeu de données.
Les jeux d'essais
Des assert qui vérifient tes fonctions d'analyse sur un petit exemple connu.
xTest = np.array([1.0, 2.0, 3.0])
yTest = np.array([2.0, 4.0, 6.0]) # masse = 2 x rayon
stats = analyser(xTest, yTest, cat, 4.0)
assert abs(stats["pente"] - 2.0) < 0.001
assert abs(stats["valeurPredite"] - 8.0) < 0.001
print("Tous les jeux d'essais passent.")
À toi de jouer
Une fois ton Colab terminé, copie-colle cet exemple, puis ajuste les valeurs et les appels de fonction pour tester 2 valeurs de ton choix - par exemple la moyenne et l'écart-type de tes données.
Au moins 2 asserts en lien avec tes calculs mathématiques (ex. la pente, une valeur prédite).
Les graphiques
Le nuage de points, la droite et un second graphique.
Les graphiques à produire
Plusieurs courbes
Plusieurs séries en couleurs, avec une légende.
Double-répartition
Des subplots (tartes, barres, histogrammes) ou un diagramme à barres empilées.
Nuage + droite
Les points, la droite d'ajustement et la prédiction.
Tous bien habillés : un titre, des axes nommés et une légende.
Graphique de plusieurs courbes en couleurs
Plusieurs séries sur un même graphique : une couleur par série + une légende.
Double-répartition : des subplots
Quatre subplots pour comparer deux galaxies : l'âge des planètes (histogrammes) et la composition rocheuses / gazeuses (tartes).
Double-répartition : barres empilées
Compare deux sous-groupes : barres empilées, ou des subplots (tartes / barres / histogrammes).
Graphique obligatoire : le nuage + la droite
Les points montrent la relation ; la droite la résume ; l'étoile, c'est la prédiction.
⭐ Point bonus (+10) - 2 retouches
📈 Le R²
Calcule le R² (entre 0 et 1) et dis ce qu'il signifie.
Il mesure à quel point ta droite colle aux points.
📊 Les barres d'erreur
Ajoute une incertitude / des barres d'erreur à ta prédiction.
Montre que ta valeur prédite a une marge.
Fais les 2 retouches pour décrocher le +10.
Le rapport
Les jeux d'essais, la sortie attendue et le bonus.
Le rapport, c'est trois livrables
À l'écran
Le rapport affiché par ton programme avec print.
Dans un fichier .txt
Les statistiques descriptives enregistrées dans un fichier texte.
En images
Les graphiques enregistrés en fichiers images (.png).
Affiché, enregistré, illustré : ton étude laisse une trace complète.
La sortie attendue
============================================
🚀 RAPPORT - EXOPLANÈTES (rayon → masse)
============================================
Planètes étudiées : 60
dont rocheuses : 38 gazeuses : 22
Rayon moyen : 2.52 (écart-type 1.1) rayons terrestres
Masse moyenne : 7.4 (écart-type 4.9)
--------------------------------------------
Masse moyenne par catégorie :
rocheuse : 2.9 gazeuse : 11.2
--------------------------------------------
PRÉDICTION (formule) : masse = 3.3 x rayon - 0.9
PRÉDICTION (valeur, rayon 3.2) : masse ≈ 9.7
============================================
Un rapport clair : les statistiques, la comparaison, et surtout la prédiction.
La documentation
Docstrings, commentaires, README et conclusion.
La documentation, c'est cinq choses
📝
Les blocs du calepin
Des cellules de texte qui expliquent ta démarche, étape par étape.
🏷️
Les docstrings
Une courte phrase en en-tête de chaque fonction, qui dit ce qu'elle fait.
💬
Les commentaires
En bout de ligne, seulement pour expliquer ce qui est complexe.
📄
Le README
Le résumé du programme : à quoi il sert, entrées, traitements, sorties.
⭐ Vise un code qui se lit comme une phrase
Donne des noms parlants à tes fonctions et à tes variables (code sémantique) : leur nom dit ce qu'elles font ou ce qu'elles contiennent.
for planete in listePlanetes: se lit « pour chaque planète dans la liste des planètes ». Bien nommé, ton code s'explique presque tout seul.
README + conclusion scientifique
Ton README décrit ton programme selon le cadre :
À quoi il sert pour Maya (ton sujet)
Les ENTRÉES : tes données, tes colonnes
Les TRAITEMENTS : statistiques, régression, rôle de chaque fonction
Les SORTIES : le rapport, la prédiction, les graphiques
⚠️ Personnalisé pour TON sujet, pas une description générale.
Ta conclusion répond en scientifique :
La relation : x et y vont-ils dans le même sens ?
La prédiction : a-t-elle du sens ?
Les catégories : que vois-tu en comparant les deux groupes ?
📝 À écrire dans une cellule de texte (Markdown), à la fin de ton calepin Colab.
Récapitulatif
La grande finale : tout ce qui compte dans la note.
Grille d'évaluation
Données
20
Calculs mathématiques
20
Graphiques
20
Rapport
20
Documentation
20
Total
100
⭐ BONUS - qualité de l'ajustement ET barres d'erreur
+10
Critères
Code découpé en fonctions courtes au rôle clair.
Chaque fonction documentée (docstring).
Noms sémantiques : sans abréviations, en français sans accent.
Les noms de fonctions commencent par un verbe à l'infinitif.
⚠ Un code remis sans versions ni sauvegardes pas à pas ne sera pas évalué : note de zéro.
Ta checklist complète
Données
Téléchargement distant (URL ou Drive)
Lecture d'un fichier : 3 grandeurs et 2 textes
Structures de données :
liste de hashmap pour les données source
hashmap pour chaque rapport ou graphique
Calculs mathématiques
Statistiques descriptives
Comparaison de sous-groupes
Fonction de bibliothèque mathématique
Prédiction de formule ou valeur
Jeux d'essais (2 asserts)
Graphiques
Graphique de plusieurs courbes en couleurs
Une figure de double-répartition :
Subplots de 4 répartitions ou plus : tartes, barres ou histogrammes
Diagramme à barres empilé
Nuage de points + droite d'ajustement
Graphiques habillés : titre, axes, légende
Rapport
Rapport affiché à l'écran
Statistiques enregistrées dans un .txt
Graphiques enregistrés en images
Documentation
Blocs du calepin
Docstrings
Commentaires
README + conclusion scientifique
Code sémantique
⭐ Bonus (+10)
Qualité de l'ajustement (R²)
Barres d'erreur
Coche au fur et à mesure : ton suivi est gardé sur ton appareil.
Comment travailler ce projet
Travaille directement dans le lien Colab remis par la prof pour le projet.
Travaille pas à pas
Avance une cellule à la fois : écris, exécute, vérifie, puis continue (raffinement graduel).
Affiche temporairement tes valeurs intermédiaires pour t'assurer que tout est correct.
Garde tes fonctions courtes et nommées par un verbe : un code clair se corrige mieux.
Pas à pas, avec des fonctions
Le même principe s'applique à tes fonctions : deux façons d'avancer, au choix.
① Coder, puis envelopper
Tu écris ton code directement dans la cellule, tu le fais marcher, puis tu l'enveloppes dans une fonction et tu testes l'appel.
moyenne = sum(valeurs) / len(valeurs)
print(moyenne)
# ca marche -> on enveloppedef calculerMoyenne(valeurs):
return sum(valeurs) / len(valeurs)
print(calculerMoyenne(valeurs))
② Prototyper la fonction vide
Tu crées tout de suite la fonction avec juste return "", tu l'appelles immédiatement, puis tu codes pas à pas dans la cellule.