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

Повторение

Продолжаем работать с тем же файлом. Выведем описательные статистики для всей базы.

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)