Вы подписаны на Машинное обучение доступно
Отлично! завершите оплату для полного доступа к Машинное обучение доступно
Снова приветствуем Вас! Вы успешно авторизовались
Успех! Аккаунт активирован, и Вы имеете полный доступ к контенту.
Нормальное распределение (Normal Distribution)

Нормальное распределение (Normal Distribution)

in

Нормальное распределение (распределением Гаусса или Гаусса — Лапласа) – распространенная разновидность непрерывного распределения вероятностей для случайной величины.

Помните колоколообразную кривую? Вот эту:

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

Нормальное распределение – это ключевая концепция Статистики (Statistics) и основа Науки о данных (Data Science). При выполнении Разведочного анализа данных (EDA) мы сначала стремимся найти их распределение вероятностей, и наиболее распространенный ее вид – нормальное распределение.

Посмотрите на распределение вероятностей окупить инвестиции в фондовый индекс S&P 500:

Да-да, вероятность "выйти в ноль" выше остальных! Также справедливо утверждение, что вероятность потерять больше как бы тает вместе с отрицательным процентом возврата. Белой непрерывной линией обозначено предсказание кривой нормального распределения. Прочие наблюдения, такие как вес при рождении и показатель IQ, часто следуют нормальному распределению подобным образом.

Еще одна причина, по которой нормальное распределение становится важным для Дата-сайентистов (Data Scientist) – это Центральная предельная теорема (Central Limit Theorem). Эта теорема объясняет магию математики и является основой методов проверки гипотез.

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

Свойства нормального распределения

Кривая стандартного нормального распределения симметрична относительно Среднего арифметического (Mean), Медианы (Median) и Моды (Mode). Более того, также являются нормальным распределением произведение двух нормальных распределений и их сумма. Магия, не правда ли? Существуют и другие, более сложные закономерности, пока обойдемся самыми понятными.

Эмпирическое правило

Вы слышали об эмпирическом правиле? Оно часто используется в статистике и гласит: "68,27% наблюдений случайной Выборки (Sample) лежат в пределах одного Стандартного отклонения (Standard Deviation), 95,45% – в пределах двух, а 99,73 – в пределах трех стандартных отклонений от среднего":

Это правило позволяет нам идентифицировать Выбросы (Outlier) и очень полезно при Проверке на нормальность (Normality Test).

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

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

$$z = \frac{x - μ}{σ}, где$$
$$z\space{–}\space{,}$$
$$x\space{–}\space{значение выборки,}$$
$$μ\space{–}\space{среднее,}$$
$$σ\space{–}\space{стандартное}\space{отклонение}$$

Пример. Есть два интерна: Левин и Ричардс. Левин набрал 65 баллов на экзамене по терапии, а Ричардс – 80 баллов на экзамене по кожной венерологии. Верно ли, что Ричардс учился лучше, чем Левин?

Нет, потому что манера поведения людей в терапии отличается от того, как люди проявляют себя в кожной венерологии. Таким образом, прямое сравнение простым сравнением оценок некорректно.

Теперь предположим, что отметки теста по терапии подчиняются нормальному распределению со средним значением 60 и стандартным отклонением 4. С другой стороны, отметки о кожвенерологии подчиняются нормальному распределению со средним значением 79 и стандартным отклонением 2.

Нам нужно будет вычислить Стандартизированную оценку (Z-score) путем стандартизации обоих этих распределений:

$$z_{Левин} = \frac{65 - 60}{4} = 1,25$$
$$z_{Ричардс} = \frac{80 - 79}{2} = 0,5$$

Таким образом, Левин набрал 1,25 стандартного отклонения выше среднего, в то время как Ричардс – только 0,5. Следовательно, Левин показал себя лучше:

Асимметричное распределение

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

Визуальная оценка нормальности

Для таких целей принято использовать три вида графиков:

  • Гистограмма (Histogram), которая отображает частоту "попадания" наблюдения (Observation) в том или ином вертикальном "Ящике" (Bin). В этом примере распределение скошено вправо.
  • График Ядерной оценки плотности (Kernel Density Distribution – сокр. KDE). Является сглаженной версией гистограммы, где непрерывная кривая – ядро, также отображает каждое наблюдение.
  • График квантиль-квантиль (Q-Q Plot). Если значения располагаются по примерно прямой линии под углом 45 градусов, то данные распределяются нормально. На нашем графике видно, что значения данных имеют тенденцию немного отклоняться от линии под углом 45°, особенно на концах, что может указывать на то, что набор данных не распределяется нормально.
Слева направо: гистограмма, График KDE, Q-Q Plot

Для оценки нормальности распределения также используют Скошенность (Skewness) и Эксцесс (Kurtosis).

Нормальное распределение и Python

Посмотрим, как выглядит код, визуализирующий распределение и заодно рассчитывающий основные метрики Датасета (Dataset). Для начала импортируем необходимые библиотеки:

import numpy as np
import pandas as pd
import seaborn as sns

Загрузим данные:

df = pd.read_csv('https://www.dropbox.com/s/ezugw0xgfp8pzut/%D0%9E%D1%86%D0%B5%D0%BD%D0%BA%D0%B8.csv?dl=1')
df.head()

Определим функцию, которая пройдется по всем столбцам датасета, рассчитает основные статистические метрики (среднее, минимум, максимум и т.д.):

def UVA_numeric(data):
    var_group = data.columns # Список столбцов
    size = len(var_group) # Количество столбцов (3)
    plt.figure(figsize = (7 * size, 3), dpi = 400) # Параметры графика

    # Применяем расчеты к каждому столбцу
    for j,i in enumerate(var_group):
        
        # Рассчитываем основные статистические метрики
        mini = data[i].min()
        maxi = data[i].max()
        ran = data[i].max()-data[i].min() # Диапазон значений
        mean = data[i].mean()
        median = data[i].median()
        st_dev = data[i].std() # Стандартное отклонение
        skew = data[i].skew() # Скошенность 
        kurt = data[i].kurtosis() # Эксцесс

        # Расчет точек стандартного отклонения
        points = mean - st_dev, mean + st_dev

        # Построим график с каждым из трех наборов даннных
        #Plotting the variable with every information
        plt.subplot(1, size, j+1)
        sns.distplot(data[i], hist = True, kde=  True)
        
        sns.lineplot(points, [0,0], color = 'black', label = "std_dev")
        sns.scatterplot([mini,maxi], [0,0], color = 'orange', label = "min/max")
        sns.scatterplot([mean], [0], color = 'red', label = "mean")
        sns.scatterplot([median], [0], color = 'blue', label = "median")
        plt.xlabel('{}'.format(i), fontsize = 20)
        plt.ylabel('density')
        plt.title('Стандартное отклонение = {}; Эксцесс = {};\n Скошенность = {}; Разброс, шаг гистограммы = {}\n Среднее = {}; Медиана = {}'.format((round(points[0],2),round(points[1],2)),
                                                                                 round(kurt,2),                             							round(skew,2),
        (round(mini,2),round(maxi,2),round(ran,2)),
        round(mean,2),
        round(median,2)))

Построим тройной график:

UVA_numeric(df)

Ноутбук, не требующий дополнительной настройки на момент написания статьи, можно скачать здесь.

Фото: @changlisheng