SNT - TP Python 1 : Modélisation d'un réseau social

Kitten

Pour commencer, exécutez le script suivant pour importer deux modules qui nous seront nécessaires pendant tout le TP.

In [ ]:
# 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

1 Introduction

Exécuter plusieurs fois le script Python ci-dessous (sans chercher pour le moment à en comprendre le code) :

In [ ]:
#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...

2 Découverte du module networkx

Simulons un réseau social avec le module Python networkx.

Lire puis exécuter plusieurs fois le code suivant :

In [ ]:
# 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 :

In [ ]:
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...

3 Un graphe orienté

Lire puis exécuter plusieurs fois le code suivant, qui est presque le même que le code précédent :

In [ ]:
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...

4 Mon petit réseau social

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.

In [ ]:
# votre code ici
...
pass

5 Un réseau social où tout le monde est amis

Lire puis exécuter plusieurs fois le programme suivant.

In [ ]:
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...

6 Un réseau social plus ou moins social

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 :

In [ ]:
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...

7 D'autres réseaux ?

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...