Konu: www.amazon.com’da yapılan alışverişlerde birlikte alınan ürünlerin ağ yapısının belirlenmesi

library(readxl)
library(dplyr)
library(ggplot2)
library(plotly)

options(scipen = TRUE)

amazon <- read_excel("C:/Users/Tolga/Desktop/YTU/sosyalag/Ödevler/Ödevler/Amazon/Amazon Purchasing.xlsx", sheet = "Amazon(4)")

1. Birbirinin aynısı satırlar varsa datayı ağırlıklı olarak tekrar düzenleyiniz.

##from 'a göre gruplandırma

amazon%>%
  group_by(from)%>%
  summarise(n=n())%>%
  ggplot()+
  geom_point(aes(x=from, y=n))
## `summarise()` ungrouping output (override with `.groups` argument)

##to 'ya göre gruplandırma

amazon%>%
  group_by(to)%>%
  summarise(n=n())%>%
  ggplot()+
  geom_point(aes(x=to, y=n))
## `summarise()` ungrouping output (override with `.groups` argument)

##date 'e göre gruplandırma

amazon%>%
  group_by(date)%>%
  summarise(n=n())%>%
  ggplot()+
  geom_col(aes(x=date,y=n,fill=date))
## `summarise()` ungrouping output (override with `.groups` argument)

## Ağırlıklandırma yapıldığında dağılım

amazon %>%
  group_by(from,to)%>%
  summarise(wgt=n())%>%
  ungroup()%>%
  group_by(wgt)%>%
  summarise(n=n())
## `summarise()` regrouping output by 'from' (override with `.groups` argument)
## `summarise()` ungrouping output (override with `.groups` argument)
## # A tibble: 2 x 2
##     wgt     n
##   <int> <int>
## 1     1 14643
## 2     2   249
ggplotly(amazon %>%
  group_by(from,to)%>%
  summarise(wgt=n())%>%
  ggplot()+
  geom_point(aes(x=from,y=to,color=as.factor(wgt))))
## `summarise()` regrouping output by 'from' (override with `.groups` argument)
amazon %>%
  group_by(from,to,date)%>%
  summarise(wgt=n())%>%
  ungroup()%>%
  group_by(wgt)%>%
  summarise(n=n())
## `summarise()` regrouping output by 'from', 'to' (override with `.groups` argument)
## `summarise()` ungrouping output (override with `.groups` argument)
## # A tibble: 1 x 2
##     wgt     n
##   <int> <int>
## 1     1 15141
#Amazon datasını filtreliyoruz.
amazon4 <- amazon %>%
  group_by(from,to)%>%
  summarise(wgt=n())%>%
  filter(wgt == 2)
## `summarise()` regrouping output by 'from' (override with `.groups` argument)

2. Ağ yapısını görsel olarak oluşturunuz.

3. Düğümler ve bağlantı çizgileri günlere göre farklı renklerde olacak şekilde ağ yapısının görselini değiştiriniz.

Amazon verisi

Genel “amazon” verisi gösterimi

library(igraph)
library(visNetwork)
plot2 <- graph_from_data_frame(d=amazon, directed=T)

E(plot2)$color <- ifelse(E(plot2)$date == "01-10-2020", "blue", 
                         ifelse(E(plot2)$date == "02-10-2020", "red",
                                ifelse(E(plot2)$date == "03-10-2020", "green",
                                       ifelse(E(plot2)$date == "04-10-2020", "yellow","black"))))

plot(plot2)

İnteraktif Plot

Genel “amazon” verisi gösterimi - 1

myViz <- function (myGraph){
  visIgraph(myGraph, randomSeed = 11)  %>%
    visIgraphLayout(randomSeed = 11) %>%
    visNodes(
      font = list(size = 39),
      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)%>%
    visOptions(nodesIdSelection = TRUE)
}

myViz(plot2)
library(DT)
derece <- degree(plot2)
derecemerkez <- degree(plot2, normalized=TRUE, mode = "in") #Yönsüz ağlarda bir düğümün derecesi basitçe o düğüme bağlanan kenarların sayısıdır.
yakinlikmerkez <- closeness(plot2, normalized=TRUE) #Yakınlık Merkeziliği bir düğümün ağdaki tüm diğer düğümlere ne kadar yakın olduğunu gösterir
## Warning in closeness(plot2, normalized = TRUE): At centrality.c:2784 :closeness
## centrality is not well-defined for disconnected graphs
arasindamerkez <- betweenness(plot2, normalized=TRUE)
pagerankmerkez <- page_rank(plot2)$vector #Google’ın web sayfalarını sıralama başarısı PageRank adlı algoritmaya dayanmaktadır

datatable(data.frame(derece,derecemerkez, yakinlikmerkez, arasindamerkez, pagerankmerkez),filter="top")

Amazon4 Verisi

Filtrelenmiş “amazon4” verisi gösterimi

plot3 <- graph_from_data_frame(d=amazon4, directed=T)

nodes <- data.frame(id=unique(amazon4$from),label=unique(amazon4$from))
edges <- amazon4%>%select(from,to)
        
visNetwork(nodes, edges, main = "Amazon Sheet (4) Network Graph") %>% 
  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"),
                arrows = "to"
            ) %>%
            visGroups(groupname = "1", color = "red") %>%
            visGroups(groupname = "2", color = "lightblue") %>%
            visLegend()%>%
            visOptions(
                highlightNearest = FALSE,
                clickToUse = FALSE,
                manipulation = FALSE,
                collapse = list(enabled = FALSE, clusterOptions = list(shape = "square")),
                autoResize = TRUE,
                nodesIdSelection = TRUE
            )%>%
            visInteraction(
                hover = TRUE,
                hoverConnectedEdges = FALSE,
                selectConnectedEdges = FALSE,
                multiselect = FALSE,
                dragNodes = TRUE,
                dragView = TRUE,
                zoomView = TRUE,
                navigationButtons = FALSE,
                selectable = TRUE
            )%>%
            visPhysics(
                stabilization = TRUE,
                solver = "repulsion",
                repulsion = list(
                    nodeDistance = 500,
                    centralGravity = 0,
                    springLength = 200
                ),
                enabled = TRUE
            )
library(DT)
derece <- degree(plot3)
derecemerkez <- degree(plot3, normalized=TRUE, mode = "in") #Yönsüz ağlarda bir düğümün derecesi basitçe o düğüme bağlanan kenarların sayısıdır.
yakinlikmerkez <- closeness(plot3, normalized=TRUE) #Yakınlık Merkeziliği bir düğümün ağdaki tüm diğer düğümlere ne kadar yakın olduğunu gösterir
## Warning in closeness(plot3, normalized = TRUE): At centrality.c:2784 :closeness
## centrality is not well-defined for disconnected graphs
arasindamerkez <- betweenness(plot3, normalized=TRUE)
pagerankmerkez <- page_rank(plot3)$vector  #Google’ın web sayfalarını sıralama başarısı PageRank adlı algoritmaya dayanmaktadır

datatable(data.frame(derece, derecemerkez, yakinlikmerkez, arasindamerkez, pagerankmerkez),filter="top")

5. Mevcut ağ yönsüz bir olsaydı; ağ yapısının kümelenme katsayısını hesaplayarak görsel olarak kümelenmeyi gösteriniz ve yorumlayınız.

plot3 <- graph_from_data_frame(d=amazon4, directed=F)

ceb <- cluster_edge_betweenness(plot3)
dendPlot(ceb, mode="hclust")

par(mfrow=c(2, 3), mar=c(0,0,1,0))
plot(ceb, plot3, layout=layout_randomly, main="Random")
plot(ceb, plot3, layout=layout_in_circle, main="Circle")
plot(ceb, plot3, layout=layout_as_star, main="Star")
plot(ceb, plot3, layout=layout_as_tree, main="Tree")
plot(ceb, plot3, layout=layout_on_grid, main="Grid")
plot(ceb, plot3, layout=layout_with_fr, main="Force-directed")

ceb
## IGRAPH clustering edge betweenness, groups: 115, mod: 0.99
## + groups:
##   $`1`
##   [1] "3104" "3106" "3105"
##   
##   $`2`
##   [1] "3108" "3109"
##   
##   $`3`
##   [1] "3118" "3117"
##   
##   $`4`
##   + ... omitted several groups/vertices
#IGRAPH clustering edge betweenness, groups: 115, mod: 0.99

6. Ağ yapısının bütünü için aşağıdaki istatistikleri hesaplayıp yorumlayınız.

  1. Yoğunluk (density)
  2. Ortalama uzaklık (mean distance)
  3. En uzun mesafe (diameter)
  4. Karşılıklılık (reciprocity)
  5. Geçişlilik (transitivity)
library(CINNA)
#Yoğunluk (Density) mevcut bağlantı sayısının potansiyel olabilecek tüm bağlantı sayısına oranını verir.

edge_density(plot2)
## [1] 0.0003459626
edge_density(plot3)
## [1] 0.006657576
#Ortalama yol uzunluğu mean_distance() fonksiyonu ile hesaplanır. 
mean_distance(plot2, directed=FALSE)
## [1] 6.479386
mean_distance(plot3, directed=FALSE)
## [1] 1.222727
#İki birim arasındaki en uzun mesafe diameter() fonksiyonu ile hesaplanır.

diameter(plot2, directed=FALSE, weights=NA)
## [1] 13
diameter(plot3, directed=FALSE, weights=NA)
## [1] 4
#Karşılıklılık (Reciprocity) geçişliliğin başka bir ölçüsüdür. Düğümler arasındaki bağlantıların karşılıklı yani iki yönlü olup olmadığının ölçülmesidir. Dolayısıyla yalnızca yönlü ağlar için tanımlıdır. Takip edersen takip ederim. 

plot2 <- graph_from_data_frame(d=amazon, directed=T)
reciprocity(plot2)
## [1] 0.2335381
plot3 <- graph_from_data_frame(d=amazon4, directed=T)
reciprocity(plot3)
## [1] 0.5542169
#Kümelenme katsayısı olarak da bilinen geçişlilik transitivity() fonksiyonu ile hesaplanır. Örneğin, A birimi B birimi ile bağlantılı ve B birimi de C birimi ile bağlantılıysa, A biriminin C birimi ile bağlantılı olma olasılığı nedir sorusunun yanıtıdır. Bu örnekte birimlerin %18.4’ü ve %66.3'ü bu şekilde bağlantılıdır.

transitivity(plot2)
## [1] 0.1846984
transitivity(plot3)
## [1] 0.6634615

7. 6. aşamadaki tüm istatistikleri her bir gün için ayrı ayrı hesaplayıp karşılaştırmalı olarak yorumlayınız.

unique(amazon$date)
## [1] "01-10-2020" "02-10-2020" "03-10-2020" "04-10-2020"
amazondate1 <- amazon %>%
  filter(date == "01-10-2020")

dateplot1 <- graph_from_data_frame(d=amazondate1, directed=T)

amazondate2 <- amazon %>%
  filter(date == "02-10-2020")

dateplot2 <- graph_from_data_frame(d=amazondate2, directed=T)

amazondate3 <- amazon %>%
  filter(date == "03-10-2020")

dateplot3 <- graph_from_data_frame(d=amazondate3, directed=T)

amazondate4 <- amazon %>%
  filter(date == "04-10-2020")

dateplot4 <- graph_from_data_frame(d=amazondate1, directed=T)
library(tidyr)
data.frame(edge_density(dateplot1),edge_density(dateplot2),edge_density(dateplot3),edge_density(dateplot4),mean_distance.dateplot1=mean_distance(dateplot1, directed=FALSE),mean_distance.dateplot2=mean_distance(dateplot2, directed=FALSE),mean_distance.dateplot3=mean_distance(dateplot3, directed=FALSE),mean_distance.dateplot4=mean_distance(dateplot4, directed=FALSE),diameter.dateplot1=diameter(dateplot1, directed=FALSE, weights=NA),diameter.dateplot2=diameter(dateplot2, directed=FALSE, weights=NA),diameter.dateplot3=diameter(dateplot3, directed=FALSE, weights=NA),diameter.dateplot4=diameter(dateplot4, directed=FALSE, weights=NA),reciprocity(dateplot1),reciprocity(dateplot2),reciprocity(dateplot3),reciprocity(dateplot4),transitivity(dateplot1),transitivity(dateplot2),transitivity(dateplot3),transitivity(dateplot4))%>%
  gather(key,value,1:20)
##                        key         value
## 1  edge_density.dateplot1.  0.0006314849
## 2  edge_density.dateplot2.  0.0007526706
## 3  edge_density.dateplot3.  0.0005109239
## 4  edge_density.dateplot4.  0.0006314849
## 5  mean_distance.dateplot1 12.1963352483
## 6  mean_distance.dateplot2 12.1503821868
## 7  mean_distance.dateplot3 16.5487918777
## 8  mean_distance.dateplot4 12.1963352483
## 9       diameter.dateplot1 37.0000000000
## 10      diameter.dateplot2 31.0000000000
## 11      diameter.dateplot3 40.0000000000
## 12      diameter.dateplot4 37.0000000000
## 13  reciprocity.dateplot1.  0.1558752998
## 14  reciprocity.dateplot2.  0.1832000000
## 15  reciprocity.dateplot3.  0.2210934367
## 16  reciprocity.dateplot4.  0.1558752998
## 17 transitivity.dateplot1.  0.2209852066
## 18 transitivity.dateplot2.  0.2656183595
## 19 transitivity.dateplot3.  0.2979623049
## 20 transitivity.dateplot4.  0.2209852066

KAYNAKÇA

https://furkangursoy.github.io/R-ile-sosyal-ag-analizi

https://edav.info/network.html

http://pablobarbera.com/big-data-upf/html/02a-networks-intro-visualization.html

https://datastorm-open.github.io/visNetwork/physic.html

https://dgranjon.shinyapps.io/shinyMons/_w_d42074ff/