вторник, 29 марта 2016 г.

Работа с графами в R

Мы уже писали о том, как готовить описательную статистику для социальных сетей в Python, а в этом посте расскажем о том, как посчитать показатели в статистической среде R.
Работать с графами в R можно во множестве пакетов (например, igraphsnastatnetRSiena), однако для вычисления описательной статистики чаще используют igraph.

Igraph_post-Copy1
In [ ]:
# В этом посте мы будем работать с данными о дружбе
# сотрудников одного из университетов Великобритании.
# Этот набор данных часто используется для отладки алгоритмов
# по выявлению сообществ.
# Данные об этой социальной сети можно получить в пакете igraphdata.
# Поэтому загружаем сразу 2 пакета: igraph и igraphdata.
library(igraph)
library(igraphdata)
In [ ]:
# Загрузим наши данные и посмотрим на их описание.
data(UKfaculty)
?UKfaculty
In [ ]:
# Для начала посмотрим, сколько в нашей социальной сети вершин
vcount(UKfaculty)
# и ребер
ecount(UKfaculty)
Out[ ]:
81
Out[ ]:
817
In [ ]:
# Теперь рассмотрим базовые макропараметры социальной сети:
# плотность, взаимность, транзитивность.
In [ ]:
# Вычислим плотность сети
graph.density(UKfaculty)
# Значение плотности невелико,
#  но все равно достаточно большое для социальной сети
Out[ ]:
0.12608024691358
In [ ]:
# Взаимность
reciprocity(UKfaculty)
#Связи в большинстве своем оказываются взаимными,
# как обычно и случается со связями дружбы
Out[ ]:
0.587515299877601
In [ ]:
# Транзитивность
transitivity(UKfaculty) 
# Друг моего друга -- мой друг и в английском университете.
Out[ ]:
0.473408385093168
In [ ]:
# После того, как мы вычислили макропараметры для социальной сети,
# вычислим значения микропараметров - центральностей!
In [ ]:
# Посмотрим на распределение активности
# (исходящей степени центральности, или outdegree).
# Иными словами, посмотрим, какое количество друзей
# называют сотрудники университета.
V(UKfaculty)$outdegree <- degree(UKfaculty, mode = "out")

#Строим распределение центральностей
plot(density(V(UKfaculty)$outdegree),
     main = "Outdegree distribution", 
     xlab="Ourdegree",
     ylab="Frequency")

# Распределение центральностей немногим похоже на степенной закон:
# Достаточно малое количество сотрудников
# называют очень большое количество друзей

Igraph_post-Copy2
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)

Комментариев нет:

Отправить комментарий