ajout du corrigé du TP contamination

This commit is contained in:
2026-08-11 23:59:33 +02:00
parent e8af386233
commit a0cbd029ea
+328
View File
@@ -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 personnepersonne 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(n1)/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) : RayWendell, WalterCurtis,
WalterWendell, CurtisWendell ; puis PaulaCurtis (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