Выполните сетевой анализ и управляйте сетевыми данными с помощью igraph в R.

Введение

Сетевой анализ - это метод, который использует теорию графов для изучения сложных проблем реального мира, таких как вычислительная биология, инженерия, финансы, маркетинг, нейробиология, политология и общественное здравоохранение (Kolaczyk et al., 2014). В своих предыдущих работах я провел довольно много сетевого анализа в среде Python с помощью NetworkX и node2vec. Однако недавно я наткнулся на книгу Статистический анализ сетевых данных с помощью R (это первая версия, а вторая версия была опубликована в 2020 году), написанную Эриком Д. Колачиком. и Gábor Csárdi, который показал мне много интересных пакетов (например, igraph) в R, которые обеспечивают высококачественный сетевой анализ с точки зрения управления графиками, математического моделирования, статистического моделирования и т. д.

В книге есть список демонстраций кода, который можно найти здесь: https://github.com/kolaczyk/sand.

Этот блог построен на основе главы 2 книги «Управление сетевыми данными», предполагающей, что вы уже поняли основные концепции сетевого анализа, такие как узлы, ребра и т. Д. Однако, если вам нужно исчерпывающее объяснение, я рекомендую вам прочитать книга.

Что вам нужно:

RStudio (или аналогичные IDE) и igraph (пакет R, доступный в CRAN)

Если у вас не установлен «igraph»:

## Download and install the package 
install.packages("igraph") 
## Load package 
library(igraph)

Код

Создавайте неориентированные и направленные графы

Чтобы вручную создать график, можно использовать функцию «graph.formula».

Чтобы сделать создание ориентированных графов более понятным, я предложил сеть аэропортов, состоящую из трех аэропортов: JFK (аэропорт Нью-Йорка), PEK (аэропорт Пекина) и CDG (аэропорт Парижа). Таким образом, созданный мной ориентированный граф можно прочитать: у нас есть только рейсы в одну сторону из JFK в PEK и CDG (предположим, что применяются некоторые ограничения на поездки); PEK и CDG связаны между собой, и летать можно в обе стороны.

Получите основную информацию о графиках

Чтобы сделать блог кратким, остальная часть демонстрации будет сосредоточена только на неориентированных графиках. Для получения дополнительной информации посетите репозиторий книги на GitHub.

Граф, представленный G = (V, E), представляет собой математическую структуру, состоящую из множества V вершин и множества E ребер. Количество вершин и количество ребер в графе иногда называют порядком и размером графа G (Kolaczyk et al., 2014).

Вы можете использовать V (граф) и E (граф) для проверки вершин и ребер; используйте vcount (graph) и ecount (graph), чтобы проверить порядок и размер графика; используйте print_all (graph), чтобы показать сводку графика.

Визуализируйте график

Вы можете использовать команду plot (graph) для визуализации графика:

Обозначьте вершины

Я создал граф, вершины которого были помечены числами от 1 до N. На практике у вас уже могут быть естественные метки, такие как имена. Итак, вот как вы можете пометить свои вершины и как это будет выглядеть:

V(g)$name <-c("Adam","Judy","Bobby","Sam","Frank","Jay","Tom","Jerry")
plot(g)

Представления для графиков

Обычно граф хранится в трех основных форматах: списки смежности, списки ребер и матрица смежности (Kolaczyk et al., 2014).

Список смежности - это набор неупорядоченных списков. Каждый неупорядоченный список описывает набор соседей определенной вершины в графе в списке смежности. Этот формат используется igraph в функции сводки графика.

Список ребер представляет собой таблицу из двух столбцов, в которой перечислены все пары узлов в графе. Этот формат предпочитает NetworkX (в Python).

Записи матрицы смежности показывают, связаны ли две вершины в графе или нет. Если существует связь между двумя узлами, «i и j», индексы столбцов строк (i, j) будут помечены как 1, в противном случае - 0. Следовательно, матрица смежности будет симметричной для неориентированных графов. Статистические модели обычно предпочитают кодировать графы с помощью этого формата, такого как node2vec, который требует в качестве входных данных матрицу смежности.

Вы можете использовать функции get.adjlist (graph), get.edgelist (graph) и get.adjacency (graph), чтобы получить три разных формата соответственно.

Операции с графами

На практике мы можем захотеть удалить определенные ребра или соединить графы, чтобы получить подграфы. В этом случае математические операторы могут помочь вам в достижении цели.

Граф в (1, 1) является исходным графом. Граф в (1, 1) удалил две вершины из исходного графа. Граф в (2, 1) состоит из определенных ребер (ребра были удалены из исходного графа из-за удаления вершин). Граф в (2, 2) является объединенным графом (1, 1) и (2, 1), и он имеет ту же структуру, что и (1, 1).

Использование фреймов данных

В реальных задачах мы редко строим графики вручную. Вместо этого мы должны импортировать данные. Чтобы лучше всего управлять графиками, нам обычно нужно подготовить два файла данных / фреймы данных. Один из файлов должен содержать все атрибуты для каждой вершины графа. Другой файл должен содержать ребра в сети (обычно это список ребер).

В книге автор привел пример датасета адвоката Лазеги. Информация хранится в двух разных файлах: elist.lazega и v.attr.lazega. Исходные данные доступны в библиотеке sand (Статистический анализ сетевых данных). Следовательно, вот как вы читали бы свои собственные данные:

Вывод

В этом блоге я рассмотрел код для создания направленных и неориентированных графиков, визуализации графиков, получения статистики из графиков, маркировки вершин, создания различных форматов представлений, разделения и объединения графиков, а также чтения ваших собственных сетевых данных с помощью igraph .

Связанные чтения

NetworkX: демонстрация кода для управления подграфами

Анализ совместной встречаемости заболеваний с помощью NetworkX, Gephi и Node2Vec

Ссылка

Статистический анализ сетевых данных с помощью R, Эрик Д. Колачик и Чарди Габор, Springer, 2014 г., стр. 13–28.