Перейти к основному содержимому

Тест на нормальность: как проверить, распределены ли ваши данные нормально

Узнайте, что такое тест на нормальность, зачем он нужен и как использовать популярные методы — Шапиро—Уилка, Колмогорова—Смирнова и визуальные проверки — на примерах в Python и R.
Обновлено 4 мая 2026 г.  · 14 мин читать

Бывало ли, что вы провели t-тест, получили аккуратное p-значение и только потом вспомнили, что так и не проверили, нормально ли распределены данные?

Статистические тесты не сообщают о нарушении своих предпосылок — они просто выдают значение. Проблема в том, что такие тесты, как t-тесты и ANOVA, предполагают нормальное распределение данных. Если это не так, вы строите выводы на шатком основании.

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

В этой статье я разберу самые распространенные визуальные и статистические методы проверки нормальности, покажу, как запускать их в Python и R, и объясню, что делать, если данные не проходят проверку.

Что такое нормальное распределение на практике

Вы наверняка видели колокол — но вот что он означает для ваших данных.

Нормальное распределение — это такой профиль, при котором большинство значений сосредоточено вокруг центра, а по мере удаления влево или вправо наблюдается все меньше значений. На графике это симметричная, колоколообразная кривая: левая часть зеркально отражает правую.

Normal distribution plot

График нормального распределения

Особенность нормального распределения в том, что среднее, медиана и мода совпадают в одной точке — центре «колокола». Смещения влево или вправо нет. Иными словами, данные сбалансированы.

Такое поведение постоянно встречается в реальных измерениях. Рост человека, показатели артериального давления, допуски в производстве, результаты тестов — все это при достаточно большом числе наблюдений обычно тяготеет к нормальному распределению. Естественная вариативность биологических и физических систем часто дает именно такую форму.

При этом не все данные так себя ведут. Доходы скошены вправо. Время отклика сайтов имеет длинные хвосты.

В реальном мире все может пойти наперекосяк, если вы предполагаете нормальность, не проверяя ее.

Зачем важно проверять нормальность

Проблема отказа от проверки нормальности в том, что большинство распространенных статистических тестов — t-тесты, ANOVA — это параметрические тесты.

Это значит, что они основаны на предположениях о распределении данных. Нормальность — одно из них. Когда предпосылка нарушается, ломается и математика теста. Результат вы все равно получите, но он может привести к неверным выводам.

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

Вот тут и пригодятся непараметрические тесты.

Тесты Манна—Уитни или Краскела—Уоллиса не предполагают нормальности — они работают с рангами, а не с исходными значениями. Они гибче, но при нормально распределенных данных обычно менее эффективны. Поэтому переходить на них без необходимости — не выход.

Главная ошибка многих начинающих в Data Science — совсем пропускать проверку.

Проверка нормальности — это несколько строк кода. Если вы ее не делаете, значит либо безоговорочно доверяете данным, либо вообще о них не думаете.

Визуальные методы проверки нормальности

Прежде чем запускать формальные тесты, постройте графики. Визуализация многое скажет о ваших данных.

Гистограмма

Гистограмма показывает форму распределения.

Example histogram

Пример гистограммы

Если данные нормально распределены, гистограмма будет похожа на «колокол» — высокая в центре и симметрично сужающаяся к краям. Обращайте внимание на асимметрию (skewness): длинный правый хвост — положительная асимметрия, левый — отрицательная. В обоих случаях это признак ненормальности.

Проблема гистограмм в том, что форма зависит от размера бинов:

  • Слишком мало бинов — распределение выглядит плоским
  • Слишком много — кривая «зубчатая»

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

Q-Q график

Q-Q график (quantile-quantile) сравнивает квантили ваших данных с квантилями теоретического нормального распределения.

Example Q-Q plot

Пример Q-Q графика

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

Q-Q графики точнее гистограмм в обнаружении тонких отклонений от нормальности — особенно в хвостах, где гистограммы часто «не видят» проблем.

Диаграмма размаха (box plot)

Диаграмма размаха показывает медиану, разброс и выбросы в одном окне.

Пример диаграммы размаха

При нормальном распределении медиана располагается примерно по центру «коробки», а «усы» имеют примерно равную длину. Если медиана смещена или один «ус» заметно длиннее другого — это асимметрия. Точки за пределами «усов» — выбросы.

Общая проблема визуализаций — субъективность. Двое могут по-разному истолковать одну и ту же гистограмму. Используйте графики, чтобы сначала «почувствовать» данные, а затем подтвердите выводы формальным тестом.

Распространенные тесты на нормальность

Нет единственного лучшего теста на нормальность для всех случаев. Выбор зависит от объема выборки и того, что вы хотите обнаружить.

Критерий Шапиро—Уилка

Критерий Шапиро—Уилка — базовый выбор для малых и средних выборок, обычно до нескольких сотен наблюдений.

Он измеряет, насколько ваши данные соответствуют нормальному распределению, сравнивая наблюдаемые значения с ожидаемыми при нормальности. Широко используется, хорошо изучен и доступен в большинстве библиотек. Для большинства аналитиков — это первый тест, к которому стоит обратиться.

Главное ограничение — избыточная чувствительность на больших выборках: он помечает крошечные, практически незначимые отклонения как статистически значимые.

Критерий Колмогорова—Смирнова

Критерий Колмогорова—Смирнова (KS) сравнивает эмпирическое накопленное распределение выборки с теоретическим — в нашем случае с нормальным.

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

Используйте его как быстрый общий чек — но не как основной тест на нормальность.

Критерий Андерсона—Дарлинга

Критерий Андерсона—Дарлинга — вариация KS-теста с одним ключевым отличием: он сильнее «взвешивает» хвосты распределения.

Благодаря этому он лучше улавливает отклонения на краях — тяжелые хвосты, выбросы или иные ненормальные эффекты, которые KS может пропустить. Если для вашей задачи критично поведение хвостов, Андерсон—Дарлинг — хороший выбор.

Критерий Д’Агостино—Пирсона

Критерий Д’Агостино—Пирсона использует иной подход.

Вместо прямого сравнения распределений он оценивает две характеристики данных: асимметрию (skewness) и эксцесс (kurtosis — «тяжесть» хвостов).

Обе метрики объединяются в единый статистический показатель. Это помогает понять не только факт ненормальности, но и ее природу. Лучше работает на больших выборках, где оценки асимметрии и эксцесса надежнее.

Критерий Жарке—Бера

Критерий Жарке—Бера также опирается на асимметрию и эксцесс, как и Д’Агостино—Пирсона.

Распространен в эконометрике и анализе временных рядов. Как и Д’Агостино—Пирсона, требует достаточно большой выборки для надежных результатов. На малых выборках тест ненадежен. Если вы работаете в финансах или экономике, вы часто встретите этот критерий.

Итого: используйте Шапиро—Уилка для малых выборок и сочетайте его с Q-Q графиком. Применяйте Андерсона—Дарлинга, когда важны хвосты, и Д’Агостино—Пирсона — когда нужно понять характер отклонения.

Как интерпретировать результаты тестов на нормальность

Любой тест на нормальность — это проверка гипотез.

Нулевая гипотеза в таких тестах гласит, что ваши данные распределены нормально. Тест задает вопрос: насколько вероятно, что нулевая гипотеза верна, исходя из наблюдаемых данных?

Ответ возвращается в виде p-значения:

  • p > 0,05 — недостаточно оснований отвергнуть нормальность. Считайте данные нормальными и используйте параметрические тесты
  • p < 0,05 — отклонение от нормальности статистически обнаружимо. Отклоняйте предположение о нормальности

Звучит просто, но здесь часто ошибаются.

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

Существует и обратная проблема. На малых выборках даже явно скошенные данные могут дать p > 0,05 — у теста просто не хватит мощности зафиксировать отклонение.

Статистическая значимость и практическая значимость — не одно и то же.

P-значение говорит, есть ли отступление от нормальности. Оно не говорит, важно ли это отступление для вашей конкретной задачи. Всегда сопоставляйте результат теста с Q-Q графиком: если точки близко следуют линии, ваши данные, вероятно, «достаточно нормальны» — независимо от p-значения.

Тесты на нормальность в Python

Модуль Python scipy.stats содержит все необходимое, чтобы запускать тесты на нормальность в несколько строк.

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

import numpy as np
from scipy import stats

np.random.seed(42)
data = np.random.normal(loc=0, scale=1, size=100)

Критерий Шапиро—Уилка

Используйте shapiro() как первую проверку, особенно для малых наборов данных.

stat, p_value = stats.shapiro(data)
print(f"Statistic: {stat:.4f}, p-value: {p_value:.4f}")

Вы получите примерно следующее:

Output of a Shapiro-Wilk’s test in Python

Вывод критерия Шапиро—Уилка в Python

P-значение значительно выше 0,05, поэтому мы не отвергаем нормальность. Данные выглядят нормальными — что логично, ведь мы сгенерировали их из нормального распределения.

Критерий Колмогорова—Смирнова

kstest() сравнивает выборку с именованным распределением. Для нормальности передайте "norm" вместе со средним и стандартным отклонением выборки.

stat, p_value = stats.kstest(data, 'norm', args=(data.mean(), data.std()))
print(f"Statistic: {stat:.4f}, p-value: {p_value:.4f}")

Output of a Kolmogorov-Smirnov test in Python

Вывод критерия Колмогорова—Смирнова в Python

Снова p > 0,05 — нет оснований против нормальности.

В этом тесте на Python всегда явно передавайте среднее и стандартное отклонение через args. Если пропустить, kstest() возьмет стандартное нормальное (mean=0, std=1), и результат будет ненадежным, если данные не стандартизованы.

Критерий Д’Агостино—Пирсона

normaltest() проверяет нормальность по совокупности асимметрии и эксцесса. Лучше подходит для больших выборок.

stat, p_value = stats.normaltest(data)
print(f"Statistic: {stat:.4f}, p-value: {p_value:.4f}")

Output of a D'Agostino-Pearson test in Python

Вывод критерия Д’Агостино—Пирсона в Python

Снова p > 0,05. Данные проходят все три теста — ожидаемо, ведь они сгенерированы нормальными. На практике тесты часто расходятся, особенно около порога 0,05. В таких случаях опирайтесь на Q-Q график.

Тесты на нормальность в R

В R есть встроенные функции для проверки нормальности — для базовых проверок дополнительные пакеты не нужны.

Как и в примерах на Python, я использую один и тот же набор данных: 100 значений из нормального распределения.

set.seed(42)
data <- rnorm(100, mean = 0, sd = 1)

Критерий Шапиро—Уилка

shapiro.test() — лучший выбор для малых и средних выборок. Просто передайте вектор данных:

shapiro.test(data)

Output of a Shapiro-Wilk’s test in R

Вывод критерия Шапиро—Уилка в R

p > 0,05 — нет оснований против нормальности. Статистика W принимает значения от 0 до 1; близость к 1 указывает на хорошее соответствие нормальному распределению.

Критерий Колмогорова—Смирнова

ks.test() сравнивает выборку с теоретическим распределением. Для нормальности укажите "pnorm" и передайте среднее и стандартное отклонение выборки.

ks.test(data, "pnorm", mean(data), sd(data))

Output of a Kolmogorov-Smirnov test in R

Вывод критерия Колмогорова—Смирнова в R

Снова p > 0,05. То же предостережение, что и в Python: всегда передавайте mean(data) и sd(data). Иначе по умолчанию будет использовано стандартное нормальное распределение, и результат исказится, если данные не стандартизованы.

Q-Q график

Встроенные функции R qqnorm() и qqline() строят Q-Q график в две строки кода.

qqnorm(data, main = "Q-Q Plot")
qqline(data, col = "steelblue", lwd = 2)

Q-Q plot in R

Q-Q график в R

qqnorm() строит квантили выборки против теоретических квантилей нормального распределения. qqline() добавляет опорную линию. Если точки близко следуют линии, данные ведут себя нормально. Отклонения на концах сигнализируют о проблемах в хвостах, которые стоит изучить.

Что делать, если данные не нормальны

Если данные не проходят тест на нормальность, у вас есть несколько надежных вариантов.

Преобразовать данные

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

Логарифмическое преобразование — самый распространенный выбор. Хорошо работает для правоскошенных данных — доходов, времен отклика, биологических измерений с длинным правым хвостом. В Python используйте np.log(data), в R — log(data).

Квадратный корень — более мягкое преобразование при умеренной асимметрии и удобно, когда в данных есть нули (логарифм от нуля не берется). В Python — np.sqrt(data), в R — sqrt(data).

После преобразования повторно проверьте нормальность. Если преобразованные данные проходят тест, используйте параметрические методы — только не забудьте интерпретировать результаты в преобразованной шкале.

Использовать непараметрические тесты

Если преобразование не помогает или неуместно, переходите на непараметрические тесты. Они не предполагают нормальности — работают с рангами вместо исходных значений.

  • Критерий Манна—Уитни — альтернатива непараметрическому t-тесту для независимых выборок. Используйте при сравнении двух групп
  • Критерий Краскела—Уоллиса — непараметрический аналог однофакторной ANOVA. Применяйте при сравнении трех и более групп

Оба теста доступны в scipy.stats (mannwhitneyu() и kruskal()) и в базовом R (wilcox.test() и kruskal.test()).

Опираться на большие выборки

При достаточно больших выборках вопрос нормальности часто можно опустить.

Центральная предельная теорема говорит, что по мере роста объема выборки распределение среднего стремится к нормальному — независимо от исходного распределения данных. На практике это означает, что параметрические тесты обычно надежны на больших выборках, даже если исходные данные не идеально нормальны.

Типичные ошибки при проверке нормальности

Проверять нормальность просто — как вы видели, это одна строка кода. Но и тут легко ошибиться.

Вот частые промахи начинающих специалистов по данным:

  • Опора только на p-значения: p-значение говорит о факте обнаружения отклонения от нормальности, но не о его величине и практической значимости. Воспринимать p > 0,05 как «зеленый свет», а p < 0,05 как «красный» — слишком грубо. Всегда дополняйте результат теста Q-Q графиком
  • Игнорирование влияния объема выборки: на малых выборках тесты могут не обнаружить реальные отклонения и вернуть p > 0,05, даже если данные явно скошены. На больших — становятся столь чувствительными, что помечают крошечные, незначимые отклонения как статистически значимые. Объем выборки меняет смысл p-значения
  • Чрезмерное тестирование нормальности: не каждый анализ требует формального теста. Для разведочного этапа обычно достаточно гистограммы и Q-Q графика
  • Неверная трактовка легких отклонений: реальные данные почти никогда не идеальны. Небольшой отступ от опорной линии на Q-Q графике или p-значение чуть ниже 0,05 не означает «сильную ненормальность». Вопрос в том, «достаточно ли нормальны» данные для применяемого теста

Итого: проверка нормальности — это всего лишь один из элементов контроля данных. Используйте ее как один из входов, а не как окончательный вердикт.

Когда можно пропустить проверку нормальности

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

Большие наборы данных

При большом объеме выборки центральная предельная теорема гарантирует, что распределение среднего приблизится к нормальному независимо от формы исходных данных. В такой ситуации параметрические тесты, как правило, надежны, а формальная проверка нормальности мало что добавляет.

Некоторые методы также устойчивы к ненормальности. Например, линейная регрессия обычно «держится» при разумных размерах выборки и неэкстремальных нарушениях. (Линейная регрессия все же предполагает нормальность остатков.)

Разведочный анализ

Когда вы ищете паттерны, формируете интуицию или решаете, какие переменные изучать дальше, достаточно быстрой гистограммы или Q-Q графика. Формальные тесты — для подтверждающего анализа, когда выводы должны «держать удар».

Помните: проверка нормальности нужна, чтобы уберечь вас от неверных выводов. Если цена ошибки невелика или ваш метод не зависит от нормальности, тест необязателен.

Выводы

Проверка нормальности — это про уверенность в том, что ваши предпосылки достаточно соблюдаются, чтобы доверять результатам.

Ни один датасет не идеален. Цель — понять поведение данных и выбрать соответствующие методы. Q-Q график показывает, где именно отклонения; формальный тест — обнаружимы ли они статистически. Вместе они дают более ясную картину, чем по отдельности.

Выбор теста зависит от контекста. Используйте Шапиро—Уилка для малых выборок, Андерсона—Дарлинга — когда важны хвосты, непараметрические альтернативы — когда нормальность предположить нельзя. А иногда — при больших выборках или устойчивых методах — тест и вовсе не нужен.

Считаете p-значения запутанными? Прочитайте нашу статью «Проверка гипотез без боли», чтобы правильно их интерпретировать.

Частые вопросы о тестах на нормальность

Что такое тест на нормальность?

Тест на нормальность — это статистический метод, который проверяет, следуют ли ваши данные нормальному (гауссовскому) распределению. Большинство распространенных статистических тестов — t-тесты, ANOVA и линейная регрессия — предполагают нормальность, поэтому проверка этого предположения до анализа помогает избежать неверных выводов.

Нужно ли всегда проверять нормальность?

Не всегда. На больших выборках центральная предельная теорема делает параметрические тесты надежными независимо от исходного распределения. Для разведочного анализа обычно достаточно гистограммы или Q-Q графика — формальные тесты на нормальность особенно полезны при подтверждающем анализе, когда выводы должны быть устойчивыми.

Что делать, если данные не проходят тест на нормальность?

Есть несколько вариантов. Можно преобразовать данные логарифмом или квадратным корнем и повторить проверку. Если преобразование не помогает, переходите на непараметрические тесты — например, Манна—Уитни (для двух групп) или Краскела—Уоллиса (для трех и более групп), которые не предполагают нормальности.

В чем разница между критериями Шапиро—Уилка и Колмогорова—Смирнова?

Шапиро—Уилка специально предназначен для проверки нормальности и лучше работает на малых и средних выборках. Критерий Колмогорова—Смирнова более общий — он сравнивает выборку с любым теоретическим распределением, а не только с нормальным, — но именно для проверки нормальности он менее мощный и чаще пропускает тонкие отклонения.

Как интерпретировать Q-Q график при проверке нормальности?

Q-Q график сравнивает квантили ваших данных с квантилями теоретического нормального распределения. Если точки ложатся близко к диагональной опорной линии, данные ведут себя нормально. Отклонения на концах линии указывают на проблемы в хвостах: S-образная форма — признак асимметрии, а изгибы от линии на обоих концах — на более тяжелые или более легкие хвосты по сравнению с нормальным распределением.

Темы

Учитесь с DataCamp

Course

Understanding Data Science

2 ч
845.3K
An introduction to data science with no coding involved.
ПодробнееRight Arrow
Начать курс
Смотрите большеRight Arrow