Processing math: 100%

Практикум

Условие

Можно считать, что распределение случайной величины X – результаты теста IQ – является нормальным. В большинстве современных исследований средний результат равняется 100 баллам, а стандартное отклонение – 15 баллам. В какой вероятностью случайно выбранный человек, пройдя тест IQ, наберет:

  1. меньше, чем 50, 70, 80, 90, 100, 110, 170 баллов?

  2. больше, чем 50, 70, 80, 90, 100, 110, 170 баллов?

  3. между 50 и 60, 70 и 80, 80 и 90, 90 и 100, 100 и 110, 110 и 120, 170 и 180 баллами?

Указания к решению задачи:

  • Создайте вектор значений случайной величины X, указанных в условии.
x <- c(50, 70, 80, 90, 100, 110, 120, 170)
  • Воспользуйтесь функцией pnorm() для рассчета вероятностей. Не забывайте про аргументы!

  • Округлите значения вероятностей до 4 знака после запятой.

  • Результатом решения задачи должна стать таблица из 6 колонок:

    1. Зачение случайной величины X,

    2. P(X<xi),

    3. P(X>xi),

    4. Значение верхней границы для отрезка из пункта 3. Обратите внимание, значение случайной величины X везде является нижней границей отрезка, а длина отрезка всегда постоянна. Как можно преобразовать вектор значений случайной величины X, чтобы получить вектор значений верхних границ отрезка xupper?

    5. P(X<xupper);

    6. P(xi<X<xupper).

  • Объясните, почему P(90<X<100)=P(100<X<110).

  • Сохраните получившуюся таблицу в файл расширения .csv.

Комментарий. Для того, чтобы таблица открывалась в Excel, нужно воспользоваться функцией write.csv2().

Решение

Рассчитаем вероятности того, что X не превысит каждое из значений, данное в векторе x, а затем округлим до 4 знака после запятой.

p_less_x <- pnorm(x, mean = 100, sd = 15, lower.tail = T)
p_less_x <- round(p_less_x, 4)
p_less_x
## [1] 0.0004 0.0228 0.0912 0.2525 0.5000 0.7475 0.9088 1.0000

Рассчитаем вероятности того, что X превысит каждое из значений, данное в векторе x, а затем округлим до 4 знака после запятой. Это можно сделать двумя способами: прописав аргумент lower.tail = F в функции pnorm() или вычтя из единицы вектор вероятностей, который мы получили на прошлом шаге:

p_more_x <- pnorm(x, mean = 100, sd = 15, lower.tail = F)
p_more_x <- round(p_more_x, 4)
p_more_x
## [1] 0.9996 0.9772 0.9088 0.7475 0.5000 0.2525 0.0912 0.0000

Проверим, что сумма двух вероятностей действительно равна 1.

p_less_x + p_more_x
## [1] 1 1 1 1 1 1 1 1

Создадим вектор верхних границ отрезков из пункта три.

x_upper <- x + 10
x
## [1]  50  70  80  90 100 110 120 170
x_upper
## [1]  60  80  90 100 110 120 130 180

Рассчитаем значения функции распределения от верхних границ отрезков и округлим до 4 знака после запятой.

p_less_upper <- pnorm(x_upper, mean = 100, sd = 15, lower.tail = T)
p_less_upper <- round(p_less_upper, 4)
p_less_upper
## [1] 0.0038 0.0912 0.2525 0.5000 0.7475 0.9088 0.9772 1.0000

Рассчитаем вероятность P(xlower<X<xupper):

p_between <- p_less_upper - p_less_x
p_between
## [1] 0.0034 0.0684 0.1613 0.2475 0.2475 0.1613 0.0684 0.0000

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

Осталось собрать табличку. Это делается функцией data.frame():

df <- data.frame(values = x, p_less_x, p_more_x, 
                 values_upper = x_upper, p_less_upper = p_less_upper,
                 p_between)
df
##   values p_less_x p_more_x values_upper p_less_upper p_between
## 1     50   0.0004   0.9996           60       0.0038    0.0034
## 2     70   0.0228   0.9772           80       0.0912    0.0684
## 3     80   0.0912   0.9088           90       0.2525    0.1613
## 4     90   0.2525   0.7475          100       0.5000    0.2475
## 5    100   0.5000   0.5000          110       0.7475    0.2475
## 6    110   0.7475   0.2525          120       0.9088    0.1613
## 7    120   0.9088   0.0912          130       0.9772    0.0684
## 8    170   1.0000   0.0000          180       1.0000    0.0000

Семинар

Знакомство с базой данных

Откроем базу данных, содержащую результаты эксперимента, проведенного на первом практическом занятии. Мы можем загрузить базу напрямую из интернета:

df <- read.csv2("http://math-info.hse.ru/f/2018-19/psych-ms/data/psych_survey.csv")

Узнаем, сколько в базе наблюдений (первое значение) и переменных (второе значение):

dim(df)
## [1] 123   9

Посмотрим на структуру базы: какие переменные в ней содержатся и каких типов. Обратите внимание, что перед каждой переменной стоит знак $ – он используется для того, чтобы обращаться к переменной в базе:

str(df)
## 'data.frame':    123 obs. of  9 variables:
##  $ height   : num  169 168 164 158 186 ...
##  $ math     : int  76 62 80 75 62 70 NA 79 50 70 ...
##  $ bio      : int  96 79 94 77 74 65 68 69 63 79 ...
##  $ subject  : int  1 2 2 4 2 1 4 1 2 4 ...
##  $ gender   : int  2 1 1 1 2 1 2 1 2 1 ...
##  $ residence: int  2 1 2 1 2 1 1 1 1 1 ...
##  $ length   : num  0 0 18 43 20 25 30 35 35 40 ...
##  $ angle    : num  0 0 11 12 15 15 15 15 15 15 ...
##  $ soft     : Factor w/ 2 levels "R","SPSS": 1 1 1 1 1 1 1 2 1 1 ...

Мы можем посмотреть на верхние 6 строчек базы, используя функцию head():

head(df)
##   height math bio subject gender residence length angle soft
## 1  169.0   76  96       1      2         2      0     0    R
## 2  168.0   62  79       2      1         1      0     0    R
## 3  164.0   80  94       2      1         2     18    11    R
## 4  158.0   75  77       4      1         1     43    12    R
## 5  186.0   62  74       2      2         2     20    15    R
## 6  168.5   70  65       1      1         1     25    15    R

Можно попросить R показать первые n строчек:

head(df, 10)
##    height math bio subject gender residence length angle soft
## 1   169.0   76  96       1      2         2      0     0    R
## 2   168.0   62  79       2      1         1      0     0    R
## 3   164.0   80  94       2      1         2     18    11    R
## 4   158.0   75  77       4      1         1     43    12    R
## 5   186.0   62  74       2      2         2     20    15    R
## 6   168.5   70  65       1      1         1     25    15    R
## 7   180.0   NA  68       4      2         1     30    15    R
## 8   176.0   79  69       1      1         1     35    15 SPSS
## 9   183.0   50  63       2      2         1     35    15    R
## 10  174.0   70  79       4      1         1     40    15    R

Аналогично мы можем посмотреть на нижние строчки в базе, используя функцию tail():

tail(df)
##     height math bio subject gender residence length angle soft
## 118    169   70  77       2      1         1     20    45    R
## 119    150   70  77       2      2         2     20    45    R
## 120    176   56  78       4      1         2     25    45    R
## 121    175   77  86       5      1         1      5    50    R
## 122    163   74  96       2      1         2      3    60    R
## 123    163   74  96       2      1         2      3    60    R
tail(df, 10)
##     height math bio subject gender residence length angle soft
## 114    160   84  60       1      1         1     24    38    R
## 115    189   59  70       1      1         2     26    38    R
## 116    170   72  60       1      1         2     25    40 SPSS
## 117    170   72  96       2      1         1      5    45    R
## 118    169   70  77       2      1         1     20    45    R
## 119    150   70  77       2      2         2     20    45    R
## 120    176   56  78       4      1         2     25    45    R
## 121    175   77  86       5      1         1      5    50    R
## 122    163   74  96       2      1         2      3    60    R
## 123    163   74  96       2      1         2      3    60    R

Сортировка наблюдений

Иногда нам требуется отсортировать таблицу по какой-либо переменной. Это делается с помощью функции order(). Обратите внимание на код ниже: в этой строчке мы просим R расположить строчки в таблице в соответствии с отсортированной переменнйо роста. (Если Вы просто прогоните команду order(df$height), то обнаружите, что у Вас отсортировалась не таблица, а только переменная):

sort <- df[order(df$height), ]
head(sort)
##     height math bio subject gender residence length angle soft
## 23     145   99 100       4      3         1     25    20    R
## 119    150   70  77       2      2         2     20    45    R
## 111    151   70  92       4      1         1     23    35    R
## 70     152   NA  NA       3      1         2     24    27 SPSS
## 72     156   68  77       5      1         3     19    28 SPSS
## 91     156   72  66       5      1         1     25    30    R

Мы можем сортировать наблюдения по убыванию. Для этого требуется поставить минус перед сортирующей переменной:

sort <- df[order(-df$height), ]
head(sort)
##     height math bio subject gender residence length angle soft
## 14     190   72  86       2      2         2     24    18    R
## 115    189   59  70       1      1         2     26    38    R
## 30     187   84  89       1      2         1     25    20 SPSS
## 5      186   62  74       2      2         2     20    15    R
## 49     186   80  92       5      2         2     25    25 SPSS
## 94     185   70  88       2      2         2     35    30    R

Частоты

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

Для начала посмотрим на распределение количества ответов по переменной гендера:

table(df$gender)
## 
##  1  2  3 22 
## 97 23  1  1

Мы заметили, что помимо ответов 1 – девушка и 2 – молодой человек у нас в базе оказались бессмысленные значения. Для корректной работы их нужно преобразовать: например, в пропущенные значения. Это делается следующим образом – мы производим замену в переменной внутри базы данных и сохраняем ее в ту же переменую внутри базы:

df$gender <- replace(df$gender, df$gender == 3 | df$gender == 22, NA)
table(df$gender)
## 
##  1  2 
## 97 23

Чтобы подсчитать частоты, нужно применить функцию prop.table() к выдаче функции table(). В строке ниже я вставляю функцию внутрь функции, а затем округляю получившийся результ до второго знака после запятой:

gender_table <- prop.table(table(df$gender))
round(gender_table, 2)
## 
##    1    2 
## 0.81 0.19

Описательные статистики: начало

Для характеристики количественных переменных нам требуются более сложные инструменты (подумайте, почему нам не подходят таблицы частот?). Для этого используются описательные статистики. Их можно считать как для всей базы, так и для отдельных переменных. Выведем описательные статистики для переменной количества баллов ЕГЭ по математике.

summary(df$math)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##   50.00   70.00   74.00   73.31   78.00   99.00      17

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