Подготовка данных

Загрузим базу данных из файла 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)))

Пояснения к коду:

По матрице видно, что исследовать связь между отдельными парами показателей не очень удобно: слишком их много. Для этого мы и будем реализовывать метод главных компонент – снижать размерность наших данных. Но давайте для начала отдельно посмотрим на коэффициенты корреляции, выведем корреляционную матрицу. Вообще, строго говоря, оценки в 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 показателей выбрать наиболее информативные, мы бы взяли первые две главные компоненты, и первая главная компонента представляла собой своеобразный индекс способности студента к английскому языку, а вторая – интегральный индекс склонности к историческим и социальным наукам. На этом закончим, а на следующем занятии уделим больше времени интерпретации.