Загрузим базу данных из файла scores3.csv
.
df <- read.csv("scores3.csv")
Посмотрим на нее:
head(df)
## mstat econ eng polth mstat2 phist law phil polsoc ptheo compp game wpol
## 1 9 8 9 8 10 8 7 9 9 7 8 6 10
## 2 10 10 10 10 10 9 9 10 10 9 8 9 10
## 3 9 10 9 10 9 8 9 10 9 9 8 7 9
## 4 9 8 9 9 10 6 9 9 9 8 8 8 9
## 5 10 10 10 10 9 8 8 10 9 7 5 8 10
## 6 9 10 9 8 9 8 8 10 9 7 8 9 9
## male
## 1 1
## 2 1
## 3 1
## 4 0
## 5 1
## 6 0
В файле scores3.csv
сохранены оценки студентов-политологов, взятые из кумулятивного рейтинга с сайта ВШЭ (без имен).
Переменные:
Удалим из базы строки с пропущенными значениями – они нам будут мешать при реализаии метода главных компонент (одно из требований МГК к данным - отсутствие пропусков).
df <- na.omit(df)
Теперь уберем из базы последний столбец male, поскольку эта переменная, строго говоря, не количественная, так как отвечает за качественный признак - пол студента.
d <- df[1:ncol(df)-1]
Пояснения к коду: ncol(df)
- число столбцов в базе df
, и мы выбираем все столбцы из df
, начиная с первого и до предпоследнего. Потом сохраняем результат в переменную d
.
Попробуем построить диаграммы рассеяния для каждой пары показателей и вывести сразу коэффициенты корреляции. Установим библиотеку GGally
:
install.packages("GGally")
Обратимся к ней:
library(GGally)
Теперь построим матрицу диаграмм рассеяния (это может занять некоторое время из-за числа графиков):
ggpairs(d)
Приведем график в порядок:
ggpairs(d,
upper = list(continuous = wrap("cor", size = 3)),
lower = list(continuous = wrap("points", size = 0.3)))
Пояснения к коду:
upper - параметры верхней половины матрицы, над главной диагональю, передаются в виде списка (list
). Параметр "cor"
отвечает за текст, содержащий коэффициенты корреляции, здесь мы поменяли размер текста;
lower - параметры нижней половины матрицы, под главной диагональю, передаются в виде списка (list
). Параметр "points"
отвечает за точки на диаграммах рассеяния, здесь мы поменяли размер точек.
По матрице видно, что исследовать связь между отдельными парами показателей не очень удобно: слишком их много. Для этого мы и будем реализовывать метод главных компонент – снижать размерность наших данных. Но давайте для начала отдельно посмотрим на коэффициенты корреляции, выведем корреляционную матрицу. Вообще, строго говоря, оценки в 10-балльной шкале – показатели не количественные, а порядковые (ординальные). Поэтому давайте посмотрим на коэффициенты корреляции Спирмена:
cor(d, method = "spearman")
## mstat econ eng polth mstat2 phist
## mstat 1.0000000 0.6176276 0.4534958 0.3875934 0.7631511 0.3787232
## econ 0.6176276 1.0000000 0.3963725 0.4600553 0.6217645 0.3452217
## eng 0.4534958 0.3963725 1.0000000 0.4020750 0.3788167 0.3428704
## polth 0.3875934 0.4600553 0.4020750 1.0000000 0.4790910 0.7422948
## mstat2 0.7631511 0.6217645 0.3788167 0.4790910 1.0000000 0.3369457
## phist 0.3787232 0.3452217 0.3428704 0.7422948 0.3369457 1.0000000
## law 0.4511240 0.3947224 0.3470541 0.5942683 0.5822143 0.4514427
## phil 0.5558160 0.7368656 0.4696619 0.6632443 0.6412523 0.5677653
## polsoc 0.3583622 0.3814569 0.4065767 0.7054303 0.3956788 0.6489989
## ptheo 0.4128863 0.5488706 0.2978884 0.6897136 0.6034308 0.6313920
## compp 0.1563743 0.4007272 0.2667313 0.6549595 0.2863901 0.4468840
## game 0.3731448 0.2945525 0.3164101 0.3573266 0.4867725 0.3017593
## wpol 0.3049210 0.2639518 0.3912632 0.4710572 0.3378935 0.4015494
## law phil polsoc ptheo compp game
## mstat 0.4511240 0.5558160 0.3583622 0.4128863 0.1563743 0.3731448
## econ 0.3947224 0.7368656 0.3814569 0.5488706 0.4007272 0.2945525
## eng 0.3470541 0.4696619 0.4065767 0.2978884 0.2667313 0.3164101
## polth 0.5942683 0.6632443 0.7054303 0.6897136 0.6549595 0.3573266
## mstat2 0.5822143 0.6412523 0.3956788 0.6034308 0.2863901 0.4867725
## phist 0.4514427 0.5677653 0.6489989 0.6313920 0.4468840 0.3017593
## law 1.0000000 0.5780088 0.6149869 0.5767664 0.3842284 0.3363555
## phil 0.5780088 1.0000000 0.5894866 0.7732779 0.5351403 0.4436880
## polsoc 0.6149869 0.5894866 1.0000000 0.6574317 0.5737745 0.3256020
## ptheo 0.5767664 0.7732779 0.6574317 1.0000000 0.6113797 0.4784995
## compp 0.3842284 0.5351403 0.5737745 0.6113797 1.0000000 0.3124625
## game 0.3363555 0.4436880 0.3256020 0.4784995 0.3124625 1.0000000
## wpol 0.3948234 0.3368150 0.5039353 0.4624604 0.5467573 0.4064749
## wpol
## mstat 0.3049210
## econ 0.2639518
## eng 0.3912632
## polth 0.4710572
## mstat2 0.3378935
## phist 0.4015494
## law 0.3948234
## phil 0.3368150
## polsoc 0.5039353
## ptheo 0.4624604
## compp 0.5467573
## game 0.4064749
## wpol 1.0000000
Между оценками по каким курсам наблюдается сильная согласованность?
Для реализации метода главных компонент нам понадобится функция prcomp()
. Это не единственная функция в R для МГК, но плюс этих функций в том, что они базовые – для их загрузки не нужно дополнительных библиотек.
pca <- prcomp(d, center = TRUE, scale = TRUE)
В качестве дополнительных параметров в prcomp()
мы выставили два аргумента center=TRUE
и scale=TRUE
. Это мы сделали для того, чтобы перейти к центрированно-нормированным данным, которые нам необходимы в МГК. Можно было бы обойтись без этих аргументов, но тогда перед тем, как передать базу d
на вход функции prcomp()
, нужно было бы шкалировать данные с помощью функции scale()
, как мы делали в кластерном анализе.
На самом деле, на этом реализация МГК закончилась :) Осталось посмотреть на результаты и проинтерпретировать их. Результаты мы сохранили в переменную pca
:
pca
## Standard deviations:
## [1] 2.6055441 1.1771046 0.9735513 0.8851887 0.8282008 0.7883380 0.7009425
## [8] 0.5670366 0.5331358 0.5125424 0.4484431 0.3559333 0.3150176
##
## Rotation:
## PC1 PC2 PC3 PC4 PC5
## mstat -0.2565066 -0.47500043 0.10971249 -0.07363800 0.173397850
## econ -0.2863127 -0.28814363 -0.14499208 -0.02081404 0.324113863
## eng -0.2038500 -0.12255875 0.57802764 -0.58386281 -0.177656796
## polth -0.3181943 0.22782785 -0.24765071 -0.06028538 -0.068379152
## mstat2 -0.2847444 -0.41089145 -0.03340885 0.23277470 0.155106073
## phist -0.2822290 0.24151363 -0.20570300 -0.28742679 -0.212429707
## law -0.2861525 -0.02096933 -0.06564367 -0.06462649 0.002971748
## phil -0.3430839 -0.14460985 -0.16339074 -0.02650635 -0.002485410
## polsoc -0.2959854 0.31188552 0.01592344 -0.25521763 -0.090300216
## ptheo -0.3314008 0.11952251 -0.19216949 0.11834400 -0.046719086
## compp -0.2546686 0.41234938 0.02853651 0.27903752 0.327217247
## game -0.2199262 -0.13517052 0.18478943 0.51443807 -0.743069003
## wpol -0.1960791 0.27576810 0.65185427 0.29374634 0.299811588
## PC6 PC7 PC8 PC9 PC10
## mstat -0.14613932 0.425442848 -0.40610209 0.21723397 -0.005350138
## econ 0.46491724 -0.176181556 0.26057114 0.26181671 0.256720970
## eng 0.21763244 -0.234667480 -0.02519589 -0.20631714 -0.287175516
## polth -0.01034791 0.006048546 0.15044306 0.44647376 -0.439185540
## mstat2 -0.26247565 0.081587391 -0.09865909 -0.24593241 -0.230256799
## phist 0.04439677 0.612840983 0.20510302 -0.04335634 -0.116024062
## law -0.66241713 -0.455179322 0.25916903 0.06406942 -0.073867889
## phil 0.26464348 -0.158787056 0.17770017 -0.07600864 0.207696394
## polsoc -0.19454419 -0.085174279 -0.45498687 0.16970071 0.598550741
## ptheo 0.02144486 0.047898819 0.03871222 -0.71024924 0.144506955
## compp 0.25717650 -0.201581117 -0.47248054 -0.03268891 -0.363647096
## game 0.13849171 -0.060538779 -0.06269852 0.17415578 0.033174818
## wpol -0.10816701 0.253716513 0.39709995 0.07389175 0.176501962
## PC11 PC12 PC13
## mstat -0.2700726422 0.37565081 -0.180287365
## econ -0.1467310156 -0.02890087 0.486403472
## eng 0.0547006349 0.01771319 0.073762144
## polth 0.4631518964 0.38430617 0.002342365
## mstat2 0.4702288795 -0.46458267 0.187066644
## phist -0.3049188192 -0.39629202 0.083588993
## law -0.4308967026 -0.02806491 -0.002883336
## phil 0.1001989498 -0.15844918 -0.789359358
## polsoc 0.2623464998 -0.13166414 0.127431404
## ptheo 0.0001481339 0.51492509 0.167433067
## compp -0.2929310623 -0.16408925 -0.057534822
## game -0.1234883729 -0.02132199 0.092224613
## wpol 0.0913387195 0.03748079 -0.065543868
Немного теории. Часть со стандартными отклонениями (Standard deviations) соответствует стандартным отклонениям главных компонент, каждое из которых совпадает с квадратным корнем из соответствующего собственного значения ковариационной матрицы. Отдельно стандартные отклонения можно вызвать так:
pca$sdev
## [1] 2.6055441 1.1771046 0.9735513 0.8851887 0.8282008 0.7883380 0.7009425
## [8] 0.5670366 0.5331358 0.5125424 0.4484431 0.3559333 0.3150176
Часть с главными компонентами (Rotation) соответствует матрице поворота, которая является матрицей перехода к новой системе координат (новому базису). Эта матрица состоит из собственных векторов ковариационной матрицы для наших данных, причем длина каждого вектора равна 1. Отдельно эту матрицу можно вызвать так:
pca$rotation
## PC1 PC2 PC3 PC4 PC5
## mstat -0.2565066 -0.47500043 0.10971249 -0.07363800 0.173397850
## econ -0.2863127 -0.28814363 -0.14499208 -0.02081404 0.324113863
## eng -0.2038500 -0.12255875 0.57802764 -0.58386281 -0.177656796
## polth -0.3181943 0.22782785 -0.24765071 -0.06028538 -0.068379152
## mstat2 -0.2847444 -0.41089145 -0.03340885 0.23277470 0.155106073
## phist -0.2822290 0.24151363 -0.20570300 -0.28742679 -0.212429707
## law -0.2861525 -0.02096933 -0.06564367 -0.06462649 0.002971748
## phil -0.3430839 -0.14460985 -0.16339074 -0.02650635 -0.002485410
## polsoc -0.2959854 0.31188552 0.01592344 -0.25521763 -0.090300216
## ptheo -0.3314008 0.11952251 -0.19216949 0.11834400 -0.046719086
## compp -0.2546686 0.41234938 0.02853651 0.27903752 0.327217247
## game -0.2199262 -0.13517052 0.18478943 0.51443807 -0.743069003
## wpol -0.1960791 0.27576810 0.65185427 0.29374634 0.299811588
## PC6 PC7 PC8 PC9 PC10
## mstat -0.14613932 0.425442848 -0.40610209 0.21723397 -0.005350138
## econ 0.46491724 -0.176181556 0.26057114 0.26181671 0.256720970
## eng 0.21763244 -0.234667480 -0.02519589 -0.20631714 -0.287175516
## polth -0.01034791 0.006048546 0.15044306 0.44647376 -0.439185540
## mstat2 -0.26247565 0.081587391 -0.09865909 -0.24593241 -0.230256799
## phist 0.04439677 0.612840983 0.20510302 -0.04335634 -0.116024062
## law -0.66241713 -0.455179322 0.25916903 0.06406942 -0.073867889
## phil 0.26464348 -0.158787056 0.17770017 -0.07600864 0.207696394
## polsoc -0.19454419 -0.085174279 -0.45498687 0.16970071 0.598550741
## ptheo 0.02144486 0.047898819 0.03871222 -0.71024924 0.144506955
## compp 0.25717650 -0.201581117 -0.47248054 -0.03268891 -0.363647096
## game 0.13849171 -0.060538779 -0.06269852 0.17415578 0.033174818
## wpol -0.10816701 0.253716513 0.39709995 0.07389175 0.176501962
## PC11 PC12 PC13
## mstat -0.2700726422 0.37565081 -0.180287365
## econ -0.1467310156 -0.02890087 0.486403472
## eng 0.0547006349 0.01771319 0.073762144
## polth 0.4631518964 0.38430617 0.002342365
## mstat2 0.4702288795 -0.46458267 0.187066644
## phist -0.3049188192 -0.39629202 0.083588993
## law -0.4308967026 -0.02806491 -0.002883336
## phil 0.1001989498 -0.15844918 -0.789359358
## polsoc 0.2623464998 -0.13166414 0.127431404
## ptheo 0.0001481339 0.51492509 0.167433067
## compp -0.2929310623 -0.16408925 -0.057534822
## game -0.1234883729 -0.02132199 0.092224613
## wpol 0.0913387195 0.03748079 -0.065543868
Каждой главной компоненте PC соответствует свой собственный вектор ковариационной матрицы длины 1, который задает направление новой оси - главной компоненты. Несложно заметить, что главных компонент получилось столько же, сколько исходных переменных – мы просто повернули все оси, ничего не выкидывая.
Каждая главная компонента получается линейной комбинацией старых показателей, то есть представляется суммой исходных переменных, взятых с разными весами. Чем больше вес, тем большую информацию в главную компоненту вносит конкретный показатель. Запишем выражение для первой главной компоненты (веса показателей округлены до второго знака после запятой):
\[PC1 = -0.26 \times mstat - 0.29 \times econ - 0.2 \times eng - 0.32 \times polth - 0.28 \times mstat2 - 0.28 \times phist\] \[ - 0.29 \times law - 0.34 \times phil - 0.30 \times polsoc - 0.33 \times ptheo - 0.25 \times compp - 0.22 \times game - 0.20 \times wpol\]
Теперь перейдем к интерпретации.
Интерпретация. По весам, которые представлены в выдаче Rotation, можно попробовать определить, какой содержательный смысл есть у каждой главной компоненты. Рассмотрим первую главную компоненту PC1. На самом деле, с ней все не так очевидно, так часто бывает при работе с реальными данными, особенно когда корреляция между показателями не очень высокая. Что можно сказать о PC1? Несмотря на то, что все переменные входят в нее с отрицательным весом, видно, что с наибольшим весом (по самому значению, не по модулю) входят оценки по английскому языку и мировой политике, которая читается на английском языке. Давайте считать, что первая главная компонента отвечает за способность студентов к английскому языку.
Со второй главной компонентой PC2 все более понятно. В нее наибольший вклад вносят оценки по истории политических учений, политической истории, сравнительной политике и политической социологии. Можно считать, что эта главная компонента отвечает за склонность к истории и социальным наукам. С третьей главной компонентой все сложно, давайте проинтерпретируем четвертую. В четвертую главную компоненту с высоким весом входит оценка по теории игр, с относительно высоким – математика и статистика и экономика. Можно условно считать эту главную компоненту “ответственной” за склонность к точным наукам.
Остальные главные компоненты интерпретировать можно, но не всегда нужно: чем больше мы удаляемся от первой главной компоненты, тем менее информативными эти компоненты становятся. Давайте посмотрим на информативность главных компонент.
summary(pca)
## Importance of components:
## PC1 PC2 PC3 PC4 PC5 PC6
## Standard deviation 2.6055 1.1771 0.97355 0.88519 0.82820 0.78834
## Proportion of Variance 0.5222 0.1066 0.07291 0.06027 0.05276 0.04781
## Cumulative Proportion 0.5222 0.6288 0.70171 0.76198 0.81475 0.86255
## PC7 PC8 PC9 PC10 PC11 PC12
## Standard deviation 0.70094 0.56704 0.53314 0.51254 0.44844 0.35593
## Proportion of Variance 0.03779 0.02473 0.02186 0.02021 0.01547 0.00975
## Cumulative Proportion 0.90035 0.92508 0.94694 0.96715 0.98262 0.99237
## PC13
## Standard deviation 0.31502
## Proportion of Variance 0.00763
## Cumulative Proportion 1.00000
Сводная информация по результатам МГК содержит следующее: стандартные отклонения главных компонент, доля дисперсии исходных данных, которую объясняет главная компонента, и кумулятивная доля объясненной дисперсии – дисперсия исходных данных, которая объясняется текущей и предыдущими главными компонентами.
Обычно считается, что нужно извлекать столько главных компонент, сколько можем содержательно проинтерпретировать. Но, конечно, существуют и более формальные критерии (более детально поговорим о них на следующем занятии). Так, например, по правилу Кайзера нужно извлекать столько главных компонент, сколько имеется компонент с дисперсией (собственным числом) более 1. В нашем случае таких ГК две. Другое эмпирическое правило гласит, что нужно извлекать столько главных компонент, сколько смогут объяснить хотя бы 70%-80% дисперсии наших исходных данных. В нашем случае - не менее трех (первые три главные компоненты объясняют 70%).
Еще существует правило Кеттела, которое имеет логику, схожую с методом согнутого колена (локтя) в кластерном анализе. Нужно построить график, по горизонтальной оси которого отложены номера главных компонент, а по вертикальной – их дисперсии (собственные значения ковариационной матрицы):
plot(pca, type = "l")
Остановиться нужной на той главной компоненте, которая находится на “изгибе” или до него. То есть, в нашем случае, на второй.
Другими словами, если бы мы хотели из исходных 13 показателей выбрать наиболее информативные, мы бы взяли первые две главные компоненты, и первая главная компонента представляла собой своеобразный индекс способности студента к английскому языку, а вторая – интегральный индекс склонности к историческим и социальным наукам. На этом закончим, а на следующем занятии уделим больше времени интерпретации.