Я создал накопительный дистрибутив 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.
Кто-нибудь знает, почему это не так? Любые подсказки будут высоко оценены. Спасибо!
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
пределы из-за вышеуказанной причины).
Теперь, если вы хотите получить кумулятивную плотность, то distplot
вычисляет ее на основе kde
как distplot
ниже:
sns.distplot(df.a, kde_kws={'cumulative': True})
На этом этапе обратите внимание, что оба хвоста 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])
Теперь 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)
cumulative kde
cumulative hist
(с большей гранулярностью при увеличении аргументаbins
. Этотcumulative hist
является «фактическим» кумулятивным распределением. Надеюсь, это имеет смысл.