ajout TP 4 & 4 bis séance BFS

This commit is contained in:
2025-10-22 11:01:35 +02:00
parent b5601dcbf9
commit dbe5f21626
2 changed files with 205 additions and 0 deletions

88
TP_4.ipynb Normal file
View File

@@ -0,0 +1,88 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": "# Séance 6 — Parcours en largeur (BFS) : comment linformation se propage dans un réseau\n\n## Objectifs\n- Comprendre intuitivement ce quest un **parcours en largeur** (Breadth-First Search ou BFS).\n- Relier ce concept à la **diffusion dune information, dune rumeur ou dune idée** dans un réseau social.\n- Explorer un réseau avec Python et `networkx` pour visualiser cette propagation.\n- Comparer avec une autre stratégie dexploration : le **parcours en profondeur (DFS)**.\n"
},
{
"cell_type": "markdown",
"metadata": {},
"source": "## 1. Introduction sociologique : une rumeur se propage\nImaginez quune personne — appelons-la **Alice** — partage une nouvelle dans son groupe damis.\nChacun la répète à ses proches, et ainsi de suite.\n\nLinformation se diffuse **par cercles successifs** : dabord les amis directs dAlice, puis les amis des amis, etc.\n\nCest exactement ce que fait un **parcours en largeur** : explorer un réseau *niveau par niveau*.\n\n→ En sociologie des réseaux, cela correspond à la **distance sociale** entre individus."
},
{
"cell_type": "markdown",
"metadata": {},
"source": "## 2. Exemple manuel : propagation dune information\nConsidérons ce réseau :\n\n```\nAlice — Bob — Chloé — David\n │ │ │\n Emma Félix Gaël\n```\n\nSupposons quAlice commence à diffuser une nouvelle.\n\n**Étapes :**\n1. Niveau 0 : Alice\n2. Niveau 1 : les personnes directement connectées à Alice → {Bob, Emma}\n3. Niveau 2 : les amis de Bob (hors Alice) → {Chloé, Félix}\n4. Niveau 3 : les amis de Chloé → {David, Gaël}\n\nChaque *niveau* correspond à une **distance sociale** par rapport à la source."
},
{
"cell_type": "markdown",
"metadata": {},
"source": "## 3. Visualisation avec Python\nCréons ce réseau et voyons comment le BFS le parcourt."
},
{
"cell_type": "code",
"metadata": {},
"execution_count": null,
"outputs": [],
"source": "import networkx as nx\nimport matplotlib.pyplot as plt\n\n# Création du graphe\nG = nx.Graph()\nG.add_edges_from([\n ('Alice', 'Bob'), ('Alice', 'Emma'),\n ('Bob', 'Chloé'), ('Bob', 'Félix'),\n ('Chloé', 'David'), ('Chloé', 'Gaël')\n])\n\nplt.figure(figsize=(6,4))\npos = nx.spring_layout(G, seed=0)\nnx.draw(G, pos, with_labels=True, node_color='lightblue', node_size=1000)\nplt.title('Réseau social — Diffusion de la nouvelle')\nplt.show()"
},
{
"cell_type": "markdown",
"metadata": {},
"source": "## 4. Explorer le réseau en largeur\nOn peut utiliser la fonction `nx.bfs_tree()` pour construire un arbre de parcours à partir dun point de départ (ici, Alice)."
},
{
"cell_type": "code",
"metadata": {},
"execution_count": null,
"outputs": [],
"source": "source = 'Alice'\nT = nx.bfs_tree(G, source=source)\n\nplt.figure(figsize=(6,4))\nnx.draw(T, with_labels=True, node_color='lightgreen', node_size=1000)\nplt.title(f'Arbre BFS à partir de {source}')\nplt.show()\n\nprint('Ordre du parcours BFS :')\nprint(list(nx.bfs_edges(G, source)))"
},
{
"cell_type": "markdown",
"metadata": {},
"source": "## 5. Distances sociales depuis Alice\nLe BFS permet aussi de mesurer la **distance minimale** entre Alice et chaque autre personne."
},
{
"cell_type": "code",
"metadata": {},
"execution_count": null,
"outputs": [],
"source": "distances = nx.single_source_shortest_path_length(G, source)\nprint('Distances sociales depuis Alice :')\nfor k, v in distances.items():\n print(f'{k} : {v}')"
},
{
"cell_type": "markdown",
"metadata": {},
"source": "### Interprétation sociologique\n- Les **valeurs faibles** indiquent des individus **proches** dAlice (accès direct à linformation).\n- Les **valeurs élevées** indiquent des individus **périphériques** : ils napprennent la nouvelle que tardivement.\n\n→ Cela permet danalyser la **vitesse de diffusion** ou la **position sociale** dans le réseau."
},
{
"cell_type": "markdown",
"metadata": {},
"source": "## 6. Comparaison intuitive : BFS vs DFS\nPour bien comprendre la logique du BFS, comparons-le brièvement à une autre stratégie : le **DFS**.\n\n| Stratégie | Métaphore | Manière dexplorer | Exemple |\n|:-----------|:-----------|:------------------|:---------|\n| BFS (largeur) | diffusion sociale | explore les cercles autour de la source | bouche-à-oreille, information publique |\n| DFS (profondeur) | exploration ciblée | suit un chemin jusquau bout avant de revenir | enquête individuelle, relation hiérarchique |\n\nLe BFS **propagera rapidement une information**, tandis que le DFS **creusera une piste en profondeur**."
},
{
"cell_type": "markdown",
"metadata": {},
"source": "## 7. Pour aller plus loin\n- Comment interpréteriez-vous un individu qui nest **atteint par personne** (non connexe) ?\n- Si plusieurs personnes diffusent simultanément une info, que se passe-t-il ?\n- Quels phénomènes réels le BFS peut-il modéliser ? (rumeur, contagion, propagation dun hashtag, etc.)"
},
{
"cell_type": "markdown",
"metadata": {},
"source": "## 8. Synthèse\n- Le **BFS** explore un réseau **par cercles successifs** à partir dune source.\n- Il permet de mesurer la **distance sociale** et didentifier les **positions centrales**.\n- Dans un graphe non connexe, certaines personnes ne reçoivent jamais linformation.\n- Le **DFS**, lui, suit une logique dexploration **en profondeur**, utile pour détecter des **sous-groupes**.\n"
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"name": "python",
"version": "3.x"
}
},
"nbformat": 4,
"nbformat_minor": 5
}

117
TP_4_bis.ipynb Normal file
View File

@@ -0,0 +1,117 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": "# Séance 6 bis — TP dirigé : Diffusion dune information dans un réseau (BFS)\n\n## Objectifs\n- Manipuler concrètement un **parcours en largeur (BFS)** avec Python.\n- Visualiser la **diffusion dune information** dans un réseau social.\n- Interpréter sociologiquement la **distance**, la **proximité** et la **position** des individus.\n\nCe TP prolonge la séance précédente sur le parcours en largeur."
},
{
"cell_type": "markdown",
"metadata": {},
"source": "## 1. Création du réseau\nCommençons par créer un petit réseau social entre 7 personnes. Nous utiliserons la bibliothèque `networkx` pour représenter et afficher le graphe."
},
{
"cell_type": "code",
"metadata": {},
"execution_count": null,
"outputs": [],
"source": "import networkx as nx\nimport matplotlib.pyplot as plt\n\n# Création d'un graphe non orienté\nG = nx.Graph()\n\n# Sommets et arêtes du réseau\nrelations = [\n ('Alice', 'Bob'), ('Alice', 'Emma'),\n ('Bob', 'Chloé'), ('Bob', 'Félix'),\n ('Chloé', 'David'), ('Chloé', 'Gaël')\n]\n\nG.add_edges_from(relations)\n\n# Affichage du graphe\npos = nx.spring_layout(G, seed=0)\nplt.figure(figsize=(6,4))\nnx.draw(G, pos, with_labels=True, node_color='lightblue', node_size=1000)\nplt.title('Réseau social : relations entre individus')\nplt.show()"
},
{
"cell_type": "markdown",
"metadata": {},
"source": "**Questions :**\n1. Quelle personne semble la plus « centrale » dans le graphe ?\n2. Quelle personne paraît la plus isolée ?\n3. Ce graphe est-il connexe (toutes les personnes peuvent-elles être atteintes ?)"
},
{
"cell_type": "markdown",
"metadata": {},
"source": "## 2. Parcours en largeur (BFS)\nNous allons simuler la diffusion dune information à partir dun individu : **Alice**."
},
{
"cell_type": "code",
"metadata": {},
"execution_count": null,
"outputs": [],
"source": "source = 'Alice'\n\n# Création de l'arbre de parcours BFS depuis Alice\nT = nx.bfs_tree(G, source=source)\n\nplt.figure(figsize=(6,4))\nnx.draw(T, with_labels=True, node_color='lightgreen', node_size=1000)\nplt.title(f'Arbre BFS à partir de {source}')\nplt.show()\n\n# Affichage de l'ordre du parcours\nprint('Ordre du parcours BFS :')\nprint(list(nx.bfs_edges(G, source)))"
},
{
"cell_type": "markdown",
"metadata": {},
"source": "**Questions :**\n1. Dans quel ordre les personnes reçoivent-elles l'information ?\n2. Quel est le rôle d'Alice dans cette diffusion ?\n3. Que se passerait-il si l'information partait de Bob plutôt que d'Alice ?"
},
{
"cell_type": "markdown",
"metadata": {},
"source": "## 3. Distances sociales depuis la source\nLe BFS permet de mesurer la distance sociale entre la source et chaque personne du réseau."
},
{
"cell_type": "code",
"metadata": {},
"execution_count": null,
"outputs": [],
"source": "distances = nx.single_source_shortest_path_length(G, source)\nprint('Distances sociales depuis Alice :')\nfor k, v in distances.items():\n print(f'{k} : {v}')"
},
{
"cell_type": "markdown",
"metadata": {},
"source": "**Interprétation :**\n- Distance = nombre détapes pour atteindre une personne depuis Alice.\n- Plus la distance est grande, plus la personne est éloignée socialement.\n\n**Questions :**\n1. Qui apprend la nouvelle en premier ? En dernier ?\n2. Quelle distance maximale observe-t-on dans ce réseau ?\n3. Quelle est la signification sociologique d'une distance de 3 ?"
},
{
"cell_type": "markdown",
"metadata": {},
"source": "## 4. Comparaison avec un autre point de départ\nRecommençons la diffusion mais cette fois **à partir de Chloé**. Observez les différences de structure et de distances."
},
{
"cell_type": "code",
"metadata": {},
"execution_count": null,
"outputs": [],
"source": "source2 = 'Chloé'\nT2 = nx.bfs_tree(G, source=source2)\n\nplt.figure(figsize=(6,4))\nnx.draw(T2, with_labels=True, node_color='lightcoral', node_size=1000)\nplt.title(f'Arbre BFS à partir de {source2}')\nplt.show()\n\nprint('Distances sociales depuis Chloé :')\nfor k, v in nx.single_source_shortest_path_length(G, source2).items():\n print(f'{k} : {v}')"
},
{
"cell_type": "markdown",
"metadata": {},
"source": "**Questions :**\n1. Quelles différences remarquez-vous par rapport au départ depuis Alice ?\n2. Quelle personne semble jouer un rôle « de pont » dans la diffusion ?\n3. Que peut-on dire de la position de Chloé dans le réseau ?"
},
{
"cell_type": "markdown",
"metadata": {},
"source": "## 5. Expérience sociologique : un acteur isolé\nAjoutons une nouvelle personne, **Hugo**, qui nest reliée à personne. Que se passe-t-il lors du BFS ?"
},
{
"cell_type": "code",
"metadata": {},
"execution_count": null,
"outputs": [],
"source": "# Ajout d'une personne isolée\nG.add_node('Hugo')\n\nplt.figure(figsize=(6,4))\npos = nx.spring_layout(G, seed=1)\nnx.draw(G, pos, with_labels=True, node_color='lightblue', node_size=1000)\nplt.title('Réseau social avec une personne isolée (Hugo)')\nplt.show()\n\nprint('Composantes connexes du graphe :')\nfor i, comp in enumerate(nx.connected_components(G)):\n print(f'Composante {i+1} : {comp}')"
},
{
"cell_type": "markdown",
"metadata": {},
"source": "**Questions :**\n1. Hugo peut-il recevoir l'information ? Pourquoi ?\n2. Que représente un acteur isolé dans un réseau social réel ?\n3. Comment cette notion d'isolement peut-elle sinterpréter en sociologie ?"
},
{
"cell_type": "markdown",
"metadata": {},
"source": "## 6. Pour aller plus loin (facultatif)\n1. Ajoutez de nouvelles relations pour rendre le graphe plus connecté.\n2. Essayez de trouver une configuration où tout le monde est relié en deux étapes maximum.\n3. Testez d'autres points de départ pour le BFS et comparez les distances obtenues."
},
{
"cell_type": "markdown",
"metadata": {},
"source": "## 7. Synthèse\n- Le **BFS** permet de simuler la **diffusion dune information** dans un réseau.\n- Les **distances** indiquent le **niveau daccès à linformation**.\n- Les **personnes centrales** propagent plus vite, les **isolées** restent à lécart.\n- Ces observations permettent de **lier structure du réseau et dynamique sociale**."
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"name": "python",
"version": "3.x"
}
},
"nbformat": 4,
"nbformat_minor": 5
}