# 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