При расчете p-value в выдачах R часто встречается так называемая экспоненциальная запись числа. Она используется для удобного отображения очень больших или очень маленьких чисел через произведение \(a\times 10^b\), где a – любое число, по модулю не меньшее 1, но меньшее 10. Например, мы можем представить миллион как произведение \(1\times 10^6\).
Давайте посмотрим на очень большое число, возведя число 16 в степень 16:
16^16
## [1] 1.844674e+19
R обозначет умножение на 10 в некоторой степени как e.
Теперь очень маленькое число. Обратите внимание на знак после e:
1/16^16
## [1] 5.421011e-20
Сегодня мы поработаем с базой данных, содержащей информацию о 891 пассажире Титаника, отправившегося в Нью-Йорк из британского Саутгемптона 10 апреля 1912 года. Прежде чем выйти в Атлантический океан, Титаник совершил остановки во французском Шербуре и ирландском Квинстауне. Всего на борту находилось 1317 пассажира и 908 членов экипажа. На Титанике можно было путешествовать одним из трех классов: самые дорогие билеты приходились на 1 класс, тогда как 3 класс был самым дешевым, и каюты пассажиров 3 класса находились на нижних палубах. Давайте попробуем изучить, какие признаки связаны с шансами пассажира Титаника на спасение.
Загрузим базу данных:
titanic <- read.csv(file.choose(), stringsAsFactors = F) # выберите файл со своего компьютера
Посмотрим на список переменных, содержащихся в таблице:
str(titanic)
## 'data.frame': 891 obs. of 12 variables:
## $ PassengerId: int 1 2 3 4 5 6 7 8 9 10 ...
## $ Survived : int 0 1 1 1 0 0 0 0 1 1 ...
## $ Pclass : int 3 1 3 1 3 3 1 3 3 2 ...
## $ Name : chr "Braund, Mr. Owen Harris" "Cumings, Mrs. John Bradley (Florence Briggs Thayer)" "Heikkinen, Miss. Laina" "Futrelle, Mrs. Jacques Heath (Lily May Peel)" ...
## $ Sex : chr "male" "female" "female" "female" ...
## $ Age : num 22 38 26 35 35 NA 54 2 27 14 ...
## $ SibSp : int 1 1 0 1 0 0 0 3 0 1 ...
## $ Parch : int 0 0 0 0 0 0 0 1 2 0 ...
## $ Ticket : chr "A/5 21171" "PC 17599" "STON/O2. 3101282" "113803" ...
## $ Fare : num 7.25 71.28 7.92 53.1 8.05 ...
## $ Cabin : chr "" "C85" "" "C123" ...
## $ Embarked : chr "S" "C" "S" "S" ...
Мы знаем имена пассажиров Name; класс, которым пассажир путешествовал PClass; пол Sex; возраст Age; стоимость билета Fare; порт посадки Embarked и, наконец, сумел ли пассажир пережить крушение корабля Survived (принимает два значения: 1 для тех, кто сумел спастись, и 0 для тех, кто нет).
Посмотрим, как распределились пассажиры по переменной Survived:
table(titanic$Survived)
##
## 0 1
## 549 342
# вычислим долю выживших
342/(342+549)
## [1] 0.3838384
В действительности среди пассажиров Титаника (включая экипаж) спаслость около 32%. Таким образом, наша выборочная оценка немного завышает истинную долю спасшихся.
Рассмотрим, связаны ли класс билета и шансы спастись в крушении.
Распределение пассажиров по классам:
table(titanic$Pclass)
##
## 1 2 3
## 216 184 491
Видим, что наиболее многочисленным был 3 класс.
Теперь построим таблицу сопряженности: выборочный частотный аналог таблицы совместного распределения. Таблицы сопряженности строятся с помощью уже знакомой нам функции table(), которая теперь будет принимать два аргумента.
table(titanic$Survived, titanic$Pclass) # выжившие по строчкам
##
## 1 2 3
## 0 80 97 372
## 1 136 87 119
Видим, что среди пассажиров 1 класса выживших примерно в 2 раза (\(136/80=1.7\)) больше, чем невыживших, тогда как среди пассажиров 3 класса спасшихся почти в 3 раза (\(119/372\simeq 0.32\)) меньше, тем тех, кто спастись не сумел. Среди пассажиров 2 класса спасшиеся и не спасшиеся распределились примерно поровну. Такое распределение может навести нас на мысль о существовании некоторой закономерности. Давайте проверим это статистически.
Сформулируем нулевую и альтернативную гипотезы.
\(H_0\): связи между классом билета и шансами пассажира на спасение нет.
\(H_a\): связь между классом билета и шансами пассажира на спасение есть.
Вычислим статистику хи-квадрат на основании построенной таблицы сопряженности с помощью команды chisq.test(), принимающей в качестве аргумента саму таблицу:
table <- table(titanic$Survived, titanic$Pclass) # сохраним таблицу в отдельный объект
chisq.test(table)
##
## Pearson's Chi-squared test
##
## data: table
## X-squared = 102.89, df = 2, p-value < 2.2e-16
Статистика хи-квадрат имеет 2 степени свободы, так как в нашей таблице 2 строчки и 3 колонки: \[df=(I-1)(J-1)=(2-1)(3-1)=2\] Значение статистики равно \(103\), а близко к нулю. Следовательно, мы должны отвергнуть нулевую гипотезу (по сути, на любом уровне значимости). Кажется, класс, которым путешествовал пассажир, все-таки был связан с шансами на спасение.
Из непосредственного расчета статистики хи-квадрат мы не можем делать вывод о направлении связи, только о факте ее наличия или отсутствия. Для этого нам потребуется рассмотрение стандартизированных остатков. Что это такое и откуда они берутся? Остатки показывают, насколько велико различие между наблюдаемыми и ожидаемыми частотами в таблице сопряженности в отношении к ожидаемой частоте, и имеют стандартное нормальное распределение:
\(z=\frac{n_{ij}^{obs}-n_{ij}^{exp}}{\sqrt{n_{ij}^{exp}}}\)
Остатки вычисляются для каждой ячейки (то есть, комбинации значений признаков) по отдельности. По сути, стандартизованный остаток — это корень из каждого из слагаемых, которые фигурируют при расчете статистики хи-квадрат.
Давайте выведем на экран таблицу ожидаемых частот:
chi <- chisq.test(table) # сохраним результаты расчета критерия в новый объект
chi$observed # извлечем из него наблюдаемые частоты
##
## 1 2 3
## 0 80 97 372
## 1 136 87 119
round(chi$expected, 2) # и ожидаемые тоже (округляю до сотых для удобства отображения)
##
## 1 2 3
## 0 133.09 113.37 302.54
## 1 82.91 70.63 188.46
Видно, что мы имеем практически на 54 больше спасшихся пассажиров 1 класса чем то, что мы ожидали бы увидеть, если бы признаки были независимы. Аналогично, среди пассжиров 3 класса спаслись на 70 человек меньше, чем мы ожидали бы. При этом, среди пассажиров 2 класса выживших больше на 17 человек. Много это или мало? Давайте проверим, анализируя стандартизованные остатки.
round(chi$residuals, 2) # округляю до сотых для удобства отображения
##
## 1 2 3
## 0 -4.60 -1.54 3.99
## 1 5.83 1.95 -5.06
Мы делаем вывод о направлении и “значимости” связи для каждой комбинации значений признаков так же, кк и для любой другой статистики критерия, которая имеет стандартное нормальное распределение. Мы знаем, что критическая область для 95% уровня доверия и двусторонней альтернативы лежит в границах \[(-\infty; -1.96]\cup [1.96;+\infty)\] или, если немного более грубо — при \(|Z|>2\). Вы видим, что для 1 и 3 класса остатки превышают 2 по модулю (и довольно сильно), тогда как для 2 класса нет. Это значит, что “искажений” в спасении для пассажиров 2 класса мы не видим. То есть, весь эффект обуславливается условиями путешествия пассажиров 1 и 3 класса. Как мы и ожидали, 1 класс благоприятствует спасению (положительный знак), тогда как 3 нет (отрицательный знак).
Теперь рассмотрим, есть ли связь между портом посадки и шансами на спасение. Переменная порта посадки принимает следующие значения: S — Southampton (Британия), С — Cherbourg (Франция), Q — Queenstown (Ирландия). Больше всего пассажиров поднялись на борт в Британии, меньше всего в Ирландии.
table(titanic$Embarked)
##
## C Q S
## 2 168 77 644
Построим таблицу сопряженности (таблицу наблюдаемых частот):
table(titanic$Survived, titanic$Embarked)
##
## C Q S
## 0 0 75 47 427
## 1 2 93 30 217
Видим, что для трех пассажиров порт посадки не указан. Давайте исключим этих пассажиров из анализа:
titanic2 <- subset(titanic, Embarked != "") # обратите внимание, что в этой переменной содержится не то, что мы называем "системный пропуск" (обозначается NA), а некоторое текстовое значение, которое не содержит символов (пропуск).
nrow(titanic)
## [1] 891
nrow(titanic2) # все исключилось
## [1] 889
table(titanic2$Survived, titanic2$Embarked)
##
## C Q S
## 0 75 47 427
## 1 93 30 217
Сформулируем нулевую и альтернативную гипотезы.
\(H_0\): связи между портом посадки и шансами пассажира на спасение нет.
\(H_a\): связь между портом посадки и шансами пассажира на спасение есть
Вычислим статистику хи-квадрат:
table2 <- table(titanic2$Survived, titanic2$Embarked)
chisq.test(table2)
##
## Pearson's Chi-squared test
##
## data: table2
## X-squared = 26.489, df = 2, p-value = 1.77e-06
Видим, что p-value близок к нулю, а значит, нулевая гипотеза об отсуствтии связи между портом посадки и шансами на спасение отвергается. Посмотрим на остатки:
chi2 <- chisq.test(table2)
round(chi2$residuals, 2)
##
## C Q S
## 0 -2.82 -0.08 1.47
## 1 3.59 0.10 -1.87
Видим, что связь обсуловлена пассажирами, поднявшимися на борт Шербуре: среди них значительно больше спасшихся, нежели мы могли бы ожидать. Можно предположить, что в Шербуре садились в основном пассажиры 1 класса. Проверим наше предположение:
table(titanic2$Pclass, titanic2$Embarked)
##
## C Q S
## 1 85 2 127
## 2 17 3 164
## 3 66 72 353
Действительно, в Шербуре пассажиров 1 класса столько же, сколько 2 и 3 вместе взятого. Для Саутгемптона и Квинстауна наоборот.