libraries
library(tidyverse)
library(igraph)
library(visNetwork)
library(ggraph)
#Veri Seti Öncelikle veri setine göz atalım. Bu çalışamda iki ayrı veri seti kullanacağız. Birincisi aktörleri gösteren ikincisi ise bu aktörler arasındaki bağlantıları içeren dosya
# Aktör isimleri
network <- readxl::read_excel("For Network Analysis Transposed.xlsx")
network <- network %>% rowid_to_column("id")
names1 <- network %>% select(id, PanelMember1) %>% rename ("name" = "PanelMember1")
# Bağlantılar
edges1<- network %>%
select(-c(PanelMember1))%>%
pivot_longer(2:88, names_to = "to", values_to = "weight") %>%
select(id, to, weight)
q <- as_tibble(rep(c(1:87),times=223))
edges2 <- cbind(edges1, q)
edges3 <- edges2 %>%
select(-c(to)) %>%
rename ( "from" = "id",
"to" = "value")
edges3 <- edges3[,c(1,3,2)]
edges4 <- edges3 %>% filter (weight >= 1)
#network objesi
g <- graph_from_data_frame(edges4, directed = TRUE, vertices = names1)
Şimdi kullanacağımız dosyaların içeriğine bir göz atalım
#Aktörler
names1
#Bağlantılar
edges4
##Ağın Oluşturulması ve İncelenmesi
Veri setlerimizi kullanarak inceleyeceğimiz ağı igraph paketi ile oluşturacağız. Çalışmanın sonunda veri setlerini kullanarak ağ oluşturmayı ve ağın içerisindeki aktörleri ve bağlantılarını görebileceğiz.
Burada graph_from_data_frame fonksiyonunun ilk argümanını bağlantıları içeren edges4 verisi oluşturuyor. İkinci argüman olan directed argümanı ise grafiğimizi yönlü veya yönsüz (directed veya undirected) olarak çizmemiz için olanak tanır. Burada şimdilik yönsüz (undirected) seçeneği ile ilerleyeceğimizden seçeneği FALSE olarak tanımlıyoruz. vertices argümanında ise aktörleri (names1) içeren veri setini tanımlıyoruz.
#Ağ oluşturmak için kodumuz
g <- graph_from_data_frame(edges4, directed = FALSE, vertices = names1)
#Oluşan network nesnesine bakalım
g
## IGRAPH 140a06b UNW- 223 951 --
## + attr: name (v/c), weight (e/n)
## + edges from 140a06b (vertex names):
## [1] AkihikoHara --FernandoCabreraGarcia AkiraKotera --DominikKocholl
## [3] AkiraKotera --AlainZahlandeCayetti AlanHarris --DavidWilliams
## [5] AlasdairBell --BruceBuck AlasdairBell --DeannaReiss
## [7] AlasdairBell --DenisOswald AlasdairBell --DirkReinerMartens
## [9] AlasdairBell --EdwardCanty AlasdairBell --EminOzkurt
## [11] AlasdairBell --FernandoCabrera AlasdairBell --GuedelNdiaye
## [13] AlexanderMcLin--BernhardHeusler
## + ... omitted several edges
Ağdaki aktörlere bakalım. Bunun için V() fonksiyonunu kullanıyoruz
V(g)
## + 223/223 vertices, named, from 140a06b:
## [1] AkihikoHara AkiraKotera
## [3] AlainZahlandeCayetti AlanHarris
## [5] AlasdairBell AlexanderMcLin
## [7] AlexandraBrilliantova AlexisSchoeb
## [9] AliaksandrDanilevich AlvaroGarciaAlamandelaCalle
## [11] AndrasGurovits AndreBrantjes
## [13] AndreGossin AndrewdeLotbiniereMcDougall
## [15] AngeloCascella ArbenRakipi
## [17] AttilaBerzeviczi AugustinEmmanuelSenghor
## [19] BardRacinMeltvedt BeatHodler
## + ... omitted several vertices
Ağdaki aktör sayısına bakalım. Bunun için vcount() fonksiyonunu kullanıyoruz
vcount(g)
## [1] 223
Ağdaki bağlantılara bakalım. Bunun için E() fonksiyonunu kullanıyoruz
E(g)
## + 951/951 edges from 140a06b (vertex names):
## [1] AkihikoHara --FernandoCabreraGarcia
## [2] AkiraKotera --DominikKocholl
## [3] AkiraKotera --AlainZahlandeCayetti
## [4] AlanHarris --DavidWilliams
## [5] AlasdairBell --BruceBuck
## [6] AlasdairBell --DeannaReiss
## [7] AlasdairBell --DenisOswald
## [8] AlasdairBell --DirkReinerMartens
## [9] AlasdairBell --EdwardCanty
## [10] AlasdairBell --EminOzkurt
## + ... omitted several edges
Ağdaki bağlantı sayısına bakalım. Bunun için ecount() fonksiyonunu kullanıyoruz
ecount(g)
## [1] 951
igraph ile oluşturulan ağlar bazı özelliklere sahip olur. Ağ özellikleri (network attributes) tüm ağ, aktör özellikleri (node attributes) aktörler, bağlantı özellikleri (tie attributes) bağlantılar ile ilgili bilgileri içerir.
Ağımıza isim “Madrid” ismini verelim
g$name <- "CAS"
g$name
## [1] "CAS"
Ağımızdaki bağlantıların ağrılıklarına(weight) bakalım
E(g)$weight
## [1] 1 1 1 1 1 1 1 1 2 2 1 2 1 1 1 1 1 1 1 2 2 1 1 1 1
## [26] 1 1 1 1 1 1 1 1 1 1 1 3 1 1 2 1 1 2 1 1 1 1 1 2 1
## [51] 1 1 1 1 1 1 2 2 1 1 2 1 1 1 1 1 1 2 1 2 1 1 2 1 1
## [76] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1
## [101] 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 3 1 1 2
## [126] 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 3 3 1 1 1 1 1
## [151] 1 1 1 1 1 1 2 2 1 2 1 2 7 1 3 2 1 2 3 1 6 2 1 1 1
## [176] 1 1 1 4 1 1 5 1 3 2 1 1 3 1 1 1 1 2 1 1 1 1 1 1 1
## [201] 1 1 1 1 1 1 1 1 1 1 1 1 1 2 3 2 4 1 2 1 1 1 1 2 1
## [226] 1 1 1 3 1 1 1 1 1 2 1 1 1 1 1 1 1 2 1 1 2 1 1 1 1
## [251] 1 2 1 8 1 1 1 2 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 2 1
## [276] 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 3 1 2 3 2 3 2 2 1
## [301] 1 1 1 1 1 1 2 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
## [326] 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1
## [351] 1 1 1 2 1 3 1 2 2 1 1 2 1 1 1 1 1 1 2 1 1 1 2 2 1
## [376] 1 1 1 1 3 1 2 1 2 1 1 1 1 1 1 1 2 1 1 1 1 2 1 1 1
## [401] 1 1 1 1 2 1 1 1 2 1 3 1 1 2 1 1 1 2 1 1 1 1 2 2 4
## [426] 1 1 1 3 1 2 1 5 8 1 4 3 5 1 5 1 2 5 1 2 1 7 2 1 2
## [451] 10 2 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 2 1 1
## [476] 1 1 1 1 1 2 1 1 4 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2
## [501] 1 1 1 1 2 1 1 1 4 1 1 2 2 4 1 7 3 2 1 1 1 1 1 2 3
## [526] 1 1 1 1 1 4 2 1 1 2 3 1 1 5 3 1 1 1 4 2 2 1 1 1 1
## [551] 1 1 1 1 1 1 3 1 1 1 1 1 2 2 3 1 1 1 3 2 1 1 1 1 2
## [576] 1 1 1 2 1 3 1 3 1 1 1 3 2 4 1 3 3 1 1 1 1 4 2 1 1
## [601] 1 1 1 1 1 1 1 1 1 3 1 2 1 2 1 2 2 2 2 1 1 1 1 1 2
## [626] 1 1 1 1 1 1 2 2 2 1 3 3 1 1 2 1 1 2 1 1 3 3 1 1 1
## [651] 2 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 2 1 3 3 1 5 5 1 2
## [676] 5 1 1 1 1 8 5 2 4 12 2 6 6 2 1 2 1 6 3 6 3 2 4 1 1
## [701] 1 1 2 4 1 1 1 1 1 1 1 1 1 1 1 1 2 2 1 1 1 1 1 1 2
## [726] 2 2 1 2 2 4 2 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 2 1 1
## [751] 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 4 1 1 1 1
## [776] 1 1 2 1 1 1 1 2 1 1 1 1 1 1 3 3 3 3 1 1 1 1 1 1 2
## [801] 2 1 1 1 1 2 1 2 1 1 1 1 1 4 2 1 2 1 3 1 1 1 1 1 1
## [826] 1 1 1 1 1 1 3 1 2 1 1 1 2 1 1 1 1 1 1 1 1 1 2 2 1
## [851] 1 1 3 2 1 1 4 1 2 2 5 1 1 6 4 6 1 7 1 1 1 4 2 2 3
## [876] 3 1 2 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 2 3 1 1 1
## [901] 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1
## [926] 1 2 1 1 1 2 5 3 3 1 2 3 1 2 2 2 3 1 1 1 1 1 1 1 1
## [951] 1
#Merkeziyet (Centrality) Ölçüleri
##Degree Centrality Sosyal ağ analizlerinde aktörlerin ve bağlantıların önemini(veya önemsizliğini) ortaya koymak için bazı ölçümler yapılır. Bu ölçümlerin en basit ve sıkça kullanılanı degree centrality adı ile yapılan bir ölçümdür. Bu ölçüm her aktörün sahip olduğu bağlantı sayısı ile ifade edilir. Bizim verimizde bu ölçüm bir aktörün başka kaç aktör ile bağlantılı olduğunu ortaya koyar. Kullandığımız igraph paketinde degree centrality degree() komutu ile hesaplanır. Bu işlemi yaparken daha önce öğrendiğimiz dplyr paketinin fonksiyonlarından da yararlanabiliriz.
degree_centrality <- names1 %>%
# her aktör için degree centrality değerinin hesaplanması ve veri tabanına eklenmesi
mutate(degree = degree(g)) %>%
# degree centrality değerine göre sıralanması
arrange(desc(degree))
# Göz atalım
degree_centrality
Buradan Balmelli ve Fumagelli isimli aktörlerin eylemde merkezi bir rol oynadıklarını görebiliyoruz.
##Strength Centrality Her ne kadar durum böyle olsa da bir aktöre ait bağlantı sayısının fazlalığı onun ağ içindeki rolünü tam olarak ortaya koymayabilir. Burada gereken bu bağlara ait bir güç (strength) ölçümüdür. igraph paketi bağlantıların gücünü strength() fonksiyonu ile, degree centrality değerine ağdaki bir aktörden diğer aktöre giden tüm bağları dikkate alan bir ağırlık değeri vererek hesaplar
strenght_centrality <- names1 %>%
mutate(
degree = degree(g),
# # her aktör için strength centrality değerinin hesaplanması ve veri tabanına eklenmesi
strength = strength(g)
) %>%
# strength centrality kullanılarak sıralanması
arrange(desc(strength))
# Göz atalım
strenght_centrality
##Tie Betweenness (Bağlantıların Aradalığı!!!)
Ağlardaki aktörler için yukarıda gördüğümüz hesaplamalar bağlantılar (ties) için de yapılabilir. Bir bağlantının aradalığı (tie betweenness) bir bağlantıya ait en kısa yolların sayısı ile tanımlanır. Tie betweenness değeri yüksek olan bağlantılar bir ağ için özel bir önem taşırlar. Zira bu bağlar aktörler arasında bağlantı için en önemli olan bağlardır ve ortadan kaldırılmaları ağ içerisindeki aktörlerin bağlarını birbirinden kopartır.
CAS ağında bağlantıların ağırlığı iki aktör arasındaki bağlantının gücü ile tanımlanmıştı - yüksek değer iki aktör arasındaki yakın ilişkiyi ifade eder. Ancak igraph paketinin fonksiyonu edge_betweenness() iki aktör arasındaki mesafeyi dikkate alarak hesaplama yapar - yüksek değer iki aktör arasındaki uzak ilişkiyi ifade eder. Tie betweenness hesabından önce bu durumu düzeltmek için ağırlığın tersini alarak işleme sokmamız gerekir.
# Bağlantı ağırlıklarının tersini hesaplayalım
dist_weight <- 1 / E(g)$weight
tie_betweenness <- edges4 %>%
# Veri tabanına hesapladığımız dist_weight değeri ile edge betweenness hesabını ekleyelim
mutate(betweenness = edge_betweenness(g, weights = dist_weight))
# Göz atalım
tie_betweenness
Daha zengin analiz imkanı sağlamak için Betweennnes ve centrality değerlerini içeren strength_centrality verisi ile g objesini tekrar yaratıyorum.
g <- graph_from_data_frame(edges4, directed = FALSE, vertices = strenght_centrality) #g networkünü tekrar tanımladım çünkü içinde artık strength gibi değerler var
Merkezi Aktörler
ggraph(g, layout = "with_kk") +
# Add an edge link geom, mapping alpha to weight
geom_edge_link() +
# Add a node point geom, mapping size to degree
geom_node_point(aes(size = degree))
#Kümeleme Bu aşamada birbirlerine daha çok benzeyen aktörleri kümeleme işlemini göreceğiz. Hiyerarşik/sıralı kümeleme çalışmasında amaç, aktörler için benzerlik katsayıları üretmek ve katsayıları birbirleri ile benzeşen aktörleri aşamalı olarak birbirine bağlamaktır. Bu işlemin sonunda oluşan grafik tipine de dendogram adı verilir. Bahsi geçen katsayıların oluşturulması için Pearson Similarity hesabını kullanacağız. Standart korelasyon testlerinde bu test değişkenler arasındaki ilişkiyi -1 (tam ters yönlü ilişki) ile 1 (tam aynı yönlü ilişki) arasında bir değer şeklinde ifade eder. Burada aynı işlemi ağda bulunan aktörler için hesaplayacağız. Ancak bu işleme başlamadan önce ağımız için ağa ait adjancency matrixi oluşturmamız gerekir. Bu matrix aslında ağ içinde bulunan bağlantıları bir matris şeklinde ifade eder. Matrix şeklinde ifade edilen ağ artık üzerinde matematiksel işlemler apılır hale gelir.
# adjacency matrix oluşturalım
library(Matrix)
##
## Attaching package: 'Matrix'
## The following objects are masked from 'package:tidyr':
##
## expand, pack, unpack
A <- get.adjacency(g, attr = "weight", names = F, sparse = F)
# Calculate node strengths as row sums of adjacency
Matrix::rowSums(A)
## [1] 108 108 89 85 82 79 76 69 66 59 57 57 55 47 49 47 47 48
## [19] 43 39 39 39 37 35 35 33 34 33 31 30 29 28 28 28 25 24
## [37] 20 20 20 20 19 19 16 17 17 16 15 14 15 15 15 14 14 13
## [55] 13 13 13 13 13 13 12 12 12 12 11 11 11 10 10 10 10 10
## [73] 9 9 9 8 8 8 8 8 7 7 7 7 7 7 7 7 7 7
## [91] 7 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 5
## [109] 5 5 5 5 5 5 5 5 5 4 4 4 4 4 4 4 4 4
## [127] 4 4 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
## [145] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 2
## [163] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1
## [181] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
## [199] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
## [217] 1 1 1 1 1 1 1
Bu şekilde her aktöre ait güç değerini matrix halinde hesaplamış olduk. Şimdi benzer aktörleri bulmak için Pearson katsayısını hesaplayalım
# A matrixi için Pearson korelasyon değeri
S <- cor(A)
# Matrix diagonalini 0'a ayarlamak
diag(S) <- 0
# S'yi vektör haline getirmek
flat_S <- as.vector(S)
# Benzerlik grafiği
hist(flat_S, xlab = "Benzerlik katsayıları", main = " Benzerlik Histogramı ")
Yukarıdaki histogramdan benzerliklerin önemli bir miktarının 0 değerinin altında gerçekleştiğini görüyoruz. Bu da bize bu ağdaki aktörlerin birbirlerine çok benzemedikleri bilgisini veriyor.
Şimdi kümeleme işlemine geçebiliriz.
# Benzerlik matrixini 1 değerinden çıkartarak uzaklık matrixini oluşturalım
D <- 1-S
# uzaklık nesnesini oluşturalım
d <- as.dist(D)
# average-linkage clustering yöntemi ile dendrogramı oluşturalım
cc <- hclust(d, method = "single")
plot(cc)
Yukarıdaki dendogramı daha iyi anlamak için bölümlerine (clusters/küme) ayırt edebiliriz. Kabaca baktığımızda 3 ayrı öbek olduğunu görebiliyoruz. Bu işlem için aşağıdaki kod kullanılır
# Dendogramı 4 kümeye ayıralım
cls <- cutree(cc, k = 3)
# küme bilgisini nodes veritabanına ekleyelim
nodes <- names1 %>%
mutate(cluster = cls)
# See the result
nodes
Şimdi bu cluster lara yakından bakalım. Acaba hangi kümede hangi aktör var?
# 1. kümede kim var?
nodes %>%
# 1. kümeyi filtreleyelim
filter(cluster == 1) %>%
# Name (isim) sütununu seçelim
select(name)
# Her kümenin özelliklerine bakalım
nodes %>%
# küme bazında gruplayalım
group_by(cluster) %>%
# temel istatistiklere bakalım
summarize(
# Aktör sayısı
size = n(),
# Ortalama derece
avg_degree = mean(degree),
# Ortalama strength
avg_strength = mean(strength)
) %>%
# Sıralayalım
arrange(desc(size))
## Warning in mean.default(degree): argument is not numeric or logical: returning
## NA
## Warning in mean.default(degree): argument is not numeric or logical: returning
## NA
## Warning in mean.default(degree): argument is not numeric or logical: returning
## NA
## Warning in mean.default(strength): argument is not numeric or logical: returning
## NA
## Warning in mean.default(strength): argument is not numeric or logical: returning
## NA
## Warning in mean.default(strength): argument is not numeric or logical: returning
## NA
# From previous step
V(g)$cluster <- nodes$cluster
# Update the plot
ggraph(g, layout = "with_kk") +
geom_edge_link(aes(alpha = weight), show.legend=FALSE) +
geom_node_point(aes(color = factor(cluster))) +
labs(color = "cluster")
Ağ grafiklerimizi daha anlaşılır ve çekici hale getirmek için ´visNetwork´ paketini kullanacağız. Bu işleme başlangıç için aşağıdaki kodlar kullanılır.
# igraph nesnesini visNetwork nesnesine çevirelim
data <- toVisNetworkData(g)
# Aktörlere göz atalım
head(data$nodes)
# Bağlantılara göz atalım
head(data$edges)
# Ağı visNetwork ile görselleştirelim
visNetwork(
nodes = data$nodes,
edges = data$edges,
width = 600,
height = 600
)
visNetwork paketi ağları farklı formatlarda göstermemize de yarar
# Önceki grafiğimiz
visNetwork(nodes = data$nodes, edges = data$edges, width = 600, height = 600) %>%
# Dairesel görselleştirme kalıbı
visIgraphLayout(layout = "layout_in_circle")
Bir aktörün ismini ve o aktöre ait bağları ayrıca görmek istersek
# Önceki grafiğimiz
visNetwork(nodes = data$nodes, edges = data$edges, width = 600, height = 600) %>%
# Görselleştirme kalıbımız
visIgraphLayout(layout = "layout_with_kk") %>%
# Aktör seçildiğinde en yakın bağların gösterilmesi
visOptions(highlightNearest = TRUE) %>%
# Aktör ismi
visOptions(nodesIdSelection = TRUE)
Son olarak kümeleri de görelim
V(g)$color <- V(g)$cluster
data <- toVisNetworkData(g)
visNetwork(nodes = data$nodes, edges = data$edges, width = 300, height = 300) %>%
visIgraphLayout(layout = "layout_with_kk") %>%
visOptions(selectedBy = "group")