#python #plot #seaborn #violin-plot
#python #сюжет #Статистика #seaborn
Вопрос:
Следующий код дает мне очень хороший violinplot (и boxplot внутри).
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
foo = np.random.rand(100)
sns.violinplot(foo)
plt.boxplot(foo)
plt.show()
Пока все хорошо. Однако, когда я смотрю foo
, переменная не содержит никаких отрицательных значений. seaborn
Сюжет здесь кажется вводящим в заблуждение. Обычный matplotlib boxplot дает что-то более близкое к тому, что я ожидал.
Как я могу сделать скрипичные графики с лучшей подгонкой (не показывая ложноотрицательных значений)?
Комментарии:
1. Ну, это, вероятно, не так просто. Это артефакт KDE, который не знает, что существует жесткая граница в 0. Если вас интересует проблема, смотрите также: stats.stackexchange.com/questions/65866 /…
2. @cel Спасибо. это то, о чем я думал. Но разве его нельзя было подогнать плотнее?
3. Для этого есть алгоритмы. Посмотрите впечатляющий результат в этом ответе: stats.stackexchange.com/a/71291 . Однако я еще не видел этого в python.
Ответ №1:
Как отмечается в комментариях, это следствие (я не уверен, что назвал бы это «артефактом») предположений, лежащих в основе гауссовского KDE. Как уже упоминалось, это несколько неизбежно, и если ваши данные не соответствуют этим предположениям, вам может быть лучше просто использовать boxplot, который показывает только точки, которые существуют в фактических данных.
Однако в своем ответе вы спрашиваете, может ли он быть «плотнее», что может означать несколько вещей.
Одним из ответов может быть изменение пропускной способности ядра сглаживания. Вы делаете это с bw
аргументом, который на самом деле является масштабным коэффициентом; используемая полоса пропускания равна bw * data.std()
:
data = np.random.rand(100)
sns.violinplot(y=data, bw=.1)
Другим ответом может быть усечение скрипки в крайних точках данных. KDE по-прежнему будет соответствовать плотностям, выходящим за пределы ваших данных, но хвосты не будут показаны. Вы делаете это с cut
параметром, который указывает, на сколько единиц пропускной способности после экстремальных значений должна быть нарисована плотность. Для усечения установите значение 0:
sns.violinplot(y=data, cut=0)
Кстати, API violinplot
для изменится в версии 0.6, и я использую версию для разработки здесь, но оба аргумента bw
и cut
существуют в текущей выпущенной версии и ведут себя более или менее одинаково.
Комментарии:
1. Мне не нравится решение, использующее
cut
. Он скрывает тот факт, чтоKDE
не может правильно соответствовать такой плотности. Плотность, близкая к границе 0, вводит в заблуждение, поскольку вы получите такую оценку плотности, даже если соответствующая гистограмма имеет свой максимум на 0.2. Смотрите Запрос функции по адресу github.com/mwaskom/seaborn/issues/525 (ожидание восходящих изменений в statsmodels).
3. 1 Отличное решение. Это быстрое и простое решение. Очевидно, что крайние сокращения будут указывать на некоторые крайние различия между kde и базовой плотностью.
4. Мне нравится решение ‘Cut’, оно дает представление о том, насколько близко ваше распределение к границам.