Тест на нормальность необходим для статистического анализа, чтобы оценить, соответствует ли набор данных нормальному распределению. Многие статистические методы предполагают нормальность, и нарушение этого предположения может повлиять на достоверность результатов. Выполнив тест на нормальность, мы можем определить, соответствуют ли данные этому предположению, и решить, следует ли применять соответствующие статистические методы. Критерий Шапиро-Уилка является широко используемым критерием нормальности, а график Q-Q обеспечивает графическое представление отклонения данных от нормальности. Вместе они помогают оценить предположение о нормальности и направить дальнейший анализ и интерпретацию.

Я решил ручной расчет для понимания корня тестов нормальности с использованием программирования на Python.

  1. Импорт необходимых библиотек:
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import scipy.stats as stats
from scipy.special import ndtri

2. Чтение набора данных и проверка первых 10 строк набора данных:

df = pd.read_csv("https://github.com/tarekujjaman/Data-Science/blob/main/Normality%20Test/Univariate%20Normality%20Test/univariate_data.csv")
df.head(10)

Выход:

3. Добавление нового столбца уровня вероятности [j — 0,5/n] для каждой строки последовательного столбца:

def add(row):
   return (row[0]-0.5)/len(df["Sl"])

df['prob_level'] = df.apply(add, axis=1)
print(df.head())

Выход:

4. Получение оценки Z для столбца prob_level:

stats.zscore(df["prob_level"].head(10))

Выход:

5. Расчет стандартных нормальных квантилей:

ndtri(df["prob_level"].head(10))

Выход:

6. Добавление нового столбца «Стандартный нормальный квантиль»:

df["Standard Normal Quantile"] = ndtri(df["prob_level"])
df.head(10)

Выход:

7. Расчет коэффициента корреляции:

corr_cal = df.corr().loc['Standard Normal Quantile', 'Ordered Radiation']
corr_cal

Выход:

0.927

Из критических точек для теста коэффициента корреляции графика QQ для таблицы нормальности

для n = 42, уровень значимости = 5%

Ссылка: http://www.dm.unibo.it/~simoncin/QQCritVal.pdf

корр_табулированный = 0,9749

8. Давайте проверим график QQ или график регрессии (стандартный нормальный квантиль против упорядоченного излучения) [значения должны быть отсортированы в порядке возрастания]:

sns.regplot(data = df,x=df["Ordered Radiation"].sort_values(), y=df["Standard Normal Quantile"].sort_values(),ci=None)

Выход:

Точки данных в основном находятся за пределами линии (45 градусов). Таким образом, увидев график, мы можем сказать, что данные не распределены нормально.

9. Проверка гипотез:

H0 = "Distribution is not normal"
Ha = "Distribution is normal"

if corr_cal > corr_tabulated:
    print("The null hypothesis is rejected. Hence",Ha)
else:
    print("We can't reject the null hypothesis. Hence",H0)

Выход:

Мы не можем отвергнуть нулевую гипотезу. Следовательно, распределение не является нормальным