Грамматика Data Science: Python vs R

Некоторые data scientist’ы пользуются языком Python, другие — отдают предпочтение R.

Фанаты «питона» зачастую применяют библиотеки Pandas и Seaborn в то время, как поклонники R предпочитают пакеты dplyr и ggplot2.

Какой из этих языков более эффективен для решения задач обработки и визуализации данных? Однозначного ответа на этот вопрос нет.

В сегодняшней статье мы приведем подробное сравнение решений некоторых простых задач, реализованных на Python и R.

Вселенная Хэдли Уикхэма

Итак, в качестве примера возьмем набор данных, который поставляется вместе с библиотекой ggplot2. Он содержит характеристики 50 000 бриллиантов: масса (carat size), качество огранки (cut), чистота (clarity), глубина павильона (depth), диаметр площадка (table), цена и пространственные параметры. Ниже представлены первые пять строк данных:

Нас могут интересовать некоторые вопросы, связанные с этими данными. Как цена бриллианта зависит от массы? Как на эту зависимость влияют категорийные переменные, такие как качество огранки, цвет или чистота? На эти вопросы можно ответить посредством быстрой визуализации с помощью функции ggplot, написав всего пять строк кода:

Операция %>% представляет собой конвейер, который просто передает результат левой операции в качестве первого аргумента для правой операции. Посредством функции отображения (функция aes) мы сообщаем ggplot, что независимая переменная X – это масса, а зависимая переменная Y – цена.

Следующий графический слой (функция geom_point) говорит о том, что мы хотим представить каждый элемент данных в виде точки, чтобы в результате получить диаграмму рассеяния (scatter plot).

Затем с помощью функции facet_grid создаем отдельные диаграммы рассеяния для каждого значения переменной «качество огранки». Мы бы также могли получить отдельные диаграммы рассеяния для значений переменной «цвет» или «чистота».

Далее применяется линейная модель второго порядка (функция stat_smooth) и строится приближенная кривая, отображаемая поверх диаграммы рассеяния. Как видим, язык описания визуализации интуитивно понятен, а результаты прекрасны.

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

«Трудности перевода» на Python

Как мы можем решить ту же задачу на Python? Используя библиотеку Seaborn, можно реализовать это с помощью функции lmplot, которая обеспечивает значительно менее впечатляющую визуализацию.

Основная проблема заключается в том, что масштаб оси Y определяет приближенная кривая, а не фактические данные. В результате, фактические данные отображаются в уменьшенном масштабе! Вряд ли бы Эдвард Тафти одобрил нечто подобное…

При использовании R функция ggplot автоматически решает эту проблему, благодаря чему вы получаете эффективную визуализацию без дополнительных усилий.

Кроме того, писать код на R значительно легче, чем на Python, ведь он состоит из комбинации простых и легко запоминающихся элементов, а читается как англоязычный текст.

По сравнению с Python, R значительно уменьшает когнитивную нагрузку при исследовании данных с целью быстрой проверки гипотез. В защиту Seaborn можно сказать, что эта библиотека обеспечивает более простой API и более элегантную визуализацию, чем библиотека Matplotlib. Кроме того, Seaborn моложе ggplot2, а это означает, что у нее было меньше времени на совершенствование.

Звучит неубедительно? dplyr взорвет ваш мозг

Давайте рассмотрим другой пример, где в игру вступает библиотека dplyr. Предположим, нас интересует, как взаимосвязаны друг с другом качество огранки, цена, масса и объем (volume) (признак, производный от имеющихся данных) бриллиантов.

На R с помощью функции ggpairs мы можем создать простую визуализацию, которая поможет нам быстро ответить на этот вопрос. Сначала необходимо создать признак «объем», затем  выбрать интересующие нас переменные и сделать выборку данных, чтобы избежать наложения (overplotting). Ниже представлен код на R, реализующий описанные действия:

И снова код читается, как текст на английском. Функции mutate, select и sample_frac (глаголы!) являются частью библиотеки для обработки данных dplyr, овладеть которой можно очень легко и быстро.

Все, что для этого понадобилось, – вот эта удобная шпаргалка.

Ниже представлены результаты визуализации:

Функция ggpairs интеллектуально визуализирует взаимосвязи между переменными. Мы видим диаграммы рассеяния для случая взаимосвязи двух непрерывных переменных (например, взаимосвязь объема и массы) или сгруппированные гистограммы для случая взаимосвязи непрерывной переменной и категорийной переменной (например, взаимосвязь объема и качества огранки).

В ячейках, расположенных по диагонали, изображены ядерные оценки плотности распределения (kernel density estimates) для непрерывных переменных (например, распределение объема в правом нижнем углу) и гистограмма для категорийной переменной (распределение качества огранки в левом верхнем углу).

В трех ячейках справа мы видим коэффициенты корреляции для случаев взаимосвязи двух непрерывных переменных (например, корреляция между объемом и массой составляет 0,996).

В трех верхних ячейках изображены сгруппированные диаграммы типа «ящик с усами» (boxplot) для случаев взаимосвязи непрерывной переменной и категорийной переменной (например, взаимосвязь объема и качества огранки).

Благодаря столь информативной визуализации, мы можем узнать очень многое о ковариационной структуре наших данных, но при этом нам пришлось написать всего несколько строк кода!

Python снова отстает

Эквивалентный код на Python не читается, как текст на английском, и его очень неудобно писать.

Результат также намного менее впечатляющий и информативный.

Здесь есть серьезные проблемы. Во-первых, функция pairplot библиотеки Seaborn не смогла создать диаграммы с участием переменной «качество огранки», потому что не знала, как сопоставить эту переменную с непрерывными переменными. Эта функция может строить диаграммы только для случаев взаимосвязи двух непрерывных переменных.

Во-вторых, три диаграммы являются избыточными (например, диаграмма в правом верхнем углу идентична диаграмме в левом нижнем углу).

При использовании R избыточные диаграммы заменяются коэффициентами корреляции или сгруппированными «ящиками с усами», что дает дополнительную информацию.

В-третьих, используя Seaborn, трудно управлять внешним видом диаграмм, поэтому значения цены, расположенные в качестве меток под осью X, накладываются друг на друга.

И снова следует отметить, что при работе с ggplot2 + dplyr код легче читается, легче пишется, имеет интуитивно понятную структуру и обеспечивает информативную визуализацию.

Оба языка имеют свои преимущества

Следует сказать, что R также имеет некоторые существенные недостатки по сравнению с Python. Серьезные затруднения вызывает автоматизация рабочего процесса и создание повторно используемого кода. Так что идеальная стратегия – брать лучшее из обоих миров: реализовывать анализ данных на ранних этапах с помощью R, а потом переходить на Python, когда приходит время работать в команде и создавать реальные программные продукты.

Важно! Майкл Воском (Michael Waskom), разработчик Seaborn, отметил, что можно легко усечь диаграммы, представленные на втором рисунке в этой статье, передав функции lmplot параметр truncate = True.

В основу статьи легли материалы Stitch Fix

Добавить комментарий

Ваш адрес email не будет опубликован.

закрыть

Поделиться

Отправить на почту
закрыть

Вход

закрыть

Регистрация

+ =