Взрывной хак: как делать супер-реалистичные тестовые данные в Python за пару минут — вообще без готовых датасетов!

Стилизованная иллюстрация с логотипом Python, окружённым диаграммами и графиками.

Кратко

Часто мне нужно быстро протестировать какую-нибудь статистическую библиотеку для Python — а подходящий набор данных вдруг не находится. Здесь и помогает простая генерация собственных данных. Поделюсь, как я это обычно делаю.

Зачем вообще создавать данные самому?

В наши дни подходящих датасетов для Python очень много — ищи в открытых государственных архивах или на сервисах вроде Kaggle.

Но бывает, хочется быстро примерить какой-то метод в statsmodels или посмотреть работу статистических тестов в Pingouin, а под рукой ничего подходящего нет. В таких случаях я просто создаю небольшой тестовый массив через NumPy — генератор случайных чисел очень выручает.

Функции попроще: в большинстве случаев обычных случайных чисел более чем достаточно

Самое простое — импортировать NumPy и инициализировать генератор случайных чисел. Обычно работаю в окружении Mamba:

Свои статистические эксперименты я запускаю в интерактивной консоли IPython или Jupyter Notebook. Для начала — импорт NumPy:

Потом создаю объект-генератор случайных чисел:

Можно сразу получить массив из 20 случайных чисел с плавающей точкой:

С этим массивом легко посчитать все основные статистические метрики из коробки. Обычно первым делом смотрю среднее:

В терминале IPython случайно сгенерированный массив Python.

Можно и по-другому посчитать среднее:

Расчёт среднего значения массива в Python.

Медиану тоже найти просто — это просто число, стоящее ровно посередине упорядоченного массива:

Ну и, конечно, стандартное отклонение — оно показывает, насколько далеко значения разбросаны относительно среднего.

Его тоже легко вычислить:

Стандартное отклонение NumPy для случайно созданного массива.

Перцентили — интересная штука: они показывают, какой процент значений лежит ниже заданного числа. Медиана — это как раз 50-й перцентиль: половина значений меньше неё. Как узнать перцентиль для своего массива:

В функцию передаёте свой массив и желаемый процент (от 0 до 100).

Точно так же можно вывести и, например, 75-й перцентиль:

Медиана NumPy для случайно созданного массива.

Перцентили 0 и 100 — это просто минимум и максимум выборки. Их можно получить отдельными функциями NumPy:

NumPy min для случайного массива.

Максимум выведу так:

NumPy max для случайного массива.

Регрессия, корреляция: как сымитировать «настоящие» данные с нормальным распределением

Обычных случайных чисел хватает для простейших задач, но чтобы эмитировать корреляцию или регрессию, нужны уже «почти настоящие» данные. Здесь выручает генерация массива с нормальным распределением — тем самым классическим «колоколом». В NumPy для этого есть метод standard_normal. Например, создаём 50 значений:

Чтобы убедиться, что получился правильный «колокол», удобно сразу построить гистограмму с Seaborn:

В Jupyter Notebook сперва разрешаю отображение графиков прямо в блокноте:

Теперь рисую гистограмму:

Гистограмма на основе массива из нормального распределения NumPy.

Теперь делаю второй массив — просто умножаю первый на 20:

Импортирую pandas и собираю DataFrame из этих двух массивов

Далее строю диаграмму рассеяния «a» против «b»:

Чётко видно: значения выстроились почти по прямой — отличный повод нарисовать регрессионную линию через regplot в Seaborn. В принципе, достаточно сменить одну букву в названии «relplot».

Диаграмма рассеяния для двух массивов из нормального распределения в NumPy.
Линия регрессии для нормальных массивов, сгенерированных в NumPy.

Для более продвинутых исследований захожу в statsmodels — там не только куча тестов, но и вполне удобная линейная регрессия, которую можно задать привычной формулой, как в R:

В результате получаем подробную таблицу с ключевыми коэффициентами для построения уравнения (y = kx + b) и важнейший показатель — коэффициент детерминации R-квадрат. Он всегда неотрицательный, потому что возводится в квадрат.

Результаты регрессии в statsmodels.

Если R-квадрат равен 1 — это идеальная корреляция (что ожидаемо, ведь мы сами придумали данные). Совпадение можно проверить и через SciPy: stats.pearsonr (названа так в честь Карла Пирсона).

Результат доказывает: оба наших массива идеально линейно зависят друг от друга.

Как подправить случайные числа «под себя»

Очень просто сделать так, чтобы случайные массивы имели нужное среднее и разброс: достаточно прибавить к ним или умножить на константу. Например, прибавили число — сдвинули среднее, умножили — изменили стандартное отклонение.


Получайте самые полезные лайфхаки по генерации данных — подпишитесь на рассылку!

Допустим, нужно получить 15 случайных значений со средним 20 и стандартным отклонением 3.5:

Используем стандартные mean и std — и получаем результат близкий к нужным значениям (на больших выборках будет ещё точнее, спасибо центральной предельной теореме).

Сгенерировать свои данные для тестов в Python проще простого. Больше не нужно перерывать бесконечные каталоги открытых датасетов или выискивать подходящий пример в учебниках — NumPy всё сделает за вас!

Если вам понравилась эта статья, подпишитесь, чтобы не пропустить еще много полезных статей!

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

Подробнее о том, какие преимущества вы получите с премиум подпиской, можно узнать здесь

Также подписывайтесь на нас в:

Алекс Бежбакин
Оцените автора
Добавить комментарий