Упражнение R: Анализ социальной сети


Анализ социальной сети

Определение

Социальные сети — это просто сети социальных взаимодействий и личных отношений. Подумайте о нашей группе друзей и о том, как мы с ними познакомились. Может быть, мы познакомились с ними еще во время учебы в школе, а может быть, через хобби или через наше общество. На самом деле, 72% всех пользователей Интернета сегодня активны в социальных сетях, включаясь в социальное взаимодействие и развитие личных отношений. Однако, чтобы понять, что такое социальные сети, нам не обязательно обращаться только к интернету или социальным медиа, они могут появляться в различных формах в нашей повседневной жизни.

Анализ социальных сетей

Анализ социальных сетей (SNA), также известный как наука о сетях, — это область анализа данных, которая использует сети и теорию графов для понимания социальных структур. Мы можем видеть сети вокруг нас, такие как дорожная сеть, онлайн-сеть, сеть социальных сетей, таких как facebook, twitter и т.д. Изучение SNA позволяет нам исследовать различные источники данных.

График SNA

Все мы хорошо знакомы с графом, который представляет собой совокупность ненулевых вершин и ребер. Для того чтобы построить SNA-граф, необходимы два ключевых компонента — акторы и отношения. Здесь актеры представляют собой вершины, а отношения означают ребро между двумя актерами. Давайте напишем SNA-граф в коде R. Для этого в нашей R или R studio должен быть установлен пакет igraph.

library(igraph)


## 
## Attaching package: 'igraph'

## The following objects are masked from 'package:stats':
## 
## decompose, spectrum

## The following object is masked from 'package:base':
## 
## union


g <- graph(c(1,2))
plot(g)

Войти в полноэкранный режим Выйти из полноэкранного режима

На рисунке мы видим направленный граф от узла 1 к узлу 2. Из приведенного выше графика также видно, что по умолчанию он дает направленный граф. На рисунке плохо видны узлы и ребра, поэтому давайте увеличим их размер и придадим узлам другой цвет.

plot(g,
vertex.color = 'green',
vertex.size = 40,
edge.color ='red',
edge.size = 20)

Вход в полноэкранный режим Выход из полноэкранного режима

Теперь мы изменим цвет узла и размер шрифта узла. Добавьте больше узлов на граф, для этого выполните следующий код.

g <- graph(c(1,2,2,3,3,4,4,1))
plot(g,
     vertex.color = 'green',
     vertex.size =40,
     edge.color = 'red',
     edge.size = 20)

Войти в полноэкранный режим Выйти из полноэкранного режима

Мы получили граф с четырьмя вершинами 1,2,3,4. Здесь мы также получили направленный граф. Давайте сделаем его направленным, для этого нам нужно написать directed is false.

g <- graph(c(1,2,2,3,3,4,4,1),directed = FALSE)
plot(g,
     vertex.color = 'green',
     vertex.size =40,
     edge.color = 'red',
     edge.size = 20)

Вход в полноэкранный режим Выйти из полноэкранного режима

Мы получили желаемый тип графа. Теперь перейдем к дальнейшим действиям. Мы можем задать количество вершин, не записывая их, для этого посмотрите следующий код.

g <- graph(c(1,2,2,3,3,4,4,1), 
directed = F, n=7)
plot(g,
     vertex.color = 'green',
     vertex.size =40,
     edge.color = 'red',
     edge.size = 20)

Войти в полноэкранный режим Выйти из полноэкранного режима

В приведенном выше графе мы указали семь номеров вершин. Среди них мы видим три изолированные вершины. Причина появления изолированных вершин в том, что мы не указали ребро или связь между ними. Также из графа можно понять, что это не направленный граф.

Матрица смежности

Давайте посмотрим, что произойдет, если мы введем только g[].

g[]


## 7 x 7 sparse Matrix of class "dgCMatrix"
##                   
## [1,] . 1 . 1 . . .
## [2,] 1 . 1 . . . .
## [3,] . 1 . 1 . . .
## [4,] 1 . 1 . . . .
## [5,] . . . . . . .
## [6,] . . . . . . .
## [7,] . . . . . . .

Войти в полноэкранный режим Выйти из полноэкранного режима

Это дает нам матрицу смежности 7 на 7. Матрица смежности — это матрица, в которой мы ставим 1, если между двумя вершинами есть ребро, если нет, то ставим 0. Но в приведенной выше матрице вместо нуля получилось просто ..

Давайте попробуем построить наш граф, используя текстовые данные вместо чисел.

g1 <-
graph(c("Binu","Binita","Binita","Rita"
,"Rita","Binu","Binu","Rita", "Anju", 
"Binita"))
plot(g1,
vertex.color = "green",
vertex.size = 40,
edge.color = "red",
edge.size = 5)

Вход в полноэкранный режим Выход из полноэкранного режима

Если мы хотим проверить характеристики g1, то просто набираем g1 и нажимаем клавиши control и enter. Мы получим следующий результат.

g1


## IGRAPH d030509 DN-- 4 5 -- 
## + attr: name (v/c)
## + edges from d030509 (vertex names):
## [1] Binu ->Binita Binita->Rita Rita ->Binu Binu ->Rita Anju ->Binita

Вход в полноэкранный режим Выход из полноэкранного режима

Он показал, что в графе 4 узла 5 ребер. Ребра направлены отBinu ->Binita, Binita->Rita, Rita ->Binu, Binu ->Rita, Anju ->Binita.

Степень

Степень означает количество связей с каждым узлом. Давайте проверим степень графа g1. Для проверки степени мы можем сделатьdegree(g1) или degree(g1, mode='all').

degree(g1) 


## Binu Binita Rita Anju 
## 3 3 3 1

Вход в полноэкранный режим Выйти из полноэкранного режима

Степень Бину равна 3, а степень Анджу равна 1.

degree(g1, mode='all')


## Binu Binita Rita Anju 
## 3 3 3 1

Войдите в полноэкранный режим Выход из полноэкранного режима

Диаметр

Диаметр означает количество граней внутри и снаружи SND. Теперь проверим диаметр графа.

diameter(g1, directed = F, weights = 
NA)


## [1] 2

Войти в полноэкранный режим Выйти из полноэкранного режима

Мы получили два диаметра, т.е. Anju <- Binita <- Rita, Anju <- Binita <- Binu.

Краевая плотность

Плотность краев означает ecount(g1)/(vcount(g1)*(vcount(g1) -1)). Мы можем рассчитать его по следующему коду.

edge_density(g1, loops = F)


## [1] 0.4166667

Вход в полноэкранный режим Выйти из полноэкранного режима

Мы получили значение краевой плотности 0.4166667.

Взаимность

Всего ребер = 5

Связанные ребра = 2

Взаимность = 2/5 = 0,4

reciprocity(g1)


## [1] 0.4

Войдите в полноэкранный режим Выход из полноэкранного режима

Близость

Теперь получим близость графа.

closeness(g1, mode = "all", weights = NA)


## Binu Binita Rita Anju 
## 0.2500000 0.3333333 0.2500000 0.2000000

Войти в полноэкранный режим Выйти из полноэкранного режима

Из приведенного выше результата видно, что Бинита ближе всех к трем другим людям, а Анджу дальше всех от остальных трех людей.

Betweenness

Вычислим расстояние между g1

betweenness(g1, directed = T, weights = NA)


## Binu Binita Rita Anju 
## 1 2 2 0

Войти в полноэкранный режим Выйти из полноэкранного режима

Бинита и Рита имеют по 2 внутренних края, Бину имеет один внутренний край, а Анджу не имеет внутреннего края.

Связность ребер

Для каждой пары вершин в связном графе существует хотя бы один кратчайший путь между вершинами.

edge_betweenness(g1, directed = T, weights = NA)


## [1] 2 4 4 1 3

Войти в полноэкранный режим Выход из полноэкранного режима

SNA в TwitterData

Здесь я загрузилTwitterdata с моей локальной машины.

load("F:/MDS R/termDocMatrix.rdata")


m<- as.matrix(termDocMatrix)
termM <- m %*% t(m)
termM[1:10,1:10]


## Terms
## Terms analysis applications code computing data examples introduction
## analysis 23 0 1 0 4 4 2
## applications 0 9 0 0 8 0 0
## code 1 0 9 0 1 6 0
## computing 0 0 0 10 2 0 0
## data 4 8 1 2 85 5 3
## examples 4 0 6 0 5 17 2
## introduction 2 0 0 0 3 2 10
## mining 4 7 3 1 50 5 3
## network 12 0 1 0 0 2 2
## package 2 1 0 2 12 2 0
## Terms
## Terms mining network package
## analysis 4 12 2
## applications 7 0 1
## code 3 1 0
## computing 1 0 2
## data 50 0 12
## examples 5 2 2
## introduction 3 2 0
## mining 64 1 6
## network 1 17 1
## package 6 1 27

Войти в полноэкранный режим Выход из полноэкранного режима

Теперь мы построили матрицу смежности терминов, где строки и столбцы представляют термины, а каждая запись - количество совпадений двух терминов. Далее мы можем построить граф с помощьюgraph.adjacency() из пакета igraph.

g <- graph.adjacency(termM,weighted = T,mode = 'undirected')
g


## IGRAPH d066e18 UNW- 21 151 -- 
## + attr: name (v/c), weight (e/n)
## + edges from d066e18 (vertex names):
## [1] analysis --analysis analysis --code        
## [3] analysis --data analysis --examples    
## [5] analysis --introduction analysis --mining      
## [7] analysis --network analysis --package     
## [9] analysis --positions analysis --postdoctoral
## [11] analysis --r analysis --research    
## [13] analysis --series analysis --slides      
## [15] analysis --social analysis --time        
## + ... omitted several edges

Вход в полноэкранный режим Выход из полноэкранного режима

Здесь мы построили граф на termDocMatrix. В результате мы можем видеть ребра между различными док-тами.

g <- simplify(g)
g


## IGRAPH d06a87e UNW- 21 130 -- 
## + attr: name (v/c), weight (e/n)
## + edges from d06a87e (vertex names):
## [1] analysis --code analysis --data        
## [3] analysis --examples analysis --introduction
## [5] analysis --mining analysis --network     
## [7] analysis --package analysis --positions   
## [9] analysis --postdoctoral analysis --r           
## [11] analysis --research analysis --series      
## [13] analysis --slides analysis --social      
## [15] analysis --time analysis --tutorial    
## + ... omitted several edges

Вход в полноэкранный режим Выход из полноэкранного режима

Функция simplify() в igraph вручную удаляет самозацикливающиеся петли из сети. Мы видим, что в предыдущем графе есть 151 ребро, а во втором графе только 130 ребер. Следовательно, существует 21 самопетля, которые удаляются из графа.

Проверьте степень графа и узлы графа.

V(g)$label <- V(g)$name
V(g)$label


## [1] "analysis" "applications" "code" "computing" "data"        
## [6] "examples" "introduction" "mining" "network" "package"     
## [11] "parallel" "positions" "postdoctoral" "r" "research"    
## [16] "series" "slides" "social" "time" "tutorial"    
## [21] "users"


V(g)$degree <- degree(g)
V(g)$degree


## [1] 17 6 9 9 18 14 12 20 14 13 8 7 8 17 9 11 15 11 11 16 15

Войти в полноэкранный режим Выйдите из полноэкранного режима

Мы обнаружили, что степень графа равна 20.

Гистограмма на основе степени

hist(V(g)$degree, breaks = 100,col = 'green', main = "Frequency Of Degree", 
     xlab = " Degree of vertices", ylab = " Frequency")

Войдите в полноэкранный режим Выход из полноэкранного режима

Видно, что большинство узлов имеют степень 9 и 11. Все мы знаем, что такое степень графа, количество ребер, которые инцидентны узлу, называется степенью графа.

Построим график по данным.

Зададим set.seed(3952). Где set.seed дает ту же выборку с тем же значением seed.

set.seed(3952)

layout1 <- layout.fruchterman.reingold(g)

plot(g, layout=layout1)

Вход в полноэкранный режим Выход из полноэкранного режима

С помощью первой строки кода ниже можно создать другой макет. Вторая строка создает интерактивный график, который позволяет нам вручную изменять раскладку

plot(g, layout=layout.kamada.kawai)

Войти в полноэкранный режим Выйти из полноэкранного режима

Сделайте лучше.

V(g)$label.cex <- 2.2 * V(g)$degree / max(V(g)$degree)+ .2

V(g)$label.color <- rgb(0, 0, .2, .8)

V(g)$frame.color <- NA

egam <- (log(E(g)$weight)+.4) / max(log(E(g)$weight)+.4)

E(g)$color <- rgb(.5, .5, 0, egam)

E(g)$width <- egam
# plot the graph in layout1

plot(g, layout=layout1)

Войти в полноэкранный режим Выйти из полноэкранного режима

Здесь размер слов отображается в зависимости от их степени. Из графика хорошо видно, что узел mining имеет максимальную степень.

Определение сообществ

Сообщества рассматриваются как группы, кластеры, согласованные подгруппы или модули в различных областях; обнаружение сообществ в социальной сети - это определение наборов узлов таким образом, что связи узлов внутри набора больше, чем их связи с другими узлами сети.

comm <- cluster_edge_betweenness(g)


## Warning in cluster_edge_betweenness(g): At community.c:461 :Membership vector
## will be selected based on the lowest modularity score.

## Warning in cluster_edge_betweenness(g): At community.c:468 :Modularity
## calculation with weighted edge betweenness community detection might not make
## sense -- modularity treats edge weights as similarities while edge betwenness
## treats them as distances


plot(comm,g)

Войти в полноэкранный режим Выход из полноэкранного режима

В группе есть плотные связи, внутри сообщества связи разреженные.

prop <- cluster_label_prop(g)
plot(prop, g)

Войти в полноэкранный режим Выход из полноэкранного режима

Это другой тип алгоритмов для определения сообщества, который отличается от предыдущего.

Узлы

Узлы с наибольшим количеством внешних ребер. Нам нужно найти показатель узла.

hs <- hub_score(g,weights = NA)$vector
hs


## analysis applications code computing data examples 
## 0.9047777 0.3589289 0.5606314 0.5223206 0.9065063 0.8195307 
## introduction mining network package parallel positions 
## 0.7307838 1.0000000 0.7483791 0.7210610 0.4939614 0.3733995 
## postdoctoral r research series slides social 
## 0.4095660 0.9147530 0.4481802 0.6761093 0.8510808 0.6018664 
## time tutorial users 
## 0.6761093 0.8899001 0.8342594

Войти в полноэкранный режим Выход из полноэкранного режима

Авторитет

Узлы с наибольшим количеством внутренних ребер. Необходимо найти показатель авторитетности

as <- authority_score(g, weights = NA)$vector
as


## analysis applications code computing data examples 
## 0.9047777 0.3589289 0.5606314 0.5223206 0.9065063 0.8195307 
## introduction mining network package parallel positions 
## 0.7307838 1.0000000 0.7483791 0.7210610 0.4939614 0.3733995 
## postdoctoral r research series slides social 
## 0.4095660 0.9147530 0.4481802 0.6761093 0.8510808 0.6018664 
## time tutorial users 
## 0.6761093 0.8899001 0.8342594

Войти в полноэкранный режим Выйти из полноэкранного режима

Узлы на участке

par(mfrow = c(1,2))
plot(g,vertex.size= hs*50, main = "Hubs",
     vertex.label = NA,
     vertex.colour = rainbow(50))

Войти в полноэкранный режим Выйти из полноэкранного режима

Авторитет на участке

plot(g,vertex.size= as*30, main = "Authorities",
     vertex.label = NA,
     vertex.colour = rainbow(50))

Войти в полноэкранный режим Выйти из полноэкранного режима

Ожидается, что хаб содержит большое количество исходящих ссылок. А авторитеты, как ожидается, будут содержать большое количество входящих ссылок от концентраторов.

Применение СНС в реальном мире

Анализ социальных сетей может предоставить информацию о сфере влияния банд, их воздействии и активности. Этот подход может также позволить нам определить тех, кто может быть подвержен риску объединения в банду и/или эксплуатации со стороны банд.

Оцените статью
devanswers.ru
Добавить комментарий