<-readRDS("kaf_max.rds")
kaf_max<-readRDS("ign_max.rds")
ign_max<-readRDS("rnd_max.rds")
rnd_max<-readRDS("nets.rds")
nets<-nets[[1]]
kaf_graph<-nets[[2]]
ign_graph<-nets[[3]] rnd_graph
Анализ виртуальных сообществ (часть 4 - поиск влиятельных членов сообществ)
Понятие центральности и основные задачи занятия
В ходе анализа социальных сетей одной из важных задач является анализ центральности. Это индивидуальный уровень анализа, когда мы находим показатель для каждого члена сообщества, а потом уже отбираем тех, у кого эти показатели максимальны.
Меры центральности позволяют определить наиболее важные узлы сети: - Наиболее влиятельные (авторитетные) лица, лидеры социальной сети - Ключевые информаторы, распространяющие информацию - Наиболее значимые транспортные узлы - Наиболее важные страницы в сети Интернет (которые читают, на которые ссылаются) - Узлы, которые удерживают сеть в стабильном состоянии, не позволяют ей распасться - Косвенные связи (скрытых участников, непредсказуемых явлений) - Влияние групп вершин на отдельные вершины
Существует огромное количество различных мер центральности, наиболее важными из которых являются следующие:
- Центральность по степени - основывается на выявлении степени (количества соседей узла). Основная идея: важные узлы имеют большее количество связей, соответственно узел, имеющий наибольшее количество связей с другими узлами, является наиболее центральным.
- Центральность посредничества (Betweenness centrality) – определяется по тому, насколько узел лежит на пути между другими узлами в сети. Можно сказать, что узел с наибольшей степенью посредничества может контролировать наибольшее число каналов коммуникации
- Центральность по близости (Closeness centrality) определяется тем, за какое число «шагов» можно дойти от изучаемого узла сети до всех остальных. Т.е. чем выше центральность близости, тем быстрее информация от актора может достичь самый удаленный узел сети.
- Центральность собственного вектора (Eigenvector centrality) вычисляется с учетом того, каков «вес» у узлов, с которыми связан изучаемый узел. Т.е. более «влиятельный» узел тот, который, в свою очередь, связан с другими влиятельными узлами.
- Связующая центральность (Bridging centrality) определяет узлы, которые соединяют плотно связанные области графа (кластеры). Акторы с высокими значениями по этому показателю одновременно важны, как информационные «мосты» между частями сети и, потенциально, могут быть местом возникновения т.н. «бутылочных голышек» и задержек при проведении больших объемов информации / взаимодействий.
В рамках данного занятия мы попытаемся исследовать наши виртуальные сообщества по некоторым параметрам центральности.
Как и на предыдущих этапах анализа, нужно будет:
- свести все показатели центральности в одну таблицу
- найти в каждой группе, кто (какой пользователь, по id, имени) обладает максимальной центральностью
- описать результаты анализа.
Предварительная работа с данными
На прошлом занятии мы создали сетевые объекты по каждому виртуальному сообществу и объединили их в один список - nets
. Дополнительно мы создали второй список, в котором содержится информация только о наиболее значимых связных компонентах внутри каждого сообщества - nets_max
.
Однако, сегодня мы будем работать с индивидуальными графами по каждому сообществу:
Загрузим сохраненные данные
Не забываем загружать библиотеку, с которой мы будем работать:
library(igraph)
Центральность по степени
Первый вид центральности, который мы рассмотрим - степенная центральность, или центральность по степени.
Базовой для данного вида центральности является мера, показывающая количество соседей (узлов, с которыми узел связан на расстоянии в один шаг).
Виды степенной центральности зависят от типа графа:
- ориентированный: вычисляется отдельно по суммам входящих и исходящих связей;
- неориентированный: подсчитывается количество инцидентных ребер (простыми словами - количество соседей)
- взвешенный ненаправленный: может учитываться не только число соседей, но и весов связей (например, интенсивность коммуникации, объем переданной информации и пр.)
- взвешенный направленный: комбинируются оба подхода, так как граф ориентированный, мы можем посчитать сумму входящих и исходящих связей, а если есть информация о характеристиках связей (весах), также включить ее в анализ.
В нашем микро-исследовании сети являются ненаправленными и невзвешенными (самый простой случай). Поэтому у нас будет степень, которая учитывает только количество связей каждого узла с его соседями.
Формула для подсчета степенной центральности:
\[C_{deg}(v)=\frac{d_v}{N-1},\] где:
- \(N\) - количество узлов в сети
- \(d_v\) - степень узла \(v\).
Посчитаем степени центральности для максимальных компонент наших сообществ:
<-degree(kaf_max)/180 #число: количество пользователей минус 1
degree_kaf<-degree(ign_max)/3054
degree_ign<-degree(rnd_max)/511 degree_rnd
Создадим атрибут размера для визуализации степенной центральности:
V(kaf_max)$size <- degree_kaf*10
Сделаем график наиболее центральных узлов:
plot(kaf_max, edge.arrow.size = .5, vertex.label=NA, vertex.color = "gold")
{{< iconify arcticons anz size=42px >}} Самостоятельная работа: сделать аналогичные графики по остальным сообществам.
Посмотрим, какие максимальные значения у нас получились и кто является «носителем этой центральности».
Сохраним значения степенной центральности в отдельную таблицу и упорядочим их по убыванию, посмотрим 6 самых больших значений:
library(dplyr)
<-degree_kaf %>%
degree_kaf_maxas.data.frame() %>%
arrange(desc(degree_kaf)) %>%
round(2) %>%
head()
$id<-row.names(degree_kaf_max) degree_kaf_max
{{< iconify arcticons anz size=42px >}} Самостоятельная работа: посмотреть по остальным сообществам, кто является самым влиятельным по показателю степенной центральности, свести в одну таблицу.
<-degree_ign %>%
degree_ign_maxas.data.frame() %>%
arrange(desc(degree_ign)) %>%
round(2) %>%
head()
$id<-row.names(degree_ign_max)
degree_ign_max<-degree_rnd %>%
degree_rnd_maxas.data.frame() %>%
arrange(desc(degree_rnd)) %>%
round(2) %>%
head()
$id<-row.names(degree_rnd_max)
degree_rnd_max<-cbind(degree_ign_max, degree_kaf_max, degree_rnd_max)
degree_tab degree_tab
. id . id . id
6559 0.26 6559 0.67 85645509 0.50 261759045
377935992 0.23 377935992 0.64 14065837 0.24 66720653
301970275 0.23 301970275 0.60 65446060 0.24 87970076
235264095 0.22 235264095 0.59 17220459 0.24 69944150
96815187 0.22 96815187 0.57 27613920 0.23 47355682
326029232 0.20 326029232 0.56 364775694 0.22 143272462
Центральность посредничества (Betweenness centrality)
Центральность посредничества может быть вычислена как для узла, так и для связи, и определяется как количество коротких путей, проходящих через этот узел или связь. Чем их больше, тем узел важнее.
Формула:
\[c_B(v) =\sum_{s,t \in V} \frac{\sigma(s, t|v)}{\sigma(s, t)},\] где \(V\) - это набор узлов, \(\sigma(s, t)\) количество коротких путей, и \(\sigma(s, t|v)\) - количество коротких путей, проходящих через узел \(V\).
Поскольку нас в большей степени интересуют узлы, посчитаем значения близости по посредничеству по узлам:
library(tibble)
<-betweenness(kaf_max, normalized = T)
bet_kaf<-betweenness(ign_max, normalized = T)
bet_ign<-betweenness(rnd_max, normalized = T)
bet_rnd# создадим функцию для ускорения процесса
<-function(df){
find_max<-df %>%
max_dfas.data.frame() %>%
arrange(desc(.)) %>%
round(2) %>%
rownames_to_column() %>%
head()
}
<-find_max(bet_kaf)
bet_kaf_max<-find_max(bet_ign)
bet_ign_max<-find_max(bet_rnd)
bet_rnd_max
<-cbind(bet_kaf_max, bet_ign_max, bet_rnd_max)
bet_tabcolnames(bet_tab)<-c("id_kaf", "index_kaf", "id_ign", "index_ign", "id_rnd", "index_rnd")
bet_tab
id_kaf index_kaf id_ign index_ign id_rnd index_rnd
1 85645509 0.17 6559 0.05 261759045 0.41
2 27613920 0.09 377935992 0.03 47355682 0.06
3 14065837 0.09 301970275 0.03 144075781 0.05
4 65446060 0.09 235264095 0.02 51981631 0.05
5 17220459 0.09 326029232 0.02 249559977 0.04
6 96947178 0.08 206548101 0.02 69944150 0.04
Центральность по близости
Центральность по близости определяется как обратная величина сумме расстояний до всех других узлов сети:
\[C(u) = \frac{n - 1}{\sum_{v=1}^{n-1} d(v, u)},\] Если между узлами связи нет, она опускается из вычислений, если от какого-то узла невозможно добраться до других узлом, его центральность определяется как неопределяемая (NaN).
При нормализации в знаменателе указывается не сумма, а среднее расстояние.
<-closeness(kaf_max, normalized = T)
clos_kaf<-closeness(ign_max, normalized = T)
clos_ign<-closeness(rnd_max, normalized = T)
clos_rnd
<-find_max(clos_kaf)
clos_kaf_max<-find_max(clos_ign)
clos_ign_max<-find_max(clos_rnd)
clos_rnd_max
<-cbind(clos_kaf_max, clos_ign_max, clos_rnd_max)
close_tabcolnames(close_tab)<-c("id_kaf", "index_kaf", "id_ign", "index_ign", "id_rnd", "index_rnd")
close_tab
id_kaf index_kaf id_ign index_ign id_rnd index_rnd
1 85645509 0.58 6559 0.49 261759045 0.54
2 65446060 0.57 96815187 0.49 144075781 0.47
3 14065837 0.56 377935992 0.48 47355682 0.47
4 17220459 0.56 301970275 0.48 143272462 0.46
5 27613920 0.56 376955131 0.48 416858020 0.45
6 96947178 0.55 326029232 0.48 51981631 0.45
Центральность собственного вектора
<-eigen_centrality(kaf_max)
eigen_kaf<-eigen_centrality(ign_max)
eigen_ign<-eigen_centrality(rnd_max)
eigen_rnd
<-find_max(eigen_kaf$vector)
eigen_kaf_max<-find_max(eigen_ign$vector)
eigen_ign_max<-find_max(eigen_rnd$vector)
eigen_rnd_max
<-cbind(eigen_kaf_max, eigen_ign_max, eigen_rnd_max)
eigen_tabcolnames(eigen_tab)<-c("id_kaf", "index_kaf", "id_ign", "index_ign", "id_rnd", "index_rnd")
eigen_tab
id_kaf index_kaf id_ign index_ign id_rnd index_rnd
1 96947178 1.00 96815187 1.00 87970076 1.00
2 14065837 0.98 301970275 0.98 143272462 0.97
3 364775694 0.96 235264095 0.97 66720653 0.95
4 65446060 0.95 377935992 0.95 47355682 0.89
5 17220459 0.88 326029232 0.94 206253081 0.87
6 85645509 0.88 376955131 0.90 51981631 0.86
Связующая центральность
Точки артикуляции (Articulation points, cut vertices) - это вершины, удаление которых увеличивает количество связных компонентов в графе.
Аналогично, мосты (bridges, cut-edges ) - это ребра, удаление которых увеличивает количество связных компонентов в графе. Если изначально граф был связным, то удаление одной точки сочленения или одного моста делает его неориентированным. Если граф не содержит точек сочленения, то связность его вершин не меньше двух.
head(articulation_points(kaf_graph))
+ 6/206 vertices, named, from aa8bc8d:
[1] 201184242 246371541 403216202 260129730 351053946 364775694
head(articulation_points(ign_graph))
+ 6/3377 vertices, named, from b44c367:
[1] 161966937 181361191 264834807 229457959 200325107 200474466
head(articulation_points(rnd_graph))
+ 6/677 vertices, named, from b4cc031:
[1] 6655123 16022877 29712648 13503523 294655490 153392949
Хабы и авторитеты
<-hub_score(kaf_graph, scale=TRUE)$vector
hubs_kaf<-find_max(hubs_kaf) hubs_kaf_max
Самостоятельная работа
- Провести анализ по своим сообществам, свести результаты в таблицы.
- Определить по разным метрикам, кто повторяется, определить лидеров в каждом сообществе.
- Сделать описание результатов