From 5fa45aaf12f0d0c5a4e9c88d1eb66064e33a4012 Mon Sep 17 00:00:00 2001 From: Florian Mathieu Date: Wed, 15 Oct 2025 13:24:57 +0200 Subject: [PATCH] ajout tp3 --- TP3.ipynb | 233 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 233 insertions(+) create mode 100644 TP3.ipynb diff --git a/TP3.ipynb b/TP3.ipynb new file mode 100644 index 0000000..990d050 --- /dev/null +++ b/TP3.ipynb @@ -0,0 +1,233 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Activité — Les matrices d’adjacence\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Introduction\n", + "En sociologie, on cherche souvent à représenter **les relations entre individus** : qui connaît qui, qui travaille avec qui, qui échange le plus, etc.\n", + "\n", + "Un **graphe** permet de modéliser ces interactions :\n", + "- **nœuds (ou sommets)** → les individus\n", + "- **arêtes (ou liens)** → les relations entre eux\n", + "\n", + "Mais il existe une autre manière, plus mathématique, de représenter ces relations : la **matrice d’adjacence**.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Définition\n", + "Pour un graphe $G = (V, E)$ à *n* sommets, la **matrice d’adjacence** $A$ est une matrice carrée *n × n* où :\n", + "\n", + "$$A_{ij} = \\begin{cases}1 & \\text{si une arête relie le sommet } i \\text{ au sommet } j \\\\0 & \\text{sinon}\\end{cases}$$\n", + "\n", + "- Dans un **graphe non dirigé**, $A$ est **symétrique** : $A_{ij} = A_{ji}$\n", + "- Dans un **graphe dirigé**, $A$ peut être **asymétrique** : $A_{ij} = 1$ ne signifie pas forcément $A_{ji} = 1$\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Partie 1 — Représentation papier\n", + "### 1. Graphe de départ\n", + "Voici un petit réseau d’amitié entre cinq personnes :\n", + "\n", + "```\n", + "Alice — Bob — Claire\n", + " │ │\n", + " David Emma\n", + "```\n", + "\n", + "**Consigne :**\n", + "1. Listez les sommets : `Alice, Bob, Claire, David, Emma`.\n", + "2. Complétez la matrice d’adjacence correspondante :\n", + "\n", + "| | Alice | Bob | Claire | David | Emma |\n", + "|:------|:------:|:---:|:------:|:------:|:----:|\n", + "| Alice | 0 | | | | |\n", + "| Bob | | 0 | | | |\n", + "| Claire| | | 0 | | |\n", + "| David | | | | 0 | |\n", + "| Emma | | | | | 0 |\n", + "\n", + "(Remplissez avec des 1 là où il existe un lien.)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2. Questions d’analyse\n", + "1. Quel est le **degré** de chaque individu (combien de liens possède-t-il) ?\n", + "2. Quel est l’individu le plus **central** dans ce réseau ?\n", + "3. Si on ajoute un lien entre *David* et *Emma*, comment la matrice change-t-elle ?\n", + "4. Que signifie le fait que la matrice soit **symétrique** ?\n", + "5. En sociologie, que représenterait une matrice **non symétrique** ? (donnez un exemple concret)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Partie 2 — Exploration Python\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import networkx as nx\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1. Créer et afficher la matrice" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "G = nx.Graph()\n", + "G.add_edges_from([\n", + " (\"Alice\",\"Bob\"),\n", + " (\"Bob\",\"Claire\"),\n", + " (\"Alice\",\"David\"),\n", + " (\"Bob\",\"Emma\")\n", + "])\n", + "\n", + "# Obtenir la matrice d’adjacence\n", + "A = nx.to_numpy_array(G, nodelist=G.nodes())\n", + "print(list(G.nodes()))\n", + "print(A.astype(int)) # version entière" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2. Visualiser le graphe" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "plt.figure()\n", + "nx.draw(G, with_labels=True, node_color=\"lightblue\", node_size=1000)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3. Explorer la structure du réseau" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Degré de chaque sommet\n", + "print(\"Degré de chaque individu :\", dict(G.degree()))\n", + "\n", + "# Densité du réseau (rapport entre liens existants et liens possibles)\n", + "print(\"Densité du réseau :\", round(nx.density(G), 2))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 4. Liens indirects : le carré de la matrice" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "A2 = np.linalg.matrix_power(A, 2)\n", + "print(\"A² =\\n\", A2.astype(int))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " Interprétation :\n", + "- Si `A²[i][j] > 0`, cela signifie qu’il existe **un ami commun** entre les nœuds *i* et *j*.\n", + "- En sociologie : cela mesure les **liens indirects**, c’est-à-dire les “amis d’amis”.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Synthèse\n", + "| Concept mathématique | Interprétation sociologique |\n", + "|:----------------------|:----------------------------|\n", + "| 1 dans la matrice | lien direct entre deux individus |\n", + "| 0 dans la matrice | absence de lien |\n", + "| somme d’une ligne | degré (popularité / nombre de connexions) |\n", + "| symétrie | réciprocité des relations |\n", + "| $A^2$ | existence de relations indirectes |\n", + "| densité | cohésion du groupe |\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Questions de réflexion\n", + "1. En quoi la matrice d’adjacence permet-elle de **quantifier** un réseau social ?\n", + "2. Si une matrice est très dense, que peut-on en conclure sur le **type de groupe** étudié ?\n", + "3. Comment pourriez-vous pondérer les liens dans cette matrice pour représenter l’**intensité** des relations ?" + ] + }, + { + "cell_type": "markdown", + "id": "d6a2470b", + "metadata": {}, + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "name": "python", + "version": "3.x" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}