рекомендации

вторник, 16 марта 2021 г.

Шесть способов проверки распределения на нормальность


Существует множество методов проверки того, соответствует ли переменная нормальному распределению. В этой статье вы узнаете, какой из них лучше использовать!

1. Гистограмма

1.1. Введение

Первый метод, который знает почти каждый, - это гистограмма. Гистограмма - это визуализация данных, которая показывает распределение переменной. Она дает нам частоту появления каждого значения в наборе данных, о чем и говорят распределения.

Гистограмма - отличный способ быстро визуализировать распределение отдельной переменной.

1.2. Интерпретация

На рисунке ниже две гистограммы показывают нормальное распределение и не нормальное распределение.
  • Слева очень небольшое отклонение распределения выборки (серым цветом) от теоретического распределения (красная линия).
  • Справа мы видим совершенно иную форму на гистограмме, прямо говорящую нам, что это не нормальное распределение.

Иногда отклонение от нормального распределения настолько очевидно, что его можно обнаружить визуально.

1.3. Реализация

Гистограмму можно легко создать в python следующим образом:

import pandas as pd
my_data = pd.Series([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 8, 6, 4, 2])
my_data.hist()

1.4. Вывод

Гистограмма - отличный способ быстро визуализировать распределение отдельной переменной.

2. Box Plot

2.1. Введение

Box Plot - это еще один метод визуализации, который можно использовать для обнаружения нестандартных выборок. Box Plot отображает 5-значную сводку переменной: минимум, первый квартиль, медиана, третий квартиль и максимум.

Box Plot - отличный способ визуализировать распределение нескольких переменных одновременно.

2.2 Интерпретация

Box Plot - отличная техника визуализации, поскольку она позволяет строить множество диаграмм рядом друг с другом. Этот очень быстрый обзор переменных дает нам представление о распределении и в качестве «бонуса» мы получаем полную сводку из пяти чисел, которая поможет нам в дальнейшем анализе.

Вы должны обратить внимание на две вещи:
  • Является ли распределение симметричным (как и нормальное распределение)?
  • Соответствует ли ширина ширине нормального распределения? Это трудно увидеть на Box Plot.


Нормальный (слева), равномерный (в центре) и экспоненциальный (справа) Box Plot по сравнению с нормальной колоколообразной кривой

2.3. Реализация

Boxplot можно легко реализовать в Python следующим образом:

import pandas as pd
my_data = pd.Series([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 8, 6, 4, 2])
my_data.plot(kind = 'box')

Создание Boxplot с использованием pandas в Python

2.4. Вывод

Boxplot - отличный способ визуализировать распределения нескольких переменных одновременно, но отклонение в ширине трудно определить с помощью Boxplot.

3. График QQ

3.1. Введение

С графиками QQ мы начинаем переходить к более серьезным вещам, так как он требует немного большего понимания, чем ранее описанные методы.

QQ Plot расшифровывается как Quantile vs Quantile Plot, что он и представляет: построение теоретических квантилей против фактических квантилей нашей переменной.

График QQ позволяет нам увидеть отклонение от нормального распределения намного лучше, чем на гистограмме или прямоугольной диаграмме.

3.2. Интерпретация

Если наша переменная подчиняется нормальному распределению, квантили нашей переменной должны полностью соответствовать «теоретическим» нормальным квантилям: прямая линия на графике QQ говорит нам, что у нас нормальное распределение.


Нормальный (слева), равномерный (в центре) и экспоненциальный (справа) графики QQ

Как видно на рисунке, точки на нормальном графике QQ следуют прямой линии, тогда как другие распределения сильно отклоняются от нее.
  • Равномерное распределение имеет слишком много наблюдений в обоих концах (очень высокие и очень низкие значения).
  • Экспоненциальное распределение имеет слишком много наблюдений для более низких значений, но слишком мало для более высоких значений.
На практике мы часто видим что-то менее выраженное, но похожее по форме. избыток или недостаток точек в хвосте должен вызывать сомнения в нормальности, и в этом случае вам следует использовать один из тестов гипотез, описанных ниже.

3.3. Реализация

Реализовать график QQ можно с помощью api statsmodels в python следующим образом:

import statsmodels.api as sm
from scipy.stats import norm
import pylab

my_data = norm.rvs(size=1000)
sm.qqplot(my_data, line='45')
pylab.show()

Создание графика QQ с использованием statsmodels

3.4. Вывод

График QQ позволяет нам увидеть отклонение от нормального распределения намного лучше, чем на гистограмме или прямоугольной диаграмме.

4. Тест Колмогорова Смирнова.

4.1. Введение

Если график QQ и другие методы визуализации не дают окончательных результатов, статистический вывод (проверка гипотез) может дать более объективный ответ на вопрос, существенно ли отклоняется наша переменная от нормального распределения.

Если у вас есть сомнения относительно того, как и когда использовать проверку гипотез, вот статья, которая дает интуитивное объяснение проверке гипотез.

Тест Колмогорова-Смирнова вычисляет расстояния между эмпирическим распределением и теоретическим распределением и определяет статистику теста как верхнюю границу набора этих расстояний.

Преимущество его заключается в том, что тот же подход можно использовать для сравнения любого распределения, не обязательно только нормального распределения.

Тест KS хорошо известен, но не обладает большой мощностью. Его можно использовать для других распределений, кроме нормального.

4.2. Интерпретация

Тестовая статистика KS - это статистика Колмогорова-Смирнова, которая следует распределению Колмогорова, если нулевая гипотеза верна.

Если наблюдаемые данные полностью соответствуют нормальному распределению, значение статистики KS будет равно 0. Значение P используется, чтобы решить, достаточно ли велика разница, чтобы отклонить нулевую гипотезу:
  • Если значение P теста KS больше 0,05, мы предполагаем нормальное распределение.
  • Если значение P теста KS меньше 0,05, мы не предполагаем нормального распределения.
4.3. Реализация

Тест KS на Python с использованием Scipy может быть реализован следующим образом. Он возвращает статистику KS и ее P-значение.

from scipy.stats import kstest, norm
my_data = norm.rvs(size=1000)
ks_statistic, p_value = kstest(my_data, 'norm')
print(ks_statistic, p_value)

Реализация теста KS в Python с использованием Scipy

4.4. Вывод

Тест KS хорошо известен, но не обладает большой мощностью. Это означает, что необходимо большое количество наблюдений, чтобы отвергнуть нулевую гипотезу. Он также чувствителен к выбросам. С другой стороны, его можно использовать для других типов распределений.

5. Тест Лиллиэфорса

5.1. Введение

Тест Лиллиэфорса основан на тесте KS. Разница в том, что в тесте Лиллиэфорса принято, что среднее и дисперсия распределения совокупности рассчитывается, а не задается пользователем заранее.

По этой причине в тесте Лиллиэфорса используется распределение Лиллиэфорса, а не распределение Колмогорова.

К сожалению для Lilliefors, его мощность все еще ниже, чем у теста Шапиро Уилка.

5.2. Интерпретация
  • Если значение P теста Лиллиэфорса больше 0,05, мы предполагаем нормальное распределение.
  • Если значение P теста Лиллиэфорса меньше 0,05, мы не предполагаем нормального распределения.
5.3. Реализация

Реализация теста Lilliefors в statsmodels вернет значение статистики теста Lilliefors и P-Value следующим образом.

Внимание: в реализации statsmodels P-значения ниже 0,001 сообщаются как 0,001, а P-значения выше 0,2 сообщаются как 0,2.

from scipy.stats import norm
from statsmodels.stats.diagnostic import lilliefors
my_data = norm.rvs(size=500)
lilliefors(my_data)

Реализация теста Лиллиэфорса с использованием statsmodels

5.4. Вывод

Хотя Lilliefors является улучшением теста KS, его мощность все же ниже, чем у теста Шапиро Уилка.

6. Тест Шапиро Уилка.

6.1. Введение

Тест Шапиро Уилка - самый мощный тест при проверке нормального распределения. Он был разработан специально для нормального распределения и не может использоваться для тестирования с другими распределениями, как, например, тест KS.

Тест Шапиро Уилка - самый мощный тест при проверке нормальности распределения.

6.2. Интерпретация
  • Если значение P теста Шапиро Уилка больше 0,05, мы предполагаем нормальное распределение.
  • Если значение P теста Шапиро Уилка меньше 0,05, мы не предполагаем нормального распределения.
6.3. Реализация

Тест Шапиро Уилка можно реализовать следующим образом. Он вернет тестовую статистику под названием W и P-Value.

Внимание: для N> 5000 статистика теста W верна, но значение p может быть неверным.

from scipy.stats import norm
from statsmodels.stats import shapiro
my_data = norm.rvs(size=500)
shapiro(my_data)

Реализация теста Шапиро Уилка с использованием statsmodels в Python

6.4. Вывод

Тест Шапиро Уилка - самый мощный тест при проверке нормальности распределения. Вам обязательно стоит воспользоваться этим тестом.

7. Вывод - какой подход использовать!

Для быстрой и визуальной идентификации нормального распределения используйте график QQ, если у вас есть только одна переменная, и Boxplot, если у вас их много. Используйте гистограмму, если вам нужно представить свои результаты публике.

В качестве статистического теста для подтверждения вашей гипотезы используйте тест Шапиро Уилка. Это лучший тест, который должен стать решающим аргументом.

При тестировании с другими распределениями вы не можете использовать тест Шапиро Уилка и должны использовать, например, тест Андерсона-Дарлинга или тест KS.

Комментариев нет:

Отправить комментарий