Загрузим таблицу из csv-файла с данными по компаниям S&P 500 (Standard and Poor’s 500):
f <- 'https://pkgstore.datahub.io/core/s-and-p-500-companies-financials/constituents-financials_csv/data/8e571d9a5791c6355cd5ef8455d56920/constituents-financials_csv.csv'
dat <- read.csv(f)
Как мы уже обсуждали, для описания качественных показателей мы можем использовать частоты (абсолютные или относительные – в долях или процентах).
Столбиковая диаграмма (bar plot)
Обычная столбиковая диаграмма в R строится не для самой переменной, а для таблицы частот. С таблицей частот мы уже знакомы:
table(dat$Sector) # секторы
##
## Consumer Discretionary Consumer Staples
## 84 34
## Energy Financials
## 32 68
## Health Care Industrials
## 61 67
## Information Technology Materials
## 70 25
## Real Estate Telecommunication Services
## 33 3
## Utilities
## 28
Столбиковая диаграмма строится вот так:
barplot(table(dat$Sector))
Диаграмма показывает, сколько компаний каждого типа в базе данных. Приведем график в порядок: добавим заголовок (main
), и повернем подписи к столбикам (las=2
):
barplot(table(dat$Sector),
main = "Sector",
las = 2)
Как можно заметить, поворот подписей здесь не помог - все равно подписи видно плохо, так как они длинные. Вернем их в горизонтальное положение, но уменьшим размер шрифта (cex.names
, по умолчанию 1):
barplot(table(dat$Sector),
main = "Sector",
cex.names = 0.65)
А что, если мы сократим названия секторов? Причем не вручную, а автоматически. Для этого нам понадобится функция abbreviate()
. Но прежде посмотрим, откуда можно вытащить названия секторов:
bnames <- names(table(dat$Sector))
bnames
## [1] "Consumer Discretionary" "Consumer Staples"
## [3] "Energy" "Financials"
## [5] "Health Care" "Industrials"
## [7] "Information Technology" "Materials"
## [9] "Real Estate" "Telecommunication Services"
## [11] "Utilities"
Теперь применим функцию abbreviate()
к вектору bnames
:
barplot(table(dat$Sector),
main = "Sector",
names.arg = abbreviate(bnames))
В данном случае сокращения выглядят не очень эстетично, но параметры сокращения можно настраивать, выбирать, например, сколько букв от каждого слова оставить или сколько всего букв должно быть в аббревиатуре (см. help(abbreviate()
)).
Оставим подписи с шрифтом поменьше и поменяем цвет столбцов на красный:
barplot(table(dat$Sector),
main = "Sector",
cex.names = 0.65,
col = 'red')
Если мы хотим сделать столбцы разного цвета, вместо одного цвета в опции col
нужно указать вектор цветов. Важно, чтобы число элементов в векторе цветов совпадало с числом столбцов, иначе ничего не получится, R выдаст ошибку. Давайте добавим чередующиеся цвета: красный и синий. Так как столбцов у нас 11, нечетное число, мы можем поступить так: пять раз повторить пару цветов c('red', 'blue')
и «доклеить» к полученному вектору последний цвет (красный).
cols <- rep(c('red', 'blue'), 5)
cols <- c(cols, 'red')
cols
## [1] "red" "blue" "red" "blue" "red" "blue" "red" "blue" "red" "blue"
## [11] "red"
Теперь поменяем цвета на самом графике:
barplot(table(dat$Sector),
main = "Sector",
cex.names = 0.65,
col = cols)
Добавим подпись к вертикальной оси:
barplot(table(dat$Sector),
main = "Sector",
cex.names = 0.65,
col = 'red',
ylab = "counts")
А что если мы захотим получить столбчатую диаграмму, но не с абсолютными частотами (число регионов), а с относительными частотами (в процентах)?
Все просто: чтобы построить такой график, нужно создать таблицу с частотами в процентах – взять таблицу, которую мы уже видели, поделить все частоты в ней на сумму значений и умножить на 100:
perc <- table(dat$Sector)/sum(table(dat$Sector)) * 100
perc
##
## Consumer Discretionary Consumer Staples
## 16.6336634 6.7326733
## Energy Financials
## 6.3366337 13.4653465
## Health Care Industrials
## 12.0792079 13.2673267
## Information Technology Materials
## 13.8613861 4.9504950
## Real Estate Telecommunication Services
## 6.5346535 0.5940594
## Utilities
## 5.5445545
Округлим значения для лучшей читаемости:
perc <- round(perc, 2)
perc
##
## Consumer Discretionary Consumer Staples
## 16.63 6.73
## Energy Financials
## 6.34 13.47
## Health Care Industrials
## 12.08 13.27
## Information Technology Materials
## 13.86 4.95
## Real Estate Telecommunication Services
## 6.53 0.59
## Utilities
## 5.54
Что получилось:
barplot(perc)
А чтобы было совсем здорово, добавим подписи с процентами на сам график. Для этого сначала создадим вектор с подписями – округлим значения в векторе perc и «приклеим» к каждому значению символ «%».
perc_labels <- paste(perc, "%", sep = "")
perc_labels
## [1] "16.63%" "6.73%" "6.34%" "13.47%" "12.08%" "13.27%" "13.86%"
## [8] "4.95%" "6.53%" "0.59%" "5.54%"
В paste()
мы добавили аргумент sep
, чтобы указать разделитель. По умолчанию разделителем является пробел, а мы хотим, чтобы перед знаком процента пробела не было.
Теперь нанесем все на график – добавим нужный нам текст (подписи).
Внимание: сначала нужно сохранить график в какую-нибудь переменную (p
), а затем указать ее в качестве аргумента функции text()
.
p <- barplot(table(dat$Sector),
main = "Sector",
cex.names = 0.65,
col = cols,
ylab = "counts")
# добавляем подписи
# x - положение текста по оси x (здесь - столбцы графика)
# y - положение текста по оси y (здесь - высота столбцов, проценты)
# pos = 3 - текст помещается над координатами (x, y)
text(x = p, y = perc+60, labels = perc_labels, pos = 3)
Круговая диаграмма (pie chart)
Круговая диаграмма строится для относительных частот – для процентов. Таблицу для процентов мы уже построили (perc
).
pie(perc)
Круговые диаграммы, построенные стандартными средствами R, не очень симпатичные, чтобы сделать их красивыми, нужно постараться. Давайте пока оставим это на самостоятельное изучение :)
Гистограмма (histogram)
Гистограмма – график, который иллюстрирует соответствие между значениями количественной переменной и частотой, с которыми эти значения встречаются в выборке.
Для начала построим самую простую гистограмму. Построим гистограмму для дивидентов.
hist(dat$Dividend.Yield)
Теперь сделаем ее красивой: добавим название графика и подзаголовок, поменяем цвет и подпишем оси.
hist(dat$Dividend.Yield,
col = "lightgreen",
main = "Dividents",
xlab = "Divident Yield",
ylab = "Counts")
Что показывает эта гистограмма? Форму распределения дивидентов. По гистограмме видно следующее:
Ящик с усами (boxplot)
С помощью ящика с усами также можно представить распределение количественного показателя. В отличие от гистограммы, ящик с усами позволяет явно увидеть описательные статистики, посчитанные по переменной. Подробнее см. здесь.
boxplot(dat$Dividend.Yield)
boxplot(dat$Dividend.Yield, col = 'yellow')
Ящик с усами позволяет также определить, есть ли в выборке нетипичные значения (выбросы, outliers), то есть значения, которые сильно отличаются от остальных. В нашем случае такие наблюдения есть (точки, которые располагаются за пределами «усов» графика). Есть компании, где за Зюганова проголосовало слишком мало избирателей или наоборот, слишком много. К сожалению, с помощью стандартной функции boxplot()
мы не сможем отметить на графике, что это за регионы. Но к более «продвинутым» ящикам с усами мы еще вернемся, когда будем работать с библиотекой ggplot2
.
Скрипичная диаграмма (violin plot)
Еще один тип графика, который используется для визуализаии распределения количественных данных, это скрипичная диаграмма (violin plot). Иногда из-за формы его называют bean plot (да, кто-то видит в графике скрипки, а кто-то бобы, так бывает). Чтобы понять, почему у графика такие специфические названия, давайте его построим.
Установим сначала библиотеку vioplot
.
install.packages("vioplot")
И обратимся к ней.
library(vioplot)
Построим скрипичную диаграмму для дивидентов:
vioplot(dat$Dividend.Yield, col = "green")
Получился питон, который проглотил ящик с усами! На самом деле, скрипичная диаграмма объединяет два графика: ящик с усами и график плотности распределения (сглаженный вариант гистограммы – если повернем график на 90 градусов, увидим, что он состоит из двух одинаковых половинок, похожих на обведенную по контуру гистограмму). Несмотря на то, что график кажется необычным, он часто бывает достаточно полезен, особенно, когда нам важно показать форму распределения. По нашему графику мы видим две вещи: 1) дивиденты компаний, в целом, несильно отличаются от медианного значения; 2) есть несколько нетипичных компаний, где дивиденты слишком большие (относительно имеющихся данных) – у графика плотности есть длинный «хвост» справа.