#!/usr/bin/env python # coding: utf-8 # # 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...* # # # --- # #