В каком возрасте вы получите Нобелевскую премию — визуализация на языке R.

R

Вы когда-нибудь пробовали решать задачи с помощью визуализации? Предлагаем решить занимательную задачу на языке 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)

Специально для сайта ITWORLD.UZ. Новость взята с сайта NOP::Nuances of programming