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 (длина) - поможет определить, сколько узлов в этом пересечении.
Пример с группами кафедры, ИГН и РНД:
ign_kaf<-length(intersection(ign_graph, kaf_graph, keep.all.vertices = F))
ign_kaf[1] 98
ign_rnd<-length(intersection(ign_graph, rnd_graph, keep.all.vertices = F))
ign_rnd[1] 16
kaf_rnd<-length(intersection(kaf_graph, rnd_graph, keep.all.vertices = F))
kaf_rnd[1] 8
У нас получилось 98 общих участников групп кафедры и ИГН, 16 - у ИГН и РНД и 8 у кафедры и РНД.
Создаем новый граф, в котором будут отражены все пересечения
- Создадим граф и укажем потенциальные взаимосвязи между нашими группами (вы заменяете на свои):
net2<-graph_from_literal(ign---kaf, ign---rnd, kaf---rnd)- Добавим переменную веса для связей, в которую запишем результаты анализа пересечений (строго соблюдая порядок связей, как в пункте 1):
E(net2)$weigth<-c(ign_kaf,ign_rnd, kaf_rnd)- Посчитаем размер наших сообществ по таблице
info:
size<-info %>%
group_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
- Присвоим цвет нашим узлам. В примере три цвета, вам будет нужно пять.
Возможные варианты:
colrs <- c("tomato", "gold", "purple")# продолжить через запятую цвета до 5 штук
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расстояние от центра для подписи узла
l <- layout.fruchterman.reingold(net2)#эта строчка нужна для красивой укладки нашего графа (чтобы узлы были более-менее равномерно распределены в пространстве)
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)Самостоятельная работы
Создать визуализацию по взаимосвязям между своими сообществами.