Описание данных
Сегодня мы поработаем с файлом, в котором содержатся результаты исследования (Cowles, 1994), в котором респонденты фиксировали свой пол и участие/не участие в волонтёрской деятельности, а также заполняли анкету, по которой определялся уровень экстраверсии-интроверсии и уровень нейротизма (тревожности). Подробнее об измерениях и анкете можно почитать здесь.
Переменные в файле:
neuroticism
: уровень нейротизма (по шкале Айзенка);extraversion
: уровень экстраверсии (по шкале Айзенка);sex
: пол респондента (female
и male
);volunteer
: участвует ли респондент в волонтёрской деятельности (yes
и no
).dat <- read.csv("https://vincentarelbundock.github.io/Rdatasets/csv/carData/Cowles.csv")
Посмотрим на структуру данных:
str(dat)
## 'data.frame': 1421 obs. of 5 variables:
## $ X : int 1 2 3 4 5 6 7 8 9 10 ...
## $ neuroticism : int 16 8 5 8 9 6 8 12 15 18 ...
## $ extraversion: int 13 14 16 20 19 15 10 11 16 7 ...
## $ sex : Factor w/ 2 levels "female","male": 1 2 2 1 2 2 1 2 2 2 ...
## $ volunteer : Factor w/ 2 levels "no","yes": 1 1 1 1 1 1 1 1 1 1 ...
Библиотека ggplot2
позволяет строить красивые графики. Установим её:
install.packages("ggplot2")
Загрузим библиотеку:
library(ggplot2)
Теперь перейдем к ggplot2
. Можно считать, что у библиотеки ggplot2
есть своя философия, поняв которую, строить графики гораздо легче.
Во-первых, графики ggplot
многослойные, то есть строятся они поэтапно, по слоям. Сначала указывается датафрейм, с которой мы работаем, и интересующие нас показатели (первый слой), затем указывается тип графика (второй слой), затем настройки для подписей, легенды и прочее (остальные слои). Все слои добавляются через +
.
Во-вторых, для любого графика указывается функция aes()
, сокращенно от aesthetics, задающая оформление графика, которое непосредственно связано с переменными в датафрейме. О чём речь? Проще понять на примерах.
Пример 1. Строим диаграмму рассеяния для роста и веса человека, хотим, чтобы все точки на диаграмме рассеяния были зелёными.
Пример 2. Строим диаграмму рассеяния для роста и веса человека, хотим, чтобы точки на диаграмме рассеяния, соответствующие женщинам, были красными, а мужчинам — синими.
В первом примере оформление графика никак не связано со значениями переменных в базе данных, все точки закрашиваем одним цветом. Во втором примере цвет точек зависит от значения переменной пол, то есть оформление графика связано с переменными в базе данных. Как увидим позже, в случаях, аналогичным первому, цвет точек будет определяться за пределами aes()
, второму – внутри aes()
.
Для чего нужны гистограммы, мы уже обсуждали. Гистограммы строятся для визуализации формы распределения количественного показателя. Построим гистограмму для индекса экстраверсии (extraversion
). Укажем датафрейм dat
, сам показатель, значения которого идут по оси x
, запишем внутри aes()
. А потом допишем слой geom_histogram()
, который отвечает за тип графика.
ggplot(data = dat, aes(x = extraversion)) + geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Гистограмма получилась не очень красивой, и не только из-за тёмного цвета. Она получилась какой-то «дырявой». Почему? По умолчанию ggplot
всегда строит гистограмму с 30 столбцами, поэтому в нашем случае столбцы получились слишком узкими. Собственно, поэтому R нам и выдал предупреждение Pick better value with binwidth
. Поменяем шаг у гистограммы вручную, добавив binwidth
внутри geom_histogram()
:
# выставим шаг равен 4
ggplot(data = dat, aes(x = extraversion)) + geom_histogram(binwidth = 4)
Теперь сделаем гистограмму более красивой — добавим цвет. При изменении цвета «заполненных» (состоящих не из отдельных линий и точек) графиков нужно помнить, что есть два параметра: color
и fill
. Параметр color
отвечает за цвет контура графика, а за не цвет их заливки. А уже fill
– как раз за заливку.
# гистограмма цвета лайма,
# столбцы которой очерчены черной линией
ggplot(data = dat, aes(x = extraversion)) +
geom_histogram(binwidth = 4, fill = "limegreen", color = "black")
А теперь попробуем построить гистограммы для extraversion
по группам, отдельно для респондентов мужского пола, отдельно — для женского. С помощью ggplot2
это сделать гораздо проще, чем с помощью обычной функции hist()
: не нужно сохранять строки в отдельные датафреймы и после строить гистограммы, можно просто добавить ещё один слой для группировки. Слой называется facet_wrap
(«фасетки»), так как графики для каждой группы отображаются в отдельных окнах-фасетках. Переменная группировки, в нашем случае sex
, указывается после «тильды» (~
).
ggplot(data = dat, aes(x = extraversion)) +
geom_histogram(binwidth = 4, fill = "limegreen", color = "black") +
facet_wrap(~sex)
Вместо гистограммы можно построить график плотности распределения (density plot). Его можно рассматривать как сглаженный аналог гистограммы. Логика построения графика абсолютно та же, только опция binwidth
нам уже не нужна (столбцов нет), а вместо histogram
будет density
.
ggplot(data = dat, aes(x = extraversion)) +
geom_density(fill = "lightblue", color = "black") +
facet_wrap(~sex)
Теперь построим ящик с усами для индекса экстраверсии (extraversion
). Для начала без деления на группы. Ящик с усами отличается от предыдущих своим расположением — обычно он не горизонтальный, а вертикальный. Поэтому в aes()
горизонтальную ось x
мы оставим пустой, а показатель extraversion
поместим по оси y
. Далее останется изменить тип графика на boxplot()
:
ggplot(data = dat, aes(x = "", y = extraversion)) +
geom_boxplot(fill = "yellow", color = "black")
Готово: всё тот же ящик с усами.
Теперь повторим то же, но с группировкой по переменной пол:
ggplot(data = dat, aes(x = "", y = extraversion)) +
geom_boxplot(fill = "yellow", color = "black") +
facet_wrap(~sex)
Для желающих: можно построить скрипичную диаграмму (violin plot), график, который представляет собой симметрично отображённый график плотности распределения (две половинки). Иногда внутрь него добавляют ящик с усами.
# все то же, только теперь geom_violin()
ggplot(data = dat, aes(x = "", y = extraversion)) +
geom_violin(fill = "yellow", color = "black") +
facet_wrap(~sex)
Теперь построим диаграмму рассеяния (scatterplot) — график, который иллюстрирует связь между двумя чиловыми показателями. Построим диаграмму рассеяния для иллюстрации связи между индексом экстраверсии и индексом нейротизма. Для этого просто выберем слой geom_point()
, который используется для графиков с точками, и внутри aes()
укажем, какой показатель должен идти по оси x
, а какой — по оси y
:
ggplot(data=dat, aes(x = extraversion, y = neuroticism)) +
geom_point()
По такой диаграмме, к сожалению, видно немного: облако точек слишком рассеяно, и наклон этого облака кажется нулевым (для сравнения посмотрите на примеры здесь). То есть, можно заключить, что, скорее всего, связи между показателями экстраверсии и нейротизма нет. О направлении связи здесь судить сложно, но всё-таки ближе к отрицательной или обратной связи: чем больше значения уровня экстраверсии, тем меньше значения уровня нейротизма.
Подробнее о том, как по диаграмме рассеяния определять (примерно) направление и силу связи, можно посмотреть в конспектах по курсу.