Преобразование Бокса-Кокса, тест Шапиро-Уилка, график QQ

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

Что я должен делать? Должен ли я преобразовать переменную? Снять с модели или просто оставить?

Мне всегда интересно, является ли нормальность необходимым допущением и как с этим бороться. Эта статья обо всем этом.

Итак, необходимо ли придерживаться предположения о нормальности для независимых и зависимых переменных? Ответ отрицательный!

Переменная, которая должна быть нормально распределена, - это просто ошибка прогноза. Что такое ошибка предсказания? Это отклонение результатов прогноза модели от реальных результатов.

Y = коэффициент * X + точка пересечения + ошибка прогнозирования

Ошибка прогноза должна соответствовать нормальному распределению со средним значением 0. Расчет доверительного интервала и значимости переменной основан на этом предположении. Что это значит? Например, вы пытаетесь проанализировать, какие переменные полезны для прогнозирования цен на жилье, и вы выбрали факторы на основе 5% уровня значимости. Если распределение ошибок значительно отклоняется от среднего нормального распределения 0, факторы, которые вы выбираете как значимые, могут на самом деле не быть достаточно значительными, чтобы способствовать изменениям цен на жилье. Однако это не повлияет на ваш прогноз, если вы просто хотите получить прогноз, основанный на наименьшей среднеквадратической ошибке.

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

Я создал 1 образец случайного нормального распределения и 1 образец с ненормальным распределением для лучшей иллюстрации, и каждый из них содержит 1000 точек данных.

#create normal and nonnormal data sample
import numpy as np
from scipy import stats
sample_normal=np.random.normal(0,5,1000)
sample_nonnormal=x = stats.loggamma.rvs(5, size=1000) + 20

Есть много способов проверить нормальность данных, ниже приведены лишь некоторые примеры:

  1. Просто постройте кривую распределения и посмотрите, соответствует ли график форме колоколообразной кривой. Ненормальная выборка явно левосторонняя.
import seaborn as sns
import matplotlib.pyplot as plt
sns.distplot(sample_normal)
plt.show()
sns.distplot(sample_nonnormal)
plt.show()

2. Используйте тест Шапиро-Уилка, доступную встроенную библиотеку Python, и вы можете решить, основываясь на выбранном вами значении p, обычно мы отклоняем H0 на уровне значимости 5%, что означает, что если значение p больше 0,05, то мы примите это как нормальное распределение. Обратите внимание, что если размер выборки превышает 5000, вы должны использовать тестовую статистику вместо p-значения в качестве индикатора для принятия решения.

print (stats.shapiro(sample_normal))
print (stats.shapiro(sample_nonnormal))
#Test Statistics, p-value
#(0.9970424175262451, 0.06130971387028694) - H0 accepted
#(0.9806660413742065, 2.945287624900317e-10) - H0 rejected

3. QQ-plot, очень популярный график, чтобы увидеть, соответствует ли распределение данных нормальному распределению.

fig = sm.qqplot(sample_normal,line='s')
plt.show()
fig = sm.qqplot(sample_nonnormal,line='s')
plt.show()

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

Обычно эта проблема возникает по 2 причинам (ошибка не соответствует нормальному распределению):

  1. Зависимые или независимые переменные слишком ненормальны (это видно по асимметрии или эксцессу переменной)
  2. Наличие нескольких выбросов / экстремальных значений, которые нарушают прогноз модели.

Что нам нужно сделать, так это сначала проверить наличие выбросов как в зависимых, так и в независимых переменных. Если удаление выброса не решает проблему, то мы должны преобразовать некоторые ненормальные переменные, чтобы они были нормально распределены, используя преобразование box-cox.

Ниже приведена математическая формула преобразования Бокса-Кокса. Значение лямбда будет определено на основе точек данных, чтобы обеспечить наилучшую форму нормального распределения после преобразования. Мы можем напрямую использовать пакет Python, чтобы помочь нам преобразовать данные.

#transform the data using box-cox
sample_transformed, lambd = stats.boxcox(sample_nonnormal)
#plot the distribution curve and QQ-plot for transformed data
sns.distplot(sample_transformed)
plt.show()
fig = sm.qqplot(sample_transformed,line='s')
plt.show()

Мы можем видеть, что после преобразования box-cox, ненормально распределенная выборка имеет нормальное распределение.

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

Как вы думаете, вы, наконец, закончили со всеми проверками со статистическими допущениями перед построением модели? Нет! Если вы хотите узнать больше о других статистических допущениях в регрессионной модели, обратитесь к другой моей статье о мультиколлинеарности ниже.