Загрузим уже знакомую таблицу из csv-файла с данными по компаниям S&P 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)
Напоминание про корреляции. Коэффициент корреляции К.Пирсона – показатель линейной связи между двумя переменными, измеренными в количественной шкале. Коэффициент корреляции принимает значения от \(-1\) до \(1\). Отрицательные значения коэффициента корреляции свидетельствуют об обратной связи между переменными (с ростом значений одной переменной значения другой переменной уменьшаются), положительные значения коэффициента корреляции – о прямой связи между переменными (с ростом значений одной переменной значения другой переменной увеличиваются). Если коэффициент корреляции Пирсона между переменными равен \(0\), это не всегда означает, что связи между ними нет – связь между ними может просто быть нелинейной (например, квадратичной). Коэффициент корреляции показывает только связь между переменными, а не зависимость (\(Y\) зависит от \(X\)) и не влияние (\(X\) влияет на \(Y\)).
Коэффициент корреляции Ч.Спирмена также используется для измерения связи между двумя переменными, измеренными в количественной шкале, преимущественно в порядковой (ординальной). Коэффициент корреляции Спирмена, в отличие от коэффициента Пирсона, является устойчивым к наличию нетипичных значений.
Связи между количественными переменными можно представить в виде корреляционной матрицы. Корреляционная матрица всегда симметрична (коэффициент корреляции между переменными \(X\) и \(Y\) равен коэффициенту корреляции между переменными \(Y\) и \(X\)), и на главной диагонали такой матрицы стоят \(1\) (корреляция переменной самой с собой равна \(1\)).
Диаграммы рассеяния (scatterplots)
Допустим, мы хотим посмотреть на связь между переменными Dividend.Yield
и Market.Cap
(дивиденты и капитализация рынка). Построим диаграмму рассеяния:
plot(dat$Dividend.Yield, dat$Market.Cap)
Судя по графику, сильной связи между показателями нет, точки не образуют облако с ярко выраженным наклоном. При этом график выглядит несимпатично - точки скучены, сосредоточены в одном углу. Чтобы такого не было, можно по оси y поставить не капитализацию рынка, а ее натуральный логарифм (так иногда делают, когда шкалы измерений сильно отличаются и разброс значений по осям, как следствие, тоже).
plot(dat$Dividend.Yield, log(dat$Market.Cap))
График стал выглядеть поприятнее, но, тем не менее, связи между показателями пока не наблюдается. Подпишем оси:
plot(dat$Dividend.Yield, log(dat$Market.Cap),
xlab = "Dividents",
ylab = "Market capital (logarithm)")
Добавим цвета, причем вполне содержательно. Допустим, мы хотим разделить компании по секторам и сделать так, чтобы компании, относящиеся к одному и тому же сектору, были одного цвета. Вспомним, сколько у нас секторов:
str(dat$Sector)
## Factor w/ 11 levels "Consumer Discretionary",..: 6 6 5 5 7 7 6 7 1 7 ...
Что будет, если для 11 категорий мы возьмем первые 11 цветов в R?
# colors() # все цвета в R
colors()[1:12] # первые 11 цветов
## [1] "white" "aliceblue" "antiquewhite" "antiquewhite1"
## [5] "antiquewhite2" "antiquewhite3" "antiquewhite4" "aquamarine"
## [9] "aquamarine1" "aquamarine2" "aquamarine3" "aquamarine4"
Это будет не очень осмысленно, поскольку находящиеся рядом цвета - это, как правило, оттенки одного и того же цвета, а разницу в оттенках на графике уловить достаточно сложно. Поэтому для выбора цветов (чтобы не вводить самим перечень из 11 цветов) можно воспользоваться готовыми палитрами (палетками). Установим библиотеку RColorBrewer
(часто используется для визуализации, включая раскраску карт):
install.packages("RColorBrewer")
Обратимся к библиотеке:
library(RColorBrewer)
Посмотрим на все палитры и выберем из них ту, где точно есть 11 разных цветов (например, Set3
).
display.brewer.all()
display.brewer.pal(n = 11, name = 'Set3')
Теперь создадим вектор цветов для наших данных:
# устанавливаем цвета по группирующей переменной
colors <- brewer.pal(n = 11, name = 'Set3')[dat$Sector]
# смотрим
head(colors)
## [1] "#FDB462" "#FDB462" "#80B1D3" "#80B1D3" "#B3DE69" "#B3DE69"
Наложим получившуюся разбивку по цветам на график:
plot(dat$Dividend.Yield, log(dat$Market.Cap),
xlab = "Dividents",
ylab = "Market capital (logarithm)",
col = colors,
pch = 16)
По умолчанию R использует «пустые» точки. Но тип точек можно менять, добавляя аргумент pch
. Список маркеров для точек см. здесь.
Матрица диаграмм рассеяния (scatterplot matrix)
Иногда в ходе предварительного анализа бывает нужно посмотреть на связь «всего со всем». Для этого удобно использовать матрицу диаграмм рассеяния.
Построим диаграммы рассеяния для показателей в столбцах 4-8.
pairs(dat[4:8], col = colors) # выбираем столбцы 4-8
На пересечении названий переменных находятся диаграммы рассеяния, соответствующие парам показателей.
А теперь проиллюстрируем то же самое, но более красочно. Для этого потребуется библиотека car
.
install.packages("car")
library(car)
scatterplotMatrix(dat[4:8])
На диагональ этой матрицы диаграмм мы можем добавлять разные графики, отражающие распределение показателей, например, гистограммы или ящики с усами. На сами диаграммы рассеяния добавляется регрессионная прямая (прямая вида y = kx+b, при k < 0 наклон прямой отрицательный, связь между x и y обратная, при k > 0 наклон прямой положительный, связь между x и y прямая).
Корреляционный анализ
Для начала посмотрим на коэффициент корреляции между какими-нибудь двумя переменными:
cor(dat$Dividend.Yield, dat$Market.Cap)
## [1] -0.02179359
Если бы в одной из переменных были пропущенные значения (NA), коэффициент корреляции бы не рассчитался. Тут можно действовать по аналогии с расчетом среднего значения:
cor(dat$Dividend.Yield, dat$Market.Cap, use = "complete.obs")
## [1] -0.02179359
Как известно, существуют разные коэффициенты корреляции. Самые распространенные - линейный коэффициент корреляции Пирсона, коэффициент ранговой корреляции Спирмена и коэффициент ранговой корреляции Кендалла. По умолчанию считается коэффициент Пирсона, остальные можно получить, прописав дополнительный аргумент method
:
cor(dat$Dividend.Yield, dat$Market.Cap, method = "spearman")
## [1] 0.05994707
Проверить значимость коэффициента корреляции – проверить нулевую гипотезу о том, что истинный коэффициент корреляции равен 0.
cor.test(dat$Dividend.Yield, dat$Market.Cap)
##
## Pearson's product-moment correlation
##
## data: dat$Dividend.Yield and dat$Market.Cap
## t = -0.4889, df = 503, p-value = 0.6251
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## -0.10884164 0.06558614
## sample estimates:
## cor
## -0.02179359
В выдаче R мы видим две важные вещи: значение коэффициента корреляции (sample estimates) и pvalue. В нашем случае pvalue > 0.05, следовательно, на 5% уровне значимости есть основания отвергнуть нулевую гипотезу о равенстве коэффициента корреляции нулю. Раз эту гипотезу не отвергаем, считаем, что коэффициент корреляции равен 0, а следовательно, связи между дивидентами и капитализацией рынка нет.
Если хотим посмотреть на корреляцию «всего со всем», можем указать столбцы в базе (переменные) и получить корреляционную матрицу:
cor(dat[4:8])
## Price Price.Earnings Dividend.Yield Earnings.Share
## Price 1.0000000 NA -0.24462965 0.59106119
## Price.Earnings NA 1 NA NA
## Dividend.Yield -0.2446296 NA 1.00000000 -0.07723511
## Earnings.Share 0.5910612 NA -0.07723511 1.00000000
## X52.Week.Low 0.9950764 NA -0.24442592 0.58859470
## X52.Week.Low
## Price 0.9950764
## Price.Earnings NA
## Dividend.Yield -0.2444259
## Earnings.Share 0.5885947
## X52.Week.Low 1.0000000
Для того, чтобы получить корреляционную матрицу и значимость коэффициентов в ней, нужно постараться. Загрузим библиотеку Hmisc
.
install.packages("Hmisc")
library(Hmisc)
Внимание: функция привередничает - требует матрицу, а не просто столбцы из базы.
rcorr(as.matrix(dat[4:8]))
## Price Price.Earnings Dividend.Yield Earnings.Share
## Price 1.00 0.19 -0.24 0.59
## Price.Earnings 0.19 1.00 -0.18 0.00
## Dividend.Yield -0.24 -0.18 1.00 -0.08
## Earnings.Share 0.59 0.00 -0.08 1.00
## X52.Week.Low 1.00 0.19 -0.24 0.59
## X52.Week.Low
## Price 1.00
## Price.Earnings 0.19
## Dividend.Yield -0.24
## Earnings.Share 0.59
## X52.Week.Low 1.00
##
## n
## Price Price.Earnings Dividend.Yield Earnings.Share
## Price 505 503 505 505
## Price.Earnings 503 503 503 503
## Dividend.Yield 505 503 505 505
## Earnings.Share 505 503 505 505
## X52.Week.Low 505 503 505 505
## X52.Week.Low
## Price 505
## Price.Earnings 503
## Dividend.Yield 505
## Earnings.Share 505
## X52.Week.Low 505
##
## P
## Price Price.Earnings Dividend.Yield Earnings.Share
## Price 0.0000 0.0000 0.0000
## Price.Earnings 0.0000 0.0000 0.9186
## Dividend.Yield 0.0000 0.0000 0.0829
## Earnings.Share 0.0000 0.9186 0.0829
## X52.Week.Low 0.0000 0.0000 0.0000 0.0000
## X52.Week.Low
## Price 0.0000
## Price.Earnings 0.0000
## Dividend.Yield 0.0000
## Earnings.Share 0.0000
## X52.Week.Low