Заскуль питона (Data Science)
6.26K subscribers
111 photos
16 videos
4 files
143 links
Канал про Python, Data Science, SQL и многое другое

По вопросам сотрудничества и рекламе: @m459n9

Мемы: @ds_memes

Чат: https://t.iss.one/my_it_frogs
Download Telegram
😎 Крутые статьи на Хабре про A/B-тестирование от крупных компаний

A/B-тесты кажутся простыми: разделили аудиторию, сравнили метрики, сделали вывод. Но на практике можно легко допустить ошибку, которая приведёт к неправильным решениям. Собрал полезные статьи с Хабра, которые помогут разобраться в нюансах экспериментов и избежать классических фейлов и узнать что-то новое.

Топ постов от IT-компаний, в которых активно используется 🆎.

💙 Ozon

🟢Шесть причин, почему ваши A/B-тесты не работают
🟢Без А/B результат XЗ, или Как построить высоконагруженную платформу А/B-тестов

🖤 X5 Tech

🟢А/Б тесты с метрикой отношения. Дельта-метод
🟢Как проводить A/B-тестирование на 15 000 офлайн-магазинах
🟢50 оттенков линейной регрессии, или почему всё, что вы знаете об A/B тестах, помещается в одно уравнение
🟢Varioqub: за Mann-Whitney замолвите слово

🛒 Купер (ex. СберМаркет)

🟢Линеаризация: зачем и как укрощать ratio-метрики в A/B-тестах
🟢База: айсберг A/B-тестов

🌏 Авито

🟢Как устроено A/B-тестирование в Авито
🟢Как улучшить ваши A/B-тесты: лайфхаки аналитиков Авито. Часть 1
🟢Как улучшить ваши A/B-тесты: лайфхаки аналитиков Авито. Часть 2
🟢Сетап А/В-теста, который помог снизить MDE выручки в 2 раза
🟢Как мы в Авито проводим A/B-тесты CRM-рассылок

🤪 Lamoda Tech

🟢Как же мощно я провел A/B-тест, или почему не стоит сравнивать наблюдаемый аплифт с MDE

❤️ Яндекс

🟢10 мифов об A/B-тестировании: как избежать распространённых заблуждений в статистическом анализе

🏦 Т-банк

🟢Использование последовательного тестирования для уменьшения размера выборки

Ставьте 🐳, если подборка была полезной, сохраняйте к себе, чтобы не забыть! Следующую подборку сделаю по методам оценки эффекта без A/B тестирования

@zasql_python 👉 @ds_memes

Что-то забыл? Пишите в комментариях!
Please open Telegram to view this post
VIEW IN TELEGRAM
🐳6110🔥95👍42
Forwarded from Data Science Memes
Пятница, играем в русскую рулетку.

😏 @ds_memes
Please open Telegram to view this post
VIEW IN TELEGRAM
😁37🤣11😎21🤯1
Буквально 2 дня назад вышла статья Avito 🌍 по 🆎. Разбираем по шагам механику A/B-тестирования: математика, интуиция и код

Почитал, в целом могу сказать, что хорошее чтиво для разбора A/B тестов.

Обычно, я смотрю графически на то, как изменяется MDE (тут это написано в зависимости от длительности эксперимента), также смотрю и по количеству пользователей в эксперименте (10/10, 20/20 и тд), только равные группы пользователей.

🧑‍🎓 Теоретическое
def compare_mde(current_a, current_b, new_a, new_b):
return np.sqrt(1/current_a + 1/current_b) / np.sqrt(1/new_a + 1/new_b)

# здесь смотрят на то, а как изменится mde, если мы перейдем от 10/10 к 50/50 разбиению
compare_mde(0.1, 0.1, 0.5, 0.5) # ~2.236


💻 Практическое
def check_mde_reduce_from_size(grouped_dataset, current_t, current_c, new_t, new_c):
"""
Функция для сравнения MDE в текущем варианте сплитования и в новом.
Параметры:
- grouped_dataset: сгруппированный поюзерный датасет, на осоновании которого будут сравниваться MDE
- current_t: доля пользователей в тесте в текущем сетапе
- current_c: доля пользователей в контроле в текущем сетапе
- new_t: доля пользователей в тесте в новом сетапе
- new_c: доля пользователей в контроле в новом сетапе
Возвращает:
- отношение MDE_current / MDE_new
"""


grouped_dataset['group_current'] = np.random.choice(['test', 'control', '-'],
p=[current_t, current_c, 1 - current_c - current_t],
size=len(grouped_dataset))
grouped_dataset['group_new'] = np.random.choice(['test', 'control', '-'],
p=[new_t, new_c, 1 - new_t - new_c],
size=len(grouped_dataset))
metric = 'promotion_revenue'


test_curr = np.array(grouped_dataset[(grouped_dataset['group_current'] == 'test')][metric])
control_curr = np.array(grouped_dataset[(grouped_dataset['group_current'] == 'control')][metric])

test_new = np.array(grouped_dataset[(grouped_dataset['group_new'] == 'test')][metric])
control_new = np.array(grouped_dataset[(grouped_dataset['group_new'] == 'control')][metric])

MDE_current = get_relative_MDE(test_curr, control_curr, alpha=0.05, beta=0.2)
MDE_new = get_relative_MDE(test_new, control_new, alpha=0.05, beta=0.2)
return MDE_current / MDE_new


Из формулы MDE зачастую мы работаем с равными дисперсиями в выборкам, поэтому можно вынести из под корня константу в виде дисперсии и размера выборки, это вот тут.

Прикольно, что на практических сгенерированных примерах видно, что эти расчеты реально работают и можно использовать для реализации внутри компании, при дизайне / расчета A/B тестов.

Написано еще тут и про прокси-метрики, что их нужно выбирать в зависимости от каждого кейса, про оценку эффекта при переходе от обычной метрики к прокси-метрике, интерпретацию прокси-метрик

+ итоги правильной подготовки сетапа теста, где выбрали

а) сплит 50/50, а не 10/10
б) выбрали прокси-метрику, а не основную (которая обладает меньшей чувствительностью)
в) держать тест не 1, а 7 недель.

🔽 как результат, получили сокращение MDE в 9.2 раза!

Ну и дополнительно рассказали про контр-метрики, в очередной раз упомянули линеаризацию + доверительный интервал для оценки эффекта Ratio-метрик.

В целом, хорошая и ненапряжная статья, которую я вам советую прочитать, если хотите начать разбираться в A/B тестах + подметить для себя что-то новое)

Ставьте 🐳, если понравился пост, делитесь своими мыслями в комментариях.
Please open Telegram to view this post
VIEW IN TELEGRAM
🐳33🔥95
вот и думаем! Garbage in -> Garbage Out.

@zasql_python 👉 @ds_memes
Please open Telegram to view this post
VIEW IN TELEGRAM
22😁8🐳3
Шпаргалки по визуализации в Python

Всем привет! Аналитикам и другим специалистам в области анализа данных необходимо из семпла данных сделать какое-то исследование, найти закономерность в данных и презентовать это ПМ / руководству и др. Не для каждой задачи нужно строить дашборд, поскольку задача может требовать первичный анализ.

🤔 В начале не придаешь этому значения, так как таблицы для нас содержат уже достаточное количество информации + различные статистики. Но на этом этапе хочется иметь возможность визуализировать базовые или интересные штуковины, с помощью которых можно будет сгенерировать еще гипотез.

Визуализировать можно и через Matplotlib (база всех графиков в Python), Seaborn (более расширенный функционал, чем Matplotlib), Plotly (интерактивные графики).

⬇️ Ниже приведен в коде минимум, которым можно пользоваться. Это должно покрывать большое количество задач (~80%) на распределения, поведение метрики во времени. Конечно, есть и другие виды визуализации, но это базовые. Сюда еще можно отнести boxplot для визуализации.

import matplotlib.pyplot as plt
import numpy as np

# Данные
x = np.linspace(0, 10, 100) # создаём массив от 0 до 10 из 100 точек
y = np.sin(x) # вычисляем sin(x)
data = np.random.randn(1000) # 1000 случайных значений из нормального распределения

# Фигура с 2 графиками (subplots)
fig, ax = plt.subplots(1, 2, figsize=(12, 4)) # создаём фигуру с 1 строкой и 2 графиками

# Первый subplot: гистограмма
ax[0].hist(data, bins=20, color="skyblue", edgecolor="black") # рисуем гистограмму
ax[0].set_title("Гистограмма") # заголовок графика
ax[0].set_xlabel("Значения") # подпись оси X
ax[0].set_ylabel("Частота") # подпись оси Y
ax[0].grid(True) # включаем сетку

# Второй subplot: линейный график
ax[1].plot(x, y, label="sin(x)", color="red") # рисуем линию sin(x)
ax[1].set_xlim(0, 12) # ограничение по оси X
ax[1].set_ylim(-2, 2) # ограничение по оси Y
ax[1].set_xticks([0,2,4,6,8,10]) # задаём кастомные тики по X
ax[1].set_yticks([-2,-1,0,1,2]) # задаём кастомные тики по Y
ax[1].set_xlabel("Ось X") # подпись оси X
ax[1].set_ylabel("Ось Y") # подпись оси Y
ax[1].set_title("Линейный график") # заголовок графика
ax[1].legend() # выводим легенду
ax[1].grid(True) # включаем сетку


❤️ Если вдруг, вы хотите делать более красивые графики, испытывать наслаждение при их построении, а также сделать их понятнее, вэлком ниже.

1️⃣ Matplotlib [дока]

🔗 Matplotlib CheatSheet (matplotlib.org)

🔗 Гайд на Kaggle по различным визуализациям

🔗 DataCamp Matplotlib CheatSheet

2️⃣ Seaborn [дока]

🔗 DataCamp Seaborn

🔗 Вот тут очень хорошо описано + есть по другим библиотекам

3️⃣ Plotly [дока]

🔗 Plotly Express, Colab

🔗 Plotly Cheatsheet

🙊 Сам я использую matplotlib и seaborn, потому что они быстро настраиваются, но кому-то заходит и Plotly, так как он при обычной настройке может сделать красоту. Каждому свое)

Ну и конечно же, можно использовать ChatGPT, Cursor и других ребят для отрисовки графиков, смотря какую цель преследуете

Ставьте 🐳, сохраняйте к себе, чтобы не потерять, тренируйтесь и все у вас получится!
Please open Telegram to view this post
VIEW IN TELEGRAM
🐳456🔥5
Forwarded from Data Science Memes
Please open Telegram to view this post
VIEW IN TELEGRAM
😁29🔥2🥴2🌚1🫡1