Tevfik

Tevfik Bulut

Data Scientist

Web Site

Linkedin

RPubs

Contact

İçindekiler

0.1 Intro

In this study, it is aimed to raise awareness about network analysis (NA or SNA) by analyzing synthetic data produced after basic components of network analysis have been revealed and to show metrics widely used.

0.2 Giriş

Info!Ağ analizi ya da sosyal ağ analizi (SAA), araştırmacıların aktörler arasındaki ilişkileri tanımlamasına ve bu ilişkilerin tekrarından ortaya çıkan sosyal yapıları analiz etmesine olanak sağlayan bir dizi tekniktir. SAA’nın temel amacı, sosyal olguyu olabildiğince açıklamaktır ve bu analiz genellikle sosyal ağ analizi (SNA) olarak adlandırılmaktadır. Burada sosyal ağ terimi, bireyler, aileler, haneler, köyler, topluluklar, bölgeler vb.olarak ifade edilebilir. SAA, nicel kavramların açıklanmasına katkısının yanı sıra, nitel kavramların nicel ölçümlerini sağlayarak olguların daha iyi anlaşılmasını sağlar.

Bu çalışma kapsamında R programlama dili kullanılarak üretilen sentetik veriler üzerinden sosyal ağ analizine giriş niteliğinde uygulama örnekleri yapılacaktır.

SNA’da, veri seti genellikle analizden önce matris formatına dönüştürülür. Ancak, diğer veri kümesi biçimleri, R veya Python gibi bazı programlama dilleri tarafından desteklenir.

Ağ analizi birçok farklı konu alanında yapılabilmektedir. Öne çıkan alanlar şu şekilde sıralanabilir:

  • Pazarlama Analitiği
  • Sosyal ilişkiler
  • İlaç
  • Bankacılık İşlemleri
  • Tedarik zinciri
  • Telekom
  • Lojistik

Bir ağın bileşenleri

Bir SAA’nın bileşenleri düğüm ve kenar olup Şekil 1’de gösterilmiştir.

  • Düğüm (Vertex ya da Node): Düğümler veya köşeler, birbiriyle ilişkili birimlerdir. Bir kenar (iki elemanlı bir set), iki köşeyi birleştiren bir çizgi olarak çizilir.

  • Kenar (Edge): İki öğeden oluşan bir küme olan kenar, iki düğümü birbirine bağlayan bir çizgi olarak tanımlanır.

Şekil 1: Bir Ağın Bileşenleri

Sonraki bölümlerde sırasıyla adım adım R kod blokları verilecektir. Daha sonra elde edilen sonuçlar sunulacaktır. Aşağıda çok fazla kütüphane yüklediğime bakmayınız :). Çok daha azı ile de SAA yapılabilmektedir. Daha çok burada visNetwork, dplyr, igraph ve *networkD3 paketleri kullanılmıştır. İlk çalışmadan farklı olarak ikinci çalışmada 3d ağlara, Sankey diyagramına, dendrograma ve radyal ağlara yer verilmiştir. Çalışmanın bu versiyonunda ise tidygraph, ggraph ve netrankr paketlerinin kullanılmasına ve diğer metriklerin hesaplanmasına yer verilmiştir.

0.3 Yüklenen kütüphaneler

kütüphane<-c("dplyr","tibble","tidyr","ggplot2","ggthemes","readxl", "writexl", "psych", "GGally", "rstatix","RColorBrewer","htmlwidgets","kableExtra","stargazer","readr", "visNetwork" , "igraph", "networkD3", "tidygraph", "ggraph", "netrankr")
yükle<-sapply(kütüphane, require, character.only = TRUE, warn.conflicts = FALSE)
 
#Kütüphane yüklenme durumunu gösteren tablo
 
tablo=suppressWarnings(yükle, classes = "warning")
   
isim=names(tablo)
   
deger=as_tibble(tablo)
   
data.frame(Sıra=1:length(isim), Kütüphane=isim, Durumu=deger$value) %>% mutate(Durumu=if_else(Durumu==TRUE, "Yüklendi", "Paket Kurulumu Gerekli")) %>% kbl(caption = "Kütüphane Yüklenme Bilgisi") %>% kable_styling(bootstrap_options = c("striped", "hover"), full_width = F, html_font="calibri")
Kütüphane Yüklenme Bilgisi
Sıra Kütüphane Durumu
1 dplyr Yüklendi
2 tibble Yüklendi
3 tidyr Yüklendi
4 ggplot2 Yüklendi
5 ggthemes Yüklendi
6 readxl Yüklendi
7 writexl Yüklendi
8 psych Yüklendi
9 GGally Yüklendi
10 rstatix Yüklendi
11 RColorBrewer Yüklendi
12 htmlwidgets Yüklendi
13 kableExtra Yüklendi
14 stargazer Yüklendi
15 readr Yüklendi
16 visNetwork Yüklendi
17 igraph Yüklendi
18 networkD3 Yüklendi
19 tidygraph Yüklendi
20 ggraph Yüklendi
21 netrankr Yüklendi

0.4 Örnek 1

düğüm <- data.frame(id = 1:3, label=1:3)
kenar <- data.frame(from = c(1,2), to = c(2,3), arrows="to")
visNetwork(düğüm, kenar, main="Basit Bir Ağ Örneği")

0.5 Örnek 2

dugum <- data.frame(id = 1:10, label = paste("Etiket", 1:10),
 group = sample(LETTERS[1:3], 10, replace = TRUE), value = 1:10,
 title = paste0("<p>", 1:10,"<br>Düğüm</p>"), stringsAsFactors = FALSE)

kenar <- data.frame(from = c(8,2,7,6,1,8,9,4,6,2),
 to = c(3,7,2,7,9,1,5,3,2,9),
 value = rnorm(10, 10), label = paste("Kenar", 1:10),
 title = paste0("<p>", 1:10,"<br>Kenar</p>"))

visNetwork(dugum, kenar, height = "500px", width = "100%") %>% 
  visOptions(highlightNearest = TRUE) %>%
  visLayout(randomSeed = 1461)

0.6 Örnek 3

dugum <- data.frame(
  id = 1:3,
  label = 1:3,
  group=c("A","B","C"),
  value = c(10, 10, 10)
)
kenar<- data.frame(
  from = c(1, 2, 3),
  to = c(2, 3, 1)
)
visNetwork(dugum, kenar, main="Gruplara Göre Ağın Gösterimi") %>% 
  visNodes(shape = "ellipse") %>% 
  visEdges(arrows = "to", smooth = list(enabled = FALSE))%>%
  visGroups(groupname = "A", color = "red") %>%
  visGroups(groupname = "B", color = "lightblue") %>%
  visGroups(groupname = "C", color = "green")%>%
  visLegend(width = 0.1, position = "left", main = "Grup")

0.7 Örnek 4: Merkezilik Ölçüleri

Info!Bu kısımda ağ analizinde düğümlerin derece metriği hesaplanmıştır. Derece, bir düğümün kaç komşusu olduğunu gösteren basit bir merkezilik ölçüsüdür. Ağ yönlendiriliyorsa, ölçümün iki versiyonuna sahibiz: derece içi, gelen bağlantıların sayısı veya önceki düğümlerin sayısıdır. Derece dışı, giden bağlantıların sayısı veya ardıl düğümlerin sayısıdır. Tipik olarak, derece ile ilgileniyoruz, çünkü iç bağlantılar ağdaki diğer düğümler tarafından verilirken, dış bağlantılar düğümün kendisi tarafından belirlenir.

Bir düğüm, çok sayıda komşusu varsa veya yönlendirilmiş durumda, kendisine bağlanan çok sayıda başka düğüm varsa veya diğer birçok düğüme bağlanırsa önemlidir.
set.seed(1461)
grup=sample(x=c("Ankara", "İzmir", "Trabzon"), 10, replace = T)
nodes <- data.frame(id = 1:10, label = paste("E", 1:10), grup=grup, title = grup)
edges <- data.frame(from = sample(1:10, 10, replace = T), to =sample(1:10, 10, replace = T), arrows = "to", dashes=c(TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE))
graph <- graph.data.frame(edges, directed = T)
degree_value <- degree(graph, mode = "total")# derece içi ve dışının toplamı verilmektedir.
nodes$derece <- degree_value[match(nodes$id, names(degree_value))]
nodes$label <- paste("Derece:", nodes$derece, "(", nodes$id, ")")

visNetwork(nodes, edges, main="Ağ Analizinde Düğümlerde Toplam Derecenin Hesaplanması")%>% 
  visOptions(selectedBy = list(variable = "derece", multiple = F),highlightNearest = TRUE)

0.8 Örnek 5: Ağa Navigasyon Butonlarının Atanması

Bu kısımda ağ analizinde düğümlerin derece metriği hesaplanmıştır.

Bir düğüm, çok sayıda komşusu varsa veya yönlendirilmiş durumda, kendisine bağlanan çok sayıda başka düğüm varsa veya diğer birçok düğüme bağlanırsa önemlidir.

set.seed(1461)
grup=sample(x=c("Ankara", "İzmir", "Trabzon"), 10, replace = T)
nodes <- data.frame(id = 1:10, label = paste("E", 1:10), grup=grup, title = grup)
edges <- data.frame(from = sample(1:10, 10, replace = T), to =sample(1:10, 10, replace = T), arrows = "to", dashes=c(TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE))
graph <- graph.data.frame(edges, directed = T)
degree_value <- degree(graph, mode = "total")# derece içi ve dışının toplamı verilmektedir.
nodes$derece <- degree_value[match(nodes$id, names(degree_value))]
nodes$label <- paste("Derece:", nodes$derece, "(", nodes$id, ")")

visNetwork(nodes, edges, main="Ağ Analizinde Düğümlerde Toplam Derecenin Hesaplanması")%>% 
visOptions(selectedBy = list(variable = "derece", multiple = F),highlightNearest = TRUE)%>% 
visInteraction(navigationButtons = TRUE)

0.9 3D ağlar oluşturma

set.seed(1461)

kaynak <- sample(x=c("Ankara", "İzmir", "Trabzon", "Kayseri", "Sivas", "Antalya"), 10, replace = T)
hedef <-  sample(x=c("Ankara", "İzmir", "Trabzon", "Kayseri", "Sivas", "Antalya"), 10, replace = T)
veri <- data.frame(kaynak, hedef)

simpleNetwork(veri, fontFamily = "calibri", fontSize = 16, zoom = T, nodeColour = "blue", linkColour = "#666", linkDistance = 100)

0.10 Hiyerarşik dendogram oluşturma

set.seed(1461)
hk <- USArrests %>% sample_n(20) %>%
  scale() %>% dist() %>%
  hclust(method = "complete")
dendroNetwork(hk, fontSize = 14, height = 500, width = 800,  zoom = T, linkColour = "blue", nodeColour = "green")

0.11 Radyal Ağ Oluşturma 1

hk <- hclust(dist(USArrests), "ave")
radialNetwork(as.radialNetwork(hk))

0.12 Radyal Ağ Oluşturma 2

radialNetwork(as.radialNetwork(hk), fontSize = 14)

Radyal Ağ Örneği

0.13 Chord ağı oluşturma

ulasim <- matrix(sample(x=1:10000, 25, replace=F),
nrow =5)
chordNetwork(Data = ulasim, width = 500, height = 500, colourScale = c("#000000", "#FFDD89", "#957244", "#F26223", "#CCFF99"),
             labels = c("Trabzon", "Sivas", "Ankara", "İstanbul", "Antalya"),
             padding = 0.1, fontSize = 16,
             fontFamily = "calibri", labelDistance = 30)

0.14 Yay diyagram oluşturma

Yay diyagramı, özel bir ağ grafiği türüdür. Birimleri temsil eden düğümlerden ve birimler arasındaki ilişkileri gösteren bağlantılardan oluşur. Yay diyagramlarında düğümler tek bir eksen boyunca gösterilir ve bağlantılar yaylarla gösterilir.Düğümlerin sırası ark diyagramlarının anahtarıdır.

require(tidygraph)
# Make a graph with different directions of edges
gr <- create_notable('Meredith') %>%
  convert(to_directed) %>%
  mutate(class = sample(letters[1:3], n(), replace = TRUE)) %>%
  activate(edges) %>%
  mutate(
    class = sample(letters[1:3], n(), replace = TRUE),
    switch = sample(c(TRUE, FALSE), n(), replace = TRUE)
  ) %>%
  reroute(from = to, to = from, subset = switch)

ggraph(gr, 'linear') +
  geom_edge_arc(aes(alpha = stat(index)))+
  geom_node_text(aes(label=class), angle=65, hjust=1, nudge_y = -1.1, size=2.3)

ggraph(gr, 'linear') +
  geom_edge_arc2(aes(colour = node.class), strength = 0.6)+
  geom_node_text(aes(label=class), angle=65, hjust=1, nudge_y = -1.1, size=2.3)

## Ağ diyagramı ile kümeleme sonucu görselleştirme

library(RColorBrewer)

#Korelasyon matrisi
kor <- cor(t(iris[,c(1:4)]))

kor[kor<0.9] <- 0
 
network <- graph_from_adjacency_matrix(kor, weighted=T, mode="undirected", diag=F)

renk<- brewer.pal(nlevels(as.factor(iris$Species)), "Set1")

renkd <- renk[as.numeric(as.factor(iris$Species))]

# grafik
par(bg="grey11", mar=c(0,0,0,0))
set.seed(1461)
plot(network, 
    vertex.size=12,
    vertex.color=renkd, 
    vertex.label.cex=0.7,
    vertex.label.color="white",
    vertex.frame.color="transparent"
    )

# başlık ve legend
text(0,0,"iris bitki ağı",col="white", cex=1.5)
legend(x=-0.2, y=-0.12, 
       legend=paste( levels(as.factor(iris$Species)), " Türü", sep=""), 
       col = renk , 
       bty = "n", pch=20 , pt.cex = 2, cex = 1,
       text.col="white" , horiz = F)

0.15 Sankey diyagram oluşturma

set.seed(1453)
baglantı <- data.frame(
  kaynak=sample(x=c("Ankara", "İzmir", "Trabzon"), 40, replace = T), 
  hedef=sample(x=c("Kars", "Manisa", "Siirt", "Tekirdağ", "Kayseri"), 40, replace = T),
  deger=sample(x=1:1000, 40, replace=F))

dugum <- data.frame(
  isim=c(as.character(baglantı$kaynak), as.character(baglantı$hedef)) %>% 
    unique()
)

baglantı$IDKaynak <- match(baglantı$kaynak, dugum$isim)-1 
baglantı$IDHedef <- match(baglantı$hedef, dugum$isim)-1

# veri seti
baglantı %>% 
kbl() %>%  
kable_styling(bootstrap_options = c("striped", "hover"))
kaynak hedef deger IDKaynak IDHedef
Ankara Tekirdağ 679 0 3
Trabzon Siirt 919 1 4
Trabzon Tekirdağ 506 1 3
İzmir Kars 216 2 5
İzmir Tekirdağ 124 2 3
Ankara Kars 333 0 5
Ankara Siirt 637 0 4
İzmir Manisa 308 2 6
Trabzon Manisa 126 1 6
İzmir Manisa 925 2 6
Ankara Tekirdağ 680 0 3
İzmir Kars 283 2 5
Ankara Kars 172 0 5
Trabzon Kars 669 1 5
Ankara Kayseri 279 0 7
Trabzon Manisa 962 1 6
Ankara Siirt 22 0 4
Ankara Kayseri 833 0 7
Ankara Siirt 191 0 4
İzmir Kars 178 2 5
İzmir Manisa 861 2 6
İzmir Manisa 270 2 6
İzmir Siirt 501 2 4
Ankara Manisa 373 0 6
Ankara Kars 138 0 5
İzmir Siirt 366 2 4
Ankara Kayseri 922 0 7
Ankara Kayseri 72 0 7
Trabzon Tekirdağ 305 1 3
Trabzon Manisa 624 1 6
Trabzon Manisa 254 1 6
Trabzon Manisa 341 1 6
İzmir Siirt 864 2 4
Ankara Tekirdağ 301 0 3
Ankara Kars 536 0 5
İzmir Tekirdağ 854 2 3
İzmir Manisa 394 2 6
İzmir Manisa 201 2 6
Trabzon Siirt 974 1 4
İzmir Siirt 838 2 4
# Sankey Diyagramı
sd=sankeyNetwork(Links = baglantı, Nodes = dugum, Source = "IDKaynak", Target = "IDHedef", 
              Value = "deger", NodeID = "isim", fontSize= 15, nodeWidth = 10, nodePadding = 50, sinksRight=F, fontFamily = "Calibri")

sd<- prependContent(sd, htmltools::tags$h5("Örnek Bir Sankey Diyagramı"))
sd<-  htmltools::strong(sd)
sd
Örnek Bir Sankey Diyagramı

0.16 Tidygraph ve ggraph paketleri ile ağın gösterimi 1

Burada düğüm sayısı 25 olan bir ağ gösterilmiştir.

f=create_complete(25)
ggraph(f, layout="stress") + 
  geom_edge_link() + 
  geom_node_point()+
  theme_graph()+
  ggtitle(paste("Örnek Ağın Yapısı(Kenar Sayısı=",gsize(f),","," Düğüm Sayısı=",gorder(f),")", sep=""))+
  theme(plot.title = element_text(hjust = 0.5))

0.17 Tidygraph ve ggraph paketleri ile ağın gösterimi 1

Burada düğüm sayısı 20 olan halka ağ gösterilmiştir.

f=create_ring(20,  directed = TRUE)
ggraph(f, layout = "stress") + 
  geom_edge_link() + 
  geom_node_point()+
  theme_graph()+
  ggtitle(paste("Örnek Ağın Yapısı(Kenar Sayısı=",gsize(f),","," Düğüm Sayısı=",gorder(f),")", sep=""))+
  theme(plot.title = element_text(hjust = 0.5))

0.18 Tidygraph ve ggraph paketleri ile ağın gösterimi 2

k=create_notable('bull') %>%
activate(nodes) %>%
mutate(name = letters[1:5])
ggraph(k, layout = "stress") + 
  geom_edge_link() + 
  geom_node_point()+
  geom_node_label(aes(label = name))+
  theme_graph()+
  ggtitle(paste("Örnek Ağın Yapısı (Kenar Sayısı=",gsize(k),","," Düğüm Sayısı=",gorder(k),")", sep=""))+
  theme(plot.title = element_text(hjust = 0.5))

0.19 Tidygraph ve ggraph paketleri ile ağın gösterimi 3

dugum <- tibble(id = c(1, 2, 3, 4, 5, 6, 7, 8), dugum=letters[1:8])
kenar <- tibble(from = c(1, 4, 2, 4, 4, 6, 6, 7, 7, 7),
                  to = c(2, 4, 3, 2, 1, 5, 8, 8, 6, 5))
grafik <- tbl_graph(nodes = dugum, edges = kenar, directed = F)

ggraph(grafik, layout = 'linear', circular = TRUE) +
    geom_edge_link(arrow = arrow(length = unit(4, 'mm')), 
                   end_cap = circle(3, 'mm')) +
    geom_node_point(size = 10, colour = "red") +
    geom_node_text(aes(label = dugum)) +
    theme_graph()+
    ggtitle(paste("Örnek Ağın Yapısı(Kenar Sayısı=",gsize(grafik),","," Düğüm Sayısı=",gorder(grafik),")", sep=""))+
    theme(plot.title = element_text(hjust = 0.5))

0.20 Metrikler

Bu kısımda metrikler tidygraph paketi ile hesaplanmıştır.

0.20.1 Alpha merkezilik ölçüsü

Endojen ve eksojen faktörlerin göreceli önemini gösterir.

set.seed(1461)
sample_gnp(n=50, p=7/20, directed=TRUE) %>%
as_tbl_graph()%>% 
activate(nodes) %>%
mutate("Önem Düzeyi" = centrality_alpha())%>% 
mutate_at("Önem Düzeyi", round, 3) %>%  
kbl() %>%  
kable_styling(bootstrap_options = c("striped", "hover"))
Önem Düzeyi
2.513
-10.284
-9.260
0.992
6.302
-20.588
-4.407
-3.015
-3.014
11.222
4.637
8.368
4.403
-5.472
4.676
-1.212
10.465
-0.014
3.542
-2.595
-4.695
-5.380
2.954
-0.735
-1.958
-0.598
-0.321
7.268
1.119
1.063
-7.517
-2.560
-5.671
-7.950
-4.250
-0.083
12.632
15.134
-4.156
6.751
-1.123
-9.053
-3.464
3.427
4.614
-4.289
-2.484
4.141
1.979
3.553

0.20.2 Derece

  set.seed(1461)
  sample_gnp(n=50, p=7/20, directed=TRUE) %>%
  as_tbl_graph()%>% 
  activate(nodes) %>%
  mutate("Derece" = centrality_degree()) %>%
  kbl() %>%  
  kable_styling(bootstrap_options = c("striped", "hover"))
Derece
14
17
15
18
22
15
20
17
13
14
18
12
14
17
13
21
21
23
16
20
17
17
20
10
17
20
16
14
21
14
15
18
20
17
24
12
19
19
14
14
18
20
13
18
17
17
19
21
19
18

0.20.3 Derece içi ve dışı

  set.seed(1461)
  sample_gnp(n=50, p=7/20, directed=TRUE) %>%
  as_tbl_graph()%>%
  activate(nodes) %>%
  mutate(
   "Derece içi" = centrality_degree(mode = "in"),
    "Derece Dışı"= centrality_degree(mode = "out"),
    "Derece" = centrality_degree(mode = "all")
  ) %>% 
  kable() %>%  
  kable_styling(bootstrap_options = c("striped", "hover"))
Derece içi Derece Dışı Derece
20 14 34
16 17 33
14 15 29
17 18 35
19 22 41
17 15 32
17 20 37
15 17 32
13 13 26
13 14 27
15 18 33
17 12 29
14 14 28
20 17 37
29 13 42
21 21 42
22 21 43
15 23 38
22 16 38
16 20 36
18 17 35
21 17 38
14 20 34
14 10 24
13 17 30
22 20 42
17 16 33
15 14 29
13 21 34
17 14 31
18 15 33
19 18 37
18 20 38
17 17 34
22 24 46
14 12 26
16 19 35
22 19 41
21 14 35
16 14 30
15 18 33
15 20 35
21 13 34
15 18 33
16 17 33
10 17 27
14 19 33
19 21 40
18 19 37
16 18 34

0.20.4 Arasındalık

Info!Birçok ağ çalışmasının amacı, hangi düğümlerin önemli veya “merkezi” olduğunu bulmaktır. Düğüm merkeziliği için çeşitli metrikler vardır. Bu bölümde, iki merkezilik ölçüsü daha tartışacağız: arasındalık ve özvektör merkeziliği.

Bir düğümün arasındalığı, bu düğümden geçen en kısa yolların sayısıdır (başlangıç ve bitiş düğümleri hariç). Arasındalık oranı yüksek bir düğüm, ağdaki bilgi akışı için önemlidir, çünkü ağın farklı bölümleri arasındaki en verimli iletişim kanallarının çoğunda bulunur. İki düğüm arasında birden fazla en kısa yol varsa, tüm yolların arasındalığa olan katkısını eşit olarak böleriz.
  set.seed(1461)
  sample_gnp(n=50, p=7/20, directed=TRUE) %>%
  as_tbl_graph()%>%
  activate(nodes) %>%
  mutate("Arasındalık" = centrality_betweenness()) %>%
  arrange(desc("Arasındalık")) %>% 
  mutate_at("Arasındalık", round, 3) %>%  
  kbl() %>%  
  kable_styling(bootstrap_options = c("striped", "hover"))
Arasındalık
23.360
25.312
25.234
31.516
43.192
27.408
37.703
31.637
16.135
24.131
36.015
19.825
22.020
33.226
43.817
49.388
56.422
38.672
36.821
37.029
29.407
38.169
25.692
17.147
20.335
44.382
30.520
25.120
30.551
26.912
32.377
31.082
43.522
33.056
57.165
19.241
26.772
45.610
36.055
26.000
34.633
29.320
25.499
27.660
30.756
17.463
26.405
37.950
38.816
26.520

0.20.5 Özvektör merkezilik ölçüsü

  set.seed(1461)
  sample_gnp(n=50, p=7/20, directed=TRUE) %>%
  as_tbl_graph()%>%
  activate(nodes) %>%
  mutate("Özvektör" = centrality_eigen()) %>%
  arrange(desc("Özvektör")) %>%
  mutate_at("Özvektör", round, 3) %>%  
  kbl() %>%  
  kable_styling(bootstrap_options = c("striped", "hover"))
Özvektör
0.752
0.725
0.614
0.760
0.893
0.680
0.792
0.674
0.569
0.554
0.705
0.642
0.597
0.794
0.906
0.901
0.905
0.813
0.823
0.778
0.782
0.832
0.773
0.491
0.667
0.914
0.699
0.582
0.731
0.673
0.695
0.817
0.788
0.741
1.000
0.562
0.777
0.887
0.739
0.612
0.696
0.775
0.755
0.719
0.713
0.582
0.722
0.889
0.790
0.764

0.21 En kullanışlı ağ özet istatistikleri

0.21.1 Yoğunluk

Bir ağın yoğunluğu, tüm düğüm çiftleri bağlıysa potansiyel olarak var olabilecek tüm kenarların gerçekte var olan bir ağdaki kenarların sayısına oranlanması ile hesaplanır. Teorik olarak olası kenarların sayısını saydığımızda, paralel kenarlar ve döngüler olasılığını dışlıyoruz.Örneğin, aşağıdaki örnekte 5*4 =20 kenarla bağlanabilen 5 düğüm vardır. Gerçekte 5 kenar vardır, dolayısıyla yoğunluk 19 / 72 ≈0,26’dır.

  set.seed(1461)
  sample_gnp(n=50, p=7/20, directed=TRUE) %>%
  as_tbl_graph()%>%
  activate(nodes) %>%
  edge_density() %>% as_tibble()%>% 
  rename("Yoğunluk"=value) %>% 
  kable()%>% 
  kable_styling()
Yoğunluk
0.3502041

0.21.2 Ortalama uzaklık

Bir ağın genel bağlantılılığı için başka bir ölçü, ortalama mesafedir. İlk önce tüm düğüm çiftleri arasındaki en kısa yolların uzunlukları belirlenerek hesaplanır. Sonra bu uzunlukların ortalaması alınır.

  set.seed(1461)
  sample_gnp(n=50, p=7/20, directed=TRUE) %>%
  as_tbl_graph()%>%
  activate(nodes) %>%
  mean_distance() %>% as_tibble()%>% 
  rename("Ortalama Uzaklık"=value) %>%
  kable()%>% 
  kable_styling()
Ortalama Uzaklık
1.650204

0.21.3 Geçişlilik

Bir ağın geçişlilik veya kümelenme katsayısı, düğümlerin birlikte kümelenme eğiliminin bir ölçüsüdür. Yüksek geçişlilik, ağın, dahili olarak yoğun bir şekilde bağlı olan toplulukları veya düğüm gruplarını içerdiği anlamına gelir.Ağda gözlenen kapalı üçlü sayısı ile mümkün olan maksimum kapalı üçlü sayısı arasındaki oran ile hesaplanır. Karmaşık ağlar ve özellikle küçük ağlar genellikle yüksek geçişliliğe sahiptir.

  set.seed(1461)
  sample_gnp(n=50, p=7/20, directed=TRUE) %>%
  as_tbl_graph()%>%
  activate(nodes) %>%
  transitivity() %>% as_tibble()%>% 
  rename("Geçişlilik"=value) %>%
  kable()%>% 
  kable_styling()
Geçişlilik
0.5793687

0.21.4 Karşılıklılık

Karşılıklılık, yönlendirilmiş bir ağdaki köşelerin karşılıklı olarak bağlantılı olma olasılığının bir ölçüsüdür. Kümeleme katsayısı, ölçeksiz derece dağılımı veya topluluk yapısı gibi karşılıklılık, karmaşık ağları incelemek için kullanılan nicel bir ölçüdür.Karşılıklılık ölçüsü, yönlendirilmiş bir ağda karşılıklı bağlantıların oranını tanımlar. En yaygın olarak, yönlendirilmiş bir kenarın zıt karşılığının da grafiğe dahil olma olasılığı olarak tanımlanır.

  set.seed(1461)
# ağın grafiği (Düğüm sayısı:50)
  g=sample_gnp(n=50, p=7/20, directed=TRUE) 
  ggraph(g, layout="kk") + 
  geom_edge_link() + 
  geom_node_point()+
  ggtitle("Ağın Yapısı")+
  theme(plot.title = element_text(hjust = 0.5))+
  ggtitle(paste("Örnek Ağın Yapısı(Kenar Sayısı=",gsize(g),","," Düğüm Sayısı=",gorder(g),")", sep=""))+
  theme(plot.title = element_text(hjust = 0.5))

# ağın karşılıklılık ölçüsü
  g %>%
  as_tbl_graph()%>%
  activate(nodes) %>%
  reciprocity() %>% as_tibble()%>% 
  rename("Karşılıklılık"=value) %>% 
  kable()%>% 
  kable_styling()
Karşılıklılık
0.3403263

0.22 Veri seti üzerinden ağ analizi

Bu kısımda R ortamında bulunan highschool veri seti üzerinden ağ analizi yapılarak metrikleri verilmiştir.

data(highschool) 
graph <- highschool %>% mutate(year=factor(year))
graph <- as_tbl_graph(highschool)
graph %>%
ggraph(layout="kk") +
geom_edge_fan(aes(color=year), arrow=arrow()) +
geom_node_point() +
theme_graph()+
ggtitle("Highschool Veri Setindeki Ağın Yapısı")+
theme(plot.title = element_text(hjust = 0.5))

0.22.1 Alt grafiklere bakma

graph <- as_tbl_graph(highschool)
graph %>%
  activate(edges) %>% 
  mutate(year=factor(year))%>%
  filter(year == 1958) %>%
  ggraph(layout="kk") +
  geom_edge_fan(aes(color=year), arrow=arrow()) +
  geom_node_point() +
  theme_graph()+
  ggtitle("Alt Grafikler:1958")+
  theme(plot.title = element_text(hjust = 0.5))

0.22.2 Yönsüz ağa dönüştürme

graph <- as_tbl_graph(highschool)%>%
         activate(edges) %>% 
         mutate(year=factor(year))
         
undirected_graph <- graph %>%
  convert(to_undirected) %>%
  convert(to_simple)
  
undirected_graph  %>%
    ggraph(layout="kk") +
    geom_edge_fan() +
    geom_node_point() +
    theme_graph()+
    ggtitle("Yönsüz Ağ")+
    theme(plot.title = element_text(hjust = 0.5))

0.22.3 Toplulukları gösterme

graph <- as_tbl_graph(highschool[,1:2])%>%
         activate(nodes) %>% 
         mutate(name=factor(name))
         
undirected_graph <- graph %>%
  convert(to_undirected) %>%
  convert(to_simple)


g <- fastgreedy.community(undirected_graph)

# grup sayısı

paste("Grup Sayısı=",length(g), sep="")
## [1] "Grup Sayısı=4"
# grupların büyüklükleri

sizes(g)
## Community sizes
##  1  2  3  4 
## 23 18 14 15
# Grup üyeleri
membership(g)
##  1  2  3  4  5  6  7  8  9 11 12 13 14 15 16 17 18 19 20 21 22 23 24 26 27 28 
##  2  2  2  1  1  2  2  2  2  1  2  2  2  2  1  2  1  1  2  2  2  4  2  1  1  2 
## 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 
##  1  1  1  1  1  1  1  1  1  2  1  1  1  1  1  3  3  3  3  3  3  3  3  3  3  3 
## 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 10 
##  3  4  3  4  3  4  4  4  4  4  4  4  4  4  4  4  4  1
plot(g, as_tbl_graph(highschool))

0.22.4 Toplulukları gösterme 2

Bu kısımda tidygraph paketi kullanılarak topluluklar gösterilmiştir.

graph <- as_tbl_graph(highschool[,1:2])%>%
         activate(nodes) %>% 
         mutate(name=factor(name))
         
undirected_graph <- graph %>%
  convert(to_undirected) %>%
  convert(to_simple)


undirected_graph %>%
mutate(Topluluk = as.factor(group_infomap())) %>% 
ggraph(layout = 'kk') + 
    geom_edge_link(aes(alpha = ..index..), show.legend = FALSE) + 
    geom_node_point(aes(colour = Topluluk), size = 7) + 
    theme_graph()
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

0.23 Alt grafiklere göre derecelendirme

graph <- as_tbl_graph(highschool) %>% 
    mutate(Derece = centrality_degree(mode = 'all'))


ggraph(graph, layout = 'kk') + 
    geom_edge_fan(aes(alpha = stat(index)), show.legend = FALSE) + 
    geom_node_point(aes(size = Derece, color=Derece)) + 
    facet_edges(~year) + 
    theme_graph(foreground = 'powderblue', fg_text_colour = 'black')+
    ggtitle("Dereceyle Orantılı Alt Grafikler")+
    theme(plot.title = element_text(hjust = 0.5))
## Warning in grid.Call(C_stringMetric, as.graphicsAnnot(x$label)): font family not
## found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
## font family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

0.23.1 Her bir düğümün derecesini hesaplama

graph <- as_tbl_graph(highschool)%>%
         activate(edges) %>% 
         mutate(year=factor(year))
         
undirected_graph <- graph %>%
  convert(to_undirected) %>%
  convert(to_simple)
  
undirected_graph <- undirected_graph %>%
                    activate(nodes) %>%
                    mutate(degree=centrality_degree())%>% 
                    kbl() %>%  
                    kable_styling(bootstrap_options = c("striped", "hover"))
undirected_graph
name .tidygraph_node_index degree
1 1 7
2 2 3
3 3 2
4 4 6
5 5 5
6 6 6
7 7 3
8 8 5
9 9 9
11 10 9
12 11 6
13 12 10
14 13 5
15 14 5
16 15 8
17 16 6
18 17 6
19 18 10
20 19 9
21 20 14
22 21 13
23 22 13
24 23 2
26 24 9
27 25 7
28 26 5
29 27 8
30 28 5
31 29 6
32 30 8
33 31 7
34 32 3
35 33 5
36 34 7
37 35 4
38 36 9
39 37 9
40 38 7
41 39 7
42 40 8
43 41 11
44 42 2
45 43 7
46 44 7
47 45 6
48 46 12
49 47 13
50 48 9
51 49 13
52 50 9
53 51 10
54 52 13
55 53 13
56 54 7
57 55 7
58 56 3
59 57 8
60 58 8
61 59 5
62 60 9
63 61 8
64 62 6
65 63 9
66 64 8
67 65 9
68 66 15
69 67 8
70 68 19
71 69 15
10 70 3

0.23.2 Dereceyle orantılı olarak düğümleri gösterme

graph <- as_tbl_graph(highschool)%>%
         activate(edges) %>% 
         mutate(year=factor(year))
         
undirected_graph <- graph %>%
  convert(to_undirected) %>%
  convert(to_simple)
  
undirected_graph %>%
activate(nodes) %>%
mutate(degree=centrality_degree())%>% 
ggraph(layout="kk") +
geom_edge_fan() +
geom_node_point(aes(size=degree, color=degree)) +
theme_graph()+
ggtitle("Dereceyle Orantılı Düğümler")+
theme(plot.title = element_text(hjust = 0.5))

0.23.3 Özvektör merkezilik ölçüsü ile gösterme

graph <- as_tbl_graph(highschool) %>%
         activate(edges) %>% 
         mutate(year=factor(year))
         
graph %>%
convert(to_undirected) %>%
convert(to_simple)%>%
activate(nodes) %>%
mutate(centrality=centrality_eigen()) %>%
ggraph(layout="kk") +
geom_edge_fan() +
geom_node_point(aes(size=centrality, color=centrality)) +
theme_graph()+
ggtitle("Özvektör Merkezilik Ölçüsü")+
theme(plot.title = element_text(hjust = 0.5))

0.23.4 Arasındalık merkezilik ölçüsü ile gösterme

graph <- as_tbl_graph(highschool)%>%
         activate(edges) %>% 
         mutate(year=factor(year))
         
graph %>%
convert(to_undirected) %>%
convert(to_simple)%>%
activate(nodes) %>%
mutate(Arasindalik=centrality_betweenness()) %>%
ggraph(layout="kk") +
geom_edge_fan() +
geom_node_point(aes(size=Arasindalik, color=Arasindalik)) +
theme_graph()+
ggtitle("Arasındalık Merkezilik Ölçüsü")+
theme(plot.title = element_text(hjust = 0.5))

0.23.5 Merkezilik bilgi kriteri ile ağı gösterme

Arasındaki direnç mesafesinin tersin toplamına dayalı merkezilik ölçüsüdür.

graph <- as_tbl_graph(highschool)%>%
         activate(edges) %>% 
         mutate(year=factor(year))
         
graph %>%
convert(to_undirected) %>%
convert(to_simple)%>%
activate(nodes) %>%
mutate(Bilgi_Kriteri=centrality_information()) %>%
ggraph(layout="kk") +
geom_edge_fan() +
geom_node_point(aes(size=Bilgi_Kriteri, color=Bilgi_Kriteri)) +
theme_graph()+
ggtitle("Merkezilik Bilgi Kriteri Ölçüsü")+
theme(plot.title = element_text(hjust = 0.5))

0.23.6 Merkezilik Katz kriteri ile ağı gösterme

Uzak düğümleri cezalandıran yürüyüşlere dayalı merkezilik ölçüsüdür.

graph <- as_tbl_graph(highschool)%>%
         activate(edges) %>% 
         mutate(year=factor(year))
         
graph %>%
convert(to_undirected) %>%
convert(to_simple)%>%
activate(nodes) %>%
mutate(Katz_Kriteri=centrality_katz()) %>%
ggraph(layout="kk") +
geom_edge_fan() +
geom_node_point(aes(size=Katz_Kriteri, color=Katz_Kriteri)) +
theme_graph()+
ggtitle("Merkezilik Katz Kriteri Ölçüsü")+
theme(plot.title = element_text(hjust = 0.5))

0.23.7 Merkezilik rassal yürüyüş (RY) kriteri ile ağı gösterme

Düğümler arasında beklenen rastgele yürüyüş uzunluğunun tersinin toplamına eşit merkezilik ölçüsüdür.

options(scipen = 999)

graph <- as_tbl_graph(highschool)%>%
         activate(edges) %>% 
         mutate(year=factor(year))
         
graph %>%
convert(to_undirected) %>%
convert(to_simple)%>%
activate(nodes) %>%
mutate(RY_Kriteri=centrality_random_walk()) %>%
ggraph(layout="kk") +
geom_edge_fan() +
geom_node_point(aes(size=RY_Kriteri, color=RY_Kriteri)) +
theme_graph()+
ggtitle("Merkezilik Rassal Yürüyüş (RY) Kriteri Ölçüsü")+
theme(plot.title = element_text(hjust = 0.5))

0.23.8 K core decomposition ölçüsü ile ağı gösterme

Düğümler arasında beklenen rastgele yürüyüş uzunluğunun tersinin toplamına eşit merkezilik ölçüsüdür.

options(scipen = 999)
graph <- as_tbl_graph(highschool) %>%
         activate(edges) %>% 
         mutate(year=factor(year))
         
graph %>%
convert(to_undirected) %>%
convert(to_simple)%>%
activate(nodes) %>%
mutate(K_Core=node_coreness()) %>%
ggraph(layout="kk") +
geom_edge_fan() +
geom_node_point(aes(size=K_Core, color=K_Core)) +
theme_graph()+
ggtitle("K Core Merkezilik Ölçüsü")+
theme(plot.title = element_text(hjust = 0.5))

0.24 Sonuç

Bu çalışmada, ağ analizinin temel bileşenleri ortaya konulduktan sonra üretilen sentetik veriler analiz edilerek ağ analizi (AA veya SAA) konusunda farkındalık oluşturulması ve yaygın kullanım alanına sahip metriklerin gösterilmesi amaçlanmıştır.

Faydalı olması ve farkındalık oluşturması dileğiyle.

Bilimle ve teknoloji ile kalınız.