Pour commencer, exécutez le script suivant pour importer deux modules qui nous seront nécessaires pendant tout le TP.
# importation du module "matplotlib" pour créer des graphiques
import matplotlib.pyplot as plt
# importation du module "networkx" pour simuler un réseau social
import networkx as nx
Exécuter plusieurs fois le script Python ci-dessous (sans chercher pour le moment à en comprendre le code) :
#import warnings
G = nx.random_geometric_graph(200, 0.125)
pos = nx.get_node_attributes(G, 'pos')
dmin = 1
ncenter = 0
for n in pos:
x, y = pos[n]
d = (x - 0.5)**2 + (y - 0.5)**2
if d < dmin:
ncenter = n
dmin = d
plt.clf()
#with warnings.catch_warnings(record=True):
p = dict(nx.single_source_shortest_path_length(G, ncenter))
plt.figure(figsize=(8, 8))
nx.draw_networkx_edges(G, pos, nodelist=[ncenter], alpha=0.4)
nx.draw_networkx_nodes(G, pos, nodelist=list(p.keys()),
node_size=80,
node_color=list(p.values()),
cmap=plt.cm.Reds_r)
plt.xlim(-0.05, 1.05)
plt.ylim(-0.05, 1.05)
plt.axis('off')
plt.show()
Exercice 1 : Expliquer pourquoi la figure générée nous permet de modéliser un réseau social.
---> votre réponse dans cette cellule...
Simulons un réseau social avec le module Python networkx
.
Lire puis exécuter plusieurs fois le code suivant :
# création d'un graphe vide non orienté appelé "monReseau"
monReseau = nx.Graph()
monReseau.add_node("Audrey")
monReseau.add_node("Nicolas")
monReseau.add_node("Alexis")
monReseau.add_node("Hélène")
plt.clf()
# dessine (draw) et affiche (show) le graphe "monReseau"
nx.draw(monReseau, with_labels=True)
plt.show()
print("Nombre de personnes =", monReseau.number_of_nodes())
Exercice 2 : Que fait le code de la ligne 6 : monReseau.add_node("Alexis")
?
---> votre réponse dans cette cellule...
Lire puis exécuter plusieurs fois le code suivant :
plt.clf()
monReseau = nx.Graph()
monReseau.add_node("Audrey")
monReseau.add_node("Nicolas")
monReseau.add_node("Alexis")
monReseau.add_node("Hélène")
monReseau.add_edge("Audrey", "Nicolas")
monReseau.add_edge("Audrey", "Alexis")
monReseau.add_edge("Nicolas", "Alexis")
monReseau.add_edge("Hélène", "Audrey")
monReseau.add_edge("Hélène", "Nicolas")
nx.draw(monReseau, with_labels=True)
plt.show()
print("Nombre de personnes =", monReseau.number_of_nodes())
print("Nombre de liens =", monReseau.number_of_edges())
Exercice 3 : Que fait le code de la ligne 8 : monReseau.add_edge("Audrey","Nicolas")
?
---> votre réponse dans cette cellule...
Exercice 4 : Quelles sont les deux personnes qui ne sont pas directement en relation ? Que faudrait-il faire pour les mettre en relation ?
---> votre réponse dans cette cellule...
Lire puis exécuter plusieurs fois le code suivant, qui est presque le même que le code précédent :
plt.clf()
monReseau = nx.DiGraph() # création d'un graphe orienté
monReseau.add_node("Audrey")
monReseau.add_node("Nicolas")
monReseau.add_node("Alexis")
monReseau.add_node("Hélène")
monReseau.add_edge("Audrey", "Nicolas") # lien de Audrey vers Nicolas
monReseau.add_edge("Audrey", "Alexis")
monReseau.add_edge("Nicolas", "Alexis")
monReseau.add_edge("Hélène", "Audrey")
monReseau.add_edge("Hélène", "Nicolas")
monReseau.add_edge("Alexis", "Audrey")
nx.draw(monReseau, with_labels=True)
plt.show()
print("Nombre de personnes =", monReseau.number_of_nodes())
print("Nombre de liens =", monReseau.number_of_edges())
Exercice 5 : Qu'est-ce qui a changé par rapport au graphe précédent ?
---> votre réponse dans cette cellule...
Exercice 6 : Pourquoi la relation entre Audrey et Alexis est-elle différente des autres ? Pourquoi voit-on 5 segments mais 6 liens ?
---> votre réponse dans cette cellule...
Exercice 7 : Ce dernier graphe est dit orienté, par opposition au graphe du paragraphe précédent qui est dit non orienté. Parmi Facebook, Twitter, Instagram, WhatsApp, Snapchat, citer un réseau social orienté et un réseau social non orienté.
---> votre réponse dans cette cellule...
Exercice 8 : Choisir six prénoms de votre choix et simuler graphiquement un réseau social non orienté entre ces personnes, à l'aide du code appris précédemment.
# votre code ici
...
pass
Lire puis exécuter plusieurs fois le programme suivant.
plt.clf()
monRezo = nx.Graph()
Liste = ["Ronaldo", "Messi", "Totti", "Salah", "Mbappé", "Neymar"]
for a in Liste:
monRezo.add_node(a)
for b in Liste:
for c in Liste:
monRezo.add_edge(b, c)
nx.draw(monRezo, with_labels = True)
plt.show()
print("Nombre de personnes =", monRezo.number_of_nodes())
print("Nombre de liens =", monRezo.number_of_edges())
Exercice 9 : Expliquer ce que font les lignes 8, 9 et 10 du programme.
---> votre réponse dans cette cellule...
La fonction random()
renvoie un nombre réel au hasard entre 0 et 1.
Lire puis exécutez plusieurs fois de suite le programme suivant :
from random import random
plt.clf()
monRezo = nx.Graph()
Liste = ["Ronaldo", "Messi", "Totti", "Salah", "Pogba", "Neymar"]
p = 0.3
for a in Liste:
monRezo.add_node(a)
for b in Liste:
for c in Liste:
if random() < p:
monRezo.add_edge(b, c)
nx.draw(monRezo, with_labels = True)
plt.show()
print("Nombre de personnes =", monRezo.number_of_nodes())
print("Nombre de liens =", monRezo.number_of_edges())
Exercice 10 : Par défaut p = 0.3
(ligne 6 du programme). Donnez à p
la valeur 0.1
puis exécutez plusieurs fois le programme. Donnez à p
la valeur 0.9
puis exécutez plusieurs fois le programme. Que constatez-vous ? Pourquoi ?
---> votre réponse dans cette cellule...
Bonus : Nous venons de simuler un réseau social avec le module Python networkx
. Quels autres types de réseaux pourrait-on modéliser avec networkx
?
---> votre réponse dans cette cellule...