R или Python в аналитике?
Наконец-то решила написать про эту холиварную тему 😏
Будет максимально объективно, так как работала с R не только в науке, но и в продакшне в🖤 .
Плюсы🖥 :
🟡 Статистика из коробки – большинство статистических тестов, в том числе сложных, доступно без установки дополнительных пакетов.
🟡 Очень удобный и юзер-френдли синтаксис в
🟡 Лучшая визуализация:
🟡 Векторизация позволяет писать без циклов, повышая читаемость и снижая количество ошибок.
🟡 С помощью пайпов и NSE (not standard evaluation) работа с табличками становится очень удобной и читаемой (ниже закинула пример кода для сравнения).
Плюсы👩💻 :
🟡 Большинство аналитиков, по крайней мере в РФ, пишут на питоне.
🟡 Девопсы обычно умеют разворачивать питон приложения.
🟡 Экосистема для машинного обучения сильнее:
🟡 airflow для оркестрации изначально рассчитано под питон, писать даги в airflow на R теоретически можно, но это будет странно.
Минусы🖥 :
🟡 Чтобы получить плюсы от производительности, нужно писать в
🟡 Разворачивать приложения и оркестрацию для продакшна можно, но нужно уметь это готовить. Например, у нас в 🖤 весь бизнес-мониторинг работал на связке ClickHouse + R +
🟡 Если уходить в машинное обучение, то в R все же слабее пакеты.
🟡 Визуализация это круто, но дашборды все равно делают отдельными инструментами: Tableau, Superset, DataLens и так далее.
Минусы👩💻
🟡 В
🟡 Визуализация менее лаконична:
✍️ Сравнение кода на R и Python
Типичная задача продуктового аналитика: рассчитать ARPPU по двум группам A/B теста (в комментарии закину воспроизводимый пример, а еще пример расчета t-теста на обоих языках).
Ну как, какой вариант кажется более понятным и лаконичным? Пишите в комментариях👇
Сейчас я в основном пишу на питоне, это удобнее в командной работе, коллеги могут переиспользовать и ревьюить ноутбуки, а еще ETL-процессы в airflow.
Но использую R для некоторых задач A/B тестирования или продуктовых исследований.
В продуктовой аналитике нет особого преимущества одного языка над другим, так как ML обычно не используется, а тяжелые логи можно агрегировать на стороне SQL, поэтому в лимит по памяти пандаса тоже не упираюсь. Мне конечно самой было бы приятнее писать на R, но что поделать, рыночек порешал 😬
В принципе, писать можно на чем угодно, главное, выполнять задачи вовремя и качественно)
#analytics #R #python
Наконец-то решила написать про эту холиварную тему 😏
Будет максимально объективно, так как работала с R не только в науке, но и в продакшне в
Плюсы
tidyverse, а в data.table – высокая скорость и оптимизация по памяти.ggplot2 за счет подхода грамматики графики позволяет делать сколь угодно сложные и кастомные графики.Плюсы
scikit-learn, pytorch, keras.Минусы
data.table стиле, которому мало где учат. На онлайн-курсах аналитиков данных в принципе не изучают R, большинство R-щиков из академической среды.data.table, оркестрация ETL-пайплайнов через AWX Ansible. Но я больше нигде не видела подобную инфру, поэтому предполагаю, что с нуля настроить инфраструктуру проще на связке питон + airflow. Пользуясь случаем, передаю приветы команде BMS в X5 Tech ❤️Минусы
pandas низкая производительность и неудобный синтаксис по сравнению с tidyverse/data.table.matplotlib даже для простых графиков требует простыню кода, а seaborn менее кастомизируем. Но здесь для фанатов R можно использовать plotnine, портированный ggplot2 (но он все равно будет с урезанным функционалом).✍️ Сравнение кода на R и Python
Типичная задача продуктового аналитика: рассчитать ARPPU по двум группам A/B теста (в комментарии закину воспроизводимый пример, а еще пример расчета t-теста на обоих языках).
df_arppu <- df %>%
summarise(user_total = sum(revenue), .by = c(ab_group, user_id)) %>% # суммируем платежи пользователя
summarise(
paying_users = sum(user_total > 0),
total_revenue = sum(user_total),
ARPPU = ifelse(paying_users > 0, total_revenue / paying_users, NA_real_),
.by = ab_group
)
df_arppu = (
df
.groupby(['ab_group', 'user_id'], as_index=False)
.agg(user_total=('revenue', 'sum')) # суммируем платежи пользователя
.groupby('ab_group', as_index=False)
.agg(
paying_users=('user_total', lambda x: (x > 0).sum()),
total_revenue=('user_total', 'sum')
)
.assign(
ARPPU=lambda d: np.where(d['paying_users'] > 0,
d['total_revenue'] / d['paying_users'],
np.nan)
)
)
Ну как, какой вариант кажется более понятным и лаконичным? Пишите в комментариях
Сейчас я в основном пишу на питоне, это удобнее в командной работе, коллеги могут переиспользовать и ревьюить ноутбуки, а еще ETL-процессы в airflow.
Но использую R для некоторых задач A/B тестирования или продуктовых исследований.
В продуктовой аналитике нет особого преимущества одного языка над другим, так как ML обычно не используется, а тяжелые логи можно агрегировать на стороне SQL, поэтому в лимит по памяти пандаса тоже не упираюсь. Мне конечно самой было бы приятнее писать на R, но что поделать, рыночек порешал 😬
В принципе, писать можно на чем угодно, главное, выполнять задачи вовремя и качественно)
#analytics #R #python
Please open Telegram to view this post
VIEW IN TELEGRAM
Telegram
Статистика и R в науке и аналитике in Чат канала "Статистика и R"
А вот и обещанный код:
library(dplyr)
library(tidyr)
df <- tibble(
user_id = c(1, 1, 2, 3, 3, 4, 5, 6, 5, 7, 8, 9),
ab_group = rep(c('A', 'B'), each = 6),
revenue = c(50, 100, 200, 300, 150, 0, 150, 0, 100, 700, 200, 200)
) # создание датафрейма
df…
library(dplyr)
library(tidyr)
df <- tibble(
user_id = c(1, 1, 2, 3, 3, 4, 5, 6, 5, 7, 8, 9),
ab_group = rep(c('A', 'B'), each = 6),
revenue = c(50, 100, 200, 300, 150, 0, 150, 0, 100, 700, 200, 200)
) # создание датафрейма
df…
2🔥62👍17❤12👏5🤔2😱2🎉2