Projet 2 : Où va notre argent?
La question centrale
Section intitulée « La question centrale »Les Montréalais dépensent des centaines de millions de dollars par année en divertissement privé : billets de matchs, abonnements de streaming, entrées de cinéma, concerts.
Pendant ce temps, les piscines municipales manquent de financement. Les bibliothèques réduisent leurs heures. Les plateaux sportifs de quartier tombent en désuétude.
Est-ce qu’on fait les bons choix? Est-ce qu’on pourrait faire autrement?
C’est la question qu’on essaiera de répondre à travers ce projet.
Le travail à faire
Section intitulée « Le travail à faire »Dans ce projet, vous allez analyser un jeu de données sur les dépenses en loisirs à Montréal. Vous allez le traiter avec NumPy, le visualiser avec Matplotlib, et produire un rapport qui répond à la question :
Si 1 % de l’argent dépensé en divertissement privé à Montréal était réorienté vers les services publics, qu’est-ce qu’on pourrait financer?
Les données
Section intitulée « Les données »Le fichier loisirs_montreal.csv présenté ci-dessous contient les dépenses estimées
en loisirs pour les ménages montréalais en dollars par ménage par année, pour quatre années :
2017, 2019, 2021 et 2023.
sous_categorie,grande_categorie,depense_2017,depense_2019,depense_2021,depense_2023Cinéma - billets,Cinéma,103.01,99.85,39.24,90.54Cinéma - concessions,Cinéma,75.28,79.91,34.97,79.86Hockey - billetterie,Hockey,113.38,126.48,0.00,141.26Hockey - concessions,Hockey,19.72,24.32,0.00,28.25CF Montréal - billetterie,CF Montréal,17.54,18.21,4.52,18.32Alouettes - billetterie,Alouettes,10.32,6.75,4.25,14.83Streaming - vidéo,Streaming,72.00,120.00,185.00,245.00Streaming - musique,Streaming,35.00,55.00,68.00,88.00Jeux vidéo - consoles/PC,Jeux vidéo,85.00,92.00,145.00,108.00Jeux vidéo - mobile,Jeux vidéo,35.00,42.00,58.00,65.00Jeux vidéo - abonnements,Jeux vidéo,8.00,18.00,32.00,48.00Spectacles en salle,Concerts,95.00,108.00,5.00,92.00La matrice de données est 12 sous-catégories × 4 années = 48 valeurs.
D’où viennent ces chiffres?
Section intitulée « D’où viennent ces chiffres? »Cinéma
Billets : admissions au Québec (OCCQ, Optique culture) × 48 % × prix moyen avant taxes (OCCQ) ÷ ménages MTL.
Concessions : mêmes admissions × Concession per patron (CPP) du rapport annuel Cinéplex (TSX : CGX).
Note 2021 : cinémas fermés 16 semaines au Québec — valeurs très basses attendues.
Hockey — Canadiens
Billetterie : 41 matchs × 21 105 places × prix estimé × 85 % de partisans montréalais ÷ ménages.
2021 = 0 : saison jouée entièrement en bulle (Toronto/Edmonton) sans spectateurs.
Concessions : estimation (le Groupe CH est une société privée).
CF Montréal
Billetterie : 17 matchs locaux MLS × assistance estimée × prix moyen × 90 % locaux ÷ ménages.
Note 2021 : capacité très réduite (restrictions sanitaires au Québec).
Alouettes
Billetterie : 9 matchs locaux CFL × assistance estimée × prix moyen × 90 % locaux ÷ ménages.
Signal fort : la baisse 2017→2019 reflète les difficultés de l’équipe (changements de propriété). La remontée 2023 coïncide avec la victoire de la Coupe Grey.
Streaming
Vidéo (Netflix, Disney+, Crave…) et Musique (Spotify, Apple Music…) : estimations de marché. La hausse marquée en 2021 reflète l’explosion des abonnements pendant les confinements.
Source de référence : Statistique Canada, tableau 11-10-0222-01.
Jeux vidéo
Consoles/PC, Mobile, Abonnements (Game Pass, PS Plus…) : estimations de marché basées sur les tendances canadiennes.
Signal à surveiller : les abonnements × 6 en 6 ans (8 /ménage).
Source de référence : Statistique Canada, tableau 11-10-0222-01.
Spectacles en salle
Concerts, humour, comédie musicale : estimations basées sur les rapports ADISQ.
2021 : quasi-zéro — signal le plus brutal de la matrice, plus marqué encore que le cinéma.
Structure du code
Section intitulée « Structure du code »Vous travaillerez dans un seul fichier : analyse_loisirs.py, disponible sur Léa.
Le fichier est organisé en quatre sections clairement séparées par des commentaires.
Chaque fonction a un rôle précis et la fonction main() agit comme un orchestrateur appelant
les diverses fonctions pour les taches d’analyse et visualisation.
Aucun calcul ni aucun graphique ne se fait directement dans le main().
Sectionnement du fichier analyse_loisirs.py
Section intitulée « Sectionnement du fichier analyse_loisirs.py »analyse_loisirs.py├── Constantes├── Chargement des données → charger_csv, lister_grandes_categories, filtrer_par_categorie├── Analyse statistique → construire_matrice, total_par_annee, total_par_sous_categorie,│ variation, top_n, sous_categorie_plus_volatile,│ potentiel_reinvestissement, generer_recommandations├── Visualisation → graphique_barres_groupees, graphique_variation,│ graphique_potentiel└── Programme principal → mainLes constantes disponibles
Section intitulée « Les constantes disponibles »Ces valeurs sont déjà définies en haut du fichier. Utilisez-les dans vos fonctions plutôt que de réécrire les nombres.
ANNEES = [2017, 2019, 2021, 2023]NB_MENAGES = {2017: 746000, 2019: 756000, 2021: 762000, 2023: 781000}POURCENTAGE = 0.01 # 1 % réorienté vers les services publicsLes fonctions à implémenter
Section intitulée « Les fonctions à implémenter »charger_csv est déjà implémentée — vous pouvez l’appeler immédiatement pour vérifier que vos données se chargent correctement.
def charger_csv(chemin): """ Lit loisirs_montreal.csv et retourne trois listes : sous_categories : liste de str — 12 noms de sous-catégories grandes_categories : liste de str — 12 grandes catégories (avec doublons) matrice : liste de listes de float chaque sous-liste = [dep_2017, dep_2019, dep_2021, dep_2023] """ # ✅ Déjà implémentée (rien à modifier)
def lister_grandes_categories(grandes_categories): """Retourne la liste triée des grandes catégories, sans doublons.""" # TODO - Code à écrire
def filtrer_par_categorie(sous_cats, grandes_cats, matrice, categorie): """ Retourne deux listes (sous_cats_filtrees, sous_matrice) contenant uniquement les lignes correspondant à la grande catégorie donnée. """ # TODO - Code à écriredef construire_matrice(matrice_listes): """ Convertit la liste de listes retournée par charger_csv en tableau NumPy de shape (12, 4). """ # TODO - Code à écrire
def total_par_annee(matrice): """ Retourne un tableau de 4 valeurs : la somme des dépenses de toutes les sous-catégories pour chaque année. """ # TODO - Code à écrire
def total_par_sous_categorie(matrice): """ Retourne un tableau de 12 valeurs : la somme des dépenses sur les 4 années pour chaque sous-catégorie. """ # TODO - Code à écrire
def variation(matrice, col_debut, col_fin): """ Retourne un tableau de 12 valeurs : la variation en % entre deux colonnes pour chaque sous-catégorie.
Exemples d'appel : variation(matrice, 1, 2) → variation 2019 → 2021 (impact pandémie) variation(matrice, 2, 3) → variation 2021 → 2023 (reprise)
Retourne np.nan là où la valeur de départ est 0.
Attention : np.where évalue les deux branches avant de choisir. Pour éviter une division par zéro, remplace les 0 du dénominateur par 1.0 avant de diviser, puis masque avec np.nan. """ # TODO - Code à écrire
def top_n(valeurs, noms, n): """ Retourne une liste de n sous-listes [nom, valeur], triée de la valeur la plus élevée à la plus basse. Chaque élément est une liste [nom, valeur].
Exemple de retour pour n=3 : [["Streaming - vidéo", 245.0], ["Hockey - billetterie", 141.26], ...] """ # TODO - Code à écrire
def sous_categorie_plus_volatile(matrice, sous_categories): """ Retourne une liste [nom, ecart_type] : la sous-catégorie dont l'écart-type entre les 4 années est le plus grand. """ # TODO - Code à écrire
def potentiel_reinvestissement(matrice, pourcentage): """ Retourne le montant en dollars que représente `pourcentage` des dépenses totales estimées pour la ville entière en 2023.
Calcul attendu : total par ménage (2023) × NB_MENAGES[2023] × pourcentage """ # TODO - Code à écrire
def generer_recommandations(matrice, sous_categories, var_pandemie): """ Retourne une liste d'au moins 3 chaînes de caractères. Chaque chaîne est une piste d'investissement générée à partir des données.
Les recommandations doivent venir des calculs — pas être écrites en dur.
Pistes possibles : - Quelle catégorie physique se remet le moins bien depuis la pandémie? - Quelle catégorie numérique a le plus augmenté entre 2017 et 2023? - Que pourrait financer concrètement le potentiel de réinvestissement? """ # TODO - Code à écrireChaque fonction reçoit des données déjà calculées — aucun calcul à l’intérieur.
Les graphiques sont sauvegardés dans le dossier graphiques/, créé automatiquement au lancement.
def graphique_barres_groupees(matrice, sous_categories, chemin_sortie): """ Barres groupées : une grappe par sous-catégorie, une barre par année. Chaque année a sa propre couleur. Requis : titre, étiquettes d'axes, légende des années. """ # TODO - Code à écrire
def graphique_variation(variations, sous_categories, titre, chemin_sortie): """ Barres horizontales de variation en %. Hausses en vert, baisses en rouge. Ignore les valeurs np.nan (sous-catégories à 0 l'année de départ). Requis : titre (passé en paramètre), étiquette d'axe, ligne verticale à 0. """ # TODO - Code à écrire
def graphique_potentiel(potentiel, chemin_sortie): """ ⭐ OPTIONNEL — À faire si les deux premiers graphiques sont terminés.
Visualise ce que représente POURCENTAGE % des dépenses privées réorientées. Format libre — l'important est que le montant en dollars soit lisible. Requis : titre mentionnant le pourcentage. """ # TODO - Code à écrire (optionnel)main orchestre l’ensemble : elle appelle les fonctions, stocke les résultats et les affiche.
Elle ne fait aucun calcul elle-même.
def main(): # Chargement (lecture) de fichier sous_cats, grandes_cats, matrice_listes = charger_csv("loisirs_montreal.csv") matrice = construire_matrice(matrice_listes)
# TODO - Appelle ici toutes les fonctions d'analyse # et stocke leurs résultats dans des variables. ...
# TODO - Affiche le rapport terminal structuré ...
# TODO - Génère et sauvegarde les 2 graphiques obligatoires (+ le 3e si optionnel fait) ...Le rapport terminal
Section intitulée « Le rapport terminal »Voici la structure attendue. Les ___ sont les valeurs que votre code doit calculer et afficher.
==================================================== OÙ VA L'ARGENT DE LOISIRS À MONTRÉAL? 12 sous-catégories · 2017 / 2019 / 2021 / 2023====================================================
Ménages MTL (2023) : 781 000
Dépense totale estimée pour la ville (2017) : ___ $Dépense totale estimée pour la ville (2019) : ___ $Dépense totale estimée pour la ville (2021) : ___ $ ← effet pandémieDépense totale estimée pour la ville (2023) : ___ $
→ La dépense totale = somme de toutes les sous-catégories ($/ménage) multipliée par le nombre de ménages de l'année correspondante.
--- TOP 3 SOUS-CATÉGORIES EN 2023 --- 1. ___ (___ $/ménage) 2. ___ (___ $/ménage) 3. ___ (___ $/ménage)
--- IMPACT DE LA PANDÉMIE (2019 → 2021) --- Plus forte baisse : ___ (−___ %) Plus forte hausse : ___ (+___ %) Sous-catégorie la plus volatile (écart-type le plus grand) : ___
--- REPRISE 2021 → 2023 --- Sous-catégorie dont la reprise est la plus rapide : ___ (+___ %) Sous-catégorie pas encore revenue au niveau 2019 : ___
→ Comparer 2019 et 2023 : variation(matrice, 1, 3) — valeur négative = pas encore revenue
--- ET SI ON RÉORIENTAIT 1 % DES DÉPENSES 2023? --- Total ville 2023 : ___ $ 1 % = ___ $ par année → ...
--- PISTES D'INVESTISSEMENT ---1. ...2. ...3. ...====================================================Les graphiques
Section intitulée « Les graphiques »Les deux premiers sont obligatoires. Le troisième est optionnel — faites-le si vous avez le temps, il bonifie le rapport.
Sauvegardez-les dans le dossier graphiques/. Ce dossier est créé automatiquement quand vous lancez analyse_loisirs.py.
| Fichier | Ce qu’il montre |
|---|---|
graphiques/01_barres_groupees.png | Toutes les sous-catégories × 4 années |
graphiques/02_impact_pandemie.png | Variation 2019→2021 par sous-catégorie |
graphiques/03_potentiel.png (optionnel) | Ce que représente 1 % réorienté |
À remettre
Section intitulée « À remettre »- Fichier
analyse_loisirs.pycomplété - Rapport écrit (2-3 pages) + dossier
graphiques/avec les 2 graphiques obligatoires (+ le 3e si réalisé)
Le rapport écrit (2-3 pages)
Section intitulée « Le rapport écrit (2-3 pages) »Le rapport comporte trois sections distinctes.
Section 1 — Les données : Décrivez ce que le jeu de données contient. Quelles catégories vous semblent solides (sources officielles) vs estimées? Quelles limites avez-vous identifiées?
Section 2 — Les résultats : Répondez à la question centrale en vous appuyant sur vos graphiques et vos calculs. Qu’est-ce que votre matrice révèle? Quel est l’impact de la pandémie? Quelles tendances ressortent sur 2017-2023? Qu’est-ce qui vous a surpris?
Section 3 — Le code : Expliquez en français, sans copier le code, comment votre programme fonctionne. Décrivez le rôle de chaque groupe de fonctions, ce que représente votre matrice NumPy (shape, axes), et pourquoi vous avez utilisé axis=0 ou axis=1 à tel endroit.
En bonus: La vidéo (5 à 10 minutes)
Section intitulée « En bonus: La vidéo (5 à 10 minutes) »Vous présentez vos résultats et vous répondez à la question centrale : investissons-nous bien notre argent et notre énergie en loisirs à Montréal?. Si vous faites la vidéo, ajoutez le lien dans votre rapport.
Grille d’évaluation
Section intitulée « Grille d’évaluation »| Critère | Points |
|---|---|
Chaque fonction a un rôle précis, main n’effectue aucun calcul | 20 |
Calculs NumPy corrects — axis, argmax, argsort, std, gestion des nan | 25 |
| Graphiques lisibles — titre, axes étiquetés, légende, effet pandémie visible (2 obligatoires) | 15 |
| Recommandations générées par le code à partir des données | 15 |
| Qualité du code — noms de variables descriptifs, pas de code copié-collé en double | 10 |
| Rapport écrit | 15 |
| Vidéo | +10 |
| Total | 100 |