🧪 Как проверить распределение на нормальность с использованием Python
Для проверки распределения на нормальность в Python можно воспользоваться различными методами. Вот несколько вариантов:
1. Использование библиотеки scipy:
import scipy.stats as stats
def check_normality(data):
p_value = stats.normaltest(data).pvalue
if p_value < 0.05:
return "Распределение не является нормальным"
else:
return "Распределение является нормальным"
2. Использование библиотеки statsmodels:
import statsmodels.api as sm
def check_normality(data):
_, p_value = statsmodels.stats.stattools.jarque_bera(data)
if p_value < 0.05:
return "Распределение не является нормальным"
else:
return "Распределение является нормальным"
3. Использование графических методов:
import seaborn as sns
def check_normality(data):
sns.distplot(data, fit=stats.norm)
if sns.distplot(data, fit=stats.norm):
return "Распределение не является нормальным"
else:
return "Распределение является нормальным"
Детальный ответ
Как проверить распределение на нормальность в Python
В статистике существует множество методов для проверки распределения на нормальность. В этой статье мы рассмотрим несколько из них и покажем примеры кода на языке Python.
1. Тест Шапиро-Уилка
Тест Шапиро-Уилка является одним из самых популярных тестов на нормальность. Он основан на сравнении эмпирической функции распределения (ЭФР) с теоретической функцией распределения для нормального распределения. Если принимается нулевая гипотеза о нормальности, то p-value будет больше 0.05.
from scipy.stats import shapiro
def check_normality(data):
stat, p_value = shapiro(data)
if p_value > 0.05:
print("Распределение является нормальным.")
else:
print("Распределение не является нормальным.")
2. Тест Д'Агостино-Пирсона
Тест Д'Агостино-Пирсона основан на сравнении значения коэффициента асимметрии и эксцесса с их ожидаемыми значениями для нормального распределения.
from scipy.stats import normaltest
def check_normality(data):
stat, p_value = normaltest(data)
if p_value > 0.05:
print("Распределение является нормальным.")
else:
print("Распределение не является нормальным.")
3. QQ-график
QQ-график (квантиль-квантиль график) - это график, который позволяет визуально сравнить квантили наблюдаемого распределения с квантилями теоретического распределения (нормального распределения в данном случае).
import numpy as np
import matplotlib.pyplot as plt
def plot_qq(data):
mean, std = np.mean(data), np.std(data)
z_scores = (data - mean) / std
sorted_z_scores = np.sort(z_scores)
theoretical_quantiles = norm.ppf(np.linspace(0.01, 0.99, len(data)))
plt.scatter(theoretical_quantiles, sorted_z_scores)
plt.plot([np.min(theoretical_quantiles), np.max(theoretical_quantiles)], [np.min(theoretical_quantiles), np.max(theoretical_quantiles)], color='red')
plt.xlabel("Теоретические квантили")
plt.ylabel("Наблюдаемые квантили")
plt.title("QQ-график")
plt.show()
4. Тест Колмогорова-Смирнова
Тест Колмогорова-Смирнова используется для проверки согласия эмпирической функции распределения с теоретической функцией распределения.
from scipy.stats import kstest
def check_normality(data):
stat, p_value = kstest(data, 'norm')
if p_value > 0.05:
print("Распределение является нормальным.")
else:
print("Распределение не является нормальным.")
5. Гистограмма и ядерная оценка плотности
Еще один способ визуально оценить нормальность распределения - построить гистограмму и ядерную оценку плотности.
import numpy as np
import seaborn as sns
def plot_histogram(data):
sns.histplot(data, kde=True)
plt.xlabel("Значения")
plt.ylabel("Частота")
plt.title("Гистограмма и оценка плотности")
plt.show()
Вывод
В этой статье были рассмотрены несколько методов для проверки распределения на нормальность в Python. Тесты Шапиро-Уилка и Д'Агостино-Пирсона позволяют численно оценить нормальность распределения, QQ-график позволяет визуально оценить согласие с теоретическим распределением, а тест Колмогорова-Смирнова позволяет проверить согласие эмпирической функции распределения с теоретической функцией распределения. Также был показан способ построения гистограммы и ядерной оценки плотности для визуальной оценки нормальности распределения.