Вы когда-нибудь пробовали решать задачи с помощью визуализации? Предлагаем решить занимательную задачу на языке R.
Нобелевские премии (до 1969 года всего их было пять, а затем добавилась шестая) присуждаются ежегодно фондом, учрежденным шведским изобретателем и промышленным магнатом Альфредом Нобелем. Во всем мире Нобелевская премия считается самой престижной наградой за интеллектуальные достижения.
Подбираем данные
Нужный нам набор данных можно скачать с kaggle.
Мы постараемся визуализировать изменение возраста лауреатов премии во времени.
Мы видим, что до 1950 года средний возраст лауреатов держался почти на одной отметке. Затем он стал стабильно увеличиваться почти на 8 лет.
Для выполнения операций мы воспользуемся библиотекой tidyverse. Tidyverse — это очень полезная библиотека для загрузки таких важных пакетов, как dplyr, ggplot2, dbplyr, lubridate, readxl, readr, tidyr и др.
tidyverse — это набор пакетов, слаженная работа которых возможна благодаря общим представлениям данных и единому дизайну API. Этот пакет придумали, чтобы «уместить» установку и загрузку нескольких пакетов tidyverse в один этап.
Функция read.csv считывает данные из CSV-файла и сохраняет их в переменной в виде пакета данных. У нас он называется nobel.
Функция mutate добавляет новые переменные и сохраняет уже существующие в пакеты данных. В нашем случае mutate добавляет в пакет данных новый столбец под названием age (возраст).
age рассчитывается через функцию as.Date, которая преобразует представления символов в объекты класса Date (даты в календаре).
И, наконец, ggplot используется для диаграммы рассеивания. Эта диаграмма строится путем размещения переменной year на оси Х и age на оси У. Для построения точек используется geom_point. Мы можем задать размер каждой точки. В нашем примере size (размер) равен 3, а alpha (альфа) — 0,5. Эти показателизададут непрозрачность (прозрачность) точек и помогут быстрее обнаружить области их наложения.
#Загрузка необходимых библиотек
library(tidyverse)
nobel <- read.csv("nobel.csv")
nobel_age <- nobel %>%
mutate(age = year - year(as.Date(birth_date)))
ggplot(nobel_age,aes(x=year,y=age)) + geom_point(size = 3, alpha = 0.5,color = "black") + geom_smooth(aes(fill = "red")) + xlab("Year of Nobel Prize Distribution") + ylab("Age while Receiving the Prize")
Исследуем данные
Есть одна проблема. Как мы видим, на диаграмме представлено слишком мало информации. А при визуализации данных их форма и цвет играют ту же роль, что и сахар в приготовлении леденцов.
На диаграмме ниже мы видим, что в трех категориях Chemistry (Химия), Medicine (Медицина) и Physics (Физика) прослеживаются схожие тенденции — средний возраст получения премии с годами увеличивается. Наибольшее отклонение отмечается в категории «Физика». Единственная категория, демонстрирующая снижение среднего возраста во времени, — это Peace (Премия мира). Значения в категориях Economics (Экономика) и Literature (Литература) почти не менялись.
Еще одно важное наблюдение: большой разброс точек в категории «Премия мира» говорит о том, что было много таких Нобелевских лауреатов, возраст которых сильно отличается от среднего значения.
Так в каком же возрасте вы бы смогли получить Нобелевскую премию в различных категориях?
- Химия, возраст= 70 | Наиболее вероятно: (возраст > 70)
- Экономика, возраст = 69 | Наиболее вероятно: (67 < возраст < 71)
- Литература, возраст = 70 | Наиболее вероятно: (67 < возраст < 75)
- Медицина, возраст = 68 | Наиболее вероятно: (возраст > 52)
- Премия мира, возраст = 55| Наиболее вероятно: (возраст < 65)
- Физика, возраст = 69| Наиболее вероятно: (возраст > 66)
Давайте разберемся с кодом, который помог нам получить эти результаты. Мы загрузили ту же библиотеку, что и ранее в статье.
facet_wrap — оборачивает первую последовательность панелей во вторую. Это куда лучшее использование экранного пространства, чем facet_grid(), поскольку большинство представлений имеют прямоугольную форму.
ggplotly — преобразует ggplot2 в plotly. Данная функция конвертирует объект ggplot2::ggplot() в объект plotly.
Так что же в итоге делает этот код?
Диаграмма создавалась с использованием функции ggplot. Вкачестве данных рассматривался измененный пакет данных nobel_age. По осям Х и У располагались соответственно год и возраст. geom_point использовался для отрисовки диаграммы рассеивания, а geom_smoothискал закономерности в наложении точек одного цвета/заливки друг на друга.
Цвета и заливка задавались в переменной category. Так разные категории на диаграмме были окрашены в разные цвета. Например, если бы нам нужно было нарисовать диаграмму для магазина шоколада и отобразить там три категории («молочный шоколад», «белый шоколад» и «темный шоколад»), то этот метод разметил бы категории разными цветами, и мы бы смогли легче интерпретировать результаты.
facet_wrap в нашем примере отвечает за отрисовку каждого подокна категории. Так мы получаем шесть разных подокон, разделенных по категориям.
#Загрузка нужных библиотек
library(tidyverse)
library(plotly)
nobel <- read.csv("nobel.csv")
nobel_age <- nobel %>%
mutate(age = year - year(as.Date(birth_date)))
p <- ggplot(nobel_age,aes(x=year,y=age)) +
geom_point() +
geom_smooth(aes(colour = category, fill = category)) +
facet_wrap(~ category)
ggplotly(p)
Перевод статьи Satyam Singh Chauhan: At what age will you win the Nobel Prize? Let’s Visualize using R.