library(sf)
library(sfnetworks)
library(tmap)
library(tidygraph)
library(dplyr)
Miary grafu
1 Miary grafu
Sieć geoprzestrzenną określa się jako graf osadzony w przestrzeni geograficznej, w którym wierzchołki i krawędzie można przedstawić jako obiekty geograficzne. Taką sieć można także opisać stosując różne miary grafu.
1.1 Miary centralności wierzchołka
Miary centralności wierzchołka określają, który wierzchołek jest najbardziej istotny w analizowanym grafie/sieci.
Wyróżnia się następujęce miary:
stopień wierzchołka (degree centrality) - liczba bezpośrednich połączeń wierzchołka z innymi wierzchołkami sieci. Obliczana jest z wykorzystaniem funkcji
tidygraph::centrality_degree()
.miara bliskości/sąsiedztwa (closeness centrality) - określa średnią odległość rozpatrywanego wierzchołka do wszystkich pozostałych wierzchołków w grafie. Obliczana jest z wykorzystaniem funkcji
tidygraph::centrality_closeness().
miara pośrednictwa/obciążenia wierzchołka (betweenness centrality) - liczba najkrótszych ścieżek przechodzących przez wierzchołek. Obliczana jest z wykorzystaniem funkcji
tidygraph::centrality_betweenness().
1.2 Miary krawędzi
Miary krawędzi opisują krawędzie grafu. Wyróżnia się:
długość krawędzi - obliczana jest z wykorzystaniem funkcji
sf::st_length(geometry).
pośrednictwo krawędzi (betweenness) - liczba najkrótszych ścieżek przechodzących przez krawędź. Obliczana jest z wykorzystaniem funkcji
tidygraph::centrality_edge_betweenness()
.
1.3 Miary strukturalne grafu
Miary strukturalne grafu charakteryzują cały graf/sieć. Wyróżnia się miary:
średni stopnień wierzchołka grafu (average degree)
gęstość grafu (density) - określa, ile powiązań istnieje między wierzchołkami w porównaniu do tego, ile powiązań między wierzchołkami jest możliwych. Obliczana za pomocą funkcji
igraph::edge_density()
średnica grafu (diameter) - podaje długość (w liczbie krawędzi) najdłuższej ścieżki pomiędzy dwoma dowolnymi połączonymi wierzchołkami (jest to najdłuższa odległość wśród najkrótszych ścieżek). Obliczana za pomocą funkcji
with_graph(net, graph_diameter())
współczynnik klasteryzacji (clustering coefficient) - odzwierciedla stopień, w jakim wierzchołki w grafie mają tendencję do grupowania się. Obliczana za pomocą funkcji
with_graph(net, graph_mean_dist())
średnia odległość (mean distance) - średnia długość najkrótszej drogi. Obliczana za pomocą funkcji
igraph::transitivity(net, type = "global")
2 Przykład: Miary grafu w R
W przykładzie wykorzystamy sieć przestrzenną reprezentowaną przez sieć ulic w centrum Poznania.
= read_sf("data/out_osm_lines.gpkg") foot_lines
= as_sfnetwork(foot_lines) net
plot(net)
2.1 Miary centralności wierzchołka
Miary centralności wierzchołka opisują znaczenie węzłów w sieci.
2.1.1 Stopień centralności wierzchołka
Najprostszą z tych miar jest stopień centralności wierzchołka: liczba bezpośrednich połączeń wierzchołka z innymi wierzchołkami sieci. Stopień centralności wierzchołka można obliczyć zliczając liczbę krawędzi połączonych z węzłem. Im wyższa wartość tym węzeł ma większe znaczenie w sieci.
Obliczenie miar centralności wierzchołka w R wymaga:
- aktywowania tabeli zawierającej wierzchołki (activate(“nodes”))
- dodania do tabeli kolumny, w której zostanie obliczona wartość danej miary centralności (np. mutate(degree = centrality_degree()))
- konwersja sieci na obiekt klasy
sf
, aby można było go zwizualizować.
Stopień centralności wierzchołka obliczany jest za pomocą funkcji tidygraph::centrality_degree()
.
= net |> activate("nodes") |> mutate(degree = centrality_degree())
net = st_as_sf(net) nodes_sf
net
# A sfnetwork with 1541 nodes and 1130 edges
#
# CRS: ETRF2000-PL / CS92
#
# A directed multigraph with 657 components with spatially explicit edges
#
# A tibble: 1,541 × 2
geom degree
<POINT [m]> <dbl>
1 (359112.5 506465.9) 1
2 (359138.6 506532.7) 0
3 (359193.2 506680.9) 1
4 (359274.8 506675) 2
5 (359023.2 506483.5) 1
6 (359048.9 506476.2) 1
# ℹ 1,535 more rows
#
# A tibble: 1,130 × 7
from to osm_id name highway foot geom
<int> <int> <chr> <chr> <chr> <chr> <LINESTRING [m]>
1 1 2 8452538 Aleje Karola Mar… living… <NA> (359112.5 506465.9, 3591…
2 3 4 8452541 Ignacego Paderew… living… yes (359193.2 506680.9, 3592…
3 5 6 20910211 Święty Marcin living… <NA> (359023.2 506483.5, 3590…
# ℹ 1,127 more rows
plot(nodes_sf["degree"])
2.1.2 Miara bliskości (sąsiedztwa)
Innym przykładem miary centralności wierzchołka jest miara bliskości (sąsiedztwa, closeness centrality). Miara ta określa średnią odległość rozpatrywanego wierzchołka do wszystkich pozostałych wierzchołków w grafie. Wierzchołek, który “średnio rzecz biorąc” jest najbliższy wszystkim wierzchołkom jest uznawany za najistotniejszy.
Miara bliskości obliczana jest za pomocą funkcji tidygraph::centrality_closeness()
.
= net |> activate("nodes") |> mutate(closeness = centrality_closeness())
net = st_as_sf(net)
nodes_sf plot(nodes_sf["closeness"])
2.1.3 Miara pośrednictwa
Innym przykładem jest miara pośrednictwa/obciążenia wierzchołka (betweenness centrality), która, mówiąc najprościej, jest liczbą najkrótszych ścieżek przechodzących przez węzeł. Usunięcie wierzchołka z wysoką wartością miary pośrednicywa spowoduje, że obliczenia najkrótszej ścieżki będą dłuższe dla wielu innych wierzchołków w sieci. W efekcie spowoduje to największe zakłócenia w działaniu sieci.
Miara pośrednictwa obliczana jest za pomocą funkcji tidygraph::centrality_betweenness()
.
= net |> activate("nodes") |> mutate(betweenness = centrality_betweenness())
net = st_as_sf(net)
nodes_sf plot(nodes_sf["betweenness"])
2.2 Miary krawędzi
Obliczenie miar krawędzi wymaga aktywowania tabeli przechowującej informacje o krawędziach.
|> activate("edges") net
2.2.1 Długość krawędzi
Jedną z miar opisujących krawędzie (segmenty sieci) jest ich długość.
= net |> activate("edges") |> mutate(length = st_length(geom))
net = st_as_sf(net)
edge_sf plot(edge_sf["length"])
2.2.2 Miara pośrednictwa
Miara pośrednictwa może być także opisana dla krawędzi. W takim przypadku określa ona liczbę najkrótszych ścieżek przechodzących przez krawędź. Miarę pośrednictwa krawędzi oblicza się wykorzystując funkcję tidygraph::centrality_edge_betweenness()
= net |> activate("edges") |> mutate(betweenness = centrality_edge_betweenness())
net = st_as_sf(net)
edge_sf plot(edge_sf["betweenness"])
2.3 Miary strukturalne grafu
Miary strukturalne grafu charakteryzują całą sieć.
2.3.1 Średni stopień wiezchołka grafu
Średni stopień wierzchołka grafu obliczany jest jako średnia arytmetyczna stopnia wierzchołka. Poza średnią można obliczyć także inne statystyki opisowe.
summary(nodes_sf$degree)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.0000 0.0000 1.0000 0.7333 1.0000 3.0000
2.3.2 Gęstość grafu
Gęstość grafu określa, ile powiązań istnieje między wierzchołkami w porównaniu do tego, ile powiązań między wierzchołkami jest możliwych. Gęstość grafu oblicza się wykorzystując funkcję edge_density()
z pakietu igraph
.
= igraph::edge_density(net)
density density
[1] 0.0004761624
2.3.3 Średnica grafu
Średnica grafu (podawana w liczbie krawędzi) określana jest przez odległość między dwoma najdalej położonymi wierzchołkami (biorąc pod uwagę najkrótszą możliwą drogę między nimi). Średnica grafu obliczana jest używając funkcji graph_diameter()
z pakietu igraph
.
= with_graph(net, graph_diameter())
diameter diameter
[1] 18
2.3.4 Średnia odległość
Średnia odległość między węzłami w sieci jest obliczana używając funkcji graph_mean_dist()
.
= with_graph(net, graph_mean_dist())
mean_distance mean_distance
[1] 2.793
2.4 Współczynnik klasteryzacji
2.4.1 Globalny współczynnik klasteryzacji
Globalny współczynnik klasteryzacji obliczany dla całego grafu informuje w jakim stopniu wierzchołki w grafie mają tendencję do grupowania się. Oblicza się go wykorzystując funkcję igraph::transitivity(G, type = "global")
.
::transitivity(net, type = "global") igraph
[1] 0.005628518
2.4.2 Lokalny współczynnik klasteryzacji
Dla każdego wierzchołka grafu można także obliczyć lokalny współczynnik klasteryzacji, który informuje jaki procent sąsiadów wierzchołka V także ze sobą sąsiaduje.
= net |> activate("nodes") |> mutate(local_clustering = igraph::transitivity(net, type = "local"))
net = st_as_sf(net) nodes_sf
plot(nodes_sf["local_clustering"])