Занятие 8. Анализ взаимосвязей между сообществами

О чем будет сегодняшнее занятие

На предыдущих занятиях мы уже проанализировали множество важных характеристик сетевых сообществ - выявили их связность, транзитивность, рассчитали несколько видов центральности и выявили лидеров, а также описали социальные характеристики участников сети.

Между тем, до настоящего момента все наши сообщества были как бы «сами по себе»: мы анализировали каждое сообщество отдельно, и если и применяли какие-то функции, чтобы рассчитать аналогичные показатели сразу по пяти сообществам, это делалось лишь для того, чтобы сэкономить время, описания и графики у каждого сообщества были разные.

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

На данном занятии мы научимся и продолжим совершенствовать свои навыки:

  • находить пересечения между группами путем подсчета общих подписчиков между двумя группами;
  • создавать графы с помощью пакета igraph и присваивать атрибуты узлам и связям;
  • визуализировать граф

Загружаем библиотеки

Как всегда, мы начинаем с загрузки библиотек:

library(igraph)
library(dplyr)

Определяемся с данными

В рамках данного занятия нам потребуются следующие таблицы и сетевые объекты, созданные на предыдущих занятиях:

  • таблица 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 у кафедры и РНД.

Создаем новый граф, в котором будут отражены все пересечения

  1. Создадим граф и укажем потенциальные взаимосвязи между нашими группами (вы заменяете на свои):
net2<-graph_from_literal(ign---kaf, ign---rnd, kaf---rnd)
  1. Добавим переменную веса для связей, в которую запишем результаты анализа пересечений (строго соблюдая порядок связей, как в пункте 1):
E(net2)$weigth<-c(ign_kaf,ign_rnd, kaf_rnd)
  1. Посчитаем размер наших сообществ по таблице 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
  1. Укажем размер групп в качестве атрибута узлов нашего графа, но не в исходном виде (так узлы будут слишком большими), а в виде квадратного корня из исходного размера:
V(net2)$size<-sqrt(size$n)
#проверим
V(net2)$size
[1] 58.11196 14.35270 26.01922
  1. Присвоим цвет нашим узлам. В примере три цвета, вам будет нужно пять.

Возможные варианты:

colrs <- c("tomato", "gold", "purple")# продолжить через запятую цвета до 5 штук
V(net2)$color <- colrs[1:3]# вместо 3 поставить 5
  1. Присвоим красивые имена нашим сообществам:
V(net2)$label <- c("ИГН", "Кафедра СиМП", "РНД")# тут будут ваши названия
  1. Меняем цвет и ширину связей:
#Меняем цвет линий для связей между сообществами
E(net2)$edge.color <- "gray80"
# Устанавливаем ширину линии в зависимости от веса:
E(net2)$width <- 1+E(net2)$weigth/12
  1. Создаем график по пересечениям, включающим информацию о размере сообществ.

Комментарии к параметрам в скобках:

  • 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)

Самостоятельная работы

Создать визуализацию по взаимосвязям между своими сообществами.