1. Importer le graphe

library(igraph)
mis_graph <- read_graph("https://r-stat-sc-donnees.github.io/lesmiserables.gml", format = "gml")
mis_graph
vcount(mis_graph)
ecount(mis_graph)
V(mis_graph)
E(mis_graph)
mis_graph[1:5, 1:5]
graph_from_adjacency_matrix(mis_graph[], mode = "undirected")
as_long_data_frame(mis_graph)[1:5,]
graph_from_data_frame(as_long_data_frame(mis_graph), directed = FALSE)
don <- read.table("https://r-stat-sc-donnees.github.io/couverture.csv",
    header=TRUE,sep=";",fileEncoding="UTF-8")
don[1:6,]
graph_couv <- graph_from_edgelist(as.matrix(don))

2. Visualiser le graphe

plot(mis_graph)

plot(mis_graph, layout = layout.kamada.kawai)

3. Calculer des indices de centralité

is_connected(mis_graph)
graph.density(mis_graph)
centrality <- degree(mis_graph)
plot(mis_graph, layout = layout.kamada.kawai,
     vertex.size = 4*sqrt(centrality))

centrality2 <- betweenness(mis_graph, directed = FALSE)
plot(mis_graph, layout = layout.kamada.kawai,
vertex.size = 1*sqrt(centrality2))

4. Déterminer des classes

group <- membership(cluster_edge_betweenness(mis_graph))
plot(mis_graph, layout = layout.kamada.kawai,
     vertex.color = group)

plot(mis_graph, layout = layout.kamada.kawai, vertex.size = 4*sqrt(centrality), vertex.color = group)

Lap <- embed_laplacian_matrix(mis_graph, no = 6, which = "sa", scaled = FALSE)
set.seed(123)
resspectral <- kmeans(Lap$X[ ,-1], centers = 6, nstart = 1)
plot(mis_graph, vertex.size = 5, vertex.label = NA, vertex.color = resspectral$cluster, vertex.frame.color = resspectral$cluster)

A <- as.matrix(mis_graph[]) 
D <- diag(rowSums(A))
L <- D - A
LR <- svd(L)$u[,76:71]
resspectral <- kmeans(LR, centers = 6, nstart = 1)

Pour aller plus loin

sample_gnm(vcount(mis_graph), ecount(mis_graph))
LS0tDQp0aXRsZTogIkZvdWlsbGUgZGUgZ3JhcGhlIg0KYXV0aG9yOiAiSHVzc29uIGV0IGFsLiINCmRhdGU6ICIwNS8wOS8yMDE4Ig0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOg0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiAzDQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogJzMnDQogICAgdG9jX2Zsb2F0OiB5ZXMNCi0tLQ0KDQoNCiMgMS4gSW1wb3J0ZXIgbGUgZ3JhcGhlDQoNCmBgYHtyLHJlc3VsdHM9ImhpZGUiLG1lc3NhZ2U9RkFMU0Usd2FybmluZz1GQUxTRX0NCmxpYnJhcnkoaWdyYXBoKQ0KbWlzX2dyYXBoIDwtIHJlYWRfZ3JhcGgoImh0dHBzOi8vci1zdGF0LXNjLWRvbm5lZXMuZ2l0aHViLmlvL2xlc21pc2VyYWJsZXMuZ21sIiwgZm9ybWF0ID0gImdtbCIpDQptaXNfZ3JhcGgNCmBgYA0KDQpgYGB7cixyZXN1bHRzID0gImhpZGUiLG1lc3NhZ2U9RkFMU0Usd2FybmluZz1GQUxTRX0NCnZjb3VudChtaXNfZ3JhcGgpDQpgYGANCg0KYGBge3IscmVzdWx0cyA9ICJoaWRlIixtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0V9DQplY291bnQobWlzX2dyYXBoKQ0KYGBgDQoNCg0KYGBge3IscmVzdWx0cz0iaGlkZSIsbWVzc2FnZT1GQUxTRSx3YXJuaW5nPUZBTFNFfQ0KVihtaXNfZ3JhcGgpDQpFKG1pc19ncmFwaCkNCm1pc19ncmFwaFsxOjUsIDE6NV0NCmBgYA0KDQpgYGB7cixyZXN1bHRzPSJoaWRlIixtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0V9DQpncmFwaF9mcm9tX2FkamFjZW5jeV9tYXRyaXgobWlzX2dyYXBoW10sIG1vZGUgPSAidW5kaXJlY3RlZCIpDQpgYGANCg0KYGBge3IscmVzdWx0cz0iaGlkZSIsbWVzc2FnZT1GQUxTRSx3YXJuaW5nPUZBTFNFfQ0KYXNfbG9uZ19kYXRhX2ZyYW1lKG1pc19ncmFwaClbMTo1LF0NCmBgYA0KDQoNCmBgYHtyLHJlc3VsdHM9ImhpZGUiLG1lc3NhZ2U9RkFMU0Usd2FybmluZz1GQUxTRX0NCmdyYXBoX2Zyb21fZGF0YV9mcmFtZShhc19sb25nX2RhdGFfZnJhbWUobWlzX2dyYXBoKSwgZGlyZWN0ZWQgPSBGQUxTRSkNCmBgYA0KDQpgYGB7cixyZXN1bHRzPSJoaWRlIixtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0V9DQpkb24gPC0gcmVhZC50YWJsZSgiaHR0cHM6Ly9yLXN0YXQtc2MtZG9ubmVlcy5naXRodWIuaW8vY291dmVydHVyZS5jc3YiLA0KICAgIGhlYWRlcj1UUlVFLHNlcD0iOyIsZmlsZUVuY29kaW5nPSJVVEYtOCIpDQpkb25bMTo2LF0NCmBgYA0KDQpgYGB7cixyZXN1bHRzPSJoaWRlIixtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0V9DQpncmFwaF9jb3V2IDwtIGdyYXBoX2Zyb21fZWRnZWxpc3QoYXMubWF0cml4KGRvbikpDQpgYGANCg0KDQojIDIuIFZpc3VhbGlzZXIgbGUgZ3JhcGhlDQoNCmBgYHtyLHJlc3VsdHM9ImhpZGUiLG1lc3NhZ2U9RkFMU0Usd2FybmluZz1GQUxTRX0NCnBsb3QobWlzX2dyYXBoKQ0KYGBgDQoNCmBgYHtyLHJlc3VsdHM9ImhpZGUiLG1lc3NhZ2U9RkFMU0Usd2FybmluZz1GQUxTRX0NCnBsb3QobWlzX2dyYXBoLCBsYXlvdXQgPSBsYXlvdXQua2FtYWRhLmthd2FpKQ0KYGBgDQoNCiMgMy4gQ2FsY3VsZXIgZGVzIGluZGljZXMgZGUgY2VudHJhbGl0w6kNCg0KYGBge3IscmVzdWx0cz0iaGlkZSIsbWVzc2FnZT1GQUxTRSx3YXJuaW5nPUZBTFNFfQ0KaXNfY29ubmVjdGVkKG1pc19ncmFwaCkNCmdyYXBoLmRlbnNpdHkobWlzX2dyYXBoKQ0KYGBgDQoNCmBgYHtyLHJlc3VsdHM9ImhpZGUiLG1lc3NhZ2U9RkFMU0Usd2FybmluZz1GQUxTRX0NCmNlbnRyYWxpdHkgPC0gZGVncmVlKG1pc19ncmFwaCkNCnBsb3QobWlzX2dyYXBoLCBsYXlvdXQgPSBsYXlvdXQua2FtYWRhLmthd2FpLA0KICAgICB2ZXJ0ZXguc2l6ZSA9IDQqc3FydChjZW50cmFsaXR5KSkNCmBgYA0KDQpgYGB7cixyZXN1bHRzPSJoaWRlIixtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0V9DQpjZW50cmFsaXR5MiA8LSBiZXR3ZWVubmVzcyhtaXNfZ3JhcGgsIGRpcmVjdGVkID0gRkFMU0UpDQpwbG90KG1pc19ncmFwaCwgbGF5b3V0ID0gbGF5b3V0LmthbWFkYS5rYXdhaSwNCnZlcnRleC5zaXplID0gMSpzcXJ0KGNlbnRyYWxpdHkyKSkNCmBgYA0KDQojIDQuIETDqXRlcm1pbmVyIGRlcyBjbGFzc2VzDQoNCmBgYHtyLHJlc3VsdHM9ImhpZGUiLG1lc3NhZ2U9RkFMU0Usd2FybmluZz1GQUxTRX0NCmdyb3VwIDwtIG1lbWJlcnNoaXAoY2x1c3Rlcl9lZGdlX2JldHdlZW5uZXNzKG1pc19ncmFwaCkpDQpwbG90KG1pc19ncmFwaCwgbGF5b3V0ID0gbGF5b3V0LmthbWFkYS5rYXdhaSwNCiAgICAgdmVydGV4LmNvbG9yID0gZ3JvdXApDQpgYGANCg0KYGBge3IscmVzdWx0cz0iaGlkZSIsbWVzc2FnZT1GQUxTRSx3YXJuaW5nPUZBTFNFfQ0KcGxvdChtaXNfZ3JhcGgsIGxheW91dCA9IGxheW91dC5rYW1hZGEua2F3YWksIHZlcnRleC5zaXplID0gNCpzcXJ0KGNlbnRyYWxpdHkpLCB2ZXJ0ZXguY29sb3IgPSBncm91cCkNCmBgYA0KDQpgYGB7cixyZXN1bHRzPSJoaWRlIixtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0V9DQpMYXAgPC0gZW1iZWRfbGFwbGFjaWFuX21hdHJpeChtaXNfZ3JhcGgsIG5vID0gNiwgd2hpY2ggPSAic2EiLCBzY2FsZWQgPSBGQUxTRSkNCnNldC5zZWVkKDEyMykNCnJlc3NwZWN0cmFsIDwtIGttZWFucyhMYXAkWFsgLC0xXSwgY2VudGVycyA9IDYsIG5zdGFydCA9IDEpDQpgYGANCg0KYGBge3IscmVzdWx0cz0iaGlkZSIsbWVzc2FnZT1GQUxTRSx3YXJuaW5nPUZBTFNFfQ0KcGxvdChtaXNfZ3JhcGgsIHZlcnRleC5zaXplID0gNSwgdmVydGV4LmxhYmVsID0gTkEsIHZlcnRleC5jb2xvciA9IHJlc3NwZWN0cmFsJGNsdXN0ZXIsIHZlcnRleC5mcmFtZS5jb2xvciA9IHJlc3NwZWN0cmFsJGNsdXN0ZXIpDQpgYGANCg0KYGBge3IscmVzdWx0cz0iaGlkZSIsbWVzc2FnZT1GQUxTRSx3YXJuaW5nPUZBTFNFfQ0KQSA8LSBhcy5tYXRyaXgobWlzX2dyYXBoW10pIA0KRCA8LSBkaWFnKHJvd1N1bXMoQSkpDQpMIDwtIEQgLSBBDQpMUiA8LSBzdmQoTCkkdVssNzY6NzFdDQpyZXNzcGVjdHJhbCA8LSBrbWVhbnMoTFIsIGNlbnRlcnMgPSA2LCBuc3RhcnQgPSAxKQ0KYGBgDQoNCiMgUG91ciBhbGxlciBwbHVzIGxvaW4NCg0KYGBge3IscmVzdWx0cz0iaGlkZSIsbWVzc2FnZT1GQUxTRSx3YXJuaW5nPUZBTFNFfQ0Kc2FtcGxlX2dubSh2Y291bnQobWlzX2dyYXBoKSwgZWNvdW50KG1pc19ncmFwaCkpDQpgYGANCg0K