R против Python для анализа данных [закрыто]

60

Я программирую около года, и я действительно заинтересован в анализе данных и машинном обучении. Я принимаю участие в нескольких онлайн-курсах и читаю несколько книг.

Все, что я делаю, использует либо R, либо Python, и я ищу предложения о том, должен ли я концентрироваться на одном языке (и если да, то на каком) или продолжать с обоими; они дополняют друг друга?

- Я должен отметить, что я использую C # в школе, но знаком с Python через самообучение.

The_Cthulhu_Kid
источник
Вот, возможно, интересная ссылка: coursera.org/course/compdata
Джорджио

Ответы:

39

Я использую оба языка Python (для анализа данных, в том числе Numpy и Scipy) и R рядом друг с другом. Однако я использую R исключительно для анализа данных, а Python - для более общих задач программирования (например, управление рабочим процессом компьютерной модели).

С точки зрения базовых операций, скажем, операций над массивами и сортировкой, R и Python + numpy очень сопоставимы. Именно в очень большой библиотеке статистических функций R имеет преимущество. Кроме того, matplotlib, похоже, не так хорош, как ggplot2, но я не так часто использовал matplotlib. Кроме того, я бы сосредоточился сначала на одном языке и стал хорошо разбираться в особенностях этого. Вы, кажется, в основном заинтересованы в анализе данных, а не в разработке программного обеспечения. Я бы выбрал R и придерживался этого. Тем не менее, я думаю, что выбор для Python + numpy + scipy + scikit определенно и отличный выбор, просто я чувствую, что R чуть лучше.

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

Отказ от ответственности: обратите внимание, что я являюсь активным пользователем R, поэтому мое мнение может быть предвзятым, хотя я старался, чтобы мой ответ был максимально объективным. Кроме того, я не использовал Python + numpy широко, хотя я знаю коллег, которые проводят весь анализ данных в нем.

PS: эта ссылка может быть интересной: http://seanjtaylor.com/post/39573264781/the-statistics-software-signal

pps: или эта цитата из этого поста :

Я использую R и Python для всех своих исследований (с Rcpp или Cython по мере необходимости), но я бы предпочел избегать написания на C или C ++, если смогу избежать этого. R - замечательный язык, во многом из-за невероятного сообщества пользователей. Он был создан статистиками, что означает, что анализ данных лежит в основе языка; Я считаю, что это главная особенность языка и серьезная причина, по которой он не будет заменен в ближайшее время. Python в целом является лучшим языком, особенно если учесть его сочетание функционального программирования с объектной ориентацией. В сочетании с Scipy / Numpy, Pandas и statsmodels, это обеспечивает мощную комбинацию. Но Python все еще не хватает серьезного сообщества статистиков / математиков.

Пол Химстра
источник
3
Сказать , что R сильнее , чем Python, вы имеете в виду Python + Numpy / взрывную + SciPy или простой Python?
9000
5
Я имею в виду Python + NumPy да, в противном случае выбор будет еще проще. Я думаю, что с точки зрения базовых операций, скажем, операций над массивами и сортировкой, R и Python + numpy очень сопоставимы. Именно в очень большой библиотеке статистических функций R имеет преимущество. Кроме того, matplotlib, похоже, не так хорош, как ggplot2, но я не так часто использовал matplotlib.
Пол Химстра
Тем не менее, я думаю, что выбор для Python + numpy + scipy + scikit определенно и отличный выбор, просто я чувствую, что R чуть лучше.
Пол Химстра
@PaulHiemstra - Вы делаете несколько хороших замечаний в своих комментариях, которые, вероятно, улучшат ваш ответ - если вопрос будет вновь открыт, и у вас есть такая возможность.
PSR
@psr Я редактировал в своих комментариях, очевидно, нет необходимости открывать вопрос, если я хочу его редактировать (возможно, только я могу редактировать его ...).
Пол Химстра
36

Справочная информация: я специалист по данным в стартапе в Остине, и я учусь в аспирантуре (физика). Я использую Python для анализа данных, но немного использую R. Я также использую C # / .NET и Java (почти ежедневно), я интенсивно использовал C ++ в аспирантуре.

Я думаю, что главная проблема с использованием Python для чисел (более R) - размер сообщества пользователей. Поскольку язык существует вечно, многие люди делают то, что вы, вероятно, захотите делать. Это означает, что, столкнувшись с трудной проблемой, вы можете просто скачать пакет и приступить к работе. И R «просто работает»: вы даете ему набор данных, и он знает, какие сводные статистические данные полезны. Вы даете ему некоторые результаты, и он знает, какие участки вы хотите. Все общие сюжеты, которые вы хотели бы сделать, есть, даже некоторые довольно эзотерические, которые вам придется посмотреть в Википедии. Как хорошо, как scipy / numpy / pandas / statsmodels / и т. Д. для Python, они не на уровне стандартной библиотеки R.

Основное преимущество Python перед R состоит в том, что это настоящий язык программирования в семействе C. Он легко масштабируется, поэтому вполне возможно, что все, что у вас есть в песочнице, может быть использовано в производстве. В Python встроена объектная ориентация, в отличие от R, где он ощущается как запоздалая мысль (потому что это так). Есть и другие вещи, которые Python делает хорошо: многопоточность и параллельная обработка довольно просты, и я не уверен, так ли это в R. А изучение Python также дает вам мощный инструмент написания сценариев. Есть также действительно хорошие (бесплатные) IDE для Python, гораздо лучшие, если вы готовы заплатить (менее 100 долларов), и я не уверен, что это относится к R - единственная R IDE, о которой я знаю, это R Studio, которая довольно хороша, но не так хороша, как PyDev + Eclipse, по моему опыту.

Я добавлю это как кикер: поскольку вы еще учитесь в школе, вы должны подумать о работе. Вы найдете больше вакансий для высококвалифицированных разработчиков Python, чем для высококвалифицированных разработчиков R. В Остине рабочие места для разработчиков Django как бы падают с неба. Если вы действительно хорошо знаете R, есть несколько мест, где вы сможете использовать этот навык (например, Revolution Analytics), но многие магазины, похоже, используют Python. Даже в области анализа данных / науки о данных все больше людей обращаются к Python.

И не стоит недооценивать, что вы можете работать с / для людей, которые знают (скажем) только Java. Эти люди смогут легко прочитать ваш код на Python. Это не обязательно будет иметь место, если вы выполняете всю свою работу в R. (Это происходит из опыта.)

Наконец, это может звучать поверхностно, но я думаю, что документация Python и соглашения об именах (которые, как оказалось, неукоснительно соблюдаются) намного приятнее, чем утилитарный R doc. Это будет горячо обсуждаться, я уверен, но акцент в Python - читабельность. Это означает, что аргументы функций Python имеют имена, которые вы можете прочитать, и это что-то значит. В R имена аргументов часто усекаются - я нашел это менее верным в Python. Это может звучать педантично, но это сводит меня с ума, когда я пишу такие вещи, как 'xlab', когда вы можете так же легко назвать аргумент 'x_label' (только один пример) - это имеет огромный эффект, когда вы пытаетесь выучить новый модуль / пакет API. Чтение R doc - это то же самое, что читать справочные страницы по Linux - если это то, что плывет на вашей лодке, тогда вам больше сил.

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

  1. Написать сценарии на R и запустить их из Python с помощью модуля подпроцесса, или
  2. Установите модуль RPy.

Используйте Python для того, в чем Python хорош, и заполните пробелы одним из перечисленных выше. Это мой обычный рабочий процесс - я обычно использую R для построения графиков, а Python для тяжелой работы.

Итак, подведем итог: из-за того, что Python делает упор на удобочитаемость (поиск в «Pythonic»), наличие хороших бесплатных IDE, тот факт, что он входит в семейство языков C, вы получаете большую выгоду набор навыков и всеохватывающий стиль документации этого языка, я бы посоветовал сделать Python идеальным вариантом и полагаться на R только в случае необходимости.


Хорошо, это (безусловно) мой самый популярный ответ на стек-сайте, и он даже не № 1 :) Я надеюсь, что это помогло нескольким людям на этом пути.

Во всяком случае, я пришел к следующему выводу после нескольких лет в этой области:

Возможно, это неправильный вопрос.

Задавать вопрос «Должен ли я изучить эту технологию» - плохой вопрос. Почему?

  1. Технологические изменения. Вам всегда придется изучать другую технологию. Если вы работаете в Twitter, они запускают Scala. В некоторых местах есть магазины Python. В некоторых местах все равно. Вас не будут нанимать, потому что вы знаете или не знаете какую-то конкретную технологию - если вы не можете изучить новую технологию, вы можете (и должны быть) уволены. Это похоже на то, что если выходит новый трубный гаечный ключ, и вы сантехник, и вы не можете понять, как работает новый трубный гаечный ключ, вы, вероятно, довольно паршивый сантехник.
  2. Учитывая выбор «Я изучаю эту технологию» или «Я трачу больше времени на решение реальных проблем», вы всегда должны выбирать последнее без исключения.

Как специалист по данным, ваша задача - решать проблемы . Этот кусочек мудрости почти всегда теряется на каждой конференции или встрече, на которую вы ходите - все разговоры о «больших данных», которые я когда-либо видел, были сосредоточены на технологиях, а не на решении проблем. Фактическое решение проблемы обычно сводится к нескольким слайдам в конце:

[Talk title = "Глубокое обучение в Cool New Startup"] ... [45 минут диаграмм и технобелев, в течение которых я отключаюсь и проверяю свой телефон] ... И после внедрения нашего кластера Hadoop и [Бен отключает зоны снова] мы можем выполнить нашу рутину глубокого обучения, [проснись: вот почему я пришел!] детали которой являются собственностью. Вопросов?

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

Пако Натан был в Остине несколько месяцев назад на однодневной конференции «Большие данные» и сказал что-то вроде «Химия - это не пробирки». Это в значительной степени подводит итог: наука о данных - это не Scala, Hadoop, Spark и все, что всплывают другие технологии. В конце концов, я хочу нанять людей, которые думают, а не людей, которые умеют использовать Stack Overflow для изучения наборов инструментов.

Аналогично, если вы идете на собеседование, а вас не нанимают только потому, что вы не знаете какой-либо язык программирования, то эта компания отстой . Они не понимают, что означает «ученый данных», и, вероятно, для вас будет лучше, если это не сработает.

Наконец, если ваши способности решать проблемы незначительны (будьте честны с самим собой), или вы действительно просто наслаждаетесь технологической стороной вещей, или изучение технологий - это то, что вы действительно любите (опять же, будьте честными), тогда изучите много технологий. Вы всегда сможете найти роли типа «инженер данных», которые соответствуют вашему набору навыков. Это не плохо, инженеры по обработке данных смазывают колеса и позволяют вам выполнять свою работу в качестве ученого по обработке данных. (Разница между архитектором программного обеспечения и командой разработчиков.)

BenDundee
источник
3
Я скажу, однако, что, если я работал на торговой площадке, и главный трейдер пришел ко мне с CSV цен опционов и хотел, чтобы я соответствовал их логарифмическому распределению и возвращал среднее и стандартное отклонение, Я бы даже не стал рассматривать Python. Я думаю, что это как три строки кода, чтобы сделать это в R.
BenDundee
12

Итак, я прежде всего сделал анализ данных в Matlab, но сделал некоторые в Python (и больше использовал Python для общего назначения), а также я начал немного R. Я собираюсь пойти против структуры и предлагаю вам использовать Python. Причина в том, что вы выполняете анализ данных с точки зрения машинного обучения, а не статистики (где доминирует R) или цифровой обработки сигналов (где доминирует Matlab).

Очевидно, что между машинным обучением и статистикой много общего. Но совпадение не идентичность. Машинное обучение использует идеи из CS, которые я, например, не хотел бы реализовывать в R. Конечно, вы можете вычислить минимальное связующее дерево в R. Хотя это может выглядеть как ужасный беспорядок. Люди, обучающиеся машинному обучению, предполагают, что у вас есть легкий доступ к хеш-таблицам, деревьям двоичного поиска и т. Д. В моем понимании, проще реализовать алгоритм статистики заново, когда это необходимо, чем пытаться вставить то, что в основном является предметно-ориентированным языком, в общий язык программирования.

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

Я полагаю, что сначала я посмотрю на некоторые статьи и выясню, на каком языке они публикуют код. Если это не в R, то не используйте его.

Нир Фридман
источник
1
Большое спасибо. Я определенно больше интересуюсь стороной ML.
The_Cthulhu_Kid
1
Небольшое дополнение: я уверен, что R может сделать это также некоторым образом, но Python хорошо известен своей способностью вызывать C или компилировать функции в C с использованием Cython с минимальными издержками. Таким образом, обычно вы можете быстрее работать с меньшими усилиями, что является основным фактором при рассмотрении реальных данных. Еще одно (последнее) экзотическое замечание: в Java есть несколько действительно хороших библиотек машинного обучения (например, WEKA). Однако, что круто, так это то, что вы можете вызывать их и из Python, используя Jython :-)
Nir Friedman
7

Как ученый старой школы (более 50 лет), который использует и продолжает использовать ряд этих инструментов, я добавлю два своих цента. Я работал с коллегами, которые до сих пор пишут каждый фрагмент кода на Фортране, от тривиальных одноразовых заданий по анализу данных до кода, который доминирует в некоторых суперкомпьютерах мира. Недавние диалекты Фортрана (F90, F95, F2003, F2008) являются ИМХО, одними из лучших разработанных существующих языков. Многолетний опыт работы с высокопроизводительными вычислениями привел к довольно впечатляющему развитию языка.

Время от времени я использовал только Python и буду его пересматривать (в основном из-за Sage), но я использую проверенный временем набор языков, которые хорошо мне подходят. Fortran, C, Perl, R и Scheme (с tcl для сценариев VMD). Я считаю, что комбинация R и Fortran и C очень удобна. В отличие от других комментариев, сделанных относительно объектной модели в R, это хорошая объектная модель для интерактивной работы, основанная на концепции общих функций CLOS и диспетчеризации методов CLOS. Работая в интерактивном режиме с новым пакетом, вы часто можете полагаться на общие функции, такие как «печать» и «печать», чтобы сделать что-то продуктивное.

API для Fortran и C очень прост в использовании. Если вы привыкли работать в Fortran и C для моделирования и анализа данных, это большой плюс. Способность динамически генерировать R-код и оценивать его, хотя и не так чиста, как макросистемы в Lisp и C, очень полезна при работе с динамическими наборами данных.

Некоторые ограничения R для реальных данных включают подход «вызов по значению». Хотя существуют причины CS для вызова по значению, в реальном программировании с большими числовыми данными требуется некоторая форма вызова по ссылке (обратите внимание на важность общих блоков Fortran в более старом коде или данных модуля в более новом коде). Подход, принятый PDL (Perl Data Language), особенно элегантен в этом отношении. (Pdls, по сути, вызывается по ссылке, если только вы не запрашиваете копию. Sub-pdl ссылается на подраздел родительского pdl в более чистом синтаксисе, чем Fortran или C).

Хорошо учить много языков. Python, несомненно, является важным языком, но R также в своей области. Но когда резина действительно должна идти по пути науки, Fortran и C (и C ++ для некоторых) будет трудно заменить.

Джон Дашбах
источник
1

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

У Python, как я понимаю, нет системы управления пакетами. Не существует эквивалента всеобъемлющей архивной сети R ( http://cran.r-project.org ) и нет прямого эквивалента представлений задач R ( http://cran.csiro.au/web/views/ ). Таким образом, в некоторой степени это не относится к R, инструмент для программистов, работающих в значительной степени самостоятельно, а не как часть коммунальных усилий по созданию того, что уже доступно.

Для анализа данных и машинного обучения спрос, безусловно, в очень большой степени опирается на уже имеющиеся возможности. Для более общих задач программирования Python вполне может иметь свои преимущества. Будете ли вы выполнять эту работу достаточно, чтобы оправдать усилия по изучению Python?

Джон Майндональд
источник
3
В Python есть система управления пакетами, которая называется pip. Он не является частью стандартной библиотеки, но будет поставляться со стандартным Python, начиная с Python 3.4, который будет выпущен в следующем месяце (март 2014 года).
Коди Пирсолл
2
Эквивалент Python для Комплексной архивной сети R - это PyPI: pypi.python.org/pypi
Уилфред Хьюз,