Рассмотрим небольшую выборку из шести наблюдений и сохраним её в вектор v
. Посмотрим на описательные статистики по этой выборке:
v <- c(2, 3, 5, 5, 7, 8)
summary(v)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 2.0 3.5 5.0 5.0 6.5 8.0
Минимальное значение 2, максимальное 8. Среднее значение равно 5, медиана тоже равна 5. Нижний квартиль равен 3.5 (1st Qu.
), верхний квартиль равен 6.5 (3rd Qu.
). Проинтерпретируем:
Примечание: результаты, полученные в R, а именно значения квартилей, могут отличаться от того, что мы считали вручную, так как в R по умолчанию используется другой алгоритм расчёта.
Теперь посмотрим, как можно вызвать отдельные описательные статистики (по вектору или по столбцу в таблице).
min(v) # минимум
## [1] 2
max(v) # максимум
## [1] 8
vrange <- max(v) - min(v) # размах
vrange
## [1] 6
mean(v) # среднее
## [1] 5
median(v) # медиана
## [1] 5
Квантили заслуживают отдельного внимания. Для начала найдём квантиль уровня 0.2: укажем название вектора и через запятую — уровень квантиля.
quantile(v, 0.2)
## 20%
## 3
Получается, 20% наблюдений в выборке не превышают значение 3. Внутри функции quantile()
можно указать сразу несколько уровней, только для этого нужно оформить их в виде вектора:
quantile(v, c(0.1, 0.2, 0.3))
## 10% 20% 30%
## 2.5 3.0 4.0
Получили квантили уровней 0.1, 0.2, 0.3. Если уровней много, и все они отличаются друг от друга на одно и то же число, то их можно задать в виде последовательности. Для этого понадобится функция seq()
(от английского sequence), внутри которой нужно указать начало отрезка, конец отрезка и шаг, с которым мы по этому отрезку движемся:
quantile(v, seq(from=0, to=1, by=0.1)) # от 0 до 1 с шагом 0.1
## 0% 10% 20% 30% 40% 50% 60% 70% 80% 90% 100%
## 2.0 2.5 3.0 4.0 5.0 5.0 5.0 6.0 7.0 7.5 8.0
То, что мы получили выше — это процентили (квантили, только уровень указан в процентах), а если говорить ещё точнее, децили, то есть процентили, уровень которых делится на 10: 10%, 20%, 30%, и так далее. Теперь вернёмся к квартилям.
quantile(v, c(0.25, 0.75)) # нижний и верхний квартили
## 25% 75%
## 3.5 6.5
quantile(v, 0.75) - quantile(v, 0.25) # межквартильный размах
## 75%
## 3
IQR(v) # межквартильный размах - готовая функция R
## [1] 3
Посчитаем выборочную дисперсию и стандартное отклонение:
var(v) # variance - дисперсия
## [1] 5.2
sd(v) # standard deviation - стандартное отклонение
## [1] 2.280351
А сейчас перейдём к более красочным вещам — к графикам.
Чтобы строить более осмысленные графики, вернёмся к реальным данным и загрузим таблицу из файла Chile.csv
с результатами опроса жителей Чили перед известным плебисцитом 1988 года.
Переменные в таблице:
region
: регион, где проживает респондент (C
— Central; M
— Metropolitan Santiago area; N
— North; S
— South; SA
— city of Santiago);population
: численность населения в регионе, где проживает респондент;sex
: пол респондента (F
— female; M
— male);age
: возраст респондента;education
: уровень образования (P
— Primary; PS
— Post-secondary; S
— Secondary);income
: доход респондента;statusquo
: показатель отношения к статусу-кво (значения, близкие к -3 соответствуют поддержку статуса-кво, т.е. оставление Пиночета у власти, близкие к 3 — отрицание статуса-кво);vote
: как респондент планирует голосовать на референдуме (A
— abstain; N
— vote, i.e. against Pinochet); U
— undecided; Y
— vote yes i.e. for Pinochet)).Загрузим файл по ссылке — просто скопируем её и вставим в кавычках в функцию read.csv()
:
chile <- read.csv("http://math-info.hse.ru/f/2017-18/ps-ms/Chile.csv")
Удалим строки с пропущенными значениями (NA's
) и сохраним изменения:
chile <- na.omit(chile)
Выведем описательные статистики по всем переменным (столбцам) в таблице:
summary(chile$income)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 2500 7500 15000 34020 35000 200000
Для количественных переменных R выводит минимальное значение Min
, максимальное значение (Max
), выборочное среднее (Mean
), медиану выборки (Median
), нижний (1st Qu
) и верхний (3rd Qu
) квартили. Для качественных (текстовых, факторных) показателей R выводит частоты, сколько каких значений встречается в выборке.
Теперь построим простенькую гистограмму для переменной income
(доход респондентов):
hist(chile$income)
По умолчанию гистограмма прорисовывается без заливки, получается белой. Исправим это: добавим опцию col
и укажем название цвета в кавычках. Список всех цветов в R можно посмотреть здесь.
hist(chile$income, col = "coral1")
Что мы можем сказать о распределении дохода по этой гистограмме? Во-первых, что распределение дохода не похоже на нормальное, у этого распределения есть длинный «хвост» справа. Другими словами, большинство респондентов имеет небольшой доход, сильно отличающийся от среднего, однако есть респонденты, у которых доход довольно высокий, около 150000 и выше. Во-вторых, респондентов, у которых доход достаточно большойй, немного.
Теперь давайте приведём график к приличному виду: добавим заголовок и подписи к осям.
# main - заголовок
# xlab - подпись для оси x
# ylab - подпись для оси y
hist(chile$income, col = "coral1",
main = "Доход респондентов",
xlab = "Доход",
ylab = "Число респондентов")
Обратите внимание: все названия, так как они являются текстовыми, вводятся в кавычках.
Чему равен шаг гистограммы на графике выше? 20 тысячам, так как на отрезке от 0 до 50 тысяч помещаются два с половиной столбца одинаковой ширины. К сожалению, в базовом варианте гистограммы, создаваемой с помощью hist()
, изменить величину шага вручную не так просто. Но зато есть опция breaks
, которая приблизительно соответствует числу «перегородок», которые необходимо поставить, чтобы получить желаемое число столбцов. То есть, если мы хотим получить четыре столбца, нам потребуется три «перегородки»:
hist(chile$income, col = "coral1",
main = "Доход респондентов",
xlab = "Доход",
ylab = "Число респондентов",
breaks = 3)
Продолжим обсуждать визуализацию распределений данных и рассмотрим ещё один тип графика — ящик с усами (box plot или box-and-whiskers plot). Давайте сначала его построим, а потом посмотрим, что он иллюстрирует.
boxplot(chile$income)
Что показывает данный график? Квартили и минимальное/максимальное значения или границы типичных значений. Нижняя и верхняя граница «ящика» соответствуют нижнему и верхнему квартилю (Q1 и Q3), толстая горизонтальная линия внутри «ящика» соответствует медиане. Горизонтальная линия не всегда будет лежать в середине «ящика», такое случается, если распределение выборки примерно симметричное. Если распределение скошено (слишком много людей с высоким доходом или наоборот, низким), то медиана ближе к нижнему или верхнему квартилю, то есть к нижней или верхней границе «ящика». «Усы» графика (похожи на антенны сверху и снизу) строятся по-разному, и их построение зависит от наличия нетипичных/нехарактерных наблюдений или выбросов (outliers). Выбросы на графике изображаются отдельными точками, которые находятся всегда за рамками «усов». В нашем случае есть два выброса, в верхней части графика, то есть нетипично большие значения.
Если выбросов ни с какой стороны нет, то границы «усов» совпадают с минимальным и максимальным значением в выборке. Если выбросы есть с обеих сторон (слишком маленькие и слишком большие значения), то границы «усов» совпадают с границами типичных значений, которые вычисляются следующим образом:
\[[\text{Q}_1 - 1.5 \times \text{IQR} ; \text{Q}_3 + 1.5 \times \text{IQR}].\]
Все значения, которые выходят за границы этого интервала, считаются нетипичными значениями. Иногда среди нетипичных значений выделяют совсем нехарактерные (в SPSS они обозначаются звёздочкой) — значения, которые выходят за границы следующего интервала:
\[[\text{Q}_1 - 3 \times \text{IQR} ; \text{Q}_3 + 3 \times \text{IQR}].\]
Если выбросы есть только сверху, слишком большие значения, то нижний «ус» совпадает с минимальным значением, а верхний — со значением \(\text{Q}_3 + 1.5 \times \text{IQR}\). Если выбросы есть только снизу, слишком маленькие значения, то нижний «ус» соответствует значению \(\text{Q}_1 - 1.5 \times \text{IQR}\), а верхний — максимальному.
Дополнительно рассмотрим ещё один тип графика, менее типичный, который называется скрипичной диаграммой (на английском есть целый ряд терминов: violin plot, bean plot, vase plot, кто-то видит скрипки, кто-то бобы, а кто-то вазы). Давайте опять сначала на него посмотрим, а потом разберёмся, что к чему. Чтобы построить такой график, нам потребуется библиотека vioplot
.
install.packages("vioplot")
Построим скрипичную диаграмму для дохода респондентов:
library(vioplot)
vioplot(chile$age)
Как можно догадаться, внутри этого графика, внутри «скрипки», находится «ящик» с усами, на котором белой точкой обозначена медиана. А что снаружи? Этот график состоит из двух симметричных половинок, каждая из которых представляет собой график плотности распределения, о котором можно думать как о сглаженной гистограмме. Этот график хорошо характеризует форму распределения.
Скрипичные диаграммы довольно часто используются для визуализации данных, особенно, если исследователя интересует форма распределения и распределение отличается от нормального, но стоит иметь в виду, что такой график корректно строить в случае, когда выборка достаточно большая. Если выборка маленькая, то сглаживание, которое используется для построения графика, сработает очень грубо, и картина исказится. (Попробуйте построить гистограмму с маленьким шагом для маленькой выборки вручную и «сгладить» - схематично обвести её контур, вы поймёте, о чём идёт речь).