Как маркетологу сделать бутстрэппинг и зачем?

Как обычно, начну с определения, что маркетологу нужно работать по наитию не опираясь на данные, чтобы не плодить конкурентов. Предположим, вы запустили, новый проект, и через 7 дней выяснили, что конверсия составляет 1.08%. В голове естественные вопросы: 1. Это много или мало? 2. Достаточно ли 7 дней, чтобы сделать верные выводы?

Загуглив находим, что бывает: Статистический бутстрапинг - метод многократной случайной выборке из исходных данных. Бутстрапинг в программировании — процесс инициализации системы или программы. Бизнес-бутстрапинг — запуск компании без внешних внешних средств, с минимальными ресурсами.

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

Возьмем данные из live-demo, которое показывает посещаемость страницы metrica.yandex.com/promo/product. Просто скачаем данные по прямой ссылке (нужно иметь аккаунт в Яндексе).

Как скачать данные для бутстрэппинга
Как скачать данные для бутстрэппинга

Я напишу код на Питоне. Сначала загрузим данные:

import pandas as pd df = pd.read_excel('названиефайла.xlsx', skiprows=5) df = df.drop(index=0) # удалил первую строку df['Дата визита'] = pd.to_datetime(df['Дата визита']) df = df.set_index('Дата визита') df['CR'] = df['Целевые визиты (Автоцель: заполнил контактные данные)'] / df['Визиты']

И выберем данные за последние 7 дней:

df = df['CR'][:7]

Результат:

Визиты Посетители Отказы Глубина просмотра Время на сайте Целевые визиты (Автоцель: заполнил контактные данные) CR Дата визита 2024-03-22 906 872 0.488962 1.545254 00:01:03 12 0.013245 2024-03-21 1204 1161 0.549003 1.405316 00:00:55 14 0.011628 2024-03-20 1806 1745 0.588594 1.367110 00:00:51 25 0.013843 2024-03-19 1784 1738 0.609305 1.417040 00:00:53 12 0.006726 2024-03-18 406 390 0.339901 1.586207 00:01:42 5 0.012315 2024-03-17 258 242 0.333333 1.573643 00:01:26 2 0.007752 2024-03-16 281 270 0.355872 1.412811 00:00:56 3 0.010676

(можно просто скопировать)

Визуализируем:

Конверсия за 7 дней
Конверсия за 7 дней

В pandas бутстрэппинг делается методом:

sample = df['CR'].sample(frac=1, replace=True)

С параметрами:

n=n_size - количество элементов, которые нужно выбрать (если не указывать, выбирается по умолчанию одна строка)

Т.к. выборка довольно маленькая, укажем:

frac=1: доля от общего числа элементов, которые нужно выбрать. Если бы было указано, например, frac=0.5, то выбралось бы 50% от всех данных. Параметр frac конфликтует с параметром n, поэтому нужно указать или n или frac.

replace=True: выборка с возвращением. Это значит, что один элемент может быть выбран несколько раз.

Количество итераций можно взять достаточно большое, хоть 1 млн. На Маке М1 2020 года выпуска займет 40 секунд. Но и 10 тыс. итераций будет достаточно.

И итоговый код примет следующий вид:

import pandas as pd import matplotlib.pyplot as plt # Пример данных data = [0.013245033112582781, 0.011627906976744186, 0.013842746400885935, 0.006726457399103139, 0.012315270935960592, 0.007751937984496124, 0.010676156583629894] # Преобразование данных в DataFrame df = pd.DataFrame(data, columns=['CR']) # Параметры бутстрэппинга n_iterations = 100000 # Количество итераций # Хранение результатов boot_means = [] # Выполнение бутстрэппинга for i in range(n_iterations): # Выборка с заменой sample = df['CR'].sample(frac=1, replace=True) # Вычисление среднего mean = sample.mean() boot_means.append(mean) # Преобразование результатов в DataFrame boot_means_df = pd.DataFrame(boot_means, columns=['среднее']) # Вывод статистики print(f"Оригинальное среднее: {df['CR'].mean():.4%}") print(f"Бутстрэппинг среднее: {boot_means_df['среднее'].mean():.4%}") print(f"Доверительный интервал 95%: {boot_means_df['среднее'].quantile(0.025):.4%} - {boot_means_df['среднее'].quantile(0.975):.4%}")

Результат выполнения:

Оригинальное среднее: 1.0884%

Бутстрэппинг среднее: 1.0885%

Доверительный интервал 95%: 0.8946% - 1.2638%

Т.е. получается, что распределение вероятности конверсии лежит с уровнем значимости 95% лежит в интервале [0.89:1.26]? Проверим так ли это на самом деле, загрузив данные полностью:

df = df['2022-09-01':]

Визуализируем:

Получается, что в середине прошлого года, конверсия подросла, и в последние 7 ней тоже наблюдается небольшой рост.
Получается, что в середине прошлого года, конверсия подросла, и в последние 7 ней тоже наблюдается небольшой рост.

Выполним код еще раз и получим:

Оригинальное среднее: 0.7541%

Бутстрэппинг среднее: 0.7542%

Доверительный интервал 95%: 0.6960% - 0.8156%

Видим, что новый доверительный интервал получился значительно уже, чем исходный, и первоначальное значение 1,08% лежит за переделами нового доверительного интервала, что намекает на следующие выводы:

1. 1,08% это довольно высокая конверсия, по сравнению с данными за 569 дней, т.к. средняя конверсия за этот период 0,75%.

2. Имея данные только за 7 дней, можно сделать выводы с определенной степенью уверенности, но в этом случае доверительный интервал будет шире, чем, чем за 569 дней.

3. Если взять данные за 1569 то доверительный интервал будет еще уже.

На этом все. Делайте правильные выводы основанные на данных.

11
11
Начать дискуссию