diff --git a/Seance_5_TP_Contamination_Corrige.md b/Seance_5_TP_Contamination_Corrige.md new file mode 100644 index 0000000..488a7ce --- /dev/null +++ b/Seance_5_TP_Contamination_Corrige.md @@ -0,0 +1,328 @@ +# Corrigé — Séance 5, TP : réseau d'affiliation et chaîne de contamination + +> Document enseignant. Tous les résultats chiffrés ci-dessous ont été obtenus en +> exécutant réellement le notebook (NetworkX 3.6). + +--- + +## Intention de la séance + +Le TP poursuit un objectif qui dépasse la manipulation de NetworkX : faire découvrir +aux étudiantes, **par l'expérience et non par l'annonce**, que la projection d'un +réseau biparti détruit de l'information. + +La séquence est construite pour ça : + +1. on annonce au point 3 que « chaque repas devient une clique » — annonce abstraite, + qui ne marque pas ; +2. on applique ensuite les outils du cours sur le réseau projeté ; +3. à la question 14, le BFS renvoie **1 pour absolument tout le monde**. Le résultat + est visiblement inutilisable ; +4. la question 15 fait relier ce constat à l'annonce du point 3. + +**Ne pas divulguer le point 4 à l'avance.** L'effet pédagogique tient entièrement à +ce que le résultat dégénéré soit rencontré, pas anticipé. + +--- + +## Chiffres de référence + +| Objet | Valeur | +|---|---| +| Personnes | 17 | +| Repas | 6 | +| Participations (liens du biparti) | 41 | +| Nœuds du biparti `B` | 23 | +| Liens du projeté `G` | **74** | +| Composantes connexes de `G` | **3** | +| Composante de Paula | 13 personnes, **71 liens** sur 78 paires possibles (91 %) | +| Points d'articulation de `G` | **aucun** | +| Points d'articulation de `B` | `R1988`, `R1990`, `M1991` | + +--- + +## Partie 2 — Le réseau d'affiliation + +**Q1.** Oui, Agnès figure sur le graphique, mais **sans aucun lien** : c'est un nœud +isolé. Elle n'apparaît que parce qu'on l'a ajoutée explicitement via `add_nodes_from`. +Point à souligner : si on avait construit le graphe uniquement à partir de la liste des +participations, Agnès aurait purement et simplement disparu de l'analyse. + +C'est un biais très concret des données de réseau — **on ne voit que les personnes qui +participent**. Les non-participants sont invisibles, alors qu'ils sont souvent +sociologiquement les plus intéressants. + +**Q2.** `R1988` (le banquet du 17 septembre 1988) rassemble **11 personnes**, contre 8, +8, 7, 4 et 3 pour les autres. C'est lisible directement sur la figure au nombre de +traits qui convergent vers le carré. + +**Q3.** Non. Dans un graphe biparti, tout lien va nécessairement d'un nœud d'un côté +vers un nœud de l'autre côté. Une arête personne–personne est impossible par +construction. C'est ce que vérifie `nx.is_bipartite(B)`, qui renvoie `True`. + +**Q4.** Une personne reliée à un seul repas est un·e participant·e **occasionnel·le** : +soit périphérique dans la sociabilité locale, soit nouvellement arrivée, soit +extérieure au groupe. Dans le jeu de données, c'est le cas de Doris, Martha +(seulement `R1988`) et George (seulement `R1990`). + +Le lien avec la suite : ce sont précisément ces personnes que le retrait d'un repas +isole (question bonus 2). + +--- + +## Partie 3 — La projection + +**Q5.** Le réseau biparti comptait **41** liens ; le réseau projeté en compte **74**. +Le nombre a donc presque doublé. + +L'explication attendue : un repas rassemblant *n* personnes produit *n* liens dans le +biparti, mais *n(n−1)/2* liens dans la projection. Pour `R1988` et ses 11 participants, +on passe de 11 liens à 55. La projection **fabrique** des liens qui n'ont jamais été +observés. + +Formulation à valoriser : *le biparti enregistre des présences, la projection en déduit +des relations.* C'est une inférence, pas une observation. + +**Q6.** Tout groupe visible comme un « bloc » entièrement relié correspond à +l'ensemble des participants d'un même repas. Les 11 participants de `R1988` forment +une clique complète de 11 nœuds. + +Attention : la figure `spring_layout` est très dense et les cliques y sont peu +lisibles. Si le groupe peine à voir, projeter directement le résultat de +`bipartite.projected_graph(B, ["R1988"] ...)` ou simplement lister +`sorted(G.neighbors("Doris"))` — Doris n'ayant participé qu'à `R1988`, ses voisins +*sont* exactement les autres participants de ce repas. + +--- + +## Partie 4 — Composantes connexes + +**Q7.** Trois composantes : + +| # | Taille | Membres | Lecture | +|---|---|---|---| +| 1 | 13 | Paula, Ray, Bonnie, Jess, Sam, Nancy, Walter, Curtis, Béatrice, Wendell, Doris, Martha, George | la sociabilité de Dudley — contient **les 6 malades** | +| 2 | 3 | Marjorie, Harold, Irene | le groupe de Millhaven, sans aucun contact avec Dudley | +| 3 | 1 | Agnès | isolée : aucune participation enregistrée | + +**Q8.** Oui, les 6 malades sont dans la même composante — et c'était prévisible : une +maladie transmise lors des repas ne peut circuler qu'à l'intérieur d'une composante. +Trouver un malade dans la composante de Millhaven aurait immédiatement invalidé +l'hypothèse d'une transmission par les repas. + +Point de méthode important : **c'est un test réfutable**. La structure du réseau +permet de dire ce qu'on devrait observer si l'hypothèse est vraie, et ce qui la +contredirait. + +**Q9.** Non. Agnès forme à elle seule une composante : aucun chemin ne la relie à qui +que ce soit. Si la contamination passe par les repas, elle ne peut pas l'avoir +atteinte. + +La restriction « à partir de la structure du réseau seulement » est volontaire : +Agnès pourrait évidemment avoir été contaminée par un autre canal (un repas non +enregistré, un autre mode de transmission). Le réseau ne dit rien de ce qu'il ne +contient pas. + +**Q10.** On peut conclure qu'elle **a pu être exposée**. On ne peut absolument pas +conclure qu'elle est immunisée, ni qu'elle est saine. + +Trois raisons à faire émerger : + +- appartenir à la composante signifie qu'un chemin existe, pas qu'il a été emprunté ; +- l'incubation peut être longue : elle peut être contaminée sans être encore malade ; +- la composante est très large (13 personnes sur 17), donc peu discriminante. + +C'est la distinction entre **exposition possible** et **exposition effective**, qui +est au cœur de tout raisonnement épidémiologique — et, transposée, de tout +raisonnement sur la diffusion sociale. + +--- + +## Partie 5 — Parcours en largeur + +**Q11.** À distance 2 de Paula, dans le biparti : Béatrice, Bonnie, Curtis, Doris, +George, Jess, Martha, Nancy, Ray, Sam, Walter, Wendell — soit **12 personnes**. + +C'est exactement l'ensemble des personnes ayant partagé au moins un repas avec Paula. +Distance 1 = les repas de Paula ; distance 2 = les gens qui y étaient. + +**Q12.** Non atteints : Agnès, Harold, Irene, Marjorie et le repas `M1991`. C'est la +réunion des composantes 2 et 3. Le BFS ne franchit jamais une frontière de composante : +les deux notions donnent la même information, vue sous deux angles. + +**Q13.** La distance maximale est **3** (les repas `R1992` et `R1995`). Le réseau est +très petit et très interconnecté : Walter et Wendell participent à presque tout, ce qui +rapproche tout le monde. Dans un réseau réel de plusieurs centaines de nœuds, on +observerait des distances de 6, 8 ou davantage. + +--- + +### Q14 — le moment de bascule + +Résultat obtenu : **toutes les personnes de la composante de Paula sont à distance 1.** + +``` +Paula : 0 +Beatrice : 1 Doris : 1 Ray : 1 +Bonnie : 1 George : 1 Sam : 1 +Curtis : 1 Jess : 1 Walter : 1 + Martha : 1 Wendell : 1 Nancy : 1 +``` + +La réaction attendue est la surprise, voire la suspicion d'un bug. **Laisser ce moment +se produire.** C'est le seul endroit du TP où le résultat contredit visiblement +l'attente. + +Ne pas expliquer tout de suite : renvoyer à la question 15. + +--- + +### Q15 — l'explication + +**Proportion.** 71 liens sur 78 paires possibles, soit **91 %**. Le réseau projeté est +quasiment complet à l'intérieur de la composante. + +**Pourquoi Paula est à distance 1 de presque tout le monde.** Paula a participé à 3 des +5 repas de Dudley (`R1988`, `R1989`, `R1990`). Or `R1988` réunissait à lui seul 11 des +13 personnes de la composante. Il suffit donc d'un repas commun pour être son voisin +direct — et presque tout le monde en a un avec elle. + +**Mesures rendues inutilisables.** À faire lister par le groupe : + +- la **distance moyenne** — proche de 1, elle ne différencie plus personne ; +- la **centralité de degré** — tout le monde a un degré proche du maximum ; +- la **centralité d'intermédiarité** — nulle ou presque : dans un graphe presque + complet, aucun nœud ne se trouve sur le chemin des autres, puisque tous les chemins + sont directs ; +- le **coefficient de clustering** — proche de 1 partout, donc sans pouvoir + discriminant. + +Autrement dit : *toutes* les mesures des séances 3 et 8 s'effondrent sur ce réseau. +Le lien avec la séance 8 (centralité) est à faire explicitement — c'est un avertissement +utile avant de l'aborder. + +**Conclusion sur la méthode.** Le réseau biparti, lui, distinguait encore des niveaux +(0, 1, 2, 3) et possédait des points d'articulation. Il contenait plus d'information. + +La conclusion à faire formuler : **explorer le biparti d'abord, projeter ensuite et en +connaissance de cause.** La projection n'est pas une étape technique neutre qu'on +exécuterait par réflexe pour « pouvoir travailler » ; c'est un choix d'analyse qui +détruit de l'information, et il faut savoir laquelle. + +> Si le temps manque, c'est **cette** conclusion qu'il faut sauver, pas les questions +> bonus. + +--- + +## Partie 6 — Question de synthèse (Q16) + +Attendus pour une réponse complète (10-15 lignes) : + +**Étapes reprises, dans l'ordre.** + +1. Construire le biparti salarié·es × réunions, en **incluant les personnes qui n'ont + assisté à aucune réunion** (piège de la question 1). +2. Explorer le biparti *avant* toute projection : composantes, distances, points + d'articulation. +3. Projeter, en mesurant immédiatement la densité obtenue. +4. Si la densité est très élevée, ne pas appliquer les mesures de centralité en l'état. + +**Limites à signaler.** + +- Assister à une réunion n'est pas y prendre la parole ; le fichier ne mesure que la + présence. +- Les réunions ne sont qu'un canal de sociabilité parmi d'autres (couloirs, déjeuners, + messageries). +- Deux ans de données ne disent rien de l'antériorité des positions : on ne peut pas + distinguer qui est influent *parce qu'*il va aux réunions de qui y va *parce qu'*il + est influent. + +**Effet de la clique sur une mesure d'influence.** C'est le point le plus important. +Une réunion plénière de 200 personnes crée à elle seule 19 900 liens et place tous ses +participants à distance 1 les uns des autres. N'importe quelle mesure de centralité +appliquée après projection classera donc en tête les personnes qui assistent aux +**grandes** réunions — c'est-à-dire, très souvent, les réunions les moins sélectives. + +On mesurerait ainsi l'inverse de ce qu'on cherche : la participation à des réunions +larges et peu discriminantes plutôt que l'appartenance à des cercles restreints et +décisionnels. + +Parade à valoriser si elle est proposée : pondérer les liens, ou écarter de l'analyse +les événements au-delà d'une certaine taille. + +--- + +## Partie 7 — Pour aller plus loin + +**Bonus 1 — projection pondérée.** + +```python +W = bipartite.weighted_projected_graph(B, personnes) +top = sorted(W.edges(data=True), key=lambda e: -e[2]["weight"])[:5] +``` + +Liens les plus lourds (poids 4, ex æquo) : Ray–Wendell, Walter–Curtis, +Walter–Wendell, Curtis–Wendell ; puis Paula–Curtis (3). + +La pondération corrige *partiellement* le défaut : les liens existent toujours tous, +mais ils ne pèsent plus pareil, ce qui permet de seuiller. Elle ne corrige pas le +problème de fond — un lien de poids 1 continue d'affirmer une relation qui n'a peut-être +jamais existé. + +**Bonus 2 — points d'articulation.** + +```python +list(nx.articulation_points(G)) # [] +list(nx.articulation_points(B)) # ['M1991', 'R1988', 'R1990'] +``` + +- Sur `G` : **aucun**. Prévisible après la question 15 — dans un graphe à 91 % de + densité, retirer un nœud ne peut pas isoler qui que ce soit, puisque tous les autres + chemins directs subsistent. +- Sur `B` : **trois, et ce sont tous des repas**, pas des personnes. C'est cohérent avec + la structure : dans un réseau d'affiliation, ce sont les événements qui font tenir + l'ensemble. +- Retrait de `R1990` → **George** est isolé (c'était son unique repas). + Retrait de `R1988` → **Doris et Martha** sont isolées. + Retrait de `M1991` → les trois habitants de Millhaven sont isolés séparément. + +**Ce que la projection a rendu invisible :** le fait que la cohésion du groupe repose +sur **deux banquets précis**. Supprimez `R1988` et `R1990` du calendrier, et trois +personnes sortent du réseau. Cette dépendance est parfaitement lisible sur le biparti +et totalement effacée par la projection. + +C'est le meilleur argument du TP en faveur du travail sur le biparti, et il vaut la +peine de finir là-dessus si le temps le permet. + +**Bonus 3 — projection sur les repas.** + +`bipartite.projected_graph(B, repas)` donne 6 nœuds et **10 liens**. Les cinq repas de +Dudley forment une clique complète (10 liens) ; `M1991` reste isolé. + +Ce réseau montre la **continuité du groupe dans le temps** : d'un banquet à l'autre, il +y a toujours au moins une personne en commun. Il donne à voir la persistance d'un +collectif, là où la projection sur les personnes donnait à voir la sociabilité à un +instant donné. + +--- + +## Conduite de séance (seconde heure) + +| Moment | Durée | Vigilance | +|---|---|---| +| Parties 1-2 (biparti) | 20 min | La cellule de positionnement manuel est fournie : ne pas laisser perdre du temps dessus. Insister sur Agnès. | +| Partie 3 (projection) | 15 min | Annoncer la clique **sans insister**. L'effet vient plus tard. | +| Partie 4 (composantes) | 15 min | Réinvestissement direct du cours. Devrait aller vite. | +| Q14 | 5 min | **Ne pas expliquer.** Laisser la surprise. | +| Q15 | 20 min | Cœur de la séance. En collectif plutôt qu'en autonomie. | +| Q16 + bonus | reste | Q16 peut être donnée à rédiger pour la séance suivante. | + +**Niveau Python.** Aucune implémentation n'est demandée : toutes les cellules de code +sont fournies ou reprennent des fonctions vues en séance 4. Le travail attendu est +d'**exécuter, lire et interpréter**. Les questions notées sont toutes rédactionnelles. + +--- + +Auteur : Florian Mathieu — L3 Sociologie quantitative, *Algorithmes des graphes* + +Licence CC BY-NC-SA 4.0