30 мар. 2011 г.

Сеть сексуальных контактов героев телесериала

Всё началось с вводной презентации об анализе социальных сетей для группы студентов-медиков. Что могло бы быть для них более захватывающим, если не разговор о привлекательных персонажах телевизионного сериала о жизни врачей? Эти персонажи по законам жанра не только говорят о медицине, но и влюбляются друг в друга, а потом, конечно, занимаются друг с другом сексом.

Просмотр сериала Grey’s Anatomy и изучение страниц поклонников сериала дали обширный, но, безусловно, отнюдь не исчерпывающий список связывающих персонажи этого шоу сексуальных контактов, который можно скачать http://www.babelgraph.org/data/ga_edgelist.csv.



library(igraph)
ga.data <- read.csv('ga_edgelist.csv', header=TRUE)

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

g <- graph.data.frame(ga.data, directed=FALSE)
список связей преобразуется в нужный библиотеке igraph формат;

summary(g)
g$layout <- layout.fruchterman.reingold(g)

в атрибуты графа записывается информация о координатах узлов на будущих рисунках этого графа; эти координаты рассчитываются по алгоритму Fruchterman'а и Reingold'a. При всех последующих операциях взаимное расположение узлов на рисунке не будет меняться, что удобно для презентаций (библиотеки network и sna при каждой визуализации меняют рисунок).

plot(g)


Что мы можем сказать, глядя на рисунок, но не зная, кто именно изображён каждым узлом графа? С точки зрения общественного здоровья, если бы можно было протестировать только одного человека на наличие ИППП, кто им бы был? Если можно было бы предоставить консультацию и дать бесплатные презервативы только одному человеку, кто им бы был? Если бы было известно, что эпидемия распространяется в этой сети, то кто на кого именно нужно подействовать, чтобы остановить заразу?

Попробуем сделать визуализацию более интересной. Сначала уберём метки узлов, а затем изменим их размер так, чтобы он отражал степень центральности (degree centrality), т. е. число партнёров, связанных с каждым узлом. В контексте инфекций, передаваемых половым путём степень центральности будет обозначать количество людей, которые могли заразить данного конкретного человека или заразиться сами от него.

V(g)$label <- NA
удаляются метки узлов;

V(g)$size <- degree(g) * 2
plot(g)

переменным «размер узла» присваиваются значения соответствующей степени центральности, умноженные на 2.


Полученная схема показывает абсолютное число партнёров, но ничего не говорит об относительных позициях каждого узла в сети. Рассмотрим два типа центральности: близость (closeness) и посредничество (betweenness).

Близость — это усреднённый самый короткий путь от данного узла к любому другому узлу на графе. Большое значение близости свидетельствует, что данный узел легко достижим, если идти от большинства других узлов на графе, тогда как малое значение указывает на удалённость узла от большинства других узлов. Мы можем рассчитать центральность и затем преобразовать значения в цветовую схему для визуализации найденных различий:

clo <- closeness(g)
в вектор clo записываются значения «близости» каждого из узлов;

clo.score <- round( (clo-min(clo))*length(clo)/max(clo))+1

clo.colors <- rev(heat.colors(max(clo.score)))
создаётся вектор с перечнем цветов, в которые будут потом раскрашиваться узлы;

V(g)$color <- clo.colors[clo.score]
создаётся вектор атрибутов узла с именем color и этим атрибутам присваиваются значения цветов в зависимости от рассчитанных выше значений «близости»;

plot(g)


Как видно, на схеме есть как несколько узлов, окрашенных в красные, «горячие» тона, так и несколько в «холодных» тонах.

Далее мы сделаем то же самое, чтобы рассчитать показатель посредничества для каждого узла.

Посредничество — это число кратчайших путей в сети, проходящих через данный узел. Узлы с высоким показателем посредничества могут считаться привратниками — они контролируют самые короткие пути между другими узлами.

btw <- betweenness(g)
btw.score <- round(btw) + 1
btw.colors <- rev(heat.colors(max(btw.score)))
V(g)$color <- btw.colors[ btw.score ]
plot(g)



Этот рисунок с указанием посредничества демонстрирует две ключевых фигуры в сети, по сравнению с анализом показателей близости.

Полезной техникой в анализе социальных сетей является использование алгоритмов нахождения сообществ. Тут мы воспользуемся алгоритмом Гирвана-Ньюмена (Girvan-Newman algorithm, http://en.wikipedia.org/wiki/Girvan%E2%80%93Newman_algorithm и http://www.pnas.org/content/99/12/7821), который нам поможет установить, из каких сообществ состоит граф.

gnc <- edge.betweenness.community(g, directed=FALSE)
m <- vector()
for (s in 0:nrow(gnc$merges) ) {
memb <- community.to.membership(g,gnc$merge,steps=s)$membership
m <- c(m,modularity (g, memb, weights=NULL))
}
ideal_steps <- which(m==max(m)) - 1
plot(0:(length(m)-1),m, col="blue",xlab="Steps",ylab="Modularity")
gn.groups <- community.to.membership(g,gnc$merge, steps=ideal_steps)$membership
V(g)$color <- gn.groups
V(g)$size <- 15 # reset to default size
plot(g)




Сокращённый перевод материала: gary. Grey’s Anatomy Network of Sexual Relations [Электронный ресурс]. — Режим доступа: http://www.babelgraph.org/wp/?p=1

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