Практикум

Условие

Загрузите в R файл с данными результатов нашего игрового опроса.

df <- read.csv2("http://math-info.hse.ru/f/2018-19/psych-ms/data/psych_survey.csv")
  1. Отсортируйте базу данных по убыванию по переменной балла ЕГЭ по математике.

  2. Выведите на экран на 5 верхних и 5 нижних строчек отсортированной базы.

  3. Создайте переменную отклонения оценки величины угла от истинного значения angle_diff, если известно, что величина угла составляла 18 градусов.

  4. Выведите описательные статистики для студентов, изучающих R.

  5. Рассчитайте среднее значение балла ЕГЭ по математике для студентов, указавших математику в качестве любимого предмета, и для тех, кто ее таковым не назвал.

Решение

Отсортируем базу по переменной балла ЕГЭ по математике в порядке убывания и выведем верхние 5 и нижние 5 строчек.

df <- df[order(-df$math),]
head(df, 5)
##     height math bio subject gender residence length angle soft
## 23     145   99 100       4   <NA>         1     25    20    R
## 45     173   97  NA       5 female         1     22    23    R
## 43     165   94  78       1 female         2     24    23    R
## 15     158   91  90       1 female         1     50    20    R
## 102    181   88  68       1 female         2     25    30    R
tail(df, 5)
##    height math bio subject gender residence length angle soft
## 75    173   NA  NA       3 female         2     22    28 SPSS
## 79    161   NA  66       4 female         2     20    30    R
## 81    164   NA  NA       5   <NA>         1     30    30    R
## 84    162   NA  NA       4 female         1     25    30 SPSS
## 93    175   NA  90       2 female         2     27    30    R

Если Вы хотите вывести табличку, где будет сразу пять верхних и пять нижних строчек, можно склеить результаты функций head() и tail() в одну табличку, используя функцию rbind()

rbind(head(df, 5), tail(df, 5))
##     height math bio subject gender residence length angle soft
## 23     145   99 100       4   <NA>         1     25    20    R
## 45     173   97  NA       5 female         1     22    23    R
## 43     165   94  78       1 female         2     24    23    R
## 15     158   91  90       1 female         1     50    20    R
## 102    181   88  68       1 female         2     25    30    R
## 75     173   NA  NA       3 female         2     22    28 SPSS
## 79     161   NA  66       4 female         2     20    30    R
## 81     164   NA  NA       5   <NA>         1     30    30    R
## 84     162   NA  NA       4 female         1     25    30 SPSS
## 93     175   NA  90       2 female         2     27    30    R
df$angle_diff <- df$angle - 18

Если Вы эстет, можно создать переменную абсолютных значений отклонения, воспользовавшись функцией модуля:

df$angle_diff_abs <- abs(df$angle_diff)

Отберем респондентов, изучающих R, и сохраним их в новую базу данных.

r <-  subset(df, soft=="R")

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

summary(r)
##      height           math            bio            subject    
##  Min.   :145.0   Min.   :50.00   Min.   : 60.00   Min.   :1.00  
##  1st Qu.:163.0   1st Qu.:70.00   1st Qu.: 73.00   1st Qu.:1.75  
##  Median :169.0   Median :74.00   Median : 79.00   Median :2.00  
##  Mean   :168.7   Mean   :74.12   Mean   : 80.83   Mean   :2.62  
##  3rd Qu.:174.0   3rd Qu.:80.00   3rd Qu.: 90.00   3rd Qu.:4.00  
##  Max.   :190.0   Max.   :99.00   Max.   :100.00   Max.   :5.00  
##                  NA's   :8       NA's   :13       NA's   :1     
##     gender     residence         length          angle         soft   
##  female:72   Min.   :1.000   Min.   : 0.00   Min.   : 0.00   R   :93  
##  male  :18   1st Qu.:1.000   1st Qu.:20.00   1st Qu.:22.00   SPSS: 0  
##  NA's  : 3   Median :1.000   Median :25.00   Median :25.00            
##              Mean   :1.467   Mean   :23.79   Mean   :26.87            
##              3rd Qu.:2.000   3rd Qu.:27.00   3rd Qu.:30.00            
##              Max.   :3.000   Max.   :50.00   Max.   :60.00            
##              NA's   :1       NA's   :1                                
##    angle_diff      angle_diff_abs 
##  Min.   :-18.000   Min.   : 0.00  
##  1st Qu.:  4.000   1st Qu.: 4.50  
##  Median :  7.000   Median : 8.00  
##  Mean   :  8.871   Mean   :10.27  
##  3rd Qu.: 12.000   3rd Qu.:12.00  
##  Max.   : 42.000   Max.   :42.00  
## 

Создадим две новых базы данных: в одну сохраним студентов, выбравших математику как любимый предмет; во вторую – всех остальных.

math_lovers <- subset(df, subject == "math")
not_math_lovers <- subset(df, subject != "math")

Посчитаем среднее значение балла ЕГЭ по математике для тех, кто указал математику в качестве любимого предмета.

mean(math_lovers$math, na.rm=T)
## [1] NaN

Посчитаем среднее значение балла ЕГЭ по математике для тех, кто указал любой другой предмет, кроме математики, в качестве любимого.

mean(not_math_lovers$math, na.rm=T)
## [1] 73.19048

Семинар

Отбор наблюдений

Иногда нам требуется отбирать наблюдения по сложным логическим условиям.

Например, если мы хотим отобрать только девушек, которые в качестве любимого предмета указали либо математику, либо биологию, мы это сделаем так:

selected <- subset(df, gender  == "female" & (subject  == 1  | subject == 2))
dim(selected)
## [1] 50 11

Напомню, что команда dim() позволяет узнать размерность таблицы. Ее результат содержит два числа: первое – это количество строк, а второе – количество столбцов.

Одни и те же условия можно записывать по-разному. Эквивалентной предыдущему будет вот такая запись, в которой мы <<раскрыли скобки>>:

selected <- subset(df, (gender  == "female" & subject  == 1)  | (gender  == "female" & subject == 2))
dim(selected)
## [1] 50 11

Никогда не скупитесь проставить скобки, записывая логические условия. Без них R бы подумал, что мы хотим выбрать девушек, которые любят математику, или всех студентов, вне зависимости от их пока, любящих биологию:

selected <- subset(df, gender  == "female" & subject  == 1  | subject == 2)
dim(selected)
## [1] 61 11

Задание 1. Отобрать студентов, изучающих R, у которых балл ЕГЭ больше 90 хотя бы по одному из двух предметов.

selected_1 <- subset(df, soft == "R" & (math > 90 | bio > 90))
dim(selected_1)
## [1] 18 11

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

selected_2 <- subset(df, gender == "male" & (subject == 1 | subject == 2) & (angle<=20 & angle>=16))
selected_2
##    height math bio subject gender residence length angle soft angle_diff
## 30    187   84  89       1   male         1     25    20 SPSS          2
## 14    190   72  86       2   male         2     24    18    R          0
##    angle_diff_abs
## 30              2
## 14              0

Можно было сделать по-другому, используя переменную модуля отклонения от истинного значения.

selected_3 <- subset(df, gender == "male" & (subject == 1 | subject == 2) & angle_diff_abs <= 2)
selected_3
##    height math bio subject gender residence length angle soft angle_diff
## 30    187   84  89       1   male         1     25    20 SPSS          2
## 14    190   72  86       2   male         2     24    18    R          0
##    angle_diff_abs
## 30              2
## 14              0

Задание 3. Отобрать молодых людей, указавших, что любимый предмет это математика или биология, которые, указывая длину отрезка, ошиблись не больше, чем на 2 сантиметра.

selected_4 <- subset(df, gender == "female" & (subject == 3 | subject == 4) & (angle == 18 | length == 22))
selected_4
##    height math bio subject gender residence length angle soft angle_diff
## 86    157   70  63       3 female         1     22    30    R         12
## 73    168   56  70       4 female         2     22    28    R         10
## 75    173   NA  NA       3 female         2     22    28 SPSS         10
##    angle_diff_abs
## 86             12
## 73             10
## 75             10