Тестирование данных на нормальность часто является первым этапом их анализа, так как большое количество статистических методов исходит из предположения нормальности распределения изучаемых данных.
Например, пусть необходимо проверить гипотезу о равенстве средних значений в двух независимых выборках. Для этой цели подходит критерий Стьюдента. Но применение критерия Стьюдента обосновано, только если данные подчиняются нормальному распределению. Поэтому перед применением критерия необходимо проверить гипотезу о нормальности исходных данных. Или проверка остатков линейной регрессии на нормальность — позволяет проверить, соответствует ли применяемая модель регрессии исходным данным.
Нормальное распределение естественным образом возникает практически везде, где речь идёт об измерении с ошибками. Более того, в силу центральной предельной теоремы, распределение многих выборочных величин (например, выборочного среднего) при достаточно больших объёмах выборки хорошо аппроксимируется нормальным распределением вне зависимости от того, какое распределение было у выборки исходно. В связи с этим становится понятным, почему проверке распределения на нормальность стоит уделить особое внимание. В дальнейшем речь пойдёт о так называемых критериях согласия (goodness-of-fit tests). Проверяться будет не просто факт согласия с нормальным распределением с определёнными фиксированными значениями параметров, а несколько более общий факт принадлежности распределения к семейству нормальных распределений со всевозможными значениями параметров.
Проверку выборки на нормальность можно производить несколькими путями. Для начала можно вспомнить, какой вид у графика нормального распределения (гистограмма, график плотности и т.п.), как в нормальном распределении соотносятся среднее, мода, медиана, какими должны быть асимметрия и эксцесс, выполняется ли «правило 3-х сигм». Про всё это мы писали в статье про нормальное распределение. Вот с помощью такой описательной статистики можно оценить выборку на нормальность (обычно приемлемо отклонение на порядок ошибки рассчитываемого параметра). Вторая группа методов — критерии нормальности.
Критерии нормальности
Список критериев нормальности:
- Критерий Шапиро-Уилка
- Критерий асимметрии и эксцесса
- Критерий Дарбина
- Критерий Д’Агостино
- Критерий Васичека
- Критерий Дэвида-Хартли-Пирсона
- Критерий хи-квадрат
- Критерий Андерсона-Дарлинга
- Критерий Филлибена
- Критерий Колмогорова-Смирнова
- Критерий Мартинса-Иглевича
- Критерий Лина-Мудхолкара
- Критерий Шпигельхальтера
- Критерий Саркади
- Критерий Смирнова-Крамера-фон Мизеса
- Критерий Локка-Спурье
- Критерий Оя
- Критерий Хегази-Грина
- Критерий Муроты-Такеучи
Подробно эти критерии с формулами и таблицами можно посмотреть здесь.
Проверка на нормальность в R (источник)
Самый простой графический способ проверки характера распределения данных — построение гистограммы (с помощью функции hist() — это сделать несложно). Если гистограмма имеет колоколообразный симметричный вид, можно сделать заключение о том, что анализируемая переменная имеет примерно нормальное распределение. Однако при интерпретации гистограмм следует соблюдать осторожность, поскольку их внешний вид может сильно зависеть как от числа наблюдений, так и от шага, выбранного для разбиения данных на классы.
Другим очень часто используемым графическим способом проверки характера распределения данных является построение т.н. графиков квантилей (Q-Q plots, Quantile-Quantile plots). На таких графиках изображаются квантили двух распределений — эмпирического (т.е. построенного по анализируемым данным) и теоретически ожидаемого стандартного нормального распределения. При нормальном распределении проверяемой переменной точки на графике квантилей должны выстраиваться в прямую линию, исходящую под улом 45 градусов из левого нижнего угла графика. Графики квантилей особенно полезны при работе с небольшими по размеру совокупностями, для которых невозможно построить гистограммы, принимающие какую-либо выраженную форму.
В R для построения графиков квантилей можно использовать базовую функцию qqnorm(), которая в качестве основного аргумента принимает вектор со значениями анализируемой переменной.
x <- rnorm(500) # генерация нормально распределенной совокупности с n = 500
qqnorm(x)
Следует отметить, что интерпретация графиков квантилей при работе с небольшими выборками, происходящими из нормально распределенных генеральных совокупностей, требует определенного навыка. Дело в том, что при небольшом числе наблюдений точки на графике квантилей могут не всегда образовывать четко выраженную прямую линию. В качестве иллюстрации этого утверждения на следующем рисунке приведены графики квантилей для 5 случайным образом сгенерированных нормально распределенных выборок по 20 наблюдений каждая (если использованный в примере пакет DAAG у Вас не установлен, выполните команду install.packages(«DAAG»)):
library(DAAG)
qreference(m = 20, seed = 145, nrep = 5, nrows = 1)
Тесты проверки на нормальность в R
Существует целый ряд статистических тестов, специально разработанных для проверки нормальности распределения данных. В общем виде проверяемую при помощи этих тестов нулевую гипотезу можно сформулировать так: «Анализируемая выборка происходит из генеральной совокупности, имеющей нормальное распределение». Если получаемая при помощи того или иного теста вероятность ошибки Р оказывается меньше некоторого заранее принятого уровня значимости (например, 0.05), нулевая гипотеза отклоняется.
В R реализованы практически все имеющиеся тесты на нормальность — либо в виде стандарных функций, либо в виде функций, входящих в состав отдельных пакетов. Примером базовой функции является shapiro.test(), при помощи которой можно выполнить широко используемый тест Шапиро-Уилка:
shapiro.test(rnorm(500))
Shapiro-Wilk normality test
data: rnorm(500)
W = 0.9978, p-value = 0.7653 # P > 0.05 - нулевая гипотеза не отвергается
Основные классические критерии проверки на нормальность собраны в пакете nortest. Пакет можно установить с CRAN при помощи вызова функции install.packages():
> install.packages(pkgs=c("nortest"))
Подключить установленный пакет можно при помощи функции library():
> library(nortest)
Может возникнуть вопрос: «А зачем столько много разных критериев для проверки одного факта? Нельзя ли выбрать наилучший и всегда его использовать?». Ответ на этот вопрос не утешителен: «В общем случае, к сожалению, нельзя».
Критерий Лиллифорса
Критерий Лиллифорса (Lilliefors) является вариантом известного классического критерия Колмогорова-Смирнова, специально модифицированного для проверки нормальности. Эта модификация существенна. Для проверки гипотезы нормальности нельзя использовать классический непараметрический критерий Колмогорова-Смирнова, реализованный в функции ks.test(). Критерий Лиллифорса реализован в функции lillie.test():
> lillie.test(rnorm(100, mean = 6, sd = 4));
Lilliefors (Kolmogorov-Smirnov) normality test
data: rnorm(100, mean = 6, sd = 4)
D = 0.0463, p-value = 0.8621
> lillie.test(runif(100, min = 2, max = 4));
Lilliefors (Kolmogorov-Smirnov) normality test
data: runif(100, min = 2, max = 4)
D = 0.0732, p-value = 0.2089
Критерии Крамера-фон Мизеса и Андерсона-Дарлинга
Эти критерии менее известны, но обычно работают гораздо лучше, нежели критерий Лиллифорса. Они реализованы в функциях cvm.test() и ad.test() соответственно:
> cvm.test(rnorm(50, mean = 6, sd = 4));
Cramer-von Mises normality test
data: rnorm(50, mean = 6, sd = 4)
W = 0.0321, p-value = 0.8123
> ad.test(runif(50, min = 2, max = 4));
Anderson-Darling normality test
data: runif(50, min = 2, max = 4)
A = 1.5753, p-value = 0.0004118
Критерий Шапиро-Франсиа
Этот критерий работает достаточно хорошо в большинстве не очень «сложных» случаев. Получить p-значение можно посредством функции sf.test():
> sf.test(rexp(50, rate = 2));
Shapiro-Francia normality test
data: rexp(50, rate = 2)
W = 0.7803, p-value = 2.033e-06
Критерий хи-квадрат Пирсона
В отличие от задач проверки пропорций, критерий хи-квадрат обычно очень плохо работает в задачах проверки распределения на нормальность. Вероятность ошибки второго рода очень велика для достаточно широкого класса альтернативных распределений. В связи с этим, использовать его не рекомендуется. Тем не менее реализация его предоставлена функцией pearson.test(). У этой функции есть булевская опция adjusted, которая позволяет внести поправки в p-значение из-за наличия двух неизвестных параметров. Рекомендуемая последовательность действий такая: получить два p-значения, одно, соответствующее adjusted=TRUE, второе — adjusted=FALSE. Истинное p-значение обычно находится между. Кроме того, полезно поварьировать объем выборки и посмотреть, насколько сильно меняется p-значение. Если влияние объёма выборки сильное, то от использования критерия стоит отказаться во избежание ошибок.
> pearson.test(rnorm(50, mean = 6, sd = 4));
Pearson chi-square normality test
data: rnorm(50, mean = 6, sd = 4)
P = 5.2, p-value = 0.6356
> pearson.test(runif(50, min = -1, max = 1));
Pearson chi-square normality test
data: runif(50, min = -1, max = 1)
P = 7.6, p-value = 0.3692
Дополнительнаая информация: проверка на нормальность