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 ?
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
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).
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', ...]
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()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.
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.
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()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ère | Points |
|---|---|
| Graphe correctement créé (sommets et arêtes) | 3 pts |
| Visualisation claire et lisible du réseau | 3 pts |
| Calcul et interprétation des degrés | 4 pts |
| Calcul et interprétation de la centralité | 4 pts |
| Détection et analyse des communautés | 3 pts |
| Analyse écrite des résultats | 3 pts |
| Total | 20 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 ?
