Séance 5 — Diffusion d'une information (BFS) et composantes connexes¶
Objectifs¶
- Comprendre intuitivement ce qu'est un parcours en largeur (BFS) et relier ce concept à la diffusion d'une information, d'une rumeur ou d'une idée dans un réseau social.
- Mesurer des distances sociales et comparer l'effet du point de départ de la diffusion.
- Comparer intuitivement le BFS au parcours en profondeur (DFS).
- Identifier les composantes connexes d'un réseau et interpréter la position d'un individu isolé.
1. Introduction sociologique : une rumeur se propage¶
Imaginez qu'une personne — appelons-la Alice — partage une nouvelle dans son groupe d'ami·es. Chacun·e la répète à ses proches, et ainsi de suite.
L'information se diffuse par cercles successifs : d'abord les ami·es direct·es d'Alice, puis les ami·es des ami·es, etc.
C'est exactement ce que fait un parcours en largeur : explorer un réseau niveau par niveau.
→ En sociologie des réseaux, cela correspond à la distance sociale entre individus.
2. Exemple manuel : propagation d'une information¶
Considérons ce réseau à 7 personnes :
Alice — Bob — Chloé — David
│ │ │
Emma Félix Gaël
Supposons qu'Alice commence à diffuser une nouvelle.
Étapes :
- Niveau 0 : Alice
- Niveau 1 : les personnes directement connectées à Alice → {Bob, Emma}
- Niveau 2 : les ami·es de Bob (hors Alice) → {Chloé, Félix}
- Niveau 3 : les ami·es de Chloé → {David, Gaël}
Chaque niveau correspond à une distance sociale par rapport à la source.
3. Construire le réseau avec Python¶
import networkx as nx
import matplotlib.pyplot as plt
# Création du graphe
G = nx.Graph()
G.add_edges_from([
('Alice', 'Bob'), ('Alice', 'Emma'),
('Bob', 'Chloé'), ('Bob', 'Félix'),
('Chloé', 'David'), ('Chloé', 'Gaël')
])
pos = nx.spring_layout(G, seed=0)
plt.figure(figsize=(6,4))
nx.draw(G, pos, with_labels=True, node_color='lightblue', node_size=1000)
plt.title('Réseau social — Diffusion de la nouvelle')
plt.show()
4. Explorer le réseau en largeur depuis Alice¶
On peut utiliser la fonction nx.bfs_tree() pour construire un arbre de parcours à partir d'un point de départ.
source = 'Alice'
T = nx.bfs_tree(G, source=source)
plt.figure(figsize=(6,4))
nx.draw(T, with_labels=True, node_color='lightgreen', node_size=1000)
plt.title(f'Arbre BFS à partir de {source}')
plt.show()
print('Ordre du parcours BFS :')
print(list(nx.bfs_edges(G, source)))
distances = nx.single_source_shortest_path_length(G, source)
print('\nDistances sociales depuis Alice :')
for k, v in distances.items():
print(f'{k} : {v}')
Interprétation sociologique¶
- Les valeurs faibles indiquent des individus proches d'Alice (accès direct à l'information).
- Les valeurs élevées indiquent des individus périphériques : ils n'apprennent la nouvelle que tardivement.
→ Cela permet d'analyser la vitesse de diffusion ou la position sociale dans le réseau.
Questions :
- Dans quel ordre les personnes reçoivent-elles l'information ?
- Quel est le rôle d'Alice dans cette diffusion ?
- Quelle est la distance maximale observée ? Que signifie-t-elle socialement ?
5. Comparaison intuitive : BFS vs DFS¶
Pour bien comprendre la logique du BFS (revu en Séance 4), comparons-le brièvement à l'autre stratégie : le DFS.
| Stratégie | Métaphore | Manière d'explorer | Exemple |
|---|---|---|---|
| BFS (largeur) | diffusion sociale | explore les cercles autour de la source | bouche-à-oreille, message collectif |
| DFS (profondeur) | exploration ciblée | suit un chemin jusqu'au bout avant de revenir | enquête, filiation, exploration hiérarchique |
Le BFS propagera rapidement une information, tandis que le DFS creusera une piste en profondeur.
6. Le point de départ change-t-il tout ? Recommençons depuis Chloé¶
Recommençons la diffusion mais cette fois à partir de Chloé. Observez les différences de structure et de distances.
source2 = 'Chloé'
T2 = nx.bfs_tree(G, source=source2)
plt.figure(figsize=(6,4))
nx.draw(T2, with_labels=True, node_color='lightcoral', node_size=1000)
plt.title(f'Arbre BFS à partir de {source2}')
plt.show()
print('Distances sociales depuis Chloé :')
for k, v in nx.single_source_shortest_path_length(G, source2).items():
print(f'{k} : {v}')
Questions :
- Quelles différences remarquez-vous par rapport au départ depuis Alice ?
- Quelle personne semble jouer un rôle « de pont » dans la diffusion (voir la notion de coefficient de clustering, Séance 3) ?
- Que peut-on dire de la position de Chloé dans le réseau ?
7. Composantes connexes : un acteur isolé¶
Jusqu'ici, tout le monde pouvait recevoir l'information de proche en proche. Mais que se passe-t-il si une personne n'est reliée à personne ?
Ajoutons une nouvelle personne, Hugo, qui n'est reliée à personne dans le réseau.
# Ajout d'une personne isolée
G.add_node('Hugo')
plt.figure(figsize=(6,4))
pos = nx.spring_layout(G, seed=1)
nx.draw(G, pos, with_labels=True, node_color='lightblue', node_size=1000)
plt.title('Réseau social avec une personne isolée (Hugo)')
plt.show()
print('Composantes connexes du graphe :')
for i, comp in enumerate(nx.connected_components(G)):
print(f'Composante {i+1} : {comp}')
Interprétation : une composante connexe est un sous-ensemble du réseau où tout le monde peut s'atteindre par une suite de liens, mais qui n'a aucun lien vers le reste du réseau. Un individu isolé forme, à lui seul, sa propre composante.
Questions :
- Hugo peut-il recevoir l'information ? Pourquoi ?
- Que représente un acteur isolé dans un réseau social réel ?
- Comment cette notion d'isolement peut-elle s'interpréter en sociologie (accès à l'information, exclusion sociale, marginalité) ?
8. Pour aller plus loin (facultatif)¶
- Ajoutez de nouvelles relations pour rendre le graphe plus connecté.
- Essayez de trouver une configuration où tout le monde est relié en deux étapes maximum.
- Reliez Hugo au reste du réseau : combien de composantes reste-t-il ?
9. Synthèse¶
- Le BFS explore un réseau par cercles successifs à partir d'une source, et permet de mesurer la distance sociale.
- Le point de départ de la diffusion change radicalement l'ordre et la vitesse à laquelle l'information circule.
- Le DFS suit une logique d'exploration en profondeur, utile pour détecter des sous-groupes plutôt que pour simuler une diffusion rapide.
- Une composante connexe est un sous-groupe où tout le monde est atteignable, mais coupé du reste. Un individu isolé ne reçoit jamais l'information : cela peut traduire une exclusion ou une marginalisation sociale.