ajout TP 4 & 4 bis séance BFS
This commit is contained in:
88
TP_4.ipynb
Normal file
88
TP_4.ipynb
Normal file
@@ -0,0 +1,88 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": "# Séance 6 — Parcours en largeur (BFS) : comment l’information se propage dans un réseau\n\n## Objectifs\n- Comprendre intuitivement ce qu’est un **parcours en largeur** (Breadth-First Search ou BFS).\n- Relier ce concept à la **diffusion d’une information, d’une rumeur ou d’une 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 d’exploration : le **parcours en profondeur (DFS)**.\n"
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": "## 1. Introduction sociologique : une rumeur se propage\nImaginez qu’une personne — appelons-la **Alice** — partage une nouvelle dans son groupe d’amis.\nChacun la répète à ses proches, et ainsi de suite.\n\nL’information se diffuse **par cercles successifs** : d’abord les amis directs d’Alice, puis les amis des amis, etc.\n\nC’est 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 d’une information\nConsidérons ce réseau :\n\n```\nAlice — Bob — Chloé — David\n │ │ │\n Emma Félix Gaël\n```\n\nSupposons qu’Alice 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 d’un 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** d’Alice (accès direct à l’information).\n- Les **valeurs élevées** indiquent des individus **périphériques** : ils n’apprennent la nouvelle que tardivement.\n\n→ Cela permet d’analyser 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 d’explorer | 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 jusqu’au 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 n’est **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 d’un hashtag, etc.)"
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": "## 8. Synthèse\n- Le **BFS** explore un réseau **par cercles successifs** à partir d’une source.\n- Il permet de mesurer la **distance sociale** et d’identifier les **positions centrales**.\n- Dans un graphe non connexe, certaines personnes ne reçoivent jamais l’information.\n- Le **DFS**, lui, suit une logique d’exploration **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
117
TP_4_bis.ipynb
Normal file
@@ -0,0 +1,117 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": "# Séance 6 bis — TP dirigé : Diffusion d’une information dans un réseau (BFS)\n\n## Objectifs\n- Manipuler concrètement un **parcours en largeur (BFS)** avec Python.\n- Visualiser la **diffusion d’une 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 d’une information à partir d’un 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 n’est 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 s’interpré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 d’une information** dans un réseau.\n- Les **distances** indiquent le **niveau d’accès à l’information**.\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
|
||||
}
|
||||
Reference in New Issue
Block a user