Диаграммы размахов, или "ящики с усами" (англ. box-whisker plots), получили свое название за характерный вид: точку или линию, соответствующую медиане или средней арифметической, окружает прямоугольник ("ящик"), длина которого соответствует одному из показателей разброса или точности оценки генерального параметра. Дополнительно от этого прямоугольника отходят "усы", также соответствующие по длине одному из показателей разброса или точности. Графики этого типа очень популярны, поскольку позволяют дать очень полную статистическую характеристику анализируемой совокупности. Кроме того, диаграммы размаха можно использовать для визуальной экспресс-оценки разницы между двумя и более группами (например, между датами отбора проб, экспериментальными группами, участками пространства, и т.п.).

В R для построения диаграмм размахов служит функция boxplot(). Строение получаемых при помощи этой функции "ящиков с усами" представлено ниже:

   

Таким образом, в отличие от других статистических программ, в R при построении диаграмм размахов используются устойчивые (робастные) оценки центральной тенденции (медиана) и разброса (интерквартильный размах, ИКР). Верхний "ус" простирается от верхней границы "ящика" до наибольшего выборочного значения, находящегося в пределах расстояния 1.5 х ИКР от этой границы. Аналогично, нижний "ус" простирается от нижней границы "ящика" до наименьшего выборочного значения, находящегося в пределах расстояния 1.5 х ИКР от этой границы. Длину данного интервала (т.е. 1.5 x ИКР) можно изменить при помощи аргумента range функции boxplot(). Наблюдения, находящиеся за пределами "усов", потенциально могут быть выбросами. Однако всегда следует внимательно относиться к такого рода нестандартным наблюдениям - они вполне могут оказаться "нормальными" для исследуемой совокупности, и поэтому не должны удаляться из анализа без дополнительного расследования причин их появления. Особенности использования функции boxplot() рассмотрим на примере данных, полученных в ходе эксперимента по изучению эффективности шести видов инсектицидных средств. Каждым из этих средств обработали по 12 растений, после чего подсчитали количество выживших на растениях насекомых. Данные этого эксперимента входят в состав стандартного набора данных R и доступны по команде data(InsectSprays). В таблице InsectSprays имеется два столбца - count, содержащий результаты подсчета насекомых, и spray, содержащий коды инсектицидных средств (от А до F):

InsectSprays
   count spray
1     10     A
2      7     A
3     20     A
4     14     A
5     14     A
6     12     A
7     10     A
8     23     A
9     17     A
10    20     A
11    14     A
12    13     A
13    11     B
14    17     B
15    21     B
...     ...     ...
69    26     F
70    26     F
71    24     F
72    13     F

Для построения графика, на котором будут представлены "ящики с усами" для каждого инсектицида, достаточно выполнить команду

boxplot(count ~ spray, data = InsectSprays)
Обратите внимание на то, как были указаны переменные для построения графика - в виде т.н. формулы: count ~ spray. Это стандартный способ, используемый в R для формулировки статистических моделей. По левую сторону от знака ~ (называется "тильда") указывается зависимая переменная, по правую - предикторы. Как видим, количество насекомых на растениях, обработанных инсектицидами C, D и E было наиболее низким, что говорит о высокой эффективности этих средств по сравнению с тремя другими средствами. На растениях, обработанных средствами C и D, были отмечены необычно высокие количества насекомых (см. точки над "усами"). Однако для насекомых характерно пятнистое пространственное распределение и поэтому вряд ли эти необычно высокие наблюдения являются истинными выбросами. Как всегда, мы можем поработать над автоматически построенным графиком и несколько улучшить его внешний вид. Например, можно добавить заголовки осей и самого рисунка (аргументы xlab, ylab и main), а также закрасить "ящики" каким-нибудь цветом (аргумент col):

boxplot(count ~ spray,
            xlab = "Инсектициды",
            ylab = "Количество выживших насекомых",
            main = "Эффективность инсектицидов",
            col = "coral", data = InsectSprays)


Подобно функции plot(), функция boxplot() обладает большим числом управляющих аргументов. Например, используя аргумент log можно изобразить данные на логарифмической шкале. Аргумент varwidth (от variable - переменная, и width - ширина) позволяет сделать так, что ширина "ящиков" будет пропорциональна квадратному корню из числа наблюдений в каждой группе (для этого необходимо использовать varwidth = TRUE). Это может оказаться полезной оцпией для визуализации выборок, значительно различающихся по размеру (в нашем примере смысла в varwidth = TRUE не было бы, поскольку в каждой группе имеется по 12 наблюдений). Аргумент horizontal со значением TRUE позволяет изобразить "ящики" горизонтально (см. ниже). Подробнее об аргументах boxplot() можно узнать из файла помощи по этой функции (доступен по команде ?boxplot).

boxplot(count ~ spray,
            ylab = "Инсектициды",
            xlab = "Количество выживших насекомых",
            main = "Эффективность инсектицидов",
            col = "coral", horizontal = TRUE,
            data = InsectSprays)



Интересно, что построить диаграммы размаха можно не только при помощи специализированной функции boxplot(), но также и функции plot() - например, по команде plot(count ~ spray, data = InsectSprays). Дело в том, что функция plot() очень "смышленая" - она автоматически распознает, что переменная count является количественной, а spray - номинальной, и поэтому начинает вести себя как boxplot().

14 Комментарии

Unknown написал(а)…
Ошибка в предложении: "По левую сторону от знака ~ (называется "тильда") указывается зависимая переменная, по левую - предикторы."
Sergey Mastitsky написал(а)…
Спасибо! Исправил
Анонимный написал(а)…
Подскажите пожалуйста, как вывести в рабочую область результат по расчетам?
Sergey Mastitsky написал(а)…
Весьма туманный вопрос - результат каких именно вычислений нужно вывести?
Анонимный написал(а)…
а можно ли,например, вместо букв А,В,С,D,E,F вписать названия инсектицидов самому?
Я отобрал из своей таблицы по нужным параметрам четыре числовых вектора, дал им названия, построил 4 боксплота на одном графике. Но названий на оси нет, не понятно где теперь какой =)
Sergey Mastitsky написал(а)…
Внимательнее читайте справочный файлы по функциям. В данном случае, в частности, обратите внимание на аргумент names...
Анонимный написал(а)…
Небольшое уточнение.
1,5*ИКР - это расстояния от верхней или нижней границы ящика соответственно до верхнего или нижнего "уса". Причем ус продолжается не до 1,5*ИКР, а до наибольшего значения, не превышающего 1,5*ИКР (если бы было иначе, усы всегда были бы симметричными - а это не так даже первом рисунке).
Анонимный написал(а)…
Как добавить легенду к графику?
Sergey Mastitsky написал(а)…
См. ?legend
Unknown написал(а)…
Добрый день!
Не подскажете, как можно нарисовать в одних осях два боксплота? Скажем, по двум массивам данных состоящих из 5 столбцов цифр. При этом и в одном и в другом массиве у столбцов одинаковые заголовки и на рисунке хочется показать различие между средними значениями соответствующих столбцов - поэтому и хочется нарисовать в одних осях.
Или может можно сделать что-то похожее на гистограмме?
Sergey Mastitsky написал(а)…
См. http://docs.ggplot2.org/0.9.3.1/geom_boxplot.html
Unknown написал(а)…
Большое спасибо! :)
Unknown написал(а)…
Спасибо)
Hillerda написал(а)…
А можно прокомментировать смысл именно полутора ИКР, установленных по умолчанию для усов. С чем связана такая цифра?
И почему тело берется по квантилям, а усы считаются иначе. Почему, например не сделать было усы пятым и девяносто пятым квантилями? В чем логика реализованного подхода?
Новые Старые