Retour aux projets
Projet SNT - Réseaux sociaux

Analyser un réseau social

Modélise les relations entre personnes sous forme de graphe et analyse la structure du réseau : qui sont les influenceurs ? Quelles communautés se forment ?

3 heures
Intermédiaire
Thème : Réseaux sociaux

Objectifs pédagogiques

  • Comprendre la notion de graphe (sommets, arêtes, degré)
  • Modéliser un réseau social sous forme de graphe
  • Calculer des indicateurs de centralité (degré, intermédiarité)
  • Identifier les influenceurs et les communautés
  • Visualiser un graphe avec Python

Prérequis

  • Python installé sur l'ordinateur (ou Google Colab)
  • Connaissances de base en Python (variables, listes, boucles)
  • Bibliothèque NetworkX (pip install networkx matplotlib)

Concepts clés

Le Graphe

Un graphe est composé de sommets (les personnes) reliés par des arêtes (les relations d'amitié).

Le Degré

Le degré d'un sommet est son nombre de connexions. Plus le degré est élevé, plus la personne a d'amis.

La Centralité

La centralité mesure l'importance d'un sommet. Un sommet central est souvent un "pont" entre plusieurs groupes.

Les Communautés

Les communautés sont des groupes de personnestrès connectées entre elles mais peu avec l'extérieur.

Les étapes du projet

1

Collecter les données

On va créer un mini réseau social fictif. Imagine une classe de 10 élèves et leurs relations d'amitié.

# Les élèves de la classe (sommets du graphe)
eleves = ["Alice", "Bob", "Charlie", "David", "Emma",
          "Fiona", "Gabriel", "Hugo", "Iris", "Julie"]

# Les relations d'amitié (arêtes du graphe)
# Chaque tuple représente deux amis
amities = [
    ("Alice", "Bob"),
    ("Alice", "Charlie"),
    ("Alice", "David"),
    ("Bob", "Charlie"),
    ("Bob", "Emma"),
    ("Charlie", "David"),
    ("Charlie", "Emma"),
    ("David", "Fiona"),
    ("Emma", "Fiona"),
    ("Emma", "Gabriel"),
    ("Fiona", "Gabriel"),
    ("Gabriel", "Hugo"),
    ("Hugo", "Iris"),
    ("Hugo", "Julie"),
    ("Iris", "Julie")
]

Conseil : Tu peux utiliser les vrais prénoms de ta classe (avec leur accord !) ou des données d'un vrai réseau social (export Twitter/Instagram).

2

Créer le graphe avec NetworkX

On utilise la bibliothèque NetworkX pour créer et manipuler notre graphe.

import networkx as nx
import matplotlib.pyplot as plt

# Créer un graphe non orienté
G = nx.Graph()

# Ajouter les sommets (élèves)
G.add_nodes_from(eleves)

# Ajouter les arêtes (amitiés)
G.add_edges_from(amities)

# Afficher les informations de base
print(f"Nombre d'élèves : {G.number_of_nodes()}")
print(f"Nombre de relations : {G.number_of_edges()}")
print(f"Liste des élèves : {list(G.nodes())}")

Résultat attendu :
Nombre d'élèves : 10
Nombre de relations : 15
Liste des élèves : ['Alice', 'Bob', 'Charlie', ...]

3

Visualiser le graphe

Affichons notre réseau social sous forme visuelle.

# Configuration de la figure
plt.figure(figsize=(12, 8))

# Disposition des sommets (layout)
pos = nx.spring_layout(G, seed=42)  # seed pour reproductibilité

# Dessiner le graphe
nx.draw(G, pos,
        with_labels=True,           # Afficher les noms
        node_color='lightblue',     # Couleur des sommets
        node_size=2000,             # Taille des sommets
        font_size=10,               # Taille du texte
        font_weight='bold',
        edge_color='gray',          # Couleur des arêtes
        width=2)                    # Épaisseur des arêtes

plt.title("Réseau social de la classe", fontsize=16)
plt.tight_layout()
plt.savefig("reseau_classe.png", dpi=150)
plt.show()
4

Calculer les degrés

Le degré d'un sommet indique son nombre d'amis. Trouvons qui est le plus populaire !

# Calculer le degré de chaque sommet
degres = dict(G.degree())

# Trier par degré décroissant
degres_tries = sorted(degres.items(), key=lambda x: x[1], reverse=True)

print("Classement par nombre d'amis :")
print("-" * 30)
for i, (eleve, deg) in enumerate(degres_tries, 1):
    print(f"{i}. {eleve}: {deg} ami(s)")

# Qui est le plus populaire ?
plus_populaire = degres_tries[0]
print(f"\n🏆 Le/La plus populaire : {plus_populaire[0]} avec {plus_populaire[1]} amis")

Interprétation : Plus le degré est élevé, plus la personne est "populaire" dans le sens où elle a beaucoup de connexions directes.

5

Calculer la centralité d'intermédiarité

Cette mesure identifie les personnes qui servent de "pont" entre différents groupes.

# Calculer la centralité d'intermédiarité (betweenness)
centralite = nx.betweenness_centrality(G)

# Trier par centralité décroissante
centralite_triee = sorted(centralite.items(), key=lambda x: x[1], reverse=True)

print("Classement par centralité (influence) :")
print("-" * 40)
for i, (eleve, cent) in enumerate(centralite_triee, 1):
    print(f"{i}. {eleve}: {cent:.3f}")

# Qui est l'influenceur principal ?
influenceur = centralite_triee[0]
print(f"\n⭐ Influenceur principal : {influenceur[0]} (centralité: {influenceur[1]:.3f})")

Attention : La personne la plus "populaire" (degré élevé) n'est pas forcément la plus "influente" (centralité élevée). L'influenceur est celui qui connecte différents groupes entre eux.

6

Visualisation avancée

Créons une visualisation où la taille des sommets représente leur influence.

# Préparer les tailles et couleurs basées sur la centralité
tailles = [centralite[node] * 5000 + 500 for node in G.nodes()]
couleurs = [centralite[node] for node in G.nodes()]

# Créer la figure
plt.figure(figsize=(14, 10))

# Dessiner avec les nouvelles propriétés
nx.draw(G, pos,
        with_labels=True,
        node_size=tailles,           # Taille = influence
        node_color=couleurs,         # Couleur = influence
        cmap=plt.cm.Reds,            # Palette de couleurs
        font_size=10,
        font_weight='bold',
        edge_color='lightgray',
        width=2)

plt.title("Réseau social - Taille = Influence", fontsize=16)

# Ajouter une barre de couleur
sm = plt.cm.ScalarMappable(cmap=plt.cm.Reds,
                            norm=plt.Normalize(vmin=0, vmax=max(couleurs)))
sm.set_array([])
plt.colorbar(sm, label="Centralité d'intermédiarité")

plt.tight_layout()
plt.savefig("reseau_influence.png", dpi=150)
plt.show()
7

Détecter les communautés

Identifions les groupes d'amis qui se forment naturellement.

from networkx.algorithms import community

# Détecter les communautés (algorithme de Louvain)
communautes = community.louvain_communities(G, seed=42)

print(f"Nombre de communautés détectées : {len(communautes)}")
print("-" * 40)
for i, comm in enumerate(communautes, 1):
    print(f"Communauté {i} : {', '.join(sorted(comm))}")

# Visualiser les communautés avec des couleurs différentes
couleurs_comm = []
for node in G.nodes():
    for i, comm in enumerate(communautes):
        if node in comm:
            couleurs_comm.append(i)
            break

plt.figure(figsize=(12, 8))
nx.draw(G, pos,
        with_labels=True,
        node_size=2000,
        node_color=couleurs_comm,
        cmap=plt.cm.Set3,    # Palette de couleurs distinctes
        font_size=10,
        font_weight='bold',
        edge_color='gray',
        width=2)

plt.title("Communautés dans le réseau social", fontsize=16)
plt.tight_layout()
plt.savefig("reseau_communautes.png", dpi=150)
plt.show()

Critères d'évaluation

CritèrePoints
Graphe correctement créé (sommets et arêtes)3 pts
Visualisation claire et lisible du réseau3 pts
Calcul et interprétation des degrés4 pts
Calcul et interprétation de la centralité4 pts
Détection et analyse des communautés3 pts
Analyse écrite des résultats3 pts
Total20 pts

Pour aller plus loin

Variante 1 : Données réelles

Utilise les données d'un vrai réseau social (export Twitter, données publiques).

Variante 2 : Simulation

Simule la propagation d'une information (fake news, tendance) dans le réseau.

Variante 3 : Graphe orienté

Modélise un réseau où les relations ne sont pas réciproques (followers Twitter).

Variante 4 : Petit monde

Calcule le "petit monde" (6 degrés de séparation) : quelle est la distance moyenne ?

Pixel