Экспоненциальная запись числа

При расчете 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 вместе взятого. Для Саутгемптона и Квинстауна наоборот.