Вопрос или проблема
Я занимаюсь анализом данных и использую тест Крамера — фон Мизеса, чтобы проверить, происходят ли две выборки из одного распределения. Я использую реализацию cramervonmises_2samp
из scipy.stats
. Изначально, выборки, которые я использовал (обозначенные sample1 и sample2), составляли 800K и 200K наблюдений. Когда я попытался это вычислить, это заняло довольно много времени и съело всю мою оперативную память (32 ГБ), что привело к сбою ядра моего jupyter notebook
.
Моя функция статистического теста определена как:
def compare_distributions(sample1, sample2, ALPHA=.01):
res = cramervonmises_2samp(sample1, sample2, method='exact')
print(f'форма sample1: {sample1.shape}')
print(f'форма sample2: {sample2.shape}')
print(f'статистика: {res.statistic}')
print(f'p-значение: {res.pvalue}')
if res.pvalue < ALPHA:
print('Нулевая гипотеза отклонена. \nВыборки не имеют одинакового распределения.\n\n')
else:
print('Нулевая гипотеза не отклонена. \nВыборки происходят из одного распределения.\n\n')
В качестве эксперимента, чтобы увидеть, сколько данных моя машина может обработать, я решил провести тест с 50, 70, 100, 130 и 200 наблюдениями в каждой выборке, при этом выборки были из scipy.stats.gamma
и scipy.stats.expon
соответственно. Результаты следующие:
форма sample1: (50,)
форма sample2: (50,)
статистика: 1.8978000000000002
p-значение: 1.5142491077016167e-05
Нулевая гипотеза отклонена.
Выборки не имеют одинакового распределения.
Время выполнения: 6.093s
----------------------------------------------
форма sample1: (70,)
форма sample2: (70,)
статистика: 2.2905102040816345
p-значение: 1.9285375980904996e-06
Нулевая гипотеза отклонена.
Выборки не имеют одинакового распределения.
Время выполнения: 33.788s
----------------------------------------------
форма sample1: (100,)
форма sample2: (100,)
статистика: 3.0496999999999943
p-значение: 3.495231315392338e-08
Нулевая гипотеза отклонена.
Выборки не имеют одинакового распределения.
Время выполнения: 199.694s
----------------------------------------------
форма sample1: (130,)
форма sample2: (130,)
статистика: 5.4970118343195296
p-значение: 5.803075867500237e-14
Нулевая гипотеза отклонена.
Выборки не имеют одинакового распределения.
Время выполнения: 783.185s
Когда я попытался провести тест с 200 наблюдениями в каждой выборке, на этот раз мой ноутбук завис и потребовалась перезагрузка.
Мои вопросы:
- почему этот тест требует так много ресурсов? (с точки зрения оперативной памяти и времени выполнения)
- является ли проверка гипотезы всегда такой ресурсозатратной?
Это связано с тем, что вы пытаетесь вычислить точное p-значение, используя method='exact'
. Попробуйте использовать method='asymptotic'
, поскольку это должно значительно ускорить вычисления (2 мс против 9,2 с для 50 выборок на моем компьютере) при, как мне кажется, небольшом или отсутствии различий в вычисленном p-значении.
Ответ или решение
Ответ на вопрос о ресурсоёмкости теста Крамера — фон Мизеса
Введение
В процессе анализа данных часто возникает необходимость проверки гипотез о равенстве распределений. Один из методов для этого — тест Крамера — фон Мизеса, который реализован в библиотеке SciPy через функцию cramervonmises_2samp
. Однако, вы столкнулись с проблемой высокой ресурсозатратности при использовании этого теста на больших выборках, что действительно может стать серьёзным препятствием в процессе анализа.
Почему тест требует так много ресурсов?
-
Метод вычисления p-значения: Вы указали, что используете параметр
method='exact'
. Этот метод произвёл наибольшие вычислительные затраты, потому что он требует непосредственного вычисления «точного» p-значения, что включает в себя оценку всех возможных вариантов перестановки ваших данных. При больших объёмных выборках это становится довольно затратным как по времени выполнения, так и по использованию оперативной памяти (ОП). -
Размеры выборок: Ваши исходные выборки содержали 800K и 200K наблюдений. Тест Крамера — фон Мизеса требует, чтобы алгоритм обеспечивал сравнительную оценку между всеми наблюдениями, что линейно увеличивает сложности вычислений. Эта нагрузка растёт по мере увеличения объёма данных, потенциально выходя за пределы доступной аппаратной мощности.
-
Обработка данных в памяти: Библиотека SciPy может попробовать выполнить все вычисления в оперативной памяти, что может привести к её переполнению, как вы и наблюдали. Ваша машина была загружена, что вызвало необходимость перезагрузки.
Всегда ли гипотезе тестирование так ресурсоёмко?
Не всегда. Ресурсоёмкость зависит от:
-
Метода потестирования: Как уже было упомянуто, использование асимптотического метода, указанного как
method='asymptotic'
, значительно снизит нагрузку на систему и время выполнения. Для малых выборок это может быть немного менее точным, но для больших выборок, как у вас, разница в точности может быть несущественной. -
Выборки: Размер и сложность ваших выборок должны определять, какой тест использовать. Если ваши выборки меньше 300 наблюдений, вполне допустимо использовать точные методы. С увеличением размеров выборок следовало бы перейти к асимптотическим методам.
Рекомендации для оптимизации процесса
-
Попробуйте изменить метод на
method='asymptotic'
, как вы уже упоминали. Это должно значительно сократить время выполнения и использование ресурсов в вашем случае. -
Сократите размер выборок для тестирования, чтобы проверить гипотезы в меньшей масштабируемости, а затем снова увеличить размер выборок, если тестирование на меньших данных показало, что различия всё же присутствуют.
-
Если ваши задачи протестирования требуют более плотных выборок, рассмотрите использование инструментария для работы с «дрифтами» и «параметрическими методами» в более общих контекстах.
Заключение
Тест Крамера — фон Мизеса — мощный инструмент для проверки статистических гипотез, но его вычислительная нагрузка может стать проблемой при работе с большими выборками. Понимание и корректировка используемых методов позволяют эффективно использовать память и ресурсы, сокращая время обработки без потери точности в статистических выводах.