Мы уже писали о том, как готовить описательную статистику для социальных сетей в Python, а в этом посте расскажем о том, как посчитать показатели в статистической среде R.
Работать с графами в R можно во множестве пакетов (например, igraph, sna, statnet, RSiena), однако для вычисления описательной статистики чаще используют igraph.
In [ ]:
# В этом посте мы будем работать с данными о дружбе
# сотрудников одного из университетов Великобритании.
# Этот набор данных часто используется для отладки алгоритмов
# по выявлению сообществ.
# Данные об этой социальной сети можно получить в пакете igraphdata.
# Поэтому загружаем сразу 2 пакета: igraph и igraphdata.
library(igraph)
library(igraphdata)
In [ ]:
# Загрузим наши данные и посмотрим на их описание.
data(UKfaculty)
?UKfaculty
In [ ]:
# Для начала посмотрим, сколько в нашей социальной сети вершин
vcount(UKfaculty)
# и ребер
ecount(UKfaculty)
Out[ ]:
Out[ ]:
In [ ]:
# Теперь рассмотрим базовые макропараметры социальной сети:
# плотность, взаимность, транзитивность.
In [ ]:
# Вычислим плотность сети
graph.density(UKfaculty)
# Значение плотности невелико,
# но все равно достаточно большое для социальной сети
Out[ ]:
In [ ]:
# Взаимность
reciprocity(UKfaculty)
#Связи в большинстве своем оказываются взаимными,
# как обычно и случается со связями дружбы
Out[ ]:
In [ ]:
# Транзитивность
transitivity(UKfaculty)
# Друг моего друга -- мой друг и в английском университете.
Out[ ]:
In [ ]:
# После того, как мы вычислили макропараметры для социальной сети,
# вычислим значения микропараметров - центральностей!
In [ ]:
# Посмотрим на распределение активности
# (исходящей степени центральности, или outdegree).
# Иными словами, посмотрим, какое количество друзей
# называют сотрудники университета.
V(UKfaculty)$outdegree <- degree(UKfaculty, mode = "out")
#Строим распределение центральностей
plot(density(V(UKfaculty)$outdegree),
main = "Outdegree distribution",
xlab="Ourdegree",
ylab="Frequency")
# Распределение центральностей немногим похоже на степенной закон:
# Достаточно малое количество сотрудников
# называют очень большое количество друзей
In [ ]:
# По аналогии рассматриваем популярность (входящая центральность, или indegree).
V(UKfaculty)$indegree<-degree(UKfaculty, mode = "in")
plot(density(V(UKfaculty)$indegree),
main = "Indegree distribution",
xlab="Indegree",
ylab="Frequency")
# Полученное распределение центральностей напоминает нормальное распределение.
# В этой сети есть небольшое количество очень популярных и совсем не популярных акторов.
In [ ]:
# Мы также можем рассчитать для каждой из вершин степени близости и посредничества
# Близость
V(UKfaculty)$clo<-closeness(UKfaculty)
# Посредничество
V(UKfaculty)$bet <- betweenness(UKfaculty)
In [ ]:
# После расчета базовых характеристик социальной сети сделаем простую визуализацию.
set.seed(42)
# Выбираем алгоритм для ракладки графа (Kamada-Kawai)
l <- layout.kamada.kawai(UKfaculty)
# Вершины сети будут в форме круга
V(UKfaculty)$shape <- "circle"
# Задаем цвета вершин и ребер между ними.
# Раскрасим вершины в цвета групп, к которым приписаны сотрудники университета.
col <- c("blue", "red", "gold", "green")
V(UKfaculty)$color <- col [V(UKfaculty)$Group]
E(UKfaculty)$color <- "black"
# Уменьшим размеры и толщину стрелок ребер.
E(UKfaculty)$arrow.size <- 0.1
E(UKfaculty)$arrow.width <- 0.3
# Размер вершины пропорционален ее степени центральности.
# Берем квадратный корень из степени центральности.
V(UKfaculty)$size <- sqrt(graph.strength(UKfaculty))
# Визуализируем нашу сеть.
plot(UKfaculty, layout=l)
Комментариев нет:
Отправить комментарий