3  Mesurer

Les mesures sont testées sur deux réseaux, l’un orienté (GD) et l’autre non (GU), correspondant à la plus grande composante connexe. Lorsque la valuation et l’orientation des liens peuvent être prises en compte, les options utiles sont signalées. Par contre, le cas des liens multiples et des boucles n’est pas abordé.

NetworkX propose de nombreuses mesures et méthodes issues de la théorie des graphes au sens strict (centre, barycentre, rayon, etc.) et de l’analyse des flots dans les réseaux (optimisation) ; toutes ne sont pas évoquées ici et je me suis intéressé en priorité aux méthodes me semblant - peut-être à tort - les plus utilisées en sciences sociales.

3.1 Mesures globales

Dans les pages précédentes, on a déjà vu comment afficher l’ordre et la taille du réseau. La densité s’obtient avec la fonction density, le diamètre avec la fonction diameter.

# ordre et taille
print("nombre de sommets (ordre) : ", nx.number_of_nodes(GD), " sommets")
print("nombre de liens - orienté (taille) : ", nx.number_of_edges(GD), " liens")
print("nombre de sommets (ordre) : ", nx.number_of_nodes(GU), " sommets")
print("nombre de liens - non orienté (taille) : ", nx.number_of_edges(GU), " liens")

# densité et diamètre
print("densité (orienté) : ", round(nx.density(GD), 2))
print("densité (non orienté) :", round(nx.density(GU), 2))
# print("diamètre (non orienté et connexe) : ", nx.diameter(GD))
nombre de sommets (ordre) :  106  sommets
nombre de liens - orienté (taille) :  312  liens
nombre de sommets (ordre) :  106  sommets
nombre de liens - non orienté (taille) :  250  liens
densité (orienté) :  0.03
densité (non orienté) : 0.04

Si on cherche à mesurer le diamètre sur un réseau orienté non fortement connexe, on obtient le message d’erreur suivant : “Found infinite path length because the digraph is not strongly connected”.

Mesures directement issues de la théorie des graphes, rayon et barycentre (appelé aussi point médian) correspondent respectivement à la distance entre le(s) sommet(s) ayant une excentricité minimale et tout autre sommet du graphe (cf infra les mesures locales) et à l’ensemble de sommets minimisant la fonction \(\sum_{u \in V(G)} d_G(u, v)\), \(d_G(u, v)\) étant la distance (topologique ou valuée) entre deux sommets \(u\) et \(v\) de \(G\).

# rayon
print("rayon : ", nx.radius(GU))

# barycentre
print("barycentre : ", nx.barycenter(GU))
print("barycentre (valué) : ", nx.barycenter(GU, weight='weight'))
rayon :  4
barycentre :  ['13001']
barycentre (valué) :  ['13001']

La liste du ou des sommets centraux s’obtient avec center, la liste des sommets périphériques avec periphery. Les premiers correspondent aux sommets ayant une excentricité minimale, les seconds aux sommets ayant une excentricité maximale.

print("Sommets centraux : ", nx.center(GU))
print("Sommets périphériques : ", nx.periphery(GU))
Sommets centraux :  ['13001']
Sommets périphériques :  ['13083', '13076']

Comme toutes les mesures fondées sur la recherche de plus courts chemins (diamètre, rayon, etc.), ces fonctions supposent soit un réseau non orienté, soit un réseau orienté fortement connexe.

Il est possible de connaître l’ensemble des isthmes et des points d’articulation présents dans un réseau.

# isthmes et points d'articulation (réseau connexe)
# nombre et liste des isthmes
print("nb isthmes : ", len(list(nx.bridges(GU))))
print("isthmes : ",list(nx.bridges(GU)))

# nombre et liste des points d'articulation
print("nb points d'articulation : ", len(list(nx.articulation_points(GU))))
print("points d'articulation : ", list(nx.articulation_points(GU)))
nb isthmes :  32
isthmes :  [('13001', '13004'), ('13001', '13015'), ('13001', '13019'), ('13001', '13025'), ('13001', '13032'), ('13001', '13095'), ('13001', '13107'), ('13001', '13109'), ('13001', '13110'), ('13001', '13111'), ('13001', '13113'), ('13213', '13075'), ('13103', '13035'), ('13103', '13044'), ('13103', '13049'), ('13004', '13078'), ('13004', '13038'), ('13004', '13108'), ('13097', '13068'), ('13005', '13031'), ('13028', '13023'), ('13020', '13046'), ('13046', '13073'), ('13046', '13101'), ('13024', '13050'), ('13054', '13088'), ('13056', '13104'), ('13045', '13083'), ('13045', '13108'), ('13108', '13094'), ('13076', '13067'), ('13067', '13105')]
nb points d'articulation :  15
points d'articulation :  ['13046', '13028', '13005', '13054', '13103', '13050', '13067', '13105', '13056', '13213', '13004', '13097', '13045', '13108', '13001']

L’indice de Wiener, issu de l’étude des réseaux biologiques, correspond à la somme des plus courts chemins entre toutes les paires de sommets (équivaut à l’indice de dispersion de Shimbel parfois utilisé par les géographes des transports). Le réseau orienté n’étant pas fortement connexe, le résultat est une distance infinie (inf). Il est possible de prendre en compte la valuation des liens et de chercher la somme des plus courtes distances entre sommets.

# indice de wiener (somme des pcc)
print("Indice de Wiener (orienté) : ", nx.wiener_index(GD))     # distance topologique
print("Indice de Wiener (non orienté) : ", nx.wiener_index(GU)) # distance topologique
print("Indice de Wiener (non orienté, valué) : ", nx.wiener_index(GU, 'weight'))  # somme des intensités
Indice de Wiener (orienté) :  inf
Indice de Wiener (non orienté) :  15228.0
Indice de Wiener (non orienté, valué) :  3800738.0

Mesure plus récente et liée davantage aux études des physiciennes sur les réseaux, l’assortativité est mesurée par défaut en fonction du degré. Elle varie entre -1 (réseau disassortatif, les sommets ayant un degré faible tendent à être voisins des sommets ayant un degré élevé et inversement) et 1 (réseau assortatif, les sommets ayant un degré faible sont voisins de sommets ayant un degré faible, les sommets ayant un degré élevé sont voisins de sommets ayant un degré élevé). Dans les lignes ci-dessous, les quatre assortativités possibles dans un réseau orienté sont calculées en fonction du degré.

# assortativité (degré par défaut)
# réseau orienté - 4 options possibles
print("assortativité in-in : ", 
      round(nx.degree_assortativity_coefficient(GD, x="in", y='in'),3))

print("assortativité in-out : ", 
      round(nx.degree_assortativity_coefficient(GD, x="in", y='out'),3))

print("assortativité out-in : ", 
      round(nx.degree_assortativity_coefficient(GD, x="out", y='in'),3))

print("assortativité out-out : ", 
      round(nx.degree_assortativity_coefficient(GD, x="out", y='out'),3))

# réseau non orienté
print("assortativité globale (non orienté) : ", 
      round(nx.degree_assortativity_coefficient(GU),3))

# assortativité selon un critère autre que le degré
print("assortativité (Marseille vs autres communes) : ", 
      round(nx.numeric_assortativity_coefficient(GD, "MARS"),3))
assortativité in-in :  -0.105
assortativité in-out :  0.262
assortativité out-in :  -0.198
assortativité out-out :  0.485
assortativité globale (non orienté) :  -0.234
assortativité (Marseille vs autres communes) :  0.707

Mesure relativement proche (voir la page wikipedia), le rich club coefficient s’obtient avec la fonction… rich_club_coefficient ; elle peut être utilisée uniquement sur des réseaux non orientés et ne tient pas compte des éventuelles boucles, liens multiples ou intensité des liens. La fonction renvoie une valeur par degré (rich club coefficient des sommets de degré 1, de degré 2, etc.).

# rich-club coefficient
print("rich-club coefficient : ", nx.rich_club_coefficient(GU, normalized=True, seed=42))
rich-club coefficient :  {0: 1.0, 1: 0.9955156950672646, 2: 1.0119047619047619, 3: 1.0546875, 4: 1.0677966101694916, 5: 1.0727272727272728, 6: 1.153846153846154, 7: 1.168831168831169, 8: 1.2222222222222223, 9: 1.303030303030303, 10: 1.320754716981132, 11: 1.25, 12: 1.2000000000000002, 13: 1.1052631578947367, 14: 1.1111111111111112, 15: 1.3333333333333335, 16: 1.5, 17: 1.0}

Les mesures “globales” fondées sur des mesures “locales” (degré ou transitivité moyenne par exemple) sont abordées dans la section suivante.

3.2 Mesures locales

Le degré se calcule à l’aide de la fonction degree. Si le réseau étudié est orienté, on peut utiliser in_degree et out_degree. L’argument optionnel weight permet de calculer le degré pondéré par l’intensité des liens.

# degré
print(GD.degree())

#degré entrant, sortant
print(GD.in_degree())
print(GD.out_degree())

# degré entrant pondéré
print(GD.in_degree(weight = "weight"))
[('13001', 72), ('13041', 6), ('13201', 24), ('13205', 23), ('13208', 20), ('13209', 22), ('13213', 33), ('13002', 8), ('13206', 23), ('13211', 16), ('13212', 16), ('13003', 2), ('13053', 2), ('13103', 16), ('13004', 8), ('13078', 2), ('13097', 4), ('13005', 19), ('13028', 7), ('13042', 2), ('13119', 3), ('13210', 17), ('13007', 2), ('13014', 2), ('13117', 11), ('13015', 1), ('13016', 3), ('13086', 2), ('13019', 1), ('13020', 1), ('13046', 5), ('13022', 3), ('13023', 1), ('13024', 1), ('13050', 3), ('13025', 1), ('13026', 4), ('13043', 7), ('13054', 11), ('13056', 10), ('13030', 2), ('13031', 1), ('13032', 1), ('13033', 2), ('13035', 1), ('13037', 4), ('13038', 1), ('13039', 3), ('13047', 9), ('13077', 4), ('13040', 3), ('13044', 1), ('13045', 2), ('13083', 1), ('13108', 3), ('13063', 5), ('13048', 2), ('13074', 3), ('13049', 1), ('13051', 3), ('13102', 3), ('13104', 2), ('13059', 2), ('13060', 3), ('13062', 2), ('13065', 2), ('13068', 1), ('13069', 3), ('13070', 2), ('13071', 8), ('13072', 2), ('13087', 3), ('13073', 1), ('13075', 2), ('13076', 1), ('13067', 2), ('13079', 2), ('13080', 2), ('13081', 2), ('13082', 2), ('13084', 2), ('13085', 2), ('13088', 1), ('13091', 2), ('13092', 2), ('13094', 1), ('13095', 1), ('13098', 2), ('13101', 1), ('13105', 3), ('13106', 3), ('13107', 1), ('13109', 1), ('13110', 1), ('13111', 1), ('13112', 3), ('13113', 1), ('13114', 2), ('13118', 2), ('13202', 7), ('13203', 16), ('13204', 15), ('13214', 14), ('13215', 13), ('13207', 10), ('13216', 4)]
[('13001', 66), ('13041', 5), ('13201', 16), ('13205', 14), ('13208', 12), ('13209', 14), ('13213', 17), ('13002', 1), ('13206', 15), ('13211', 6), ('13212', 6), ('13003', 0), ('13053', 1), ('13103', 14), ('13004', 5), ('13078', 1), ('13097', 3), ('13005', 8), ('13028', 5), ('13042', 2), ('13119', 1), ('13210', 9), ('13007', 0), ('13014', 0), ('13117', 7), ('13015', 0), ('13016', 0), ('13086', 1), ('13019', 0), ('13020', 0), ('13046', 3), ('13022', 2), ('13023', 0), ('13024', 0), ('13050', 1), ('13025', 0), ('13026', 0), ('13043', 5), ('13054', 7), ('13056', 6), ('13030', 0), ('13031', 0), ('13032', 0), ('13033', 0), ('13035', 0), ('13037', 2), ('13038', 0), ('13039', 0), ('13047', 4), ('13077', 3), ('13040', 1), ('13044', 0), ('13045', 0), ('13083', 1), ('13108', 2), ('13063', 2), ('13048', 0), ('13074', 2), ('13049', 0), ('13051', 0), ('13102', 1), ('13104', 1), ('13059', 0), ('13060', 0), ('13062', 0), ('13065', 0), ('13068', 0), ('13069', 1), ('13070', 0), ('13071', 4), ('13072', 0), ('13087', 2), ('13073', 0), ('13075', 1), ('13076', 0), ('13067', 2), ('13079', 0), ('13080', 1), ('13081', 0), ('13082', 1), ('13084', 0), ('13085', 0), ('13088', 0), ('13091', 0), ('13092', 0), ('13094', 0), ('13095', 0), ('13098', 0), ('13101', 0), ('13105', 1), ('13106', 1), ('13107', 0), ('13109', 0), ('13110', 0), ('13111', 0), ('13112', 1), ('13113', 0), ('13114', 0), ('13118', 0), ('13202', 2), ('13203', 5), ('13204', 6), ('13214', 3), ('13215', 4), ('13207', 4), ('13216', 1)]
[('13001', 6), ('13041', 1), ('13201', 8), ('13205', 9), ('13208', 8), ('13209', 8), ('13213', 16), ('13002', 7), ('13206', 8), ('13211', 10), ('13212', 10), ('13003', 2), ('13053', 1), ('13103', 2), ('13004', 3), ('13078', 1), ('13097', 1), ('13005', 11), ('13028', 2), ('13042', 0), ('13119', 2), ('13210', 8), ('13007', 2), ('13014', 2), ('13117', 4), ('13015', 1), ('13016', 3), ('13086', 1), ('13019', 1), ('13020', 1), ('13046', 2), ('13022', 1), ('13023', 1), ('13024', 1), ('13050', 2), ('13025', 1), ('13026', 4), ('13043', 2), ('13054', 4), ('13056', 4), ('13030', 2), ('13031', 1), ('13032', 1), ('13033', 2), ('13035', 1), ('13037', 2), ('13038', 1), ('13039', 3), ('13047', 5), ('13077', 1), ('13040', 2), ('13044', 1), ('13045', 2), ('13083', 0), ('13108', 1), ('13063', 3), ('13048', 2), ('13074', 1), ('13049', 1), ('13051', 3), ('13102', 2), ('13104', 1), ('13059', 2), ('13060', 3), ('13062', 2), ('13065', 2), ('13068', 1), ('13069', 2), ('13070', 2), ('13071', 4), ('13072', 2), ('13087', 1), ('13073', 1), ('13075', 1), ('13076', 1), ('13067', 0), ('13079', 2), ('13080', 1), ('13081', 2), ('13082', 1), ('13084', 2), ('13085', 2), ('13088', 1), ('13091', 2), ('13092', 2), ('13094', 1), ('13095', 1), ('13098', 2), ('13101', 1), ('13105', 2), ('13106', 2), ('13107', 1), ('13109', 1), ('13110', 1), ('13111', 1), ('13112', 2), ('13113', 1), ('13114', 2), ('13118', 2), ('13202', 5), ('13203', 11), ('13204', 9), ('13214', 11), ('13215', 9), ('13207', 6), ('13216', 3)]
[('13001', 21875), ('13041', 926), ('13201', 4624), ('13205', 4649), ('13208', 2668), ('13209', 3208), ('13213', 4703), ('13002', 233), ('13206', 4730), ('13211', 1247), ('13212', 1924), ('13003', 0), ('13053', 108), ('13103', 3972), ('13004', 1127), ('13078', 173), ('13097', 367), ('13005', 1646), ('13028', 983), ('13042', 346), ('13119', 115), ('13210', 1999), ('13007', 0), ('13014', 0), ('13117', 2037), ('13015', 0), ('13016', 0), ('13086', 292), ('13019', 0), ('13020', 0), ('13046', 439), ('13022', 328), ('13023', 0), ('13024', 0), ('13050', 120), ('13025', 0), ('13026', 0), ('13043', 956), ('13054', 1433), ('13056', 1665), ('13030', 0), ('13031', 0), ('13032', 0), ('13033', 0), ('13035', 0), ('13037', 275), ('13038', 0), ('13039', 0), ('13047', 1112), ('13077', 548), ('13040', 210), ('13044', 0), ('13045', 0), ('13083', 118), ('13108', 243), ('13063', 417), ('13048', 0), ('13074', 254), ('13049', 0), ('13051', 0), ('13102', 316), ('13104', 206), ('13059', 0), ('13060', 0), ('13062', 0), ('13065', 0), ('13068', 0), ('13069', 128), ('13070', 0), ('13071', 608), ('13072', 0), ('13087', 267), ('13073', 0), ('13075', 231), ('13076', 0), ('13067', 463), ('13079', 0), ('13080', 251), ('13081', 0), ('13082', 193), ('13084', 0), ('13085', 0), ('13088', 0), ('13091', 0), ('13092', 0), ('13094', 0), ('13095', 0), ('13098', 0), ('13101', 0), ('13105', 314), ('13106', 156), ('13107', 0), ('13109', 0), ('13110', 0), ('13111', 0), ('13112', 189), ('13113', 0), ('13114', 0), ('13118', 0), ('13202', 418), ('13203', 745), ('13204', 1731), ('13214', 618), ('13215', 964), ('13207', 549), ('13216', 128)]

Ajouter _centrality à la fonction utilisée permet d’obtenir les valeurs normalisées.

# degré normalisé
print(nx.degree_centrality(GD))
{'13001': 0.6857142857142857, '13041': 0.05714285714285715, '13201': 0.2285714285714286, '13205': 0.21904761904761907, '13208': 0.1904761904761905, '13209': 0.20952380952380956, '13213': 0.31428571428571433, '13002': 0.0761904761904762, '13206': 0.21904761904761907, '13211': 0.1523809523809524, '13212': 0.1523809523809524, '13003': 0.01904761904761905, '13053': 0.01904761904761905, '13103': 0.1523809523809524, '13004': 0.0761904761904762, '13078': 0.01904761904761905, '13097': 0.0380952380952381, '13005': 0.18095238095238098, '13028': 0.06666666666666668, '13042': 0.01904761904761905, '13119': 0.028571428571428574, '13210': 0.1619047619047619, '13007': 0.01904761904761905, '13014': 0.01904761904761905, '13117': 0.10476190476190478, '13015': 0.009523809523809525, '13016': 0.028571428571428574, '13086': 0.01904761904761905, '13019': 0.009523809523809525, '13020': 0.009523809523809525, '13046': 0.04761904761904762, '13022': 0.028571428571428574, '13023': 0.009523809523809525, '13024': 0.009523809523809525, '13050': 0.028571428571428574, '13025': 0.009523809523809525, '13026': 0.0380952380952381, '13043': 0.06666666666666668, '13054': 0.10476190476190478, '13056': 0.09523809523809525, '13030': 0.01904761904761905, '13031': 0.009523809523809525, '13032': 0.009523809523809525, '13033': 0.01904761904761905, '13035': 0.009523809523809525, '13037': 0.0380952380952381, '13038': 0.009523809523809525, '13039': 0.028571428571428574, '13047': 0.08571428571428572, '13077': 0.0380952380952381, '13040': 0.028571428571428574, '13044': 0.009523809523809525, '13045': 0.01904761904761905, '13083': 0.009523809523809525, '13108': 0.028571428571428574, '13063': 0.04761904761904762, '13048': 0.01904761904761905, '13074': 0.028571428571428574, '13049': 0.009523809523809525, '13051': 0.028571428571428574, '13102': 0.028571428571428574, '13104': 0.01904761904761905, '13059': 0.01904761904761905, '13060': 0.028571428571428574, '13062': 0.01904761904761905, '13065': 0.01904761904761905, '13068': 0.009523809523809525, '13069': 0.028571428571428574, '13070': 0.01904761904761905, '13071': 0.0761904761904762, '13072': 0.01904761904761905, '13087': 0.028571428571428574, '13073': 0.009523809523809525, '13075': 0.01904761904761905, '13076': 0.009523809523809525, '13067': 0.01904761904761905, '13079': 0.01904761904761905, '13080': 0.01904761904761905, '13081': 0.01904761904761905, '13082': 0.01904761904761905, '13084': 0.01904761904761905, '13085': 0.01904761904761905, '13088': 0.009523809523809525, '13091': 0.01904761904761905, '13092': 0.01904761904761905, '13094': 0.009523809523809525, '13095': 0.009523809523809525, '13098': 0.01904761904761905, '13101': 0.009523809523809525, '13105': 0.028571428571428574, '13106': 0.028571428571428574, '13107': 0.009523809523809525, '13109': 0.009523809523809525, '13110': 0.009523809523809525, '13111': 0.009523809523809525, '13112': 0.028571428571428574, '13113': 0.009523809523809525, '13114': 0.01904761904761905, '13118': 0.01904761904761905, '13202': 0.06666666666666668, '13203': 0.1523809523809524, '13204': 0.14285714285714288, '13214': 0.13333333333333336, '13215': 0.12380952380952381, '13207': 0.09523809523809525, '13216': 0.0380952380952381}

Pour transformer une mesure en attribut, on commence par créer un objet correspondondant au résultat puis on utilise la fonction set_node_attributes si la mesure porte sur les sommets et set_edge_attributes si elle porte sur les liens.

# transformer une mesure en attribut 
deg = nx.degree(GU)
nx.set_node_attributes(GU, 'degree', deg)
print("attribut des sommets : ", list(list(GU.nodes(data=True))[0][-1].keys()))
attribut des sommets :  ['P19_POP', 'SUPERF', 'SUP_QUALI', 'NOM', 'MARS', DegreeView({'13001': 66, '13041': 5, '13201': 16, '13205': 14, '13208': 13, '13209': 14, '13213': 18, '13002': 7, '13206': 16, '13211': 12, '13212': 13, '13003': 2, '13053': 2, '13103': 15, '13004': 6, '13078': 1, '13097': 3, '13005': 17, '13028': 6, '13042': 2, '13119': 3, '13210': 11, '13007': 2, '13014': 2, '13117': 9, '13015': 1, '13016': 3, '13086': 2, '13019': 1, '13020': 1, '13046': 5, '13022': 3, '13023': 1, '13024': 1, '13050': 3, '13025': 1, '13026': 4, '13043': 6, '13054': 8, '13056': 7, '13030': 2, '13031': 1, '13032': 1, '13033': 2, '13035': 1, '13037': 4, '13038': 1, '13039': 3, '13047': 7, '13077': 3, '13040': 3, '13044': 1, '13045': 2, '13083': 1, '13108': 3, '13063': 4, '13048': 2, '13074': 3, '13049': 1, '13051': 3, '13102': 2, '13104': 1, '13059': 2, '13060': 3, '13062': 2, '13065': 2, '13068': 1, '13069': 2, '13070': 2, '13071': 7, '13072': 2, '13087': 3, '13073': 1, '13075': 1, '13076': 1, '13067': 2, '13079': 2, '13080': 2, '13081': 2, '13082': 2, '13084': 2, '13085': 2, '13088': 1, '13091': 2, '13092': 2, '13094': 1, '13095': 1, '13098': 2, '13101': 1, '13105': 3, '13106': 3, '13107': 1, '13109': 1, '13110': 1, '13111': 1, '13112': 3, '13113': 1, '13114': 2, '13118': 2, '13202': 5, '13203': 11, '13204': 10, '13214': 11, '13215': 10, '13207': 6, '13216': 3})]

Les lignes ci-dessous proposent différentes solutions pour visualiser la distribution des degrés :

  • histogramme ;
  • courbe ;
  • courbe avec une échelle log-log.
# distribution sous forme d'histogramme
degree_in = sorted((d for n, d in GD.in_degree()), reverse=True)
plt.bar(*np.unique(degree_in, return_counts=True))
plt.title("Degrés entrants")
plt.xlabel("Degré")
plt.ylabel("Fréquence")
Text(0, 0.5, 'Fréquence')

# courbe
degree_sequence = sorted((d for n, d in GU.degree()), reverse=True)

# distribution des degrés
plt.plot(degree_sequence, "r-", marker="o", linewidth=1, markersize=2)
plt.title("Distribution des degrés")
plt.xlabel('Degré')
plt.ylabel('Fréquence')
Text(0, 0.5, 'Fréquence')

# distribution degré - échelle log - log
plt.loglog(degree_sequence, "go-", linewidth=1, markersize=2)
plt.title("Distribution des degrés (log - log)")
plt.xlabel('Degré')
plt.ylabel('Fréquence')
Text(0, 0.5, 'Fréquence')

Il est possible de calculer le degré moyen des voisins à à l’aide de la fonction average_neighbor_degree (degré entrant, sortant, total, pondéré ou non).

# degré moyen des sommets voisins
nx.average_neighbor_degree(GD)
# degré entrant moyen des voisins entrants
nx.average_neighbor_degree(GD, source="in", target="in")
# degré moyen pondéré des voisins
nx.average_neighbor_degree(GD, weight="weight")

Les mesures de centralité autres s’obtiennent avec des fonctions aux noms attendus : closeness, betweenness (edge_betweenness pour l’intermédiarité des liens), eigenvector_centrality et katz_centrality.

# intermédiarité
nx.betweenness_centrality(GD)
L`` 
# intermédiarité des liens
nx.edge_betweenness_centrality(GD)

# proximité
nx.closeness_centrality(GD)

# centralité de vecteur propre
nx.eigenvector_centrality(GD)

# centralité de Katz
nx.katz_centrality(GD)

Concernant la recherche de la transitivité, on peut connaître le nom de triangles (triades fermées) contenant chaque sommet avec la fonction triangles. La transitivité locale s’obtient avec clustering, la transitivité globale avec transitivity et la transitivité moyenne avec average_clustering. Il est possible de prendre en compte l’orientation des liens et/ou leur intensité.

# nombre de triangles
nx.triangles(GU)

# typologie MAN (réseau orienté)
nx.triadic_census(GD) 

# transitivité locale
nx.clustering(GD)

# prise en compte de l'intensité des liens
nx.clustering(GD, weight="weight")
# transitivité globale et moyenne
print("Transitivité globale (orienté) : ", round(nx.transitivity(GD), 2))
print("Transitivité moyenne (orienté) : ", round(nx.average_clustering(GD), 2))
print("Transitivité globale (non orienté) : ", round(nx.transitivity(GU), 2))
print("Transitivité moyenne (non orienté) : ", round(nx.average_clustering(GU), 2))
Transitivité globale (orienté) :  0.62
Transitivité moyenne (orienté) :  0.35
Transitivité globale (non orienté) :  0.29
Transitivité moyenne (non orienté) :  0.54