Seaborn Distplot: данные не соответствуют вероятностям

1

Я создал накопительный дистрибутив Seaborn, используя следующий код:

AlphaGraphCum = sns.distplot(dfControl["alpha"],
             hist_kws={'cumulative': True},
             kde_kws={'cumulative': True}, rug=False, hist=False); 
sns.distplot(dfGoal["alpha"],
             hist_kws={'cumulative': True},
             kde_kws={'cumulative': True, 'linestyle':'--'}, rug=False, hist=False); 
sns.distplot(dfGraph["alpha"],
             hist_kws={'cumulative': True},
             kde_kws={'cumulative': True, 'linestyle':':'}, rug=False, hist=False); 
sns.distplot(dfGoalGraph["alpha"],
             hist_kws={'cumulative': True},
             kde_kws={'cumulative': True, 'linestyle':'-.'}, rug=False, hist=False)


AlphaGraphCum.set(xlabel='Alpha')
AlphaGraphCum.set(ylabel='Cumulative Probability')

#AlphaGraphCum.set_xlim(-1,1)

График имеет ось x, которая варьируется от -2 до +2. Однако, когда я исследую данные, минимальным является -1, а максимум - +1. Следовательно, я попытался ограничить ось, используя:

AlphaGraphCum.set_xlim(-1,1)

которые я прокомментировал в приведенном выше примере. Затем ось x правильно ограничена между -1 и +1. Однако для x = +1 ни одна из строк не показывает y-значение 1,0, которое должно быть, поскольку +1 является максимальным, и, следовательно, кумулятивная вероятность должна равняться 1,0.

Кто-нибудь знает, почему это не так? Любые подсказки будут высоко оценены. Спасибо!

Теги:
pandas
seaborn

1 ответ

1
Лучший ответ

distplot в distplot дает приблизительную плотность вашего набора данных с использованием kde (оценка плотности ядра), которая предполагает небольшие "микроядра" вокруг точек данных и добавляет их для создания "макроядро" в целом. Поэтому ядро вокруг min и max безусловно, пересекает предел, потому что точки данных на ребре (min и max) являются центром "микро ядер". (Примечание: термин "микро/макро ядра" - это то, что я только что объяснил здесь.)

Предположим, что у нас есть данные от -10 до 10 как -10 ниже.

import numpy as np
import pandas as pd

df = pd.DataFrame().assign(a=np.random.randint(-10, 11, 100))
print(df.a.min(), df.a.max())

Out:
-10 10

Если мы рисуем distplot с настройками по умолчанию (где kde - True),

import seaborn as sns
sns.distplot(df.a)

Он показывает как histogram связанную между -10 и 10 и kde которая является аппроксимацией этой гистограммы, оба показаны (и, конечно, kde пересекает min и max пределы из-за вышеуказанной причины).

Изображение 174551

Теперь, если вы хотите получить кумулятивную плотность, то distplot вычисляет ее на основе kde как distplot ниже:

sns.distplot(df.a, kde_kws={'cumulative': True})

Изображение 174551

На этом этапе обратите внимание, что оба хвоста kde (синяя линия) в 1-м графике и cumulative kde (синяя линия) на втором графике соответствуют.

Вы можете задаться вопросом, соответствуют ли хвосты или нет, поскольку y-шкалы различаются между 1-м и 2-м графиками, поэтому, если мы увеличим ось y второго графика, это будет выглядеть ниже.

import matplotlib.pyplot as plt
sns.distplot(df.a, kde_kws={'cumulative': True})
plt.ylim([0, 0.07])

Изображение 174551

Теперь 1-й и 3-й графики выглядят одинаково, но только разность - это 1-й, kde а 3-й график - cumulative kde.

Короче говоря, то, что вы планировали, было "аппроксимированной совокупной плотностью" на основе kde. Вот почему это более широкое распределение (и кумулятивное распределение), чем ваши фактические данные (гистограмма).

Надеюсь это поможет.


EDIT: добавлен cumulative kde vs cumulative hist

sns.distplot(df.a, 
             hist_kws={'cumulative': True}, 
             kde_kws={'cumulative': True, 'linestyle':'-.'}, 
             bins=100)

Изображение 174551

  • 0
    Большое спасибо за подробное объяснение! Это, безусловно, имеет смысл. Однако есть ли способ в Seaborn нарисовать «фактическое» совокупное распределение? Поскольку мои данные ограничены от -1 до +1, значения за пределами указанного диапазона не должны отображаться, поскольку они не имеют (экономического) смысла. Спасибо!
  • 1
    @ Marcw13 Я добавил графики, сравнивающие cumulative kde cumulative hist (с большей гранулярностью при увеличении аргумента bins . Этот cumulative hist является «фактическим» кумулятивным распределением. Надеюсь, это имеет смысл.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню