Как выполнить тест Grubbs на Python
Введение
Тест Граббса – это метод проверки статистических гипотез, позволяющий обнаружить выбросы в наборе данных. Выбросы — это наблюдения, которые распределяют распределение данных и также известны как аномалии. Набор данных с выбросами имеет тенденцию переобучать больше, чем данные с нормальным/гауссовским распределением. Следовательно, перед моделированием машинного обучения необходимо устранить выбросы. Перед обработкой мы должны обнаружить и определить местонахождение выбросов в наборе данных. Наиболее популярными методами обнаружения выбросов являются QQPlot, межквартильный диапазон и статистический тест Граббса. Однако в этой статье будет обсуждаться только тест Граббса для обнаружения выбросов. Вы узнаете: что такое тест Граббса и как его реализовать на Python.
Что такое выбросы?
Выбросы — это численно далекие наблюдения данных от других значений данных. Эти значения выходят за пределы нормально распределенных данных. Для достижения нормального распределения набор данных должен содержать 67 % записей под первым стандартным отклонением, 95 % данных под вторым стандартным отклонением и 99,7 % точек под третьим стандартным отклонением среднего значения. Другими словами, точки данных должны находиться между первым и третьим квартилем. Мы рассматриваем записи, находящиеся ниже первого квартиля и выше третьего квартиля, как выбросы или аномалии.
Статистическая проверка гипотезы Граббса
Тест Граббса также подтверждает или отклоняет нулевую (H0) или альтернативную (H1) гипотезу, как и любой другой статистический тест гипотез. Тест Граббса — это тест для обнаружения выбросов в наборе данных.
Мы можем выполнить тест Граббса двумя способами: Односторонний тест и Двусторонний тест для одномерного набора данных с или выборки почти нормального распределения с at не менее семи переменных. Этот тест также известен как тест на предельное стьюдентизированное отклонение или тест на максимальную нормализованную невязку.
Тест Граббса использует следующую гипотезу —
Нуль (H0): в наборе данных нет выбросов.
Альтернативный вариант (H1): набор данных имеет ровно один выброс.
Тест Граббса в Python
Python справится с любой задачей программирования благодаря своей обширной коллекции библиотек. Эти библиотеки предоставляют встроенные методы, которые можно использовать непосредственно для выполнения любых операций, статистических тестов и многого другого. Аналогично, в Python есть библиотека с методами выполнения теста Граббса для обнаружения выбросов. Однако мы рассмотрим оба способа реализации теста Граббса в Python: встроенную функцию из библиотеки и реализацию формулы с нуля.
Библиотека выбросов и Smirnov_grubbs
Давайте сначала установим библиотеку outlier_utils, используя следующую команду.
!pip install outlier_utils
Теперь давайте создадим набор данных с выбросами и выполним тест Граббса.
Двусторонний тест Граббса
Синтаксис
grubbs.test(data, alpha=.05)
Параметры
данные — числовой вектор значений данных.
альфа — уровень значимости для теста.
Объяснение
В этом подходе пользователь должен использовать функцию smirnov_grubbs.test() из пакета выбросов, переданного с необходимыми данными в качестве входных данных, чтобы запустить тест Грабба.
Пример
import numpy as np
from outliers import smirnov_grubbs as grubbs
#define data
data = np.array([ 5, 14, 15, 15, 14, 19, 17, 16, 20, 22, 8, 21, 28, 11, 9, 29, 40])
#perform Grubbs' test
grubbs.test(data, alpha=.05)
Выход
array([ 5, 14, 15, 15, 14, 19, 17, 16, 20, 22, 8, 21, 28, 11, 9, 29])
Приведенный выше код просто начинается с загрузки библиотек и данных и, наконец, выполнения теста Граббса на этих данных с использованием метода «test». Этот тест обнаруживает выбросы с обеих сторон, слева и справа, или значения ниже первого и выше третьего квартиля. Данные содержат только один выброс (40), который был удален с помощью теста Граббса.
Односторонний тест Граббса
Синакс
grubbs.max_test(data, alpha=.05)
Объяснение
В этом методе пользователь должен либо вызвать функцию grubbs.min_test(), чтобы получить минимальный выброс из предоставленного набора данных, либо функцию grubbs.max_test(), чтобы получить максимальный выброс из предоставленного набора данных, чтобы получить односторонний критерий Грабба.
Пример
import numpy as np
from outliers import smirnov_grubbs as grubbs
#define data
data = np.array([5, 14, 15, 15, 14, 19, 17, 16, 20, 22, 8, 21, 28, 11, 9, 29, 40])
#perform Grubbs' test for minimum value is an outlier
print(grubbs.min_test(data, alpha=.05))
#perform Grubbs' test for minimum value is an outlier
grubbs.max_test(data, alpha=.05)
Выход
[ 5 14 15 15 14 19 17 16 20 22 8 21 28 11 9 29 40]
array([ 5, 14, 15, 15, 14, 19, 17, 16, 20, 22, 8, 21, 28, 11, 9, 29])
Односторонний тест Граббса обнаруживает выбросы либо ниже первого квартиля, либо выше третьего квартиля. Мы видим, что метод min_test удаляет выбросы с минимальной стороны, а метод max_test — с верхней части данных.
Реализация формулы
Здесь мы реализуем следующую формулу теста Граббса на Python. Для реализации мы будем использовать библиотеки Numpy и Scipy.
Синтаксис
g_calculated = numerator/sd_x
g_critical = ((n - 1) * np.sqrt(np.square(t_value_1))) / (np.sqrt(n) * np.sqrt(n - 2 + np.square(t_value_1)))
Алгоритм
Шаги реализации следующие:
Вычислите среднее значение набора данных.
Рассчитайте стандартное отклонение значений набора данных.
Чтобы реализовать формулу теста Граббса, вычислите числитель, вычитая каждое значение в наборе данных из его среднего значения.
Разделите значение числителя на стандартное отклонение, чтобы получить расчетный балл.
Рассчитайте критическую оценку для тех же значений.
-
Если критическое значение превышает расчетное значение, то в наборе данных нет выбросов, в противном случае выбросы присутствуют.
Пример
import numpy as np
import scipy.stats as stats
## define data
x = np.array([12,13,14,19,21,23])
y = np.array([12,13,14,19,21,23,45])
## implement Grubbs test
def grubbs_test(x):
n = len(x)
mean_x = np.mean(x)
sd_x = np.std(x)
numerator = max(abs(x-mean_x))
g_calculated = numerator/sd_x
print("Grubbs Calculated Value:",g_calculated)
t_value_1 = stats.t.ppf(1 - 0.05 / (2 * n), n - 2)
g_critical = ((n - 1) * np.sqrt(np.square(t_value_1))) / (np.sqrt(n) * np.sqrt(n - 2 + np.square(t_value_1)))
print("Grubbs Critical Value:",g_critical)
if g_critical > g_calculated:
print("We can see from the Grubbs test that the calculated value is less than the crucial value. Recognize the null hypothesis and draw the conclusion that there are no outliers\n")
else:
print("We see from the Grubbs test that the estimated value exceeds the critical value. Reject the null theory and draw the conclusion that there are outliers\n")
grubbs_test(x)
grubbs_test(y)
Выход
Grubbs Calculated Value: 1.4274928542926593
Grubbs Critical Value: 1.887145117792422
We can see from the Grubbs test that the calculated value is less than the crucial value. Recognize the null hypothesis and draw the conclusion that there are no outliers
Grubbs Calculated Value: 2.2765147221587774
Grubbs Critical Value: 2.019968507680656
We see from the Grubbs test that the estimated value exceeds the critical value. Reject the null theory and draw the conclusion that there are outliers
Результаты теста Грабба показывают, что в массиве x нет выбросов, а в массиве y есть 1 выброс.
Заключение
В этой статье мы узнали о тесте Outliers и Grubbs в Python. Подведем итог этой статьи несколькими выводами.
Выбросы — это записи, выходящие за пределы квартильного диапазона.
Выбросы выходят за пределы нормального распределения набора данных.
Мы можем обнаружить выбросы, используя статистический тест гипотезы Граббса.
Мы можем выполнить тест Граббса, используя встроенные методы, доступные в библиотеке outlier_utils.
Двусторонний тест Граббса обнаруживает и удаляет выбросы как с левой, так и с правой стороны.
Однако односторонний тест Граббса обнаружит выбросы с обеих сторон.