Как лучше подогнать seaborn violinplots?

#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’, оно дает представление о том, насколько близко ваше распределение к границам.