Bu sayfadaki içerik, R-Ladies Istanbul’un R ile Sosyal Ag Analizi başlıklı Kasım 2019 etkinliğinde sunduğum giriş seviyesindeki dersin taslak notlarından oluşmaktadır. Daha kapsamlı ve geniş açıklamaların yer aldığı yeni bir versiyonu yine bu sayfada yayınlayacağım. Soru, yorum ve önerileriniz için her zaman yazabilirsiniz: twitter, eposta.
Ağ, en genel tanımıyla, birbirlerine bağlanmış şeylerden oluşan sistemlere denir. Bir ağ, noktalar ve bu noktaları birbirine bağlayan çizgilerle görselleştirilebilir. Bu noktalar düğüm (İng. node, vertex) veya aktör (İng. aktör) olarak, çizgiler ise bağ (İng. link, tie) veya ayrıt (İng. edge) olarak adlandırılır.
İnsanların fiziksel veya dijital hayattaki sosyal ilişkilerinin bir sosyal ağ oluşturması gibi, hayvanların kendi aralarındaki benzer ilişkiler de sosyal ağ oluşturabilir. Firmaların birbirleri arasındaki finansal ve ticari ilişkiler, ülkelerin ithalat/ihracat ilişkileri, enerji aktarım şebekeleri, besin zincirleri, protein etkileşimleri, internet altyapısı da ağlarla temsil edilebilecek sistemlere örnektir. Bu sistemlerin bir çoğu genellikle kabul edilen anlamda bir sosyallik içermeyebilir. Dolayısıyla, sosyal ağ analizi terimi yerini ağ analizi ve ağ bilimi gibi terimlere bırakmaya başlamıştır. Ancak, aynı temel ağ analiz teknikleri çok farklı tiplerdeki ağlarda (örn. sosyal, ekonomik, biyolojik, fiziksel) benzer şekilde kullanılır.
Ağ analizi, temellerini Sosyoloji ve Matematikten alır. Sosyologlar, ağlar vasıtasıyla insanların diğer insanlarla olan ilişkilerini temsil ederek, insanların davranış ve özelliklerinin bu ilişkileri nasıl değiştirdiğini ve aynı zamanda bu ilişkilerin insanların davranış ve özelliklerini nasıl değiştirdiğini anlamaya çalışmışlardır. Öte yandan, Matematikçiler de ağlar üzerinde çeşitli problemler (örn. en kısa yol problemi) tanımlayarak bunlarla ilgilenmişlerdir. Zamanla, bilgisayar bilimi, istatistiksel fizik, yaşam bilimi gibi bir çok alandaki araştırmacılar ağ analizi tekniklerini kullanmaya başlamış, her bir alan kendi perspektifiyle bu alanı daha da geliştirmiş ve zenginleştirmiştir.
Bu açık derste, uygulamalı bir yöntem benimseyerek konu açıklamalarının ve R diliyle uygulamalarının eşzamanlı gitmesi için çaba göstereceğiz. igraph kütüphanesini ve diğer kütüphaneleri aşağıdaki şekilde yükleyelim.
library(igraph)
library(visNetwork)
library(igraphdata)
Bir ağın düğümler ve bu düğümler arasındaki bağlardan oluştuğunu belirtmiştik. Boş bir ağ oluşturarak buna önce düğümler, sonra bağlar ekleyelim. Bir ağdaki bağlar yönlü veya yönsüz olabilir. Bu örnekte yönsüz bağlara sahip bir ağ oluşturacağız.
g <- make_empty_graph(directed = FALSE)
g <- g + vertices("Eda", "Can", "Oya", "Ali", "Nur", "Cem")
plot(g)
g <- g + edges("Eda", "Oya", "Eda", "Cem", "Can", "Cem", "Ali", "Nur", "Nur", "Eda")
plot(g)
g <- g + edge("Ali", "Oya") + edge("Nur", "Cem")
plot(g)
Ağda bulunan düğüm ve bağları listeleyelim, düğüm ve bağ adetlerini bulalım.
V(g)
+ 6/6 vertices, named, from b40dd52:
[1] Eda Can Oya Ali Nur Cem
E(g)
+ 7/7 edges from b40dd52 (vertex names):
[1] Eda--Oya Eda--Cem Can--Cem Ali--Nur Eda--Nur Oya--Ali Nur--Cem
vcount(g)
[1] 6
ecount(g)
[1] 7
Düğümlerin komşu sayısı derece (İng. degree) olarak isimlendirilir. Düğümlerin komşu sayısını, ve komşularının kim olduğunu bulalım.
degree(g)
Eda Can Oya Ali Nur Cem
3 1 2 2 3 3
degree(g, "Ali")
Ali
2
degree(g, c("Ali", "Oya"))
Ali Oya
2 2
neighbors(g, "Ali")
+ 2/6 vertices, named, from b40dd52:
[1] Oya Nur
neighbors(g, "Oya")
+ 2/6 vertices, named, from b40dd52:
[1] Eda Ali
Verilen iki düğümün komşu olup olmadığını kontrol edelim.
are_adjacent(g, "Ali", "Oya")
[1] TRUE
are_adjacent(g, "Nur", "Oya")
[1] FALSE
Ağlardaki bağların yönlü de olabileceğini belirtmiştik. Elimizdeki ağın yönsüz olduğunu teyit edelim ve yönlü bir ağa çevirelim. Çevirirken, var olan bağların yerine yönlü iki bağlarla değiştirilmesini sağlayalım. Ardından bu bağlardan bazılarını silelim.
is.directed(g)
[1] FALSE
g2 <- as.directed(g, mode ="mutual")
plot(g2)
g2 <- delete.edges(g2, c("Can|Cem", "Eda|Cem", "Cem|Eda", "Eda|Oya", "Nur|Ali", "Ali|Oya"))
plot(g2)
Yönlü ağlarda, bir düğümün derecesi sahip olduğu bağların yönüne göre iç-derece ve dış-derece olmak üzere iki şekilde hesaplanabilir. Aşağıda bunu hesaplayalım.
degree(g2)
Eda Can Oya Ali Nur Cem
3 1 2 2 5 3
degree(g2, mode="in")
Eda Can Oya Ali Nur Cem
2 1 0 1 3 1
degree(g2, mode="out")
Eda Can Oya Ali Nur Cem
1 0 2 1 2 2
Yönlü bir ağda, verilen bir düğümden diğerine bir bağ olup olmadığını kontrol edelim.
are_adjacent(g2, "Oya", "Eda")
[1] TRUE
are_adjacent(g2, "Eda", "Oya")
[1] FALSE
igraph kütüphanesi düğümlerin ve bağların adlarını ve id’lerini farklı şekilde tutmaktadır. her bir düğümün 1’den başlayan ve sıralı giden tam sayı id’leri vardır. Aynı durum bağlar için de geçerlidir. Bu durumda, \(n\) düğüm ve \(m\) bağdan oluşan bir ağ için düğüm id’leri \({1, 2, .., n}\), bağ id’leri \({1, 2, .., m}\) olarak oluşacaktır. Bunlarla ilgili bir kaç örnek yapalım.
V(g2)
+ 6/6 vertices, named, from b5450ad:
[1] Eda Can Oya Ali Nur Cem
as.numeric(V(g2))
[1] 1 2 3 4 5 6
as.numeric(V(g2)["Oya"])
[1] 3
E(g2)
+ 8/8 edges from b5450ad (vertex names):
[1] Ali->Nur Eda->Nur Oya->Ali Nur->Cem Oya->Eda Cem->Can Nur->Eda Cem->Nur
as.numeric(E(g2))
[1] 1 2 3 4 5 6 7 8
as.numeric(E(g2)["Oya|Ali"])
[1] 3
get.edge.ids(g2, c("Oya", "Ali"))
[1] 3
Düğüm ve bağların id’leri düğüm ve bağların silinmesi ve benzeri durumlarda yeniden numaralandırılmaktadır. Aşağıda kod parçası buna bir örnek gösterir.
g3 <- delete_edges(g2, "Ali|Nur")
get.edge.ids(g3, c("Oya", "Ali"))
[1] 2
Düğümlerin isimleri name isminde bir özellik üzerinde tutulmaktadır.
V(g3)$name
[1] "Eda" "Can" "Oya" "Ali" "Nur" "Cem"
vertex_attr(g3)
$name
[1] "Eda" "Can" "Oya" "Ali" "Nur" "Cem"
edge_attr(g3)
list()
Dilersek, kendimiz de düğümlere farklı özellikler ekleyebiliriz.
V(g3)$surname <- c("Som", "Yön", "Kum", "Gün", "Gün", "Gün")
V(g3)["Ali"]$age <- 24
vertex_attr(g3)
$name
[1] "Eda" "Can" "Oya" "Ali" "Nur" "Cem"
$surname
[1] "Som" "Yön" "Kum" "Gün" "Gün" "Gün"
$age
[1] NA NA NA 24 NA NA
Benzer şekilde bağlara da özellikler ekleyebilir, bu özelliklere göre filtrelemeler yapabiliriz.
E(g3)$weight <- c(0.5, 1., 2.5, 1., 0.5, 1.5, 2.)
edge_attr(g3)
$weight
[1] 0.5 1.0 2.5 1.0 0.5 1.5 2.0
E(g3)[weight > 1]
+ 3/7 edges from b680844 (vertex names):
[1] Nur->Cem Nur->Eda Cem->Nur
Görselleri de özelleştirebiliriz. Ancak bu derste ağ görselleştirme üzerinde durmayacağız.
plot(g3, edge.arrow.size=.5, vertex.color="gold", vertex.size=25,
vertex.frame.color="gray", vertex.label.color="black",
vertex.label.cex=0.8, vertex.label.dist=2, edge.curved=0.2)
plot(g3, vertex.color="gold", vertex.size=40, layout=layout_in_circle)
NA
NA
Aşağıda dersin geri kalanında kullanacağımız bir görselleştirme fonksiyonu tanımlıyoruz.
myViz <- function (myGraph){
visIgraph(myGraph, randomSeed = 11) %>%
visIgraphLayout(randomSeed = 11) %>%
visNodes(
font = list(size = 59),
shape = "dot",
color = list(
background = "#0085AF",
border = "#013848",
highlight = "#FF8000"
),
shadow = list(enabled = TRUE, size = 10)
) %>%
visEdges(
shadow = FALSE,
color = list(color = "#0085AF", highlight = "#C62F4B")
) %>%
visLayout(randomSeed = 11)
}
Aşağıda, 1426-1434 yılları için Floransa’daki aileler arasındaki evlilik bağlarını gösteren bir ağ oluşturuyoruz. Her bir düğüm bir aileyi, her bağ bu aileler arasında bir evlilik bağı olduğunu göstermektedir.
Orijinal veri kaynağı: Kent, D. V. (1978). The rise of the Medici: Faction in Florence, 1426-1434. Oxford University Press, USA.
florentineRelships <- read.csv("http://raw.githubusercontent.com/lhehnke/renaissance-florence-network-data/master/florentine_families_relations_matrix_sample.csv")
head(florentineRelships)
florentineMarriages <- florentineRelships[florentineRelships$marriage ==1, 1:2]
is.data.frame(florentineRelships)
[1] TRUE
florentine <- graph_from_data_frame(florentineRelships, directed = FALSE)
plot(florentine, layout=layout_with_lgl)
myViz(florentine)
NA
V(florentine)
+ 88/88 vertices, named, from b94a16e:
[1] Acciaiuoli Adimari Albizzi Altoviti Ardinghelli Arrighi
[7] Arrigucci Baldovinetti Barbadori Bardi Bartoli Belfradelli
[13] Bencivenni Benizzi Berlinghieri Bischeri Brancacci Capponi
[19] Carducci Carnesecchi Castellani Cavalcanti Corbinelli Corsi
[25] Da Uzzano Dall'Antella Davanzati Degli Agli Del Forese Del Palagio
[31] Della Casa Dietisalvi Doffi Donati Fagni Fortini
[37] Frescobaldi Gianfigliazzi Ginori Giugni Guadagni Guasconi
[43] Guicciardini Lamberteschi Lapi Manelli Manovelli Martelli
[49] Medici Orlandini Panciatichi Pandolfini Pazzi Pepi
[55] Peruzzi Pitti Ricasoli Ridolfi Rondinelli Rossi
+ ... omitted several vertices
E(florentine)
+ 449/449 edges from b94a16e (vertex names):
[1] Acciaiuoli --Medici Adimari --Rossi Adimari --Ardinghelli
[4] Albizzi --Guadagni Albizzi --Medici Albizzi --Della Casa
[7] Albizzi --Salviati Albizzi --Fortini Albizzi --Guicciardini
[10] Albizzi --Scolari Albizzi --Benizzi Albizzi --Panciatichi
[13] Albizzi --Medici Albizzi --Guadagni Albizzi --Frescobaldi
[16] Altoviti --Gianfigliazzi Altoviti --Spini Altoviti --Barbadori
[19] Altoviti --Ardinghelli Albizzi --Altoviti Altoviti --Guasconi
[22] Albizzi --Altoviti Altoviti --Bencivenni Ardinghelli--Spini
[25] Ardinghelli--Strozzi Ardinghelli--Peruzzi Ardinghelli--Lamberteschi
[28] Ardinghelli--Strozzi Ardinghelli--Gianfigliazzi Ardinghelli--Velluti
+ ... omitted several edges
is.directed(florentine)
[1] FALSE
Aileler arasındaki en kısa yolları ve bu yolların uzunluğuna bakalım. Aynı zamanda tüm aileler arasındaki ortalama uzunluğa (ortalama en kısa yol) ve en uzak iki düğüm arasındaki en kısa uzaklığı (çap) hesaplıyoruz. Sonuçları karşılaştırdığımızda, Medici ailesinin diğer ailelere görece daha yakın olduğunu görebiliriz.
shortest_paths(florentine, 'Sertini', 'Medici')
$vpath
$vpath[[1]]
+ 4/88 vertices, named, from b94a16e:
[1] Sertini Spini Brancacci Medici
$epath
NULL
$predecessors
NULL
$inbound_edges
NULL
distances(florentine, 'Medici', 'Sertini')
Sertini
Medici 3
distances(florentine,'Medici')
Acciaiuoli Adimari Albizzi Altoviti Ardinghelli Arrighi Arrigucci Baldovinetti Barbadori
Medici 1 1 1 2 2 3 2 2 1
Bardi Bartoli Belfradelli Bencivenni Benizzi Berlinghieri Bischeri Brancacci Capponi
Medici 1 2 2 1 2 1 2 1 1
Carducci Carnesecchi Castellani Cavalcanti Corbinelli Corsi Da Uzzano Dall'Antella
Medici 1 1 2 1 1 1 2 1
Davanzati Degli Agli Del Forese Del Palagio Della Casa Dietisalvi Doffi Donati Fagni
Medici 1 2 1 2 1 1 3 1 2
Fortini Frescobaldi Gianfigliazzi Ginori Giugni Guadagni Guasconi Guicciardini
Medici 2 2 1 1 1 2 1 1
Lamberteschi Lapi Manelli Manovelli Martelli Medici Orlandini Panciatichi Pandolfini
Medici 2 2 2 2 1 0 1 2 1
Pazzi Pepi Peruzzi Pitti Ricasoli Ridolfi Rondinelli Rossi Rucellai Sacchetti Salviati
Medici 1 3 2 1 2 1 1 2 2 2 1
Scambrilla Scolari Serragli Serristori Sertini Solosmei Spini Strozzi Tornabuoni
Medici 2 2 2 1 3 1 2 1 1
Vecchietti Velluti Baronci Bucelli Baroncelli Arnolfi Fioravanti Busini Da Panzano Valori
Medici 1 1 3 2 2 1 1 3 3 1
Ciai Mancini Pecori Tornaquinci Raugi Aldobrandini
Medici 1 2 1 1 3 2
mean(distances(florentine, 'Medici')[lower.tri(distances(florentine))])
[1] NA
mean(distances(florentine)[lower.tri(distances(florentine))])
[1] 2.443312
mean_distance(florentine)
[1] 2.443312
average.path.length(florentine)
[1] 2.443312
diameter(florentine)
[1] 5
max(distances(florentine))
[1] 5
Aşağıda, bu ağdaki derece dağılımını gösteriyoruz.
degree(florentine)
Acciaiuoli Adimari Albizzi Altoviti Ardinghelli Arrighi
4 13 24 11 20 1
Arrigucci Baldovinetti Barbadori Bardi Bartoli Belfradelli
4 15 18 38 2 10
Bencivenni Benizzi Berlinghieri Bischeri Brancacci Capponi
9 14 2 6 7 5
Carducci Carnesecchi Castellani Cavalcanti Corbinelli Corsi
7 5 23 10 5 3
Da Uzzano Dall'Antella Davanzati Degli Agli Del Forese Del Palagio
12 4 9 3 3 3
Della Casa Dietisalvi Doffi Donati Fagni Fortini
12 7 1 8 2 2
Frescobaldi Gianfigliazzi Ginori Giugni Guadagni Guasconi
8 17 9 8 10 18
Guicciardini Lamberteschi Lapi Manelli Manovelli Martelli
28 11 1 15 12 14
Medici Orlandini Panciatichi Pandolfini Pazzi Pepi
128 10 15 7 8 4
Peruzzi Pitti Ricasoli Ridolfi Rondinelli Rossi
35 3 20 4 17 10
Rucellai Sacchetti Salviati Scambrilla Scolari Serragli
2 5 13 5 3 5
Serristori Sertini Solosmei Spini Strozzi Tornabuoni
6 1 7 9 45 7
Vecchietti Velluti Baronci Bucelli Baroncelli Arnolfi
1 13 2 4 5 3
Fioravanti Busini Da Panzano Valori Ciai Mancini
5 4 2 6 2 1
Pecori Tornaquinci Raugi Aldobrandini
3 1 1 3
hist(degree(florentine),breaks=20)
max(degree(florentine))
[1] 128
Düğümlerin çeşitli merkezilik ölçütlerini (derece, yakınlık, ortadalık, pagerank, aktarma merkezi, otorite) aşağıda hesaplıyoruz. Bu merkezilik ölçütlerine göre aileleri sıralayıp sonuçları incelediğimizde, Medici ailesinin ağda merkezi bir konumda yer aldığını görebiliyoruz.
deg <- degree(florentine, normalized=TRUE)
cls <- closeness(florentine, normalized=TRUE)
btw <- betweenness(florentine, normalized=TRUE)
pgr <- page_rank(florentine)$vector
hub <- hub_score(florentine)$vector
aut <- authority_score(florentine)$vector
famcen <- data.frame(deg, cls, btw, pgr, hub, aut)
famcen[order(-famcen$deg), ]
famcen[order(-famcen$cls), ]
famcen[order(-famcen$btw), ]
famcen[order(-famcen$pgr), ]
famcen[order(-famcen$hub), ]
famcen[order(-famcen$aut), ]
NA
Aşağıda, Avrupa’daki bir araştırma enstitüsündeki araştırmacılar arasındaki eposta iletişimini gösteren veri setinden yönlü bir ağ oluşturuyoruz.
Orijinal veri kaynağı: J. Leskovec, J. Kleinberg and C. Faloutsos. Graph Evolution: Densification and Shrinking Diameters. ACM Transactions on Knowledge Discovery from Data (ACM TKDD), 1(1), 2007.
emailDF <- read.csv("https://raw.githubusercontent.com/Zhachory1/eu-email-viz/master/email-Eu-core.txt", sep = " ")
email <- graph_from_data_frame(emailDF, directed = TRUE)
vcount(email)
[1] 1005
ecount(email)
[1] 25571
is.directed(email)
[1] TRUE
myViz(email)
Yukarıdaki görselleştirmede, birbiriyle bağlantılı olmayan bileşenler (component) olduğunu görüyoruz. Aşağıda, yalnızca en çok düğüme sahip olan bileşeni seçerek yeni bir ağ oluşturuyoruz. Devam eden analizleri bu en büyük bağlantılı bileşen üzerinden yapacağız.
is.connected(email)
[1] FALSE
count_components(email, mode ="weak")
[1] 20
components(email, mode = "weak")$csize
[1] 986 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
components(email, mode = "weak")$membership[1:10]
0 2 5 8 10 12 15 17 20 23
1 1 1 1 1 1 1 1 1 1
cl = components(email)
emailLCC = induced.subgraph(email, which(cl$membership == which.max(cl$csize)))
is.connected(emailLCC)
[1] TRUE
count_components(emailLCC, mode ="weak")
[1] 1
components(emailLCC, mode = "weak")$csize
[1] 986
Floransa evlilik ağı için yaptığımız merkezilik ölçümlerini bu ağ için de tekrar ediyoruz.
email <- emailLCC
deg <- degree(email, normalized=TRUE, mode = "in")
cls <- closeness(email, normalized=TRUE)
At centrality.c:2784 :closeness centrality is not well-defined for disconnected graphs
btw <- betweenness(email, normalized=TRUE)
pgr <- page_rank(email)$vector
hub <- hub_score(email)$vector
aut <- authority_score(email)$vector
emlcen <- data.frame(deg, cls, btw, pgr, hub, aut)
emlcen[order(-emlcen$deg), ]
emlcen[order(-emlcen$cls), ]
emlcen[order(-emlcen$btw), ]
emlcen[order(-emlcen$pgr), ]
emlcen[order(-emlcen$hub), ]
emlcen[order(-emlcen$aut), ]
Karate ağındaki düğümler üyeleri, bağlar ise bu üyelerin dersler dışındaki ilişkilerinin var olup olmadığını göstermektedir. Mr. Hi, bu kulüpte karate eğitmeni, John A ise kulübün yöneticisidir. Zamanla Mr. Hi ve John A arasında anlaşmazlık çıkmış ve kulüp üyeleri ikiye ayrılarak farklı kulüplerde yer almışlardır. Aşağıdaki renkler, bu iki grubu temsil etmektedir.
Orijinal veri kaynağı: Wayne Zachary. An information flow model for conflict and fission in small groups. J. of Anthropol. Res., 33:452–473, 1977.
data(karate)
myViz(karate)
Aşağıda, bu ağın tamamı için ve her bir düğüm için kümelenme katsayısını hesaplıyoruz.
degree(karate)
Mr Hi Actor 2 Actor 3 Actor 4 Actor 5 Actor 6 Actor 7 Actor 8 Actor 9 Actor 10
16 9 10 6 3 4 4 4 5 2
Actor 11 Actor 12 Actor 13 Actor 14 Actor 15 Actor 16 Actor 17 Actor 18 Actor 19 Actor 20
3 1 2 5 2 2 2 2 2 3
Actor 21 Actor 22 Actor 23 Actor 24 Actor 25 Actor 26 Actor 27 Actor 28 Actor 29 Actor 30
2 2 2 5 3 3 2 4 3 4
Actor 31 Actor 32 Actor 33 John A
4 6 12 17
transitivity(karate, type="global")
[1] 0.2556818
transitivity(karate, type="local")
[1] 0.1500000 0.3333333 0.2444444 0.6666667 0.6666667 0.5000000 0.5000000 1.0000000 0.5000000
[10] 0.0000000 0.6666667 NaN 1.0000000 0.6000000 1.0000000 1.0000000 1.0000000 1.0000000
[19] 1.0000000 0.3333333 1.0000000 1.0000000 1.0000000 0.4000000 0.3333333 0.3333333 1.0000000
[28] 0.1666667 0.3333333 0.6666667 0.5000000 0.2000000 0.1969697 0.1102941
Louvain algoritmasını kullanarak bu ağı farklı topluluklara böldüğümüzde, gerçek hayatta gerçekleşmiş olan toplulukları birebir yakaladığımızı görebiliyoruz.
V(karate)$color <- cluster_louvain(karate)$membership
myViz(karate)
Aşağıda, kullanıcılar ve kullanıcıların oyladığı filmlerden oluşan bir ağ oluşturyoruz. Bu ağdaki linkler, kullanıcının ilgili filme 5 puan verdiğini göstermektedir.
Orijinal veri kaynağı: …
movieuserDF <- read.csv("https://raw.githubusercontent.com/triandicAnt/GraphEmbeddingRecommendationSystem/master/data/train_user_ratings.dat", sep = "\t")
head(movieuserDF)
movieuserDF$movieID <- paste(as.character(movieuserDF$movieID) , "mov")
movieuser <- graph_from_data_frame(movieuserDF[movieuserDF$rating==5,1:2], directed = FALSE)
Bu ağdaki tüm linkler, farklı iki düğüm seti (kullanıcılar ve filmler) arasındadır. Dolayısıyla, iki parçalı bir ağ olarak değerlendirebiliriz.
vcount(movieuser)
[1] 607
ecount(movieuser)
[1] 979
is.bipartite(movieuser)
[1] FALSE
bipartite.mapping(movieuser)$res
[1] TRUE
V(movieuser)$type <- bipartite_mapping(movieuser)$type
is.bipartite(movieuser)
[1] TRUE
Bu iki parçalı ağı kullanıcılar ve filmler üzerine ayrı ayrı projekte ederek, kullanıcılar arasında ve filmler arasında ağlar oluşturuyoruz. Örneğin, iki kullanıcının arasındaki bağ, bu iki kullanıcının da 2 veya daha çok sayıda aynı filmlere 5 puan verdiğini göstermektedir.
usernet <- bipartite.projection(movieuser, multiplicity = TRUE)$proj1
usernet <- subgraph.edges(usernet, E(usernet)[E(usernet)$weight> 2])
myViz(usernet)
movienet <- bipartite.projection(movieuser, multiplicity = TRUE)$proj2
movienet <- subgraph.edges(movienet, E(movienet)[E(movienet)$weight> 3])
myViz(movienet)
Bu notları faydalı bulduysanız, bu sayfayı ilgilenebileceğini düşündüğünüz kişilerle paylaşabilirsiniz.