Université de Genève · CUI BSc · Algorithmique & Structures de données

Introduction au projet

Séminaire 4

Qu'est-ce que le projet ?

  • Vous travaillerez sur de vraies données physiologiques provenant de 12 participant·e·s de l'étude UNIGE
  • Source des données : montres connectées Withings ScanWatch — activité de pas, totaux journaliers
  • Votre tâche : appliquer les algorithmes du cours (tri, recherche, programmation dynamique, graphes, …)
  • pour répondre à des questions concrètes dérivées du jeu de données
  • Objectif : penser algorithmiquement — pas seulement appeler des fonctions de pandas
  • Vous devez implémenter l'algorithme vous-même et justifier vos choix
  • Optionnel : utilisez vos propres données de smartphone (Withings App) pour des analyses supplémentaires

Votre note — 30 % de la note finale

ComposantePondérationDeadline
Dépôt de code + README15%19 mai 2026, 23:59
Revue de code par les pairs15%31 mai 2026, 23:59
Total pour le projet30%

Comment la partie code (15 %) est évaluée

CritèrePondération dans les 15 %Condition pour obtenir le maximum
Exactitude5%Les sorties sont correctes sur cas normaux et cas limites
Raisonnement algorithmique4%Choix de la structure de données + argument clair sur Big O
Tests2%Tests pertinents, incluant les cas limites
Qualité du README3%Explication claire pour chaque analyse
Qualité du code1%Lisible, structuré, conforme à PEP-8

Comment la partie revue par les pairs (15 %) est évaluée

CritèrePondération dans les 15 %Condition pour obtenir le maximum
Couverture5%Couvre toutes les analyses requises et le README
Précision technique5%Commentaires corrects sur l'exactitude/la complexité/les tests
Commentaires exploitables3%Suggestions spécifiques avec corrections concrètes
Professionnalisme2%Ton respectueux et structure claire

Définition de terminé (exigences minimales)

  • Un dépôt GitLab avec une structure propre et des instructions d'exécution
  • Au moins 3 analyses : 1 Débutant + 1 Intermédiaire + 1 Avancé
  • Chaque analyse implémentée comme vos propres fonction(s) Python
  • Section README pour chaque analyse : problème · algorithme · pourquoi · complexité
  • Tests pour les fonctions centrales (inclure les cas limites)
  • Aucune donnée privée commise — `researchdata/` doit être dans .gitignore

Bon exemple de soumission (ce que nous attendons)

  • Question d'analyse : Quelle date a le total de pas le plus élevé ?
  • Implémentation : parcours linéaire avec agrégation par date via dict
  • Exemple README : 'O(n) time, O(d) space (d = distinct dates)'
  • Preuve par les tests : cas normal + entrée vide + une seule ligne
  • Remarque comparative (intermédiaire/avancé) : naïf vs temps optimisé
  • Résultat : code clair, instructions reproductibles, choix justifiés
  • Exemple de soumission : https://gitlab.unige.ch/alg-26/spring-2026/alexander-horst

Le jeu de données

  • Withings ScanWatch — comptage des pas enregistré par heure et par jour
  • 12 participant·e·s anonymisé·e·s, plusieurs mois de données continues
  • Téléchargez l'archive depuis Yareta :
  • https://yareta.unige.ch/archives/19bf7f3c-7d07-48be-8c03-9f754f766906
  • Format CSV — un fichier par participant (ex. 1487.csv)
  • Lisez la documentation fournie pour comprendre :
  • Qui a collecté les données ? Taille de l'échantillon ? Combien de jours ?

Trois niveaux d'analyses (données de wearable)

NiveauCe qui est attenduExemples de questions
Débutant (commencez maintenant)Boucles explicites, logique claire, revendications de complexité simplesJour le plus actif (parcours linéaire) · moyenne hebdomadaire (dict) · classement des utilisateurs avec tri à bulles (base d'apprentissage)
Intermédiaire (après Semaine 6-7)Meilleures structures + comparaison baseline + preuves de chronométrageTendances en moyenne mobile (fenêtre glissante) · jours inhabituels (règles) · classement des utilisateurs selon plusieurs métriques
Avancé (après Semaine 8-11)Profondeur algorithmique + preuves plus solides + périmètre soignéPlus longue série (programmation dynamique) · graphe de similarité des jours avec BFS/DFS · optionnel : Dijkstra sur les transitions d'état d'activité

Vous avez besoin d'une analyse par niveau

  • Minimum : 3 analyses au total — au moins une Débutant, une Intermédiaire, une Avancée
  • Vous êtes libre de concevoir vos propres questions au-delà de ces exemples
  • Chaque analyse doit être implémentée comme une fonction Python (pas seulement pandas)
  • Pour Intermédiaire et Avancé : comparer à une approche baseline plus simple
  • 'Mon tri O(n log n) est X× plus rapide que la force brute sur 10 000 lignes'
  • Indiquez comment vous avez mesuré le temps (taille d'entrée et nombre d'exécutions)
  • Astuce : commencez par Débutant après la semaine 6, progressez les semaines suivantes

Que mettre dans le README

  • Pour chaque analyse, répondez à ces quatre questions :
  • 1. Problème — quelle question concrète répondez-vous ?
  • 2. Algorithme — quel algorithme/quelle structure de données avez-vous implémenté ?
  • 3. Pourquoi — pourquoi cet algorithme est-il approprié pour ce problème ?
  • 4. Complexité — quelle est la complexité temporelle et spatiale (Big-O) ?
  • Le README est noté autant que le code lui‑même
  • Pensez-y comme un rapport technique, pas comme un dépôt de templates
  • Incluez un court exemple d'exécution et un exemple de test par analyse

Structure du dossier projet

  • ├── researchdata/ ← gitignored ! ne commitez jamais de données privées
  • ├── analyses/ ← vos implémentations ici
  • │ ├── analysis_1.py
  • │ ├── analysis_2.py
  • │ └── analysis_3.py
  • ├── requirements.txt
  • └── README.md ← le fichier le plus important
  • Les soumissions se font via GitLab (UNIGE). Créez votre compte : https://doc.eresearch.unige.ch/gitlab/start et récupérez vos tokens d'accès.
  • Puis demandez l'accès à : https://gitlab.unige.ch/alg-26/spring-2026 où vous créerez votre dépôt à votre nom.

Erreurs courantes à éviter

  • Commettre des fichiers de données dans git — les données sont privées, ajoutez-les à .gitignore
  • Appeler df.sort_values() et dire que c'est « le tri » — implémentez le tri
  • Pas d'explication dans le README — les correcteurs doivent comprendre vos choix algorithmiques
  • Pas de tests unitaires — testez au moins les cas limites (entrée vide, élément unique)
  • Pas d'analyse de complexité — indiquez toujours la complexité temporelle et spatiale
  • Pas de reproductibilité — étapes d'exécution, chemin du jeu de données ou protocole de mesure du temps manquants
  • Copier du code sans comprendre chaque ligne — on vous interrogera à ce sujet

Exercices d'aujourd'hui

  • Ex 1 — Téléchargez le jeu de données ; chargez un CSV et affichez df.describe()
  • Ex 2 — Aplatissez tous les fichiers des participant·e·s en merged.csv
  • Ex 3 — Calculez manuellement des statistiques de base (min/max/moyenne de pas par participant)
  • Ex 4 — find_most_active_day() : implémentez sans df.idxmax()
  • Ex 5 — Plus longue série de jours au-dessus de 8 000 pas (programmation dynamique basée sur des boucles)

Points clés à retenir

  • Le projet compte pour 30 % de votre note finale (15 % code + 15 % revue par les pairs)
  • La définition de terminé est explicite : 3 analyses + tests + README + dépôt propre
  • Vous devez implémenter des algorithmes — pas seulement appeler des fonctions pandas
  • Justifiez chaque choix dans votre README : problème · algorithme · pourquoi · complexité
  • Conservez les données localement — ne commitez jamais les fichiers `researchdata/` dans git
  • Commencez aujourd'hui : chargez les données et mettez en place une analyse Débutant
  • Revue par les pairs en semaine 12 — écrivez du code que les autres peuvent lire et comprendre
Université de Genève · CUI BSc · Algorithmique & Structures de données

Merci et amusez-vous bien !