{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 🧼 SĂ©ance 2 — ReprĂ©senter un graphe : matrice, liste d'adjacence, incidence\n", "\n", "## Objectifs pĂ©dagogiques\n", "À la fin de cette sĂ©ance, vous serez capables de :\n", "- reprĂ©senter un graphe Ă  l'aide d'une **matrice d'adjacence** et d'une **liste d'adjacence** ;\n", "- reprĂ©senter un graphe Ă  l'aide d'une **matrice/liste d'incidence** (sommets × arĂȘtes) ;\n", "- choisir la reprĂ©sentation la plus adaptĂ©e selon la taille et la densitĂ© d'un rĂ©seau ;\n", "- interprĂ©ter les liens sociaux Ă  partir de ces reprĂ©sentations ;\n", "- comprendre la **symĂ©trie**, le **degrĂ©** et les **liens indirects** dans un rĂ©seau ;\n", "- construire et explorer ces reprĂ©sentations avec **Python**." ] }, { "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 plusieurs maniĂšres, plus mathĂ©matiques, de reprĂ©senter ces relations : la **matrice d'adjacence**, la **liste d'adjacence**, et la **matrice/liste d'incidence**. Chacune a ses avantages selon la taille du rĂ©seau et ce qu'on veut en faire." ] }, { "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$" ] }, { "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.)" ] }, { "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", "\n", "**Explication :**\n", "\n", "- Une matrice **symĂ©trique** signifie que les relations sont **rĂ©ciproques** : si Alice est amie avec Bob, Bob l'est aussi avec Alice. Cela correspond Ă  des relations mutuelles (amitiĂ©, collaboration, parentĂ©, etc.).\n", "- Une matrice **non symĂ©trique** reprĂ©sente des relations **non rĂ©ciproques** : par exemple, *A suit B* sur Twitter, *A cite B* dans un article scientifique, ou *A supervise B* dans une organisation." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Partie 2 — Exploration Python" ] }, { "cell_type": "code", "metadata": {}, "execution_count": null, "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", "metadata": {}, "execution_count": null, "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))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2. Visualiser le graphe" ] }, { "cell_type": "code", "metadata": {}, "execution_count": null, "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", "metadata": {}, "execution_count": null, "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", "metadata": {}, "execution_count": null, "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\"." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Pourquoi ne met-on pas les Ă©lĂ©ments eux-mĂȘmes au carrĂ© ?\n", "\n", "Quand on Ă©crit **AÂČ**, cela signifie **A × A**, c'est-Ă -dire qu'on multiplie la matrice par elle-mĂȘme selon les rĂšgles de la multiplication matricielle.\n", "\n", "On ne calcule **pas** $(A_{ij})^2$, car cela n'aurait aucun intĂ©rĂȘt :\n", "- $0^2 = 0$ et $1^2 = 1$, donc la matrice ne changerait pas.\n", "- Le but du carrĂ© matriciel est de compter **les chemins de longueur 2** entre les nƓuds.\n", "\n", "Formellement :\n", "$$A^2_{ij} = \\sum_k A_{ik} \\times A_{kj}$$\n", "\n", "Cela signifie que $A^2_{ij}$ indique combien de façons il existe d'aller du nƓud *i* au nƓud *j* en passant par **exactement un autre nƓud**.\n", "\n", "**Exemple :**\n", "Si $A =$\n", "$$\n", "\\begin{bmatrix}\n", "0 & 1 & 0 \\\\\n", "1 & 0 & 1 \\\\\n", "0 & 1 & 0\n", "\\end{bmatrix}\n", "$$\n", "alors $A^2 =$\n", "$$\n", "\\begin{bmatrix}\n", "1 & 0 & 1 \\\\\n", "0 & 2 & 0 \\\\\n", "1 & 0 & 1\n", "\\end{bmatrix}\n", "$$\n", "\n", "- $A^2_{13} = 1$ : il existe un chemin de longueur 2 entre 1 et 3 (en passant par 2).\n", "- $A^2_{22} = 2$ : le sommet 2 a deux chemins de longueur 2 qui reviennent Ă  lui-mĂȘme.\n", "\n", "**RĂ©sumĂ© :**\n", "\n", "| Calcul | Signification | UtilitĂ© |\n", "|:--------|:--------------|:--------|\n", "| $(A_{ij})^2$ | ÉlĂšve chaque case au carrĂ© | Inutile (0 et 1 inchangĂ©s) |\n", "| $A^2 = A × A$ | Produit matriciel | Donne les **liens indirects** (chemins de longueur 2) |" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Partie 3 — Liste d'adjacence\n", "\n", "La matrice d'adjacence a un dĂ©faut : pour un rĂ©seau de 500 personnes, elle contient 500 × 500 = 250 000 cases, mĂȘme si chacune n'a que 10 amis en moyenne (la plupart des cases valent alors 0). Or les rĂ©seaux sociaux rĂ©els sont presque toujours **creux** (*sparse*) : chaque individu ne connaĂźt qu'une petite fraction du groupe.\n", "\n", "La **liste d'adjacence** rĂ©pond Ă  ce problĂšme : au lieu d'une grille, on associe Ă  **chaque sommet la liste de ses voisins**. On ne stocke que les liens qui existent rĂ©ellement.\n", "\n", "$$\\text{Alice} \\rightarrow [\\text{Bob}, \\text{David}]$$\n", "$$\\text{Bob} \\rightarrow [\\text{Alice}, \\text{Claire}, \\text{Emma}]$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1. Construire la liste d'adjacence" ] }, { "cell_type": "code", "metadata": {}, "execution_count": null, "outputs": [], "source": [ "# NetworkX construit directement la liste d'adjacence Ă  partir du graphe G\n", "liste_adjacence = nx.to_dict_of_lists(G)\n", "\n", "for personne, amis in liste_adjacence.items():\n", " print(f\"{personne} → {amis}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2. Comparer matrice et liste d'adjacence\n", "\n", "**Questions :**\n", "1. Combien de \"cases\" contient la matrice d'adjacence de ce petit rĂ©seau Ă  5 personnes ? Combien de liens contient la liste d'adjacence ?\n", "2. Pour un rĂ©seau de 10 000 personnes oĂč chacune a en moyenne 50 ami·es, quelle reprĂ©sentation prendrait le moins de mĂ©moire ?\n", "3. Pour rĂ©pondre rapidement Ă  la question *\"Alice et Emma sont-elles amies ?\"*, quelle reprĂ©sentation est la plus directe ?\n", "4. Pour rĂ©pondre Ă  *\"quels sont les ami·es de Bob ?\"*, quelle reprĂ©sentation est la plus directe ?\n", "\n", "**En rĂ©sumĂ© :** la matrice d'adjacence est pratique pour les calculs matriciels (comme $A^2$) et les rĂ©seaux **denses**. La liste d'adjacence est plus Ă©conome en mĂ©moire et plus rapide Ă  parcourir pour les rĂ©seaux **creux** — c'est-Ă -dire la grande majoritĂ© des rĂ©seaux sociaux rĂ©els." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Partie 4 — Matrice et liste d'incidence\n", "\n", "Les reprĂ©sentations prĂ©cĂ©dentes croisent des **sommets avec des sommets** (qui est reliĂ© Ă  qui). La **matrice d'incidence** change de point de vue : elle croise des **sommets avec des arĂȘtes** (quel individu est concernĂ© par quelle relation).\n", "\n", "Pour un graphe Ă  *n* sommets et *m* arĂȘtes, la matrice d'incidence $B$ est une matrice *n × m* oĂč :\n", "\n", "$$B_{ie} = \\begin{cases}1 & \\text{si le sommet } i \\text{ est une extrĂ©mitĂ© de l'arĂȘte } e \\\\0 & \\text{sinon}\\end{cases}$$\n", "\n", "Chaque **colonne** reprĂ©sente donc une relation (une arĂȘte), avec exactement deux 1 : ses deux extrĂ©mitĂ©s.\n", "\n", "Cette idĂ©e rejoint celle du **graphe biparti** vue en Introduction (COURS.md — individus ↔ opinions, individus ↔ Ă©vĂ©nements) : on peut voir la matrice d'incidence comme \"qui participe Ă  quelle relation\", exactement comme on notait \"qui participe Ă  quel Ă©vĂ©nement\"." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1. Construire la matrice d'incidence" ] }, { "cell_type": "code", "metadata": {}, "execution_count": null, "outputs": [], "source": [ "# Construction manuelle de la matrice d'incidence avec numpy\n", "# (une colonne par arĂȘte, deux 1 par colonne : les deux extrĂ©mitĂ©s)\n", "liste_aretes = list(G.edges())\n", "sommets = list(G.nodes())\n", "\n", "B = np.zeros((len(sommets), len(liste_aretes)), dtype=int)\n", "for colonne, (u, v) in enumerate(liste_aretes):\n", " B[sommets.index(u), colonne] = 1\n", " B[sommets.index(v), colonne] = 1\n", "\n", "print(\"ArĂȘtes (colonnes) :\", liste_aretes)\n", "print(sommets)\n", "print(B)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "InterprĂ©tation : chaque colonne de $B$ contient exactement deux 1, ceux des deux personnes impliquĂ©es dans cette relation. Une ligne \"pleine de 0\" signifierait un individu isolĂ©, qui n'apparaĂźt dans aucune relation.\n", "\n", "### 2. Liste d'incidence\n", "\n", "De la mĂȘme façon qu'on a allĂ©gĂ© la matrice d'adjacence en liste d'adjacence, on peut allĂ©ger la matrice d'incidence : au lieu d'une grille sommets × arĂȘtes, on liste simplement, pour chaque arĂȘte, ses deux extrĂ©mitĂ©s. C'est en fait exactement ce que renvoie `G.edges()` :" ] }, { "cell_type": "code", "metadata": {}, "execution_count": null, "outputs": [], "source": [ "# La liste d'incidence : pour chaque arĂȘte, ses deux extrĂ©mitĂ©s\n", "for i, (u, v) in enumerate(G.edges()):\n", " print(f\"ArĂȘte {i} : {u} — {v}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Application sociologique :** cette matrice sommets × arĂȘtes met en avant les relations elles-mĂȘmes plutĂŽt que les individus. En pratique, en sociologie, elle reste peu utilisĂ©e : elle contient exactement la mĂȘme information que la matrice d'adjacence, sous une forme plus encombrante.\n", "\n", "> ⚠ **Attention Ă  un piĂšge de vocabulaire.** En analyse des rĂ©seaux sociaux, on appelle aussi « matrice d'incidence » un objet **diffĂ©rent** : une matrice **individus × Ă©vĂ©nements**. Ce n'est pas la mĂȘme chose que la matrice sommets × arĂȘtes ci-dessus, et c'est celle-lĂ  qui est vraiment utile au sociologue. C'est l'objet de la partie 5." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Partie 5 — L'incidence utile au sociologue : individus × Ă©vĂ©nements\n", "\n", "### 1. Pourquoi changer d'objet\n", "\n", "Dans la partie 4, chaque colonne reprĂ©sentait une **arĂȘte** et contenait donc exactement deux 1 : les deux extrĂ©mitĂ©s de la relation.\n", "\n", "Mais en sociologie, **on n'observe presque jamais les liens directement**. On n'a pas la liste des amitiĂ©s : on a des listes de prĂ©sence. Qui siĂšge dans quel conseil d'administration, qui signe quelle pĂ©tition, qui assiste Ă  quelle rĂ©union, qui adhĂšre Ă  quelle association.\n", "\n", "On construit alors une matrice $B$ de taille *individus × Ă©vĂ©nements* :\n", "\n", "$$B_{ie} = \\begin{cases}1 & \\text{si l'individu } i \\text{ participe Ă  l'Ă©vĂ©nement } e \\\\ 0 & \\text{sinon}\\end{cases}$$\n", "\n", "**La diffĂ©rence est structurelle :** une colonne n'est plus une arĂȘte mais un Ă©vĂ©nement, et elle contient autant de 1 qu'il y a de participants. Une rĂ©union Ă  cinq personnes donne une colonne Ă  cinq 1.\n", "\n", "C'est ce que Breiger (1974) appelle la **dualitĂ© des personnes et des groupes** : les individus sont reliĂ©s par les Ă©vĂ©nements qu'ils partagent, et les Ă©vĂ©nements sont reliĂ©s par les individus qu'ils rassemblent." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2. Construire la matrice d'affiliation\n", "\n", "Reprenons nos cinq personnes, mais en observant cette fois leurs **participations** Ă  quatre Ă©vĂ©nements associatifs, et non plus leurs amitiĂ©s." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "personnes = [\"Alice\", \"Bob\", \"Claire\", \"David\", \"Emma\"]\n", "evenements = [\"RĂ©union A\", \"Atelier B\", \"Sortie C\", \"Conseil D\"]\n", "\n", "participations = {\n", " \"Alice\": [\"RĂ©union A\", \"Atelier B\"],\n", " \"Bob\": [\"RĂ©union A\", \"Conseil D\"],\n", " \"Claire\": [\"Atelier B\", \"Sortie C\", \"Conseil D\"],\n", " \"David\": [\"Atelier B\", \"Sortie C\", \"Conseil D\"],\n", " \"Emma\": [\"Sortie C\"],\n", "}\n", "\n", "B = np.zeros((len(personnes), len(evenements)), dtype=int)\n", "for i, personne in enumerate(personnes):\n", " for evenement in participations[personne]:\n", " B[i, evenements.index(evenement)] = 1\n", "\n", "print(\"Colonnes :\", evenements)\n", "print(personnes)\n", "print(B)\n", "print()\n", "print(\"Nombre de 1 par colonne :\", B.sum(axis=0))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Observez la derniĂšre ligne : les colonnes somment Ă  2, 3, 3 et 3, et non Ă  2 partout. C'est la preuve concrĂšte qu'il ne s'agit **pas** de la matrice sommets × arĂȘtes de la partie 4." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3. La projection : transformer des co-prĂ©sences en rĂ©seau\n", "\n", "Voici l'opĂ©ration qui rend cette matrice utile. Deux produits matriciels suffisent :\n", "\n", "- $C = B \\, B^{T}$ est une matrice **individus × individus** : $C_{ij}$ compte les Ă©vĂ©nements que $i$ et $j$ ont en commun ;\n", "- $D = B^{T} B$ est une matrice **Ă©vĂ©nements × Ă©vĂ©nements** : $D_{ef}$ compte les personnes prĂ©sentes Ă  la fois en $e$ et en $f$.\n", "\n", "Autrement dit, on part de donnĂ©es d'affiliation, qui sont ce qu'on collecte rĂ©ellement, et on en dĂ©duit un rĂ©seau interpersonnel, qui est ce qu'on veut analyser." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "C = B @ B.T # individus × individus\n", "D = B.T @ B # Ă©vĂ©nements × Ă©vĂ©nements\n", "\n", "print(\"C = B @ B.T (individus × individus)\")\n", "print(personnes)\n", "print(C)\n", "print()\n", "\n", "print(\"Nombre d'Ă©vĂ©nements par personne (diagonale de C) :\")\n", "for i, personne in enumerate(personnes):\n", " print(f\" {personne} : {C[i, i]}\")\n", "print()\n", "\n", "print(\"Co-participations (hors diagonale) :\")\n", "for i in range(len(personnes)):\n", " for j in range(i + 1, len(personnes)):\n", " if C[i, j] > 0:\n", " print(f\" {personnes[i]} et {personnes[j]} : {C[i, j]} Ă©vĂ©nement(s) en commun\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4. Lecture sociologique\n", "\n", "Deux choses se lisent directement dans $C$ :\n", "\n", "- **la diagonale** donne le nombre d'Ă©vĂ©nements de chacun, c'est-Ă -dire son **degrĂ© d'engagement** dans la vie collective. Emma en a 1, Claire et David en ont 3 ;\n", "- **les valeurs hors diagonale** mesurent la force du lien indirect. Claire et David partagent **3 Ă©vĂ©nements** : c'est le lien le plus fort du rĂ©seau.\n", "\n", "Or, si vous remontez au graphe d'amitiĂ© du dĂ©but de la sĂ©ance, **Claire et David ne sont reliĂ©s par aucune arĂȘte**. Leur proximitĂ© est totalement invisible dans la matrice d'adjacence, et elle saute aux yeux dans la projection.\n", "\n", "C'est exactement ce que le sociologue cherche : des liens que les acteurs ne dĂ©clarent pas, mais que leurs pratiques rĂ©vĂšlent.\n", "\n", "> **Attention Ă  l'interprĂ©tation.** Partager trois rĂ©unions ne prouve pas qu'on se connaisse, encore moins qu'on s'apprĂ©cie. La projection produit une **hypothĂšse** de lien, Ă  confronter Ă  d'autres sources. Deux personnes peuvent siĂ©ger dans le mĂȘme conseil sans s'ĂȘtre jamais adressĂ© la parole." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print(\"D = B.T @ B (Ă©vĂ©nements × Ă©vĂ©nements)\")\n", "print(evenements)\n", "print(D)\n", "print()\n", "print(\"Nombre de participants par Ă©vĂ©nement (diagonale de D) :\")\n", "for e, evenement in enumerate(evenements):\n", " print(f\" {evenement} : {D[e, e]}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "La matrice $D$ se lit symĂ©triquement : deux Ă©vĂ©nements qui partagent beaucoup de participants relĂšvent probablement du **mĂȘme milieu**. C'est ainsi qu'on repĂšre, par exemple, que certaines instances recrutent dans le mĂȘme vivier." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## SynthĂšse\n", "| Concept mathĂ©matique | InterprĂ©tation sociologique |\n", "|:----------------------|:----------------------------|\n", "| 1 dans la matrice d'adjacence | lien direct entre deux individus |\n", "| 0 dans la matrice d'adjacence | absence de lien |\n", "| somme d'une ligne (matrice) / longueur d'une liste (liste d'adjacence) | 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", "| liste d'adjacence | reprĂ©sentation compacte, adaptĂ©e aux rĂ©seaux creux (la plupart des rĂ©seaux sociaux rĂ©els) |\n", "| matrice/liste d'incidence (sommets × arĂȘtes) | met en avant les relations elles-mĂȘmes ; mĂȘme information que l'adjacence, sous une forme plus lourde |\n", "| matrice d'affiliation (individus × Ă©vĂ©nements) | donnĂ©es rĂ©ellement collectĂ©es : qui participe Ă  quoi |\n", "| $B B^{T}$ | co-participations : force du lien indirect entre deux individus |\n", "| $B^{T} B$ | proximitĂ© entre Ă©vĂ©nements : recrutent-ils dans le mĂȘme milieu ? |\n", "\n", "| ReprĂ©sentation | Taille | AdaptĂ©e Ă  |\n", "|:-----------------|:--------|:-----------|\n", "| Matrice d'adjacence | *n × n* | petits rĂ©seaux, rĂ©seaux denses, calculs matriciels |\n", "| Liste d'adjacence | proportionnelle au nombre de liens | grands rĂ©seaux creux (cas le plus frĂ©quent) |\n", "| Matrice/liste d'incidence | *n × m* (sommets × arĂȘtes) | surtout thĂ©orique ; peu utilisĂ©e en sociologie |\n", "| Matrice d'affiliation | *n × p* (individus × Ă©vĂ©nements) | rĂ©seaux Ă  deux modes : prĂ©sences, adhĂ©sions, signatures |" ] }, { "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 ?\n", "4. Vous devez analyser le rĂ©seau de tou·tes les utilisateur·rices d'un rĂ©seau social (des millions de personnes, chacune avec quelques centaines d'ami·es en moyenne). Justifiez votre choix entre matrice et liste d'adjacence.\n", "5. Donnez un exemple d'enquĂȘte oĂč vous disposeriez d'une matrice d'affiliation (individus × Ă©vĂ©nements) plutĂŽt que d'une matrice d'adjacence. Qu'apporterait la projection $B B^{T}$ dans ce cas ?\n", "6. Claire et David ne sont reliĂ©s par aucune arĂȘte dans le graphe d'amitiĂ©, mais partagent trois Ă©vĂ©nements. Comment interprĂ©teriez-vous cela ? Quelles prĂ©cautions prendre avant d'en conclure qu'elles et ils se connaissent ?" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "name": "python", "pygments_lexer": "ipython3" } }, "nbformat": 4, "nbformat_minor": 4 }