Network analiza (u društvenim znanostima) ima korijene u strukturalističkom pogledu na društvo jer konceptualizira društveni život u terminima strukture i odnosa (za razliku od kategorija) među društvenim akterima. Implicitna pretpostavka network analize je da je društveni život primarno određen relacijama i obrascima odnosa između društvenih aktera. Društvene mreže (u network analizi) su definirane u terminima mrežnih čvorova (članova) i mrežnih poveznica (relacija među članovima). Upravo takva vrsta međuzavisnosti je ključni razlikovni faktor između network i drugih analitičkih pristupa u društvenim istraživanjima. Društvena mreža je skup društveno relevantnih čvorova povezanih jednom ili više vrsta poveznica. Primjeri poveznica su kolaboracije, prijateljstva, trgovinske veze, Web poveznnice, broj citata, tokovi informacija i dr., a u najširim kategorijama se mogu sistematizirati kao sličnosti, odnosi, interakcije ili tokovi.

Terminologija mreža.

Terminologija mreža.

Network analiza je mnogo više istraživačka paradigma nego zaokružena teorija ili metoda. Kao istraživačka paradigma se formira u 1950ima u Engleskoj (Uni Manchester). Teme kojima se network analiza (u društvenim znanostima) bavila u početcima su korporativna koncentracija moći, diktature, društvena struktura, političke mreže, društveni pokreti, kriminal, terorizam, akademske mreže, odnosi među tvrtkama i dr. Nakon 1970ih network analiza postaje sve ćešće korišten pristup u društvenim znanostima zbog rastućeg broja fizičara koji koriste tu metodologiju za istraživanje društvenih fenomena, a sve se ćešće sreće u psihologiji, antropologiji, komunikacijskim znanostima, ekonomici, geografiji i sociologiji.

Osnova network analize je matematička teorija grafikona (graph teory) koja se u društvenim znanostima primjenjuje na pojedince i društvene aktere poput grupa, organizacija, tvrtki i dr. Network analiza omogućuje (primjerice) mjerenje gustoće mreže i centraliteta mrežnih čvorova pri čemu se mjere centraliteta mogu koristiti kao indikatori moći, utjecaja, popularnosti ili prestiža dok mjere gustoće pokazuju strukturu društvenih zajednica, strukturnih podjela u društvu, geografskih aglomeracija i dr. Implicitna pretpostavka network analize u društvenim znanostima je međupovezanost društvenih aktera pa su standardne statističke pretpostavke nezavisnosti narušene. Zbog toga korištenje statističkih procedura poput testova signifikantnosti, regresije, analize varijance i dr. nije moguće u network analizi.

Vrste network analize su: 1. Vizualizacija i karakterizacija mreže 2. Modeliranje i inferencijalna statistika 3. Mrežni procesi.

Procedura provedbe nework analize se sastoji od sljedećih koraka: 1. Uređivanje i priprema podataka za network analizu 2. Vizualizacija mreže 3. Deskriptivna analiza mrežnih karakteristika 4. Matematički modeli mreže 5. Statistički modeli mreže 6. Dinamički modeli mreža

Network analiza u R (1)

# Učitaj pakete
library(tidyverse)
library(tidygraph)
library(ggraph)
library(navdata)
# Učitaj i pregledaj podatke
data("phone.call2")
class(phone.call2)
## [1] "list"
str(phone.call2)
## List of 2
##  $ nodes: tibble [16 x 2] (S3: tbl_df/tbl/data.frame)
##   ..$ id   : int [1:16] 1 2 3 4 5 6 7 8 9 10 ...
##   ..$ label: chr [1:16] "France" "Belgium" "Germany" "Danemark" ...
##  $ edges: tibble [18 x 3] (S3: tbl_df/tbl/data.frame)
##   ..$ from  : int [1:18] 1 2 1 1 1 1 3 3 2 3 ...
##   ..$ to    : int [1:18] 3 1 8 9 10 11 12 13 3 14 ...
##   ..$ weight: num [1:18] 9 4 3 4 2 3 2 2 3 2 ...
force(phone.call2)
## $nodes
## # A tibble: 16 x 2
##       id label         
##    <int> <chr>         
##  1     1 France        
##  2     2 Belgium       
##  3     3 Germany       
##  4     4 Danemark      
##  5     5 Croatia       
##  6     6 Slovenia      
##  7     7 Hungary       
##  8     8 Spain         
##  9     9 Italy         
## 10    10 Netherlands   
## 11    11 UK            
## 12    12 Austria       
## 13    13 Poland        
## 14    14 Switzerland   
## 15    15 Czech republic
## 16    16 Slovania      
## 
## $edges
## # A tibble: 18 x 3
##     from    to weight
##    <int> <int>  <dbl>
##  1     1     3    9  
##  2     2     1    4  
##  3     1     8    3  
##  4     1     9    4  
##  5     1    10    2  
##  6     1    11    3  
##  7     3    12    2  
##  8     3    13    2  
##  9     2     3    3  
## 10     3    14    2  
## 11     3    15    2  
## 12     3    10    2  
## 13     4     3    2  
## 14     5     3    2  
## 15     5    16    2  
## 16     5     7    2  
## 17     6     3    2  
## 18     7    16    2.5
# Napravi graph network objekt
phone <- tbl_graph(
  nodes = phone.call2$nodes,
  edges = phone.call2$edges,
  directed = T
)
# Vizualiziraj mrežu
ggraph(phone, layout = "graphopt") + 
  geom_edge_link(width = 1, colour = "lightgray") +
  geom_node_point(size = 4, colour = "#00AFBB") +
  geom_node_text(aes(label = label), repel = TRUE) +
  theme_graph()

Network analiza u R (2)

# Paket
library(corrr)
# Podatci
rc <- mtcars[,c(1,3:6)]  %>% 
  t() %>%
  correlate() %>% 
  shave(upper = T) %>%
  stretch(na.rm = T) %>% 
  filter(r >= 0.998)
  
head(rc,15)
## # A tibble: 15 x 3
##    x              y                      r
##    <chr>          <chr>              <dbl>
##  1 Mazda RX4      Mazda RX4 Wag      1.00 
##  2 Mazda RX4      Merc 230           1.00 
##  3 Mazda RX4      Merc 280           0.999
##  4 Mazda RX4      Merc 280C          0.999
##  5 Mazda RX4      Merc 450SL         0.998
##  6 Mazda RX4 Wag  Merc 230           1.00 
##  7 Mazda RX4 Wag  Merc 280           0.999
##  8 Mazda RX4 Wag  Merc 280C          0.999
##  9 Mazda RX4 Wag  Merc 450SL         0.998
## 10 Datsun 710     Toyota Corona      0.999
## 11 Datsun 710     Volvo 142E         0.999
## 12 Hornet 4 Drive Valiant            0.999
## 13 Hornet 4 Drive Cadillac Fleetwood 0.998
## 14 Hornet 4 Drive Dodge Challenger   0.998
## 15 Hornet 4 Drive Pontiac Firebird   0.999
# Vizualiziraj
cor.graph <- as_tbl_graph(rc, directed = FALSE)
cor.graph
## # A tbl_graph: 24 nodes and 59 edges
## #
## # An undirected simple graph with 3 components
## #
## # Node Data: 24 x 1 (active)
##   name             
##   <chr>            
## 1 Mazda RX4        
## 2 Mazda RX4 Wag    
## 3 Datsun 710       
## 4 Hornet 4 Drive   
## 5 Hornet Sportabout
## 6 Valiant          
## # ... with 18 more rows
## #
## # Edge Data: 59 x 3
##    from    to     r
##   <int> <int> <dbl>
## 1     1     2 1.00 
## 2     1    20 1.00 
## 3     1     8 0.999
## # ... with 56 more rows
#cor.graph %>% 
#  activate(edges) %>% 
#  arrange(desc(r))

ggraph(cor.graph) + 
  geom_edge_link() + 
  geom_node_point() +
  geom_node_text(aes(label = name), size = 3, repel = TRUE) +
  theme_graph()

# Permutacija network objekta

carsGrupa <- tibble(
  name = rownames(mtcars),
  cyl = as.factor(mtcars$cyl)
)
## Nodovi
cor.graph2 <- cor.graph %>% 
  activate(nodes) %>% 
  left_join(carsGrupa, by = "name") %>% 
  rename(label = "name")

cor.graph2
## # A tbl_graph: 24 nodes and 59 edges
## #
## # An undirected simple graph with 3 components
## #
## # Node Data: 24 x 2 (active)
##   label             cyl  
##   <chr>             <fct>
## 1 Mazda RX4         6    
## 2 Mazda RX4 Wag     6    
## 3 Datsun 710        4    
## 4 Hornet 4 Drive    6    
## 5 Hornet Sportabout 8    
## 6 Valiant           6    
## # ... with 18 more rows
## #
## # Edge Data: 59 x 3
##    from    to     r
##   <int> <int> <dbl>
## 1     1     2 1.00 
## 2     1    20 1.00 
## 3     1     8 0.999
## # ... with 56 more rows
## Edges
cor.graph3 <- cor.graph2 %>% 
  activate(edges) %>% 
  rename(weight = r)

cor.graph3
## # A tbl_graph: 24 nodes and 59 edges
## #
## # An undirected simple graph with 3 components
## #
## # Edge Data: 59 x 3 (active)
##    from    to weight
##   <int> <int>  <dbl>
## 1     1     2  1.00 
## 2     1    20  1.00 
## 3     1     8  0.999
## 4     1     9  0.999
## 5     1    11  0.998
## 6     2    20  1.00 
## # ... with 53 more rows
## #
## # Node Data: 24 x 2
##   label         cyl  
##   <chr>         <fct>
## 1 Mazda RX4     6    
## 2 Mazda RX4 Wag 6    
## 3 Datsun 710    4    
## # ... with 21 more rows
# Vizualiziraj

ggraph(cor.graph3) + 
  geom_edge_link(aes(width = weight), alpha = 0.2) + 
  scale_edge_width(range = c(0.2, 1)) +
  geom_node_point(aes(color = cyl), size = 2) +
  geom_node_text(aes(label = label), size = 3, repel = TRUE) +
  theme_graph()

## MJERE CENTRALITETA
# 1. betweenness centrality
# 2. closeness centrality
# 3. eigenvector centrality
# 4. authority centrality

# Mjera centraliteta 
phone %>%
  activate(nodes) %>%
  mutate(centrality = centrality_authority())
## # A tbl_graph: 16 nodes and 18 edges
## #
## # A directed acyclic simple graph with 1 component
## #
## # Node Data: 16 x 3 (active)
##      id label    centrality
##   <int> <chr>         <dbl>
## 1     1 France     1.01e- 1
## 2     2 Belgium    6.43e-17
## 3     3 Germany    1.00e+ 0
## 4     4 Danemark   3.21e-17
## 5     5 Croatia    3.21e-17
## 6     6 Slovenia   3.21e-17
## # ... with 10 more rows
## #
## # Edge Data: 18 x 3
##    from    to weight
##   <int> <int>  <dbl>
## 1     1     3      9
## 2     2     1      4
## 3     1     8      3
## # ... with 15 more rows
# Vizualiziraj
phone %>%
  activate(nodes) %>%
  mutate(centrality = centrality_authority()) %>%  # 
  ggraph(layout = "graphopt") + 
  geom_edge_link(width = 1, colour = "lightgray") +
  geom_node_point(aes(size = centrality, colour = centrality)) +
  geom_node_text(aes(label = label), repel = TRUE)+
  scale_color_gradient(low = "yellow", high = "red")+
  theme_graph()

## CLUSTERING (grupiranje čvorova na osnovi "grafičke topologije")

# Clustering
cor.graph3 %>%
  activate(nodes) %>%
   mutate(community = as.factor(group_infomap()))
## # A tbl_graph: 24 nodes and 59 edges
## #
## # An undirected simple graph with 3 components
## #
## # Node Data: 24 x 3 (active)
##   label             cyl   community
##   <chr>             <fct> <fct>    
## 1 Mazda RX4         6     1        
## 2 Mazda RX4 Wag     6     1        
## 3 Datsun 710        4     3        
## 4 Hornet 4 Drive    6     2        
## 5 Hornet Sportabout 8     2        
## 6 Valiant           6     2        
## # ... with 18 more rows
## #
## # Edge Data: 59 x 3
##    from    to weight
##   <int> <int>  <dbl>
## 1     1     2  1.00 
## 2     1    20  1.00 
## 3     1     8  0.999
## # ... with 56 more rows
cor.graph3 %>%
  activate(nodes) %>%
  mutate(community = as.factor(group_infomap())) %>% 
  ggraph(layout = "graphopt") + 
  geom_edge_link(width = 1, colour = "lightgray") +
  geom_node_point(aes(colour = community), size = 4) +
  geom_node_text(aes(label = label), repel = TRUE)+
  theme_graph()