Files
graphes-l3/TP3.ipynb
2025-10-15 13:24:57 +02:00

234 lines
7.2 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Activité — Les matrices dadjacence\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 dadjacence**.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Définition\n",
"Pour un graphe $G = (V, E)$ à *n* sommets, la **matrice dadjacence** $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 damitié 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 dadjacence 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 danalyse\n",
"1. Quel est le **degré** de chaque individu (combien de liens possède-t-il) ?\n",
"2. Quel est lindividu 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 dadjacence\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 quil existe **un ami commun** entre les nœuds *i* et *j*.\n",
"- En sociologie : cela mesure les **liens indirects**, cest-à-dire les “amis damis”.\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 dune 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 dadjacence 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
}