ajout du corrigé du TP contamination
This commit is contained in:
@@ -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
|
||||
Reference in New Issue
Block a user