Тест на нормальность необходим для статистического анализа, чтобы оценить, соответствует ли набор данных нормальному распределению. Многие статистические методы предполагают нормальность, и нарушение этого предположения может повлиять на достоверность результатов. Выполнив тест на нормальность, мы можем определить, соответствуют ли данные этому предположению, и решить, следует ли применять соответствующие статистические методы. Критерий Шапиро-Уилка является широко используемым критерием нормальности, а график Q-Q обеспечивает графическое представление отклонения данных от нормальности. Вместе они помогают оценить предположение о нормальности и направить дальнейший анализ и интерпретацию.
Я решил ручной расчет для понимания корня тестов нормальности с использованием программирования на Python.
- Импорт необходимых библиотек:
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%
корр_табулированный = 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)
Выход:
Мы не можем отвергнуть нулевую гипотезу. Следовательно, распределение не является нормальным