Коробки в matplotlib: маркеры и выбросы
У меня есть некоторые вопросы о boxplots в matplotlib:
Вопрос A. Что представляют собой отмеченные ниже метки с Q1, Q2 и Q3? Я считаю, что Q1 является максимальным, а Q3 - это выбросы, но что такое Q2?
![enter image description here]()
Вопрос B. Как matplotlib идентифицирует выбросы? (то есть как он знает, что они не являются истинными значениями max
и min
?)
Ответы
Ответ 1
Картинка стоит тысячи слов. Обратите внимание, что выбросы (маркеры +
на вашем графике) - это просто точки снаружи для расширенного поля [(Q1-1.5 IQR), (Q3+1.5 IQR)]
ниже.
![enter image description here]()
Однако изображение является лишь примером для нормально распределенного набора данных. Важно понимать, что matplotlib сначала не оценивает нормальное распределение и вычисляет квартили из оцененных параметров распределения, как показано выше.
Вместо этого медиана и квартили вычисляются непосредственно из данных. Таким образом, ваш boxplot может выглядеть по-разному в зависимости от распределения ваших данных и размера образца, например, асимметричного и с более или менее выбросами.
Ответ 2
Ящик представляет первый и третий квартили, а красная линия - медиана (2-й квартиль). документация дает унции по умолчанию в 1,5 IQR:
boxplot(x, notch=False, sym='+', vert=True, whis=1.5,
positions=None, widths=None, patch_artist=False,
bootstrap=None, usermedians=None, conf_intervals=None)
и
whis: [по умолчанию 1.5]
Определяет длину усов как функцию внутреннего диапазона квартилей. Они распространяются на самую экстремальную точку данных внутри диапазона данных (whis * (75% -25%)).
Если вы запутались в разных представлениях в виде квадратов, попробуйте прочитать описание в wikipedia.
Ответ 3
В дополнение к seth-ответу (поскольку документация не очень точна в этом отношении):
Q1 (wiskers) размещаются с максимальным значением ниже 75% + 1,5 IQR
(минимальное значение 25% - 1,5 IQR)
Это код, который вычисляет положение усов:
# get high extreme
iq = q3 - q1
hi_val = q3 + whis * iq
wisk_hi = np.compress(d <= hi_val, d)
if len(wisk_hi) == 0 or np.max(wisk_hi) < q3:
wisk_hi = q3
else:
wisk_hi = max(wisk_hi)
# get low extreme
lo_val = q1 - whis * iq
wisk_lo = np.compress(d >= lo_val, d)
if len(wisk_lo) == 0 or np.min(wisk_lo) > q1:
wisk_lo = q1
else:
wisk_lo = min(wisk_lo)
Ответ 4
На всякий случай, это может принести пользу кому-либо еще, мне нужно было поставить легенду на одном из графиков диаграммы коробки, поэтому я сделал этот маленький .png в Inkscape и думал, что поделюсь им.
![введите описание изображения здесь]()