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.
Giriş
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.
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")
Ö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")

Ö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)

Ö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")

Örnek 4: Merkezilik Ölçüleri
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)

Ö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)

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)

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")

Radyal Ağ Oluşturma 1
hk <- hclust(dist(USArrests), "ave")
radialNetwork(as.radialNetwork(hk))

Radyal Ağ Oluşturma 2
radialNetwork(as.radialNetwork(hk), fontSize = 14)

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)

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"))
# 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

Tidygraph ve ggraph paketleri ile ağın gösterimi
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))

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))

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))

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))

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))

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))

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))

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))

Ö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))

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))

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))

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))

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))

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))

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.
Sosyal ağ analizi ile ilgili çalışmanın tamamına https://rpubs.com/tevfik1461/saa5 linkinden de ulaşabilirsiniz.
Faydalı olması ve farkındalık oluşturması dileğiyle.
Bilimle ve teknoloji ile kalınız.
Not: Kaynak gösterilmeden alıntı yapılamaz veya kopyalanamaz.
Note: It can not be cited or copied without referencing.
Yararlanılan Kaynaklar
- https://www.sci.unich.it/~francesc/teaching/network/degree.html
- https://datastorm-open.github.io/visNetwork/
- https://tevfikbulut.com/tag/sosyal-ag-analizi/
- https://christophergandrud.github.io/networkD3/
- http://www.sthda.com/english/articles/33-social-network-analysis/137-interactive-network-visualization-using-r/
- https://www.r-graph-gallery.com/322-custom-colours-in-sankey-diagram.html
- Sosyal Ağ Analizi (SAA), https://rpubs.com/tevfik1461/saa
- http://www.hcbravo.org/networks-across-scales/misc/tidygraph.nb.html
- Bodwin, Kelly, and Hunter Glanz. 2020. Flair: Highlight, Annotate, and Format Your r Source Code.
- Sosyal Ağ Analizi (SAA) V, https://rpubs.com/tevfik1461/saa5