library(igraph)
library(dplyr)
Занятие 8. Анализ взаимосвязей между сообществами
О чем будет сегодняшнее занятие
На предыдущих занятиях мы уже проанализировали множество важных характеристик сетевых сообществ - выявили их связность, транзитивность, рассчитали несколько видов центральности и выявили лидеров, а также описали социальные характеристики участников сети.
Между тем, до настоящего момента все наши сообщества были как бы «сами по себе»: мы анализировали каждое сообщество отдельно, и если и применяли какие-то функции, чтобы рассчитать аналогичные показатели сразу по пяти сообществам, это делалось лишь для того, чтобы сэкономить время, описания и графики у каждого сообщества были разные.
Настало время протестировать гипотезу о том, связаны ли сообщества друг с другом посредством общих членов? И если эти общие пользователи групп существуют, то между какими сообществами пересечений больше или меньше и почему?
На данном занятии мы научимся и продолжим совершенствовать свои навыки:
- находить пересечения между группами путем подсчета общих подписчиков между двумя группами;
- создавать графы с помощью пакета
igraph
и присваивать атрибуты узлам и связям; - визуализировать граф
Загружаем библиотеки
Как всегда, мы начинаем с загрузки библиотек:
Определяемся с данными
В рамках данного занятия нам потребуются следующие таблицы и сетевые объекты, созданные на предыдущих занятиях:
- таблица
info
, в которой собрана вся информация о сообществах; - индивидуальные графы сообществ (в примере с кафедрой, ИГН и Домом народов они называются
kaf_graph
,ign_graph
,rnd_graph
).
Ищем пересечения между сообществами
Для того, чтобы понять, как связаны группы между собой, найдем, количество членов групп, которые входят одновременно в несколько сообществ.
Будем перебирать попарно все возможные варианты и искать, сколько общих подписчиков у каждой пары групп.
В нашем примере три группы, значит будет три пары пересечений:
- кафедры и ИГН
- ИГН и РНД
- кафедры и РНД
В ваших примерах будет пять групп, соответственно пересечений будет:
\[\frac{k(k-1)}{2} = \frac{(5*4)}{2}=10\]
Это: 1-я и 2-я, 1-я и 3-я, 1-я и 4-я, 1-я и 5-я, 2-я и 3-я, 2-я и 4-я, 2-я и 5-я, 3-я и 4-я, 3-я и 5-я, 4-я и 5-я группы.
Найти такие пересечения поможет функция intersection
, а функция length
(длина) - поможет определить, сколько узлов в этом пересечении.
Пример с группами кафедры, ИГН и РНД:
<-length(intersection(ign_graph, kaf_graph, keep.all.vertices = F))
ign_kaf ign_kaf
[1] 98
<-length(intersection(ign_graph, rnd_graph, keep.all.vertices = F))
ign_rnd ign_rnd
[1] 16
<-length(intersection(kaf_graph, rnd_graph, keep.all.vertices = F))
kaf_rnd kaf_rnd
[1] 8
У нас получилось 98 общих участников групп кафедры и ИГН, 16 - у ИГН и РНД и 8 у кафедры и РНД.
Создаем новый граф, в котором будут отражены все пересечения
- Создадим граф и укажем потенциальные взаимосвязи между нашими группами (вы заменяете на свои):
<-graph_from_literal(ign---kaf, ign---rnd, kaf---rnd) net2
- Добавим переменную веса для связей, в которую запишем результаты анализа пересечений (строго соблюдая порядок связей, как в пункте 1):
E(net2)$weigth<-c(ign_kaf,ign_rnd, kaf_rnd)
- Посчитаем размер наших сообществ по таблице
info
:
<-info %>%
sizegroup_by(group) %>%
summarize(n=n())
size
# A tibble: 3 × 2
group n
<chr> <int>
1 ign 3377
2 kaf 206
3 rnd 677
- Укажем размер групп в качестве атрибута узлов нашего графа, но не в исходном виде (так узлы будут слишком большими), а в виде квадратного корня из исходного размера:
V(net2)$size<-sqrt(size$n)
#проверим
V(net2)$size
[1] 58.11196 14.35270 26.01922
- Присвоим цвет нашим узлам. В примере три цвета, вам будет нужно пять.
Возможные варианты:
<- c("tomato", "gold", "purple")# продолжить через запятую цвета до 5 штук
colrs V(net2)$color <- colrs[1:3]# вместо 3 поставить 5
- Присвоим красивые имена нашим сообществам:
V(net2)$label <- c("ИГН", "Кафедра СиМП", "РНД")# тут будут ваши названия
- Меняем цвет и ширину связей:
#Меняем цвет линий для связей между сообществами
E(net2)$edge.color <- "gray80"
# Устанавливаем ширину линии в зависимости от веса:
E(net2)$width <- 1+E(net2)$weigth/12
- Создаем график по пересечениям, включающим информацию о размере сообществ.
Комментарии к параметрам в скобках:
vertex.label.cex = V(net2)$size*0.04
отвечает за размер надписи узлов, чтобы он был пропорционален размеру группыedge.curved = 0.2
искривленность дугиvertex.label.color="black"
цвет подписи к связям (наши веса-пересечения)edge.label=E(net2)$weigth
надписи для связей (веса)edge.label.color="black"
цвет подписей на связяхvertex.label.dist = V(net2)$size/6
расстояние от центра для подписи узла
<- layout.fruchterman.reingold(net2)#эта строчка нужна для красивой укладки нашего графа (чтобы узлы были более-менее равномерно распределены в пространстве)
l plot(net2, vertex.label.cex = V(net2)$size*0.04, edge.curved = .2, vertex.label.color="black", edge.label=E(net2)$weigth, edge.label.color="black", vertex.label.dist = V(net2)$size/6)
Самостоятельная работы
Создать визуализацию по взаимосвязям между своими сообществами.