2 Частотные данные и таблицы сопряженности
2.1 Темы занятия
- Частотные данные
- Описательные статистики
- Частотный анализ для разных шкал измерений
- Показатели вариации
- Таблицы сопряженности
2.2 Частотные данные
Частотные данные часто используются для описательных статистик. Это позволяет получить представление о структуре анализируемых данных в целом.
Примеры будем разбирать на встроенном датасете R - mtcars
: датасет с 32 автомобилями по 11 признакам, два из которых (vs
и am
) являются номинальными переменными (факторами) c уровнями, закодированными в виде 0 и 1 (подробнее см. ?mtcars
). mpg
- топлевная экономичность (в милях на галон) запишем его в переменнную df
.
df <- mtcars
2.2.1 Описательные статистики
К описательным статистикам обычно относят характеристики центральной тенденции:
Медиана - уровень показателя, который делит набор данных на две равные половины.
median(df$mpg)
## [1] 19.2
Арифметическое среднее - сумма чисел, разделённая на их количество.
mean(df$mpg)
## [1] 20.09062
Мода - значение во множестве наблюдений, которое встречается наиболее часто.
Для моды стандартной команды в R не предусмотрено, можно использовать такую функцию:
Modes <- function(x) {
ux <- unique(x) # выделение уникальных значений в векторе
tab <- tabulate(match(x, ux)) # подсчет сколько раз встречается значение
ux[tab == max(tab)]
}
Modes(df$cyl)
## [1] 8
также к К описательным статистикам относят показатели вариации (изменчивости) данных:
Дисперсия случайной величины – это один из основных показателей в статистике. Он отражает меру разброса данных вокруг арифметической средней.
var(df$mpg)
## [1] 36.3241
Стандартное отклонение - оценка стандартного отклонения ее выборочного распределения, приближенно показывает, насколько значение статистики может отличаться от своего среднего значения (параметра генеральной совокупности).
sd(df$mpg)
## [1] 6.026948
Стандартная ошибка - (или просто стандартная ошибка) приближенно показывает, насколько ее выборочная средняя (случайная наблюдаемая величина) отличается от среднего генеральной совокупности.
Специальной функции для расчета стандартной ошибки среднего в R нет, однако для этого вполне подойдут уже имеющиеся функции. Как известно, стандартная ошибка средней рассчитывается как отношение стандартного отклонения (sd) к квадратному корню из объема выборки:
sd(df$mpg)/sqrt(length(df$mpg)) # функция length() возвращает число элементов в векторе mpg
## [1] 1.065424
Минимальное, максимальное значение и размах (оба значения).
min(df$mpg)
## [1] 10.4
max(df$mpg)
## [1] 33.9
range(df$mpg)
## [1] 10.4 33.9
Можно посмотреть многие эти характеристики (если они применимы к шкале) с помощью функции summary()
.
summary(df)
## mpg cyl disp hp
## Min. :10.40 Min. :4.000 Min. : 71.1 Min. : 52.0
## 1st Qu.:15.43 1st Qu.:4.000 1st Qu.:120.8 1st Qu.: 96.5
## Median :19.20 Median :6.000 Median :196.3 Median :123.0
## Mean :20.09 Mean :6.188 Mean :230.7 Mean :146.7
## 3rd Qu.:22.80 3rd Qu.:8.000 3rd Qu.:326.0 3rd Qu.:180.0
## Max. :33.90 Max. :8.000 Max. :472.0 Max. :335.0
## drat wt qsec vs
## Min. :2.760 Min. :1.513 Min. :14.50 Min. :0.0000
## 1st Qu.:3.080 1st Qu.:2.581 1st Qu.:16.89 1st Qu.:0.0000
## Median :3.695 Median :3.325 Median :17.71 Median :0.0000
## Mean :3.597 Mean :3.217 Mean :17.85 Mean :0.4375
## 3rd Qu.:3.920 3rd Qu.:3.610 3rd Qu.:18.90 3rd Qu.:1.0000
## Max. :4.930 Max. :5.424 Max. :22.90 Max. :1.0000
## am gear carb
## Min. :0.0000 Min. :3.000 Min. :1.000
## 1st Qu.:0.0000 1st Qu.:3.000 1st Qu.:2.000
## Median :0.0000 Median :4.000 Median :2.000
## Mean :0.4062 Mean :3.688 Mean :2.812
## 3rd Qu.:1.0000 3rd Qu.:4.000 3rd Qu.:4.000
## Max. :1.0000 Max. :5.000 Max. :8.000
В статистике данные очень часто группируют в соответствии с тем или иным признаком, например, полом, социальным положением, стадией болезни, местом отбора проб и т.п. В R существует специальный класс векторов - факторы (factors), которые предназначены для хранения кодов соответствующих уровней номинальных признаков.Часто уровни факторов кодируют в виде чисел.
Если что факторные переменные закодированы при помощи чисел 0 и 1, то для корреткной работы нужно их преобразовать в факторы.
например переменная df$vs
указана как numeric.
class(df$vs)
## [1] "numeric"
Это может приводить к некоректной работе. Наример плот неправильно строит граф потому что неверно воспринимает тип переменной.
plot(df$vs)
Изменим тип переменной в факторы.
df$vs <- as.factor(df$vs) # теперь summary(df$vs) отображается корректно
plot(df$vs)
Или их можно переименовать сделав факторами в соответсвии с типом двигателя (V или S образный тип).
df$vs <- factor(df$vs, labels = c("V", "S"))
и по коробке передач (автоматическая или механическая).
df$am <- factor(df$am, labels = c("auto", "manual"))
summary(df$am)
## auto manual
## 19 13
plot(df$am)
Также можно вставлять логические условия для обращения к некоторым элементам
mean(df$mpg[df$cyl == 6 & df$vs == "V"]) # те элементы у количество цилиндров = 6 и V-обтразный двигатель)
## [1] 20.56667
NA
в переменной будет мешать посчитать некоторые статистики (например среднее значение)
df$mpg[3] <- NA
head(df$mpg)
## [1] 21.0 21.0 NA 21.4 18.7 18.1
mean(df$mpg)
## [1] NA
Можно пропускать отсутсвующие значения опцией na.rm (от not available и remove - удалить)
mean(df$mpg, na.rm = TRUE)
## [1] 20.00323
Количество всех значений можно посчитать через
length(df$mpg) # считаются значения включая NA
## [1] 32
Количество неотсутствующих значений можно посчитать вот так:
sum(!is.na(df$mpg))
## [1] 31
А количество отсутстствующих вот так:
sum(is.na(df$mpg))
## [1] 1
вернем значение на место
df$mpg[3] <- mtcars$mpg[3]
Выяснить порядковые номера элементов, обладающих минимальным и максимальным значениями.
which.min(df$mpg)
## [1] 15
which.max(df$mpg)
## [1] 20
Не бойтесь использовать функции при индексации и в других функциях:
rownames(df)[which.min(df$mpg)]
## [1] "Cadillac Fleetwood"
Описательные статистики можно также выполнять функцией aggregate()
aggregate(x = df$mpg, by = list(df$vs), FUN = mean) # лист группирующих переменных
## Group.1 x
## 1 V 16.61667
## 2 S 24.55714
aggregate(hp ~ vs, df, mean) # упрощенная запись
## vs hp
## 1 V 189.72222
## 2 S 91.35714
aggregate(hp ~ vs + am, df, mean) # Можно разбивать по нескольким группам.
## vs am hp
## 1 V auto 194.16667
## 2 S auto 102.14286
## 3 V manual 180.83333
## 4 S manual 80.57143
А также функцией tapply()
. Эта функция относится к “apply-семейству” R-функций. Эти функции позволяют выполнять математические вычисления над определенными элементами таблиц данных, матриц, или массивов (например, быстро вычислять среднее значение для каждого столбца или строки таблицы, и т.п.).
tapply(X = df$mpg, INDEX = df$am, FUN = Modes) # считает моду топливной экономичности по факторам коробки передач
## $auto
## [1] 19.2 15.2 10.4
##
## $manual
## [1] 21.0 30.4
Подсчет среднего топливной экономичности по факторам коробки передач и типу двигателя.
tapply(X = df$mpg, INDEX = list(df$am, df$vs), FUN = mean)
## V S
## auto 15.05 20.74286
## manual 19.75 28.37143
В параметр FUN можно вставлять пользовательские функции, например написаную вручную функцию для стандратных ошибок.
SE <- function(x) {sd(x)/sqrt(length(x))}
Вставляем в FUN и все работает.
tapply(X = df$disp, INDEX = df$am, FUN = SE)
## auto manual
## 25.27511 24.18603
2.2.2 Показатели вариации
Показатели вариации дают очень важную характеристику процессам и явлениям. Они отражают устойчивость процессов и однородность явлений. Чем меньше показатель вариации, тем более процесс устойчивый, а значит, и более предсказуемый.
Квантили - общий термин для порогового значения не выше которого (то есть равно или ниже) которого лежит указанная часть данных. Медиана делит распределение попалам. Квартили делят распределение на четверти, квинтили - на 5 частей, децили - на 10 частей и процентили - на 100.
Например, первый квартиль (Q1) делит распределение так, что 25 процентов наблюдений лежат не выше него; следовательно, 1-й квартиль также является 25-м процентилем. Второй квартиль (Q2) представляет 50-й процентиль, а третий квартиль (Q3) представляет 75-й процентиль, потому что 75 процентов наблюдений лежат не выше него.
quantile(df$mpg)
## 0% 25% 50% 75% 100%
## 10.400 15.425 19.200 22.800 33.900
При настройках, заданных по умолчанию, выполнение указанной команды приведет к расчету минимального (10.4) и максимального (33.9) значений, а также трех квартилей, т.е. значений, которые делят совокупность на четыре равные части - 15.4, 19.2 и 22.8. Межквартильный размах - это разница между 1-м и 3-м квартилями, т.е. между 25-м и 75-м процентилями. А разница между первым и третьим квартилями носит название интерквартильный размах (ИКР; англ. interquartile range).
ИКР является робастным (выборосоустойчивый) аналогом дисперсии и может быть рассчитан в R при помощи функции IQR()
:
IQR(df$mpg)
## [1] 7.375
Функция quantile()
позволяет рассчитать и другие квантили. Например, децили (т.е. значения, делящие совокупность на десять частей) можно получить следующим образом:
quantile(df$mpg, p = seq(0, 1, 0.1)) # задан вектор чисел от 0 до 1 с шагом в 0.1 = 10 квартилей
## 0% 10% 20% 30% 40% 50% 60% 70% 80% 90% 100%
## 10.40 14.34 15.20 15.98 17.92 19.20 21.00 21.47 24.08 30.09 33.90
Межквартильный размах - это разница между 1-м и 3-м квартилями, т.е. между 25-м и 75-м процентилями. Разница между первым и третьим квартилями носит название интерквартильный размах.
Наглядное отображение размаха вариации и межквартильного расстояния производят с помощью диаграммы «ящик с усами».
boxplot(df$mpg)
Для подсчета кооффициента вариации и ассиметрии существует пакет moments (функции kurtosis()
и skewness()
)
install.packages("moments")
library(moments)
## Warning: package 'moments' was built under R version 3.5.2
Коэффициент вариации или эксцесс (Kurtosis) - (среднеквадратическое отклонение деленное на среднее и умноженное на 100%). Этот показатель, который отражает остроту вершины и толщину хвостов одномерного распределения.
Коэффициент вариации близок к 3 если наблюдения подчиняются нормальному распределению. Если коэффициент вариации значительно отличается от 3, то гипотезу о том, что данные взяты из нормально распределенной генеральной совокупности, следует отвергнуть. (НАСКОЛЬКО БОЛЬШЕ?)
(Синяя кривая – нормальное распределение (куртозис нормального распределения вне зависимости от математического ожидания и стандартного отклонения равен 3). Красная кривая – имеет положительный эксцесс/куртозис больше 3.)
set.seed(42) # устанавливает seed (семечко) чтобы последующий псевдослучайный процесс можно было вопроизвести
kurtosis(rnorm(1000))
## [1] 3.134824
Коэффициент асимметрии - величина, характеризующая асимметрию распределения данной случайной величины. Положителен если правый хвост распределения длиннее левого.
skewness(df$mpg, na.rm = TRUE)# считая пропущенные значения
## [1] 0.6404399
2.3 Частотный анализ для разных шкал измерений
Если вчера было 2 градусов по Цельсию а сегодня 4 градуса, значит ли это что сегодня в два раза теплее? (Ответ станет понятен в процессе.)
2.3.1 Неметрические шкалы: наименований и ранговая.
Доступны непараметрические методы статистики. В шкале наименований (номенальной) числа используются лишь как метки, для различения обьектов. Примеры: тип двигателя (V образный и S образный), пол, расса. Допустимые операции: проверка совпадания несовпадения (тождественность)(a==b,a!=b)
. Возможные описательные статистики: частота, мода.
df$vs[1] == df$vs[2] # обе машины имеют V образный двиатель
## [1] TRUE
df$vs[1] == df$vs[3] # а эти имеют разные типы двигателей
## [1] FALSE
В порядковой шкале (или ранговой) объекты ранжированы, расположены в порядке увеличения или уменьшения значения параметра. Примеры: бальные оценки успеваемости (неудовлетворительно, удовлетворительно, хорошо, отлично). Допустимые операции: проверка тождественности (a==b,a!=b)
, сравнения (a>b, a<b)
. Упорядочим машины по параметру “Приятность названия машины Григорию” (где 1 самая приятная)
df$like <- c(16,15,6,5,13,12,27,27,27,27,27,27,14,17,3,10,11,18,9,25,24,7,23,22,26,2,1,9,8,19,20,21)
Одинаково ли Григорию нравятся название машин “Merc 240D” и Merc 230?
df["Merc 230", "like"] == df["Merc 240D", "like"] # да, одинаково
## [1] TRUE
А какое название приятнее “Porsche 914-2” или “Chrysler Imperial”?
df["Porsche 914-2", "like"] < df["Chrysler Imperial", "like"] # "Porsche 914-2" имеет более высокий ранг.
## [1] TRUE
Возможные описательные статистики: мода, медиана. Допустимые статистики: ранговые коэффициенты корреляции (r-Спирмана, r-Кендалла)
2.3.2 Метрические шкалы: интервальная и абсолютная.
Доступные параметрические методы статистики. В шкале интервалов существенной характеристикой является разность меджу значеними оцениваемых параметров выраженная в единицах этой шкалы. Начало отсчета может быть установлено произвольно.
Примеры: шкала Цельсия. Интервал между замерзанием и кипением воды разделен на 100 равных частей названых градусами.
Допустимые операции: проверка тождественности (a==b,a!=b)
, сравнения (a>b, a<b)
, сложения/вычетания (a+b, a-b)
.
Ответ на вопрос в начале: Так как действия умножения и деления недоступны для интервальной шкалы, то неправомерно говорить во сколько раз одна температура больше другой.
Возможные описательные статистики: мода, медиана, среднее арефметическое, стандартное отклонение.
Допустимые статистики: критерий согласия Пирсона, R — множественный коэффициент корреляции, все известные операции с натуральными числами.
Шкала отношений (абсолютная шкала) - это шкала интервалов у которой определено нулевой элемент - начало отсчета, а также размер едениц измерения.
Примеры: длинна, стоимость, возраст.
Допустимые операции: проверка тождественности (a==b,a!=b)
, сравнения (a>b, a<b)
, сложения/вычетания (a+b, a-b)
, умножения и деления (a*b, a/b)
.
Возможные описательные статистики: мода, медиана, среднее арефметическое, дисперсия, стандартное отклонение, коэффициент вариации, геометрическое среднее (перемножаем числа и делим на их колличество).
Допустимые статистики: критерий согласия Пирсона, R — множественный коэффициент корреляции, все известные операции с натуральными числами.
Как правило, для переменных, относящихся к метрической (интервальной) шкале и подчиняющихся нормальному распределению, в качестве основной характеристики используют среднее значение, а в качестве меры разброса – стандартное отклонение или стандартную ошибку. Для порядковых или интервальных переменных, не подчиняющихся нормальному распределению, соответственно медиану или первый и третий квартили. Для переменных, относящихся к номинальной шкале, нельзя дать других значимых характеристиккроме моды.
Оффтоп: Матрица диаграмм рассеянья может пригодиться чтобы быстро взглянуть на данные.
pairs(mtcars[1:4])
2.4 Построение таблиц сопряженности.
Таблицы сопряжённости (contigency tables) — это удобный способ изображения категориальных переменных и исследования зависимостей между ними.
Таблица сопряжённости представляет собой таблицу, ячейки которой индексируются градациями участвующих факторов, а числовое значение ячейки — количество наблюдений с данными градациями факторов.
Для чего создаются таблицы сопряженности?
- Показывают совместное распределение переменных в номинальной и порядковой шкале
- Проверка значимых различий между наблюдаемыми и ожидаемыми частотами
- Выявляют наличие (отсутствие) взаимосвязи между переменными
При анализе таблиц сопряженности выявляются статистические закономерности, но не причинно-следственные.
О.Генри: «Почему дует ветер? – Потому что деревья качаются».
Характер отношений между двумя переменными наглядно можно представить разными способами:
В случае измерения признаков в номинальной или порядковой шкале возможные комбинации значений обеих переменных упорядочиваются в форме таблицы сопряженности, при этом значения одной переменной образуют строки, а значения другой — столбцы таблицы.
После этого определяется частота появления всех возможных комбинаций обоих признаков в собранных данных и значение ее заносится в ячейки, стоящие на пересечении соответствующих строк и столбцов.
Для количественных данных, а также порядковых переменных с очень большим числом вариаций исходные значения предварительно группируются, соседние значения объединяются в небольшое число интервалов.
Построить таблицу сопряжённости можно с помощью функции table()
. В качестве аргументов ей нужно передать факторы, на основе которых будет строиться таблица сопряжённости:
# таблица сопряженности для выборки имеющей распределение Пуассона (n=100, λ = 5)
table(rpois(100,5))
##
## 0 1 2 3 4 5 6 7 8 9 10 11
## 2 2 8 19 15 16 18 12 3 3 1 1
R использует «честное» представление для трёх- и более мерных таблиц сопряжённости, то есть каждый фактор получает по своему измерению. Однако, это не очень удобно при выводе подобных таблиц на печать или сравнении с таблицами в литературе. Традиционно для этого используются «плоские» таблицы сопряжённости, когда все факторы, кроме одного, объединяются в один «многомерный» фактор и именно градации такого фактора используются при построении таблицы сопряжённости. Построить плоскую таблицу сопряжённости можно с помощью функцией ftable()
:
table(Titanic)
## Titanic
## 0 1 3 4 5 11 13 14 17 20 35 57 75 76 80 89 118 140 154 192
## 8 1 1 1 1 1 3 2 1 1 1 1 1 1 1 1 1 1 1 1
## 387 670
## 1 1
# Плоская таблица сопряженности для таблицы титаника
a <- ftable(Titanic, row.vars = 1:3)
# графическое изображение таблицы сопряженности
plot(Titanic, main = "Survival on the Titanic", color = TRUE) # mosaicplot
Опция row.vars
позволяет указать номера переменных в наборе данных, которые следует объединить в один единый фактор, градации которого и будут индексировать строки таблицы сопряжённости. Опция col.vars
проделывает то же самое, но для столбцов таблицы.
Функцию table()
можно использовать и для других целей. Например подсчёта частот. Также можно считать пропуски:
d <- factor(rep(c("A","B","C"), 10), levels=c("A","B","C","D","E"))
is.na(d) <- 3:4 # делаем пару значений NA
table(factor(d, exclude = NULL)) # exclude = NULL устанавливает NA как дополнительный фактор
##
## A B C <NA>
## 9 10 9 2
Задание создать такую таблицу сопряженности:
# таблицу сопряженности в дата фрейме
gip <- data.frame(c(40, 32, 72), c(30, 48, 78), c(70,80, 150))
rownames(gip) <- c("Курящие","Не курящие", "Всего")
colnames(gip) <- c("С гипертонией","Без гипертонии", "Всего")
Используем датасет который предложил Иван Иванчей в курсе по R https://stepik.org/course/129/syllabus
npersons
- сколько человек в планируемом проекте years_in_uni
сколько лет провел в университете руководитель проекта oldest_age
- самый старый сортудник field
- облать исследования status
- поддержана ли заявка
df <- read.csv("https://stepic.org/media/attachments/lesson/11502/grants.csv")
df$status <- factor(df$status, labels = c("Не поддержан","Поддержан"))
df <- read.csv("https://stepic.org/media/attachments/lesson/11502/grants.csv")
df$status <- factor(df$status, labels = c("Не поддержан","Поддержан"))
table.status <- table(df$status)
table.field <- table(df$status, df$field)
dim(table.status) # посмотреть размерность таблицы
## [1] 2
dim(table.field)
## [1] 2 5
prop.table(table.field) # пропорции или процены от общего числа
##
## beh_cog bio chem physics soc
## Не поддержан 0.07042254 0.33309859 0.04225352 0.04929577 0.03098592
## Поддержан 0.04577465 0.30422535 0.04647887 0.05492958 0.02253521
prop.table(table.field, 1) # 100% - сумма по строке
##
## beh_cog bio chem physics soc
## Не поддержан 0.13386881 0.63319946 0.08032129 0.09370817 0.05890228
## Поддержан 0.09658247 0.64190193 0.09806835 0.11589896 0.04754829
prop.table(table.field, 2) # 100% - сумма по столбцу
##
## beh_cog bio chem physics soc
## Не поддержан 0.6060606 0.5226519 0.4761905 0.4729730 0.5789474
## Поддержан 0.3939394 0.4773481 0.5238095 0.5270270 0.4210526
Визуализация
barplot(table.field, legend.text = TRUE, args.legend = list(x = "topright"), beside = TRUE)
mosaicplot(table.field)
3-х мерная таблица
table.years <- table(Years = df$years_in_uni, field = df$field, status = df$status)
dim(table.years)
## [1] 3 5 2
table.years
## , , status = Не поддержан
##
## field
## Years beh_cog bio chem physics soc
## < 5 57 198 31 20 22
## > 10 29 144 28 47 16
## 5-10 14 131 1 3 6
##
## , , status = Поддержан
##
## field
## Years beh_cog bio chem physics soc
## < 5 27 180 41 22 14
## > 10 30 155 19 54 15
## 5-10 8 97 6 2 3
Домашнее задание:
- Выполнить 5.12 “Описательная статистика” https://pozdniakov.github.io/stats/tasks.html#task_desc
- Понять как работает table (посмотрите хелп)