Séance 1 TP — Rappels & prise en main de NetworkX¶
Objectifs pédagogiques¶
- Réviser les définitions : nœuds, arêtes, graphes dirigés / non-dirigés / pondérés.
- Prendre en main
networkxpour créer un graphe et le visualiser. - Explorer des propriétés simples (degré, nombre de sommets et d'arêtes).
- Introduire graphes dirigés et pondérés.
Contexte sociologique¶
Les graphes servent à modéliser les relations sociales :
- Graphe non dirigé : relations symétriques (amitié, collaboration).
- Graphe dirigé : relations asymétriques (qui suit qui sur Twitter).
- Graphe pondéré : intensité des relations (fréquence de contact).
In [ ]:
Copied!
# %pip install networkx matplotlib
import networkx as nx
import matplotlib.pyplot as plt
# %pip install networkx matplotlib
import networkx as nx
import matplotlib.pyplot as plt
Exercice 1 : Créer un graphe non dirigé¶
In [ ]:
Copied!
# Construisons un mini-réseau social
G = nx.Graph()
G.add_edges_from([
("Alice", "Bob"),
("Bob", "Claire"),
("Alice", "David"),
("Claire", "David"),
])
print("Nœuds :", list(G.nodes()))
print("Arêtes:", list(G.edges()))
plt.figure()
nx.draw(G, with_labels=True, node_color="lightblue", node_size=1000)
plt.show()
# Construisons un mini-réseau social
G = nx.Graph()
G.add_edges_from([
("Alice", "Bob"),
("Bob", "Claire"),
("Alice", "David"),
("Claire", "David"),
])
print("Nœuds :", list(G.nodes()))
print("Arêtes:", list(G.edges()))
plt.figure()
nx.draw(G, with_labels=True, node_color="lightblue", node_size=1000)
plt.show()
Questions :
- Qui a le plus de voisins / voisines (ami-e-s) ?
- Quelles sont les relations réciproques ?
Exercice 2 : Explorer les propriétés du graphe¶
In [ ]:
Copied!
print("Nombre de sommets :", G.number_of_nodes())
print("Nombre d'arêtes :", G.number_of_edges())
print("Degrés de chaque sommet :", dict(G.degree()))
print("Degré moyen :", sum(dict(G.degree()).values())/G.number_of_nodes())
print("Nombre de sommets :", G.number_of_nodes())
print("Nombre d'arêtes :", G.number_of_edges())
print("Degrés de chaque sommet :", dict(G.degree()))
print("Degré moyen :", sum(dict(G.degree()).values())/G.number_of_nodes())
Question : Quel est le degré moyen et comment l’interpréter sociologiquement ?
Exercice 3 : Graphe dirigé¶
In [ ]:
Copied!
DG = nx.DiGraph()
DG.add_edges_from([
("Alice", "Bob"),
("Bob", "Claire"),
("Claire", "Alice")
])
plt.figure()
nx.draw(DG, with_labels=True, node_color="lightgreen", node_size=1000, arrows=True)
plt.show()
print("Degré sortant :", dict(DG.out_degree()))
print("Degré entrant :", dict(DG.in_degree()))
DG = nx.DiGraph()
DG.add_edges_from([
("Alice", "Bob"),
("Bob", "Claire"),
("Claire", "Alice")
])
plt.figure()
nx.draw(DG, with_labels=True, node_color="lightgreen", node_size=1000, arrows=True)
plt.show()
print("Degré sortant :", dict(DG.out_degree()))
print("Degré entrant :", dict(DG.in_degree()))
Questions :
- Quelle différence avec le graphe non dirigé ?
- Que représentent les degrés entrants et sortants sociologiquement (ex : followers) ?
Exercice 4 : Graphe pondéré¶
In [ ]:
Copied!
WG = nx.Graph()
WG.add_edge("Alice", "Bob", weight=5) # forte relation
WG.add_edge("Alice", "Claire", weight=1) # relation faible
print("Arêtes avec poids :", WG.edges(data=True))
# Dessin avec poids visibles
pos = nx.spring_layout(WG)
nx.draw(WG, pos, with_labels=True, node_color="lightcoral", node_size=1000)
labels = nx.get_edge_attributes(WG, "weight")
nx.draw_networkx_edge_labels(WG, pos, edge_labels=labels)
plt.show()
WG = nx.Graph()
WG.add_edge("Alice", "Bob", weight=5) # forte relation
WG.add_edge("Alice", "Claire", weight=1) # relation faible
print("Arêtes avec poids :", WG.edges(data=True))
# Dessin avec poids visibles
pos = nx.spring_layout(WG)
nx.draw(WG, pos, with_labels=True, node_color="lightcoral", node_size=1000)
labels = nx.get_edge_attributes(WG, "weight")
nx.draw_networkx_edge_labels(WG, pos, edge_labels=labels)
plt.show()
Questions :
- Comment interpréter le poids d’une relation en sociologie ?
- Donnez un exemple concret (fréquence de discussions, intensité d’une amitié).