{
  "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
}