В этом блоге мы поговорим о двумерном анализе набора данных и о том, как мы его выполняем после этого, мы видим, какие графики используются в этой задаче.

Если мы применяем EDA к двум функциям одновременно, это называется двумерным анализом, здесь мы видим двумерный анализ категориальных данных, а затем числовых данных, наконец, категориальных и числовых.

Когда обе переменные в двумерных данных находятся в статической форме, данные интерпретируются, и о них делаются утверждения и прогнозы. В ходе исследования анализ поможет определить причину и влияние, чтобы сделать вывод о том, что данная переменная является категориальной.

2.4.1.1 Двусторонние таблицы частот

Кросс-таблицы, кросс-таблицы и двусторонние таблицы (все одно и то же, но с разными именами) можно создавать с помощью функции table().

Таблица частот строится с помощью функции table().

table(dsmall$cut, dsmall$color)
##            
##              D  E  F  G  H  I  J
##   Fair       5  6  7  4  5  4  3
##   Good      18 23 11 16 17  7  7
##   Very Good 26 37 46 40 33 25 13
##   Premium   34 53 43 49 41 24 13
##   Ideal     54 63 79 92 53 34 15

Есть 4 бриллианта Fair цвета D и 21 бриллиант идеального качества цвета J.

2.4.1.2 Таблицы двусторонних пропорций

Выберите свои проценты в зависимости от вашего исследовательского вопроса. Что вы хотите сравнить?

Лучшие практики:

  • Независимая переменная в строках
  • Переменная ответа в столбцах
  • Рассчитайте % строк как % ответа для каждой пояснительной группы.

Вот демонстрации того, как интерпретация процентов меняется в зависимости от знаменателя.

Пропорции ячеек

Обернув prop.table() вокруг таблицы, вы получите пропорции ячейки.

prop.table(table(dsmall$cut, dsmall$color))
##            
##                 D     E     F     G     H     I     J
##   Fair      0.005 0.006 0.007 0.004 0.005 0.004 0.003
##   Good      0.018 0.023 0.011 0.016 0.017 0.007 0.007
##   Very Good 0.026 0.037 0.046 0.040 0.033 0.025 0.013
##   Premium   0.034 0.053 0.043 0.049 0.041 0.024 0.013
##   Ideal     0.054 0.063 0.079 0.092 0.053 0.034 0.015

0,4% всех бриллиантов имеют цвет D и огранку Fair, 2,1% — цвет J и огранку Ideal.

Пропорции строк

Чтобы получить пропорции row, укажите margin=1. Теперь проценты в сумме составляют 1 по строкам.

round(prop.table(table(dsmall$cut, dsmall$color), margin=1),3)
##            
##                 D     E     F     G     H     I     J
##   Fair      0.147 0.176 0.206 0.118 0.147 0.118 0.088
##   Good      0.182 0.232 0.111 0.162 0.172 0.071 0.071
##   Very Good 0.118 0.168 0.209 0.182 0.150 0.114 0.059
##   Premium   0.132 0.206 0.167 0.191 0.160 0.093 0.051
##   Ideal     0.138 0.162 0.203 0.236 0.136 0.087 0.038

14,8% всех бриллиантов удовлетворительного качества имеют цвет D. 5,4% всех бриллиантов идеального качества имеют цвет J.

Пропорции столбцов

Чтобы получить пропорции столбца, укажите margin=2. Проценты теперь составляют до 1 вниз по столбцам.

round(prop.table(table(dsmall$cut, dsmall$color), margin=2),3)
##            
##                 D     E     F     G     H     I     J
##   Fair      0.036 0.033 0.038 0.020 0.034 0.043 0.059
##   Good      0.131 0.126 0.059 0.080 0.114 0.074 0.137
##   Very Good 0.190 0.203 0.247 0.199 0.221 0.266 0.255
##   Premium   0.248 0.291 0.231 0.244 0.275 0.255 0.255
##   Ideal     0.394 0.346 0.425 0.458 0.356 0.362 0.294

2,7% всех бриллиантов цвета D имеют удовлетворительное качество. 44,7% всех бриллиантов цвета J имеют идеальное качество.

2.4.1.3 Сгруппированные гистограммы

Чтобы сравнить пропорции одной категориальной переменной в пределах того же уровня другой, нужно использовать сгруппированные гистограммы.

base Как и раньше, объект для построения должен быть результатом таблицы.

cc <- table(dsmall$cut, dsmall$color)
barplot(cc)

Столбцы с накоплением могут быть трудными для интерпретации и очень трудными для сравнения значений между группами. Предпочтение отдается расположенной рядом гистограмме. beside=TRUE — это то, что управляет размещением полос.

barplot(cc, main="quick side by side barchart using base graphics", beside=TRUE)

ggplot Снова постройте разрез по оси X, но затем fill, используя вторую категориальную переменную. Это дает эффект визуализации процентов row из приведенной выше таблицы. Процент цвета для каждого типа огранки.

ggplot(dsmall, aes(x=cut, fill=color)) + geom_bar()

Опять же, по умолчанию используется столбчатая диаграмма с накоплением. Поэтому мы просто указываем position=dodge, чтобы расположить столбцы рядом.

ggplot(dsmall, aes(x=cut, fill=color)) + geom_bar(position = "dodge")

И смотри, автоматическая легенда. Что, если я хочу лучше сравнить огранки в цветовой группе? Это столбец в процентах. Просто переключите, какая переменная является осью X, а какая используется для заливки цветов!

ggplot(dsmall, aes(x=color, fill=cut)) + geom_bar(position = "dodge")

Для более чем 2-х цветов не рекомендую выбирать цвета самостоятельно. Я мало знаком с теорией цвета, поэтому использую встроенные цветовые палитры. Вот отличная шпаргалка по использованию цветовых палитр.

И именно за это легкое изменение мы любим ggplot2.

2.4.2 Сгруппированные гистограммы с процентами

Не так просто, как можно было бы надеяться, но решение состоит в том, чтобы сначала рассчитать желаемые проценты, а затем построить сводные данные, используя либо geom_bar(stat='identity'), либо geom_col().

calc.props <- diamonds %>% group_by(color, cut) %>%
              summarise(count=n()) %>%
              mutate(pct=round(count/sum(count),3))
calc.props
## # A tibble: 35 × 4
## # Groups:   color [7]
##    color cut       count   pct
##    <ord> <ord>     <int> <dbl>
##  1 D     Fair        163 0.024
##  2 D     Good        662 0.098
##  3 D     Very Good  1513 0.223
##  4 D     Premium    1603 0.237
##  5 D     Ideal      2834 0.418
##  6 E     Fair        224 0.023
##  7 E     Good        933 0.095
##  8 E     Very Good  2400 0.245
##  9 E     Premium    2337 0.239
## 10 E     Ideal      3903 0.398
## # … with 25 more rows
## # ℹ Use `print(n = ...)` to see more rows

Поскольку мы отображаем сводные данные, высота столбцов указывается с помощью y=pct.

ggplot(calc.props, aes(x=color, fill=cut, y=pct)) +
                  geom_col(position="dodge") + theme_bw()

Теперь установите некоторые параметры оси Y, используя scale_y_continuous(), чтобы сделать график более точным и читаемым. labels=percent происходит из пакета scales.

library(scales)
ggplot(calc.props, aes(x=color, fill=cut, y=pct)) +
                  geom_col(position="dodge") + theme_bw() +
                  scale_y_continuous(limits=c(0,1), labels=percent)

2.4.2.1 sjPlot

sjPlot отлично справляется со своей задачей, позволяя четко отображать не только n, но и проценты.

library(sjPlot)
plot_xtab(dsmall$color, dsmall$cut, margin="row", coord.flip = TRUE)

2.4.2.2 Мозаичные графики

Но что, если вы хотите узнать, как связаны две категориальные переменные, и не хотите смотреть на две разные гистограммы? Мозаика — это способ визуализировать пропорции в таблице. Итак, вот двусторонняя таблица, которую мы будем строить.

table(dsmall$cut, dsmall$color)
##            
##              D  E  F  G  H  I  J
##   Fair       5  6  7  4  5  4  3
##   Good      18 23 11 16 17  7  7
##   Very Good 26 37 46 40 33 25 13
##   Premium   34 53 43 49 41 24 13
##   Ideal     54 63 79 92 53 34 15

Синтаксис для мозаичного графика использует обозначение модели, которое в основном представляет собой y ~ x, где ~ читается как «вертушка» или «тильда». Он находится слева от клавиши 1.

mosaicplot(cut~color, data=dsmall)

Полезно, чо. Вот два очень полезных варианта. В обратной очевидности color применяет оттенки серого к одному из уровней фактора, а shade применяет шкалу цветового градиента к ячейкам в порядке от того, что меньше ожидаемого (красный), к тому, что больше ожидаемого (синий), если эти два фактора были полностью независимыми.

par(mfrow=c(1,2)) # display the plots in 1 row and 2 columns
mosaicplot(cut~color, data=dsmall, color=TRUE)
mosaicplot(cut~color, data=dsmall, shade=TRUE)

Например, меньше бриллиантов огранки «Очень хорошо» цвета «G» и меньше бриллиантов огранки «Премиум» цвета «H». Как видите, важно знать, что означают ваши данные, когда вы пытаетесь интерпретировать то, что говорят вам графики.

Это все способы построения категориальных переменных. Если вам интересно, почему не было продемонстрировано трехмерных гистограмм, см.
здесь, здесь и здесь другие способы, которыми вы действительно можете испортить свою визуализацию.

2.4.3 Непрерывный и непрерывный

2.4.3.1 Диаграмма рассеяния

Наиболее распространенный метод визуализации взаимосвязи между двумя непрерывными переменными — использование диаграммы рассеяния.

base Вернуться к команде plot(). Здесь мы снова используем обозначение модели, поэтому это y xy x.

plot(price~carat, data=dsmall)

Похоже, что по большей части по мере увеличения стоимости карата растет и цена. В этом есть смысл.

ggplot С помощью ggplot мы указываем переменные x и y и добавляем точку.

ggplot(dsmall, aes(x=carat, y=price)) + geom_point()

2.4.3.2 Добавление линий к диаграммам рассеяния

Две наиболее распространенные линии тренда, добавляемые к диаграммам рассеяния, — это прямая линия «наилучшего соответствия» и более гладкая линия «наименее».

base Линия наилучшего соответствия (выделена синим цветом) добавляется с помощью функции abline(), обернутой вокруг функции линейной модели lm(). Обратите внимание, что он использует тот же синтаксис обозначения модели и оператор data=, что и функция plot(). Строка lowess добавляется с помощью функции lines(), но сама функция lowess() не допускает оператор data=, поэтому мы должны использовать обозначение $.

plot(price~carat, data=dsmall)
abline(lm(price~carat, data=dsmall), col="blue")
lines(lowess(dsmall$price~dsmall$carat), col="red")

ggplot С помощью ggplot мы просто добавляем слой geom_smooth().

ggplot(dsmall, aes(x=carat, y=price)) + geom_point() + geom_smooth()

Здесь точечный доверительный интервал для этой нижней линии показан серым цветом. Если вы хотите отключить доверительный интервал, используйте se=FALSE. Также обратите внимание, что геометрия сглаживания использует другую функцию или окно, чем функция lowess, используемая в базовой графике.

Здесь снова используется функция построения графика ggplot и добавляется еще один слой geom_smooth() для линии lm (линейная модель) синего цвета, а линия нижнего уровня (без указания метода) — красного цвета.

ggplot(dsmall, aes(x=carat, y=price)) + geom_point() + 
  geom_smooth(se=FALSE, method="lm", color="blue") + 
  geom_smooth(se=FALSE, color="red")

2.4.3.3 Линейные графики

Линейные графики соединяют каждую точку прямой линией. Чаще всего это делается при измерении тенденций отклика по мере увеличения значения x (например, во временном ряду).

Ранее мы видели, что carat и price кажутся, возможно, линейными. Давайте посмотрим, как средняя цена меняется с каратом.

library(dplyr)
price.per.carat <- dsmall %>% group_by(carat) %>% summarise(mean = mean(price))

base Для базовой графики type=‘b’ означает и точки, и линии, ‘l’ — только линии, а ‘p’ — только точки. Вы можете найти больше вариантов графических символов в разделе ?pch.

plot(mean~carat, data=price.per.carat, type='l')

ggplot С помощью ggplot мы указываем, что нам нужна только линейная геометрия.

ggplot(price.per.carat, aes(x=carat, y=mean)) + geom_line()

Как это соотношение меняется с огранкой бриллианта? Сначала давайте получим среднюю цену за комбинацию карата и огранки.

ppc2 <- dsmall %>% group_by(cut, carat) %>% summarise(mean = mean(price))

базовый Этот график может быть создан в базовой графике, но для этого требуется продвинутое знание графической системы. Поэтому я не показываю это здесь.

ggplot Здесь ggplot начинает преуспевать в простоте создания более сложных графиков. Все, что нам нужно сделать, это указать, что мы хотим, чтобы линии окрашивались переменной cut.

ggplot(ppc2, aes(x=carat, y=mean, col=cut)) + geom_line()

И мы получаем одну строку за разрез.

2.4.4 Непрерывный против Категориального

Создайте соответствующий график для непрерывной переменной и постройте его для каждого уровня категориальной переменной.

2.4.4.1 Точечная/ленточная диаграмма

Точечные диаграммы могут быть очень полезны при построении точек по нескольким категориям. Их также можно назвать ленточными диаграммами.

база

stripchart(carat ~ cut, data=dsmall)

Выглядит не очень красиво, но суть вроде передает. В наборе данных немного бриллиантов удовлетворительного качества, довольно разбросанных по каратному диапазону, за исключением одного высокого класса.

ggplot Мы можем воспроизвести то же самое, нанеся одну непрерывную переменную на одну категориальную переменную и добавив слой точек. Я бы сказал, что горизонтальное выглядит лучше из-за меток осей.

a <- ggplot(dsmall, aes(y=carat, x=cut)) + geom_point()
b <- ggplot(dsmall, aes(y=cut, x=carat)) + geom_point()
grid.arrange(a, b, ncol=2)

2.4.4.2 Сгруппированные диаграммы

base Базовые графические графики сгруппированы в коробчатые диаграммы, а также просто добавлена ​​тильда (тильда) ~. Еще один пример того, где работает нотация модели.

boxplot(carat~color, data=dsmall)

ggplot Простое дополнение, просто задайте свои x и y соответствующим образом.

ggplot(dsmall, aes(x=color, y=carat, fill=color)) + geom_boxplot()

Добавление скрипок Здесь также можно накладывать сюжеты для скрипок.

ggplot(dsmall, aes(x=color, y=carat, fill=color)) +
        geom_violin(alpha=.1) + 
        geom_boxplot(alpha=.5, width=.2)

2.4.4.3 Сгруппированные гистограммы

base Не существует простого способа создания сгруппированных гистограмм в базовой графике, мы его пропустим.

ggplot По умолчанию ggplot хочет наложить все графики на одну и ту же сетку. Это выглядит не очень хорошо с гистограммами. Вместо этого вы можете накладывать графики плотности

a <- ggplot(dsmall, aes(x=carat, fill=color)) + geom_histogram()
b <- ggplot(dsmall, aes(x=carat, fill=color)) + geom_density() 
grid.arrange(a,b, ncol=2)

Сплошные заливки по-прежнему плохо читаются, поэтому мы можем либо уменьшить альфу (увеличить прозрачность), либо раскрасить только линии, а не заливку.

c <- ggplot(dsmall, aes(x=carat, fill=color)) + geom_density(alpha=.2)
d <- ggplot(dsmall, aes(x=carat, col=color)) + geom_density() 
grid.arrange(c,d, ncol=2)

2.4.5 Сюжеты радости / хребты

Несколько новые (2017) джойлайны еще не добавлены в базовую раздачу ggplot2. На данный момент он доступен в пакете ggjoy. Действительно хороший способ визуализировать графики плотности без проблемы перекрытия.

library(ggjoy)
ggplot(dsmall, aes(x=carat, y=color)) + geom_joy()