Seaborn Distplot: данные не соответствуют вероятностям - PullRequest
0 голосов
/ 28 августа 2018

Я сгенерировал накопительный дистрибутив 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)

На графике есть ось х, которая колеблется от -2 до +2. Однако, когда я исследую данные, минимум равен -1, а максимум +1. Поэтому я попытался ограничить ось, используя:

AlphaGraphCum.set_xlim(-1,1)

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

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

1 Ответ

0 голосов
/ 28 августа 2018

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

Предположим, у нас есть данные в диапазоне от -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 ограничение по вышеуказанной причине).

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

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

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

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

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

enter image description here

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

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

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


РЕДАКТИРОВАТЬ: Добавлено cumulative kde против cumulative hist

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

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...