# Charger les librairies nécessaires
library(igraph)
library(igraphdata)

# Charger le jeu de données UKfaculty
data(UKfaculty)

# Afficher la structure des données
str(UKfaculty)

# Créer le graphe à partir des données
g <- graph_from_data_frame(UKfaculty, directed = TRUE)

# Visualiser le graphe
plot(g, 
     vertex.size = 5, 
     vertex.label.cex = 0.7, 
     vertex.color = "lightblue", 
     edge.arrow.size = 0.5, 
     main = "Graphe des Facultés UK")

# Nombre de nœuds
num_nodes <- gorder(g)
cat("Nombre de nœuds dans le graphe :", num_nodes, "\n")

# Vérifier si le graphe est dirigé
is_directed <- is.directed(g)
cat("Le graphe est dirigé :", is_directed, "\n")

# Calcul du nombre d'arrêtes
num_edges <- gsize(g)
cat("Nombre d'arrêtes dans le graphe :", num_edges, "\n")

# Calcul de la centralité de degré
centrality_degree <- degree(g)
cat("Centralité de degré des nœuds :\n")
print(centrality_degree)

# Transformer le graphe en non dirigé
g_undirected <- as.undirected(g)

# Appliquer l'algorithme de Louvain
communities <- cluster_louvain(g_undirected)

# Visualiser le graphe avec les communautés
plot(g_undirected, 
     vertex.size = 5, 
     vertex.label.cex = 0.7, 
     vertex.color = membership(communities), 
     main = "Communautés dans le Graphe")

# Nombre de nœuds dans chaque groupe
group_sizes <- table(membership(communities))
cat("Nombre de nœuds dans chaque groupe :\n")
print(group_sizes)

# Trouver le groupe avec le plus de nœuds
largest_group <- as.numeric(names(which.max(group_sizes)))

# Identifier les nœuds dans le groupe le plus grand
nodes_to_remove <- V(g_undirected)[membership(communities) == largest_group]

# Retirer le groupe du graphe
g_reduced <- delete_vertices(g_undirected, nodes_to_remove)

# Nombre de nœuds dans le nouveau graphe
num_nodes_reduced <- gorder(g_reduced)
cat("Nombre de nœuds dans le nouveau graphe :", num_nodes_reduced, "\n")

# Visualiser le nouveau graphe
plot(g_reduced, 
     vertex.size = 5, 
     vertex.label.cex = 0.7, 
     main = "Nouveau Graphe après retrait du groupe le plus grand")

# Calcul de la centralité de degré pour le nouveau graphe
centrality_degree_reduced <- degree(g_reduced)
cat("Centralité de degré dans le nouveau graphe :\n")
print(centrality_degree_reduced)

# Comparer les centralités
cat("Centralité de degré dans le graphe initial :\n")
print(centrality_degree)

cat("Centralité de degré dans le nouveau graphe :\n")
print(centrality_degree_reduced)

# Explication des Changements de Centralité
cat("Explication des Changements de Centralité :\n")
cat("Les valeurs de centralité peuvent changer en raison du retrait de nœuds, de la modification des chemins entre les nœuds restants, et de la perte de connexions importantes.\n")
