Продолжаем работать с тем же файлом. Выведем описательные статистики для всей базы.
df <- read.csv2("http://math-info.hse.ru/f/2018-19/psych-ms/data/psych_survey.csv")
summary(df)
## height math bio subject
## Min. :145.0 Min. :50.00 Min. : 60.0 Min. :1.000
## 1st Qu.:163.5 1st Qu.:70.00 1st Qu.: 72.0 1st Qu.:2.000
## Median :169.0 Median :74.00 Median : 79.0 Median :2.000
## Mean :169.0 Mean :73.31 Mean : 80.1 Mean :2.678
## 3rd Qu.:174.5 3rd Qu.:78.00 3rd Qu.: 89.0 3rd Qu.:4.000
## Max. :190.0 Max. :99.00 Max. :100.0 Max. :5.000
## NA's :17 NA's :22 NA's :2
## gender residence length angle soft
## female:97 Moscow :69 Min. : 3.00 Min. :11.00 R :93
## male :23 Not Moscow:52 1st Qu.:20.00 1st Qu.:22.00 SPSS:30
## NA's : 3 NA's : 2 Median :25.00 Median :25.00
## Mean :24.29 Mean :26.86
## 3rd Qu.:27.00 3rd Qu.:30.00
## Max. :50.00 Max. :60.00
## NA's :3 NA's :2
## subject2
## Humanities:36
## Neither :19
## Sciences :66
## NA's : 2
##
##
##
Выведем описательные статистики для переменной балла ЕГЭ по математике.
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
Посмотрим на получившиеся результаты. Мы видим, что минимальное значение балла ЕГЭ по математике составило 50, а максимальное – 99. Средний балл ЕГЭ по математике, рассчитанный как среднее арифметическое по всем наблюдениям, равен 73.31. Медиана равна 74 баллам, нижний квартиль – 70, а верхний – 78. Следовательно, 25% студентов, ответивших на опрос, написали ЕГЭ по математике ниже, чем на 70 баллов; 50% студентов, ответивших на опрос, написали ЕГЭ по математике ниже, чем на 74 балла; 75% студентов, ответивших на опрос, написали ЕГЭ по математике ниже, чем на 78 баллов.
Мы можем считать отдельные статистики с помощью встроенных в R комманд. Например, мы можем посчитать стандартное отклонение, которое не рассчитывается в выдаче функции summary(). Обратите внимание, что если в переменной, для которой Вы рассчитываете, присутствуют пропущенные значения, статистика не будет рассчитана. Поэтому Вам нужно прописать аргумент na.rm = TRUE, который диктует R игнорировать пропущенные значения.
sd(df$math)
## [1] NA
sd(df$math, na.rm = TRUE)
## [1] 9.595002
Давайте “приклеим” стандартное отклонение к выдаче summary(). Для этого нужно сохранить результат функции summary() в новый объект в памяти R.
sum_math <- summary(df$math)
Затем создадим новый вектор, который будет состоять из предыдущей выдаче и нового элемента Sd, в который мы сохраняем значение квадратного отклонения.
sum_math_sd <- c(sum_math, Sd = sd(df$math, na.rm = TRUE))
sum_math_sd <- round(sum_math_sd, 2)
sum_math_sd
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's Sd
## 50.00 70.00 74.00 73.31 78.00 99.00 17.00 9.60
Стандартное отклонение примерно равно 10 баллов.
Иногда в наших данных могут присутствовать нехарактерные значения – такие значения, которые очень сильно отличаются от всех остальных наблюдений. Один из способов выявления нехарактерных значений использует понятие межквартильного размаха, interquartile range (IQR). Межквартильный размах рассчитывается как разность между верхней и нижней выборочными квартилями:
\[IQR = x_{0.75}-x_{0.25}\] Таким образом, межквартильный размах охватывает 50% наиболее <<типичных>> значений, сконцентрированных вокруг медианы. Воспользуемся функцией quantile(). В качестве аргументов она принимает переменную, для которой мы считаем квантили, уровень квантиля, и указание, что делать с пропущенными значениями.
l_qu <- quantile(df$math, 0.25, na.rm = TRUE)
u_qu <- quantile(df$math, 0.75, na.rm = TRUE)
iqr <- u_qu - l_qu
names(iqr) <- "IQR"
iqr
## IQR
## 8
На самом деле, в R есть и встроенная функция, которая считает межквартильный размах:
IQR(df$math, na.rm = TRUE)
## [1] 8
Межквартильный размах позволяет рассчитать границы нехарактерных значений. В качестве верхней границы используется значение, соответствующее сумме верхней квартили и произведению межквартильного размаха на 1.5:
\[UB = x_{0.75}+1.5*IQR\]
В качестве нижней границы используется значение, соответствующее разности нижней квартили и произведению межквартильного размаха на 1.5:
\[LB = x_{0.25}-1.5*IQR\]
Давайте рассчитаем эти границы.
upper_bound <- u_qu + 1.5*iqr
names(upper_bound) <- "upper bound"
upper_bound
## upper bound
## 90
lower_bound <- l_qu - 1.5*iqr
names(lower_bound) <- "lower bound"
lower_bound
## lower bound
## 58
Следовательно, верхняя граница типичных наблюдений равна 90 баллам, а нижняя – 58. Баллы, превышающие или не достигающие этих значений соответственно, нетипично высоки и нетипично низки относительно нашей выборки.
Мощный инструмент описательного анализа данных – визуализация или построение графиков. Сегодня мы познакомимся с двумя графиками, которые используются для визуализации количественных переменных: ящик с усами и гистограмма.
Ящик с усами, или box plot, основывается на расчете выборочных квартилей и межквартильном размахе. На этом графике одна ось: по ней отложены значения переменной, для которой рисуется график.
Границами ящика выступают значения нижней и верхней квартили. Внутри “ящика” откладывается медиана. Наконец, “усами” на графике отмечаются максимальное и минимальное значение переменной, попадающие внутрь границ характерных значений. Наблюдения, выходящие за эти границы, отмечаются точками как нетипичные.
Давайте посмотрим ящик с усами для переменной балла ЕГЭ по математике:
boxplot(df$math)
Этот график не очень понятный. При визуализации данных принято делать графики как можно более понятными для читателя. Прежде всего, нам нужно подписать ось и дать название графику:
boxplot(df$math, ylab = "Балл", main = "Распределение балла ЕГЭ по математике")
Изменим цвет ящика:
boxplot(df$math, ylab = "Балл", main = "Распределение балла ЕГЭ по математике", col = "salmon")
Цвета в R можно задавать двумя способами. Простой: выбрать название цвета из http://www.stat.columbia.edu/~tzheng/files/Rcolor.pdf. Чуть более сложный: задать обозначение цвета через https://www.w3schools.com/colors/colors_picker.asp.
Наконец, мы можем сравнить распределения переменной между заданными нами группами. Например, построим два ящика с усами для баллов ЕГЭ по математике для москвичей и не-москвичей. Но сначала заменим значени
boxplot(df$math ~ df$residence, ylab = "Балл", main = "Распределение балла ЕГЭ по математике",
col = "salmon")
Иногда бывает удобно “положить” ящики на бок, особенно если у нас много значений группирующей переменной. Это делается с помощью аргумента horizontal = TRUE:
boxplot(df$math ~ df$residence, ylab = "Балл", main = "Распределение балла ЕГЭ по математике",
col = "salmon", horizontal = TRUE)
Второй график, гистограмма, приближает плотность распределения нашей выборки и основывается на расчете частоты, с которой то или иное значение попадает в некоторый промежуток. Этот промежуток мы можем регулировать для более или менее точного представления распределения.
Нарисуем базовую гистограмму для балла ЕГЭ по математике:
hist(df$math, xlab = "Балл", ylab = "Количество", main = "Распределение балла ЕГЭ по математике")
Столбики на графике представляют собой промежутки, равные 5 баллам.
Давайте выведем по оси Y плотность, а не количество значений, с помощью аргумента freq = F. В результате мы получим график, площадь под которым будет равна 1:
hist(df$math, xlab = "Балл", ylab = "Плотность", main = "Распределение балла ЕГЭ по математике", freq = F)
Теперь поменяем цвет и отрегулируем количество столбиков диаграммы. Сделаем так, чтобы столбик соответствовал промежутку в 2.5 балла (у нас всего 50 баллов, следовательно, нам нужно 20 столбиков):
hist(df$math, xlab = "Балл", ylab = "Плотность", main = "Распределение балла ЕГЭ по математике", freq = F,
breaks = 20, col = "salmon")
Мы видим, некоторые из столбиков диаграммы выше, чем граница оси Y. Мы можем также регулировать границы осей с помощью аргумента ylim = с(), где нужно прописать нижнюю и верхнюю границу через запятую:
hist(df$math, xlab = "Балл", ylab = "Плотность", main = "Распределение балла ЕГЭ по математике", freq = F,
breaks = 20, col = "salmon", ylim = c(0, 0.08))
Наконец, мы можем проверить, насколько распределение похоже на нормальное, наложив на график кривую, которая будет соответствовать плотности нормалного распределения с математическим ожиданием и стандартным отклонением, подсчитанными для нашей переменной. Функция dnorm() считает значения функции плотности, а функция curve(x, add = TRUE) рисует кривую по данным значениям и добавляет ее на предыдущий нарисованный график.
hist(df$math, xlab = "Балл", ylab = "Плотность", main = "Распределение балла ЕГЭ по математике", freq = F,
breaks = 20, col = "salmon", ylim = c(0, 0.08))
curve(dnorm(x,
mean = mean(df$math, na.rm = T),
sd = sd(df$math, na.rm = T)),
add = T)