Я спробую сформулювати відповідь, що стосується основних моментів, коли дві мови вступають у гру для наукових даних / статистики / аналізу даних тощо, як хтось, хто використовує обидві.
Процес роботи в аналізі даних, як правило, складається з наступних етапів:
- Отримання даних з якогось джерела (швидше за все, бази даних SQL / noSQL або файлів .csv).
- Розбір даних у пристойному та розумному форматі (кадр даних), щоб можна було робити операції та думати про них.
- Застосування деяких функцій до даних (групування, видалення, об'єднання, перейменування).
- Застосування якоїсь моделі до даних (регресія, кластеризація, нейронна мережа або будь-яка інша більш-менш складна теорія).
- Розгортання / представлення результатів більш-менш технічній аудиторії.
Отримання даних
99% часу, процес вилучення даних зводиться до того, запитуючи яку - SQL або бази даних Impala: як Python і R мають конкретних клієнтів або бібліотеки , які роблять роботу в найкоротші терміни і однаково добре ( RImpala
, RmySQL
для R і MySQLdb
для Python працювати плавно, не дуже багато додати). Що стосується читання зовнішніх .csv-файлів, data.table
пакет для R забезпечує функцію, fread
яка читає у величезні та складні файли .csv з будь-яким варіантом спеціального розбору за якийсь час, та перетворює результат безпосередньо у фрейми даних із назвами стовпців та номерами рядків.
Організація фреймів даних
Ми хочемо, щоб дані зберігалися в якійсь таблиці, щоб ми могли легко отримувати доступ до будь-якого одного запису, рядка чи стовпця.
R пакет data.table
забезпечує неперевершені способи маркувати, перейменовувати, видаляти і доступу до даних. Стандартний синтаксис дуже схожий на SQL як dt[i, j, fun_by]
, де це призначено dt[where_condition, select_column, grouped_by (or the like)]
; спеціальні функції, визначені користувачем, можна вводити туди, як і в j
пункт, так що ви можете повністю маніпулювати даними та застосовувати будь-яку складну або фантазійну функцію для груп або підмножин (наприклад, приймати i-й ряд, k-й елемент та підсумуйте його до (k-2) -го елемента (i-1) -го ряду тоді і лише тоді, коли стандартне відхилення всього стовпця є "що-це-є", згруповане за останнім стовпцем у цілому). Погляньте на орієнтири та на це інше дивовижне запитання щодо SO. Сортування, видалення та перейменування стовпців та рядків роблять те, що їм потрібно, а стандартні векторизовані методи R apply, sapply, lapply, ifelse
виконують векторизовані операції над стовпцями та кадрами даних взагалі, не переглядаючи кожен елемент (пам'ятайте, що коли ви використовуєте петлі в R ви роблять це погано неправильно).
Підручна зброя Python - це pandas
бібліотека. Нарешті, вона надає структуру pd.DataFrame
(тієї стандартної Python не вистачає, мені чомусь досі невідомо), яка обробляє дані такими, якими вони є, а саме кадри даних (замість деяких numpy array, numpy list, numpy matrix
чи будь-яких інших). Такі операції, як групування, перейменування, сортування та подібне, можна легко досягти, і тут також користувач може застосувати будь-яку власну функцію до згрупованого набору даних або підмножини кадру за допомогою Python apply
або lambda
. Мені особисто не подобається граматика df[df.iloc(...)]
для доступу до записів, але це лише особистий смак і зовсім не проблема. Орієнтовні показники для операцій групування все ще трохи гірші, ніж R, data.table
але, якщо ви не хочете зекономити 0,02 секунди для компіляції, великої різниці у продуктивності немає.
Струни
Спосіб R для обробки рядків полягає у використанні stringr
пакету, який дозволяє легко змінювати текстові маніпуляції, анаграми, регулярне вираження, пробіли білого простору чи подібні. Він також може бути використаний у поєднанні з бібліотеками JSON, які розпаковують словники JSON та скасовують їх елементи, так що в кінцевому кадрі даних, де назви стовпців та елементи є такими, якими вони мають бути, без будь-якого символу або білого пробілу, який не є UTF8 там.
Pyndhon's Pandas .str.
виконує таку ж роботу, граючи з регулярними виразами, затягуючи або що-небудь таке добре, як і його конкурента, тому навіть тут немає великої різниці у смаку.
Застосування моделей
Ось де, на мою думку, виникають відмінності між двома мовами.
RНа сьогоднішній день має неперевершений набір бібліотек, які дозволяють користувачеві по суті робити все, що завгодно, в одному-двох рядках коду. Стандартні функціональні або поліноміальні регресії виконуються в одностроях і дають виходи, коефіцієнти яких легко читаються, супроводжуючись відповідними довірчими інтервалами та розподілом p-значень. Аналогічно для кластеризації, як і для випадкових лісових моделей, аналогічно для дендограм, аналіз основних компонентів, синхронних декомпозицій значення, логістичних пригод та багато іншого. Вихідні дані для кожного з перерахованих вище, швидше за все, мають специфічний графічний клас, який генерує візуалізацію того, що ви тільки що зробили, з кольорами та бульбашками для коефіцієнтів та параметрів. Тести гіпотез, статистичні тести, Шапіро,
Python намагається не відставати від SciPy
і scikit-learn
. Більшість стандартних аналізів і моделей також доступні, але вони трохи довші для кодування та менш інтуїтивні для читання (на мій погляд). Більш складних механізмів відсутнє, хоча деякі можна простежити до деяких комбінацій вже існуючих бібліотек. Одне, що я вважаю за краще робити в Python, а не в R, - це аналіз тексту мішком із двограмовими, триграмовими та вищими порядками.
Представлення результатів
Обидві мови мають прекрасні інструменти для побудови графіків, ggplot2
перш за все R та відповідний еквівалент Python. Не дуже сильно конкурувати, вони роблять роботу безпечною та надійною, хоча я вважаю, що якщо ви представляєте результати, вам, можливо, доведеться використовувати інші інструменти - там є чудові барвисті інструменти дизайну, і ні Python, ні R не призначені для здивування аудиторія з фантазійними червоно-зеленими перетягуваннями. Останнім часом R опублікував багато вдосконалень щодо його shiny app
особливостей, які в основному дозволяють йому виробляти інтерактивні результати . Я ніколи не хотів її вивчати, але я знаю, що вона є, і люди її добре використовують.
Бічна примітка
Як бічне зауваження, я хотів би підкреслити, що основна відмінність між двома мовами полягає в тому, що Python - це мовна програма програмування загального призначення, створена і для інформатики, переносимості, розгортання тощо тощо. Це дивовижно в тому, що він робить, і навчитися просто; немає нікого, хто не любить пітона. Але програмування - це мова програмування.
Rз іншого боку, був винайдений математиками, фізиками, статистиками та науковцями даних. Якщо ви походите з цього фону, все має ідеальний сенс, оскільки воно прекрасно відображає та відтворює поняття, які використовуються у статистиці та математиці. Але якщо натомість ви походите з інформатики та хочете імітувати Java або C в R, ви будете розчаровані; у нього немає "об'єктів" у стандартному розумінні (ну, це є, але не те, що, як правило, хтось вважає, що вони є ...), у нього немає класів у стандартному розумінні (ну, це є, але не те, що зазвичай вважає, що вони є ...), він не має "покажчиків" чи всіх інших структур інформатики - а лише тому, що їм не потрібен. Останнє, але не найменш важливе: документацію та пакети легко створювати та читати (якщо ви використовуєте Rstudio); там є велика і пристрасна спільнота, і Google займає буквально п’ять секунд, як "як зробити вставку-випадкову проблему в R", перший запис якої перенаправляє вас до вирішення проблеми (зроблено кимось іншим) з відповідним кодом , моментально.
Більшість промислових компаній мають вбудовану інфраструктуру в Python (або середовище, сприятливе для Python), що дозволяє легко інтегрувати код Python (просто import myAnalysis
де завгодно, і ви в основному зробили). Однак будь-яка сучасна технологія або сервер чи платформа легко також виконує фоновий R код без проблем.