Анализ графов с использованием «tidyverse»
2019-03-06
by Edgar Ruiz
Хоть я и не эксперт по анализу графов, но я подумал,
что очень важно все же написать эту статью. Для тех, кто разбирается в терминах
отдельных прямоугольных массивов данных, это что-то вроде «интеллектуального
скачка» для понимания того, как правильно применять принципы функции tidy
к более сложному объекту, такому, например, как таблица. К счастью, есть два
пакета, которые значительно облегчают эту работу:
- tidygraph
- предоставляет способ взаимодействия dplyr с графами.
- ggraph
- расширение до ggplot2
для анализа графов.
Краткое введение
Проще говоря, теория графов изучает связи между
объектами в группе. Визуально мы можем представить граф как серию
взаимосвязанных точек, каждая из которых представляет участника группы,
например, людей в социальной сети. Линии, нарисованные между точками,
представляют связь между участниками, например, дружбу в социальной сети.
Анализ графов помогает выявить такие вещи, как влияние определенного
участника на остальных, или то, у кого больше друзей из двух участников группы.
Более правильное определение и подробное объяснение теории графов можно найти в
Википедии здесь.
Пример
На примере этой статьи будут показаны концепции работы
по анализу графов, а также то, как для такого анализа могут использоваться смежные
инструменты tidyverse.
Источник данных
Еженедельный проект «Tidytuesday»
призывает как новичков, так и опытных пользователей использовать инструменты tidyverse для анализа наборов данных, которые меняются каждую
неделю. Я использовал эту возможность для освоения новых инструментов и методов.
Один из самых свежих наборов данных касается французских поездов; он содержит количество
ежедневных поездок от станции до станции.
library(readr)
url <-
"https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2019/2019-02-26/small_trains.csv"
small_trains <- read_csv(url)
head(small_trains)
# A tibble: 6 x 13
year month
service departure_stati~ arrival_station journey_time_avg total_num_trips
avg_delay_all_d~ avg_delay_all_a~ num_late_at_dep~
<dbl>
<dbl> <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
1 2017 9 Nation~ PARIS EST METZ 85.1 299 0.752 0.420 15
2 2017 9 Nation~ REIMS PARIS EST 47.1 218 1.26 1.14 10
3 2017 9 Nation~ PARIS EST STRASBOURG 116. 333 1.14 1.59 20
4 2017 9 Nation~ PARIS LYON AVIGNON TGV 161. 481 1.41 4.79 36
5 2017 9 Nation~ PARIS LYON BELLEGARDE (AI~ 164. 190 1.73 6.01 16
6 2017 9 Nation~ PARIS LYON BESANCON FRANC~ 129. 191 1.84 5.03 18
# ... with 3 more variables: num_arriving_late <dbl>,
delay_cause <chr>, delayed_number <dbl>
Подготовка данных
Хоть это изначально и предназначалось для анализа
задержек поездов, я подумал, что было бы интересно использовать данные, для
того чтобы понять, как станции соединены друг с другом. Создается новый сводный
набор данных, называемый маршрутами, в котором каждая станция
содержится лишь один раз. Он также включает в себя среднее время в пути,
необходимое для того чтобы доехать от одной станции до другой.