Во второй домашке узнаем всё про пассажиров Титаника и закрепим изученное на семинаре :)

Прежде всего — библиотеки!

Отключите в этом куске кода сообщения и предупреждения.

library(tidyverse) # обработка данных, графики...
library(vcd) # мозаичные графики для качественных переменных
library(skimr) # описательные статистики
library(rio) # импорт фантастического количества форматов данных
library(ggalluvial) # потоковые диаграммы для качественных переменных
library(titanic) # набор данных о пассажирах Титаника
library(corrplot) # визуализация корреляций
library(reshape2) # длинные и широкие таблицы

Описание данных:

Прежде всего положим данные в переменную df и посмотрим описателные статистики.

df <- import('titanic.csv')
skim(df)
## Skim summary statistics
##  n obs: 891 
##  n variables: 12
## Warning: package 'bindrcpp' was built under R version 3.4.4
## 
## Variable type: character 
##  variable missing complete   n min max empty n_unique
##     Cabin       0      891 891   0  15   687      148
##  Embarked       0      891 891   0   1     2        4
##      Name       0      891 891  12  82     0      891
##       Sex       0      891 891   4   6     0        2
##    Ticket       0      891 891   3  18     0      681
## 
## Variable type: integer 
##     variable missing complete   n   mean     sd p0   p25 p50   p75 p100
##        Parch       0      891 891   0.38   0.81  0   0     0   0      6
##  PassengerId       0      891 891 446    257.35  1 223.5 446 668.5  891
##       Pclass       0      891 891   2.31   0.84  1   2     3   3      3
##        SibSp       0      891 891   0.52   1.1   0   0     0   1      8
##     Survived       0      891 891   0.38   0.49  0   0     0   1      1
##      hist
##  ▇▂▁▁▁▁▁▁
##  ▇▇▇▇▇▇▇▇
##  ▃▁▁▃▁▁▁▇
##  ▇▁▁▁▁▁▁▁
##  ▇▁▁▁▁▁▁▅
## 
## Variable type: numeric 
##  variable missing complete   n mean    sd   p0   p25   p50 p75   p100
##       Age     177      714 891 29.7 14.53 0.42 20.12 28     38  80   
##      Fare       0      891 891 32.2 49.69 0     7.91 14.45  31 512.33
##      hist
##  ▂▃▇▆▃▂▁▁
##  ▇▁▁▁▁▁▁▁

Пассажиры Титаника могли попасть на корабаль из трёх портов, два из которых находились в Великобритании, а один во Франции.

table(df$Embarked)
## 
##       C   Q   S 
##   2 168  77 644
df2 <- mutate(df, Embarked = fct_collapse(Embarked, GB = c('Q', 'C')))
table(df2$Embarked)
## 
##      GB   S 
##   2 245 644

Выясним, как связаны класс каюты пассажира и выживание.

ctable <- table(df$Pclass, df$Survived)
chisq.test(ctable)
## 
##  Pearson's Chi-squared test
## 
## data:  ctable
## X-squared = 102.89, df = 2, p-value < 2.2e-16

Посмотрим, как соотносятся пол пассажира и класс каюты с его выживанием.

ctable <- table(df$Pclass, df$Survived, df$Sex, dnn = c('Pclass', 'Survived', 'Sex'))
mosaic(ctable, shade = TRUE, legend = TRUE)

Продолжим исследовать информацию о пассажирах!

mcor <- cor(df[, c('Survived', 'Age', 'SibSp', 'Parch', 'Fare')], use = 'pairwise.complete.obs')
mcor
##             Survived         Age      SibSp       Parch       Fare
## Survived  1.00000000 -0.07722109 -0.0353225  0.08162941 0.25730652
## Age      -0.07722109  1.00000000 -0.3082468 -0.18911926 0.09606669
## SibSp    -0.03532250 -0.30824676  1.0000000  0.41483770 0.15965104
## Parch     0.08162941 -0.18911926  0.4148377  1.00000000 0.21622494
## Fare      0.25730652  0.09606669  0.1596510  0.21622494 1.00000000
corrplot(mcor, method = 'square', type = 'upper')

Посмотрим на распределение возраста пассажиров Титаника.

df <- mutate(df, Pclass = factor(Pclass))

ggplot(data = df, aes(x = Pclass, y = Age)) +
  geom_violin() + 
  labs(x = 'Класс каюты', y = 'Возраст', title = 'Возраст пассажиров')
## Warning: Removed 177 rows containing non-finite values (stat_ydensity).

ggplot(data = df, aes(x = factor(Pclass), y = Age)) +
  geom_violin() + 
  facet_grid(Survived ~ .) +
  labs(x = 'Класс каюты', y = 'Возраст', title = 'Возраст пассажиров')
## Warning: Removed 177 rows containing non-finite values (stat_ydensity).

Цель задания — построить потоковую диаграмму!

freq_table <- group_by(df, Pclass, Sex, Survived) %>% summarise(freq = n())
freq_table
## # A tibble: 12 x 4
## # Groups:   Pclass, Sex [?]
##    Pclass Sex    Survived  freq
##    <fct>  <chr>     <int> <int>
##  1 1      female        0     3
##  2 1      female        1    91
##  3 1      male          0    77
##  4 1      male          1    45
##  5 2      female        0     6
##  6 2      female        1    70
##  7 2      male          0    91
##  8 2      male          1    17
##  9 3      female        0    72
## 10 3      female        1    72
## 11 3      male          0   300
## 12 3      male          1    47
ggplot(data = freq_table, aes(weight = freq, axis1 = Pclass, axis2 = Sex, axis3 = Survived)) + 
  geom_alluvium(aes(fill = Pclass), width = 1/12) +
  geom_stratum(width = 1/8) +
  geom_label(stat = 'stratum', label.strata = TRUE) +
  scale_x_continuous(breaks = 1:3, labels = c('Class', 'Sex', 'Survived')) 
## Warning in to_lodes(data = data, axes = axis_ind, discern =
## params$discern): Some strata appear at multiple axes.

## Warning in to_lodes(data = data, axes = axis_ind, discern =
## params$discern): Some strata appear at multiple axes.

## Warning in to_lodes(data = data, axes = axis_ind, discern =
## params$discern): Some strata appear at multiple axes.

Постройте широкую таблицу, в которой по строкам будем класс каюты пассажира, по столбцам — количесвто его братьев и сестёр на корабле, а внутри — средняя цена билета.

dcast(df, SibSp ~ Pclass, value.var = 'Fare', fun.aggregate = mean)
##   SibSp         1        2         3
## 1     0  75.22336 15.53233  9.832689
## 2     1  88.49202 28.38568 16.658487
## 3     2 159.97584 44.46875 19.564993
## 4     3 263.00000 21.00000 24.378483
## 5     4       NaN      NaN 31.855556
## 6     5       NaN      NaN 46.900000
## 7     8       NaN      NaN 69.550000

В вашем распоряжении новые (но недостоверные) данные о пассажирах Титаника.

new_df <- import('titanic_info.xlsx')
## Warning in strptime(x, format, tz = tz): unknown timezone 'zone/tz/2018c.
## 1.0/zoneinfo/Europe/Moscow'
lj <- left_join(df, new_df, by = 'PassengerId')
skim(lj)
## Skim summary statistics
##  n obs: 891 
##  n variables: 14 
## 
## Variable type: character 
##  variable missing complete   n min max empty n_unique
##     Cabin       0      891 891   0  15   687      148
##  Embarked       0      891 891   0   1     2        4
##      Name       0      891 891  12  82     0      891
##       Sex       0      891 891   4   6     0        2
##    Ticket       0      891 891   3  18     0      681
## 
## Variable type: factor 
##  variable missing complete   n n_unique                    top_counts
##    Pclass       0      891 891        3 3: 491, 1: 216, 2: 184, NA: 0
##  ordered
##    FALSE
## 
## Variable type: integer 
##  variable missing complete   n mean   sd p0 p25 p50 p75 p100     hist
##     Parch       0      891 891 0.38 0.81  0   0   0   0    6 ▇▂▁▁▁▁▁▁
##     SibSp       0      891 891 0.52 1.1   0   0   0   1    8 ▇▁▁▁▁▁▁▁
##  Survived       0      891 891 0.38 0.49  0   0   0   1    1 ▇▁▁▁▁▁▁▅
## 
## Variable type: numeric 
##     variable missing complete   n   mean     sd   p0    p25    p50   p75
##          Age     177      714 891  29.7   14.53 0.42  20.12  28     38  
##         Fare       0      891 891  32.2   49.69 0      7.91  14.45  31  
##     Holidays      94      797 891 187.19 106.08 0     96    193    275  
##  PassengerId       0      891 891 446    257.35 1    223.5  446    668.5
##         Pets      91      800 891   2.53   1.72 0      1      2      4  
##    p100     hist
##   80    ▂▃▇▆▃▂▁▁
##  512.33 ▇▁▁▁▁▁▁▁
##  365    ▇▇▇▇▇▇▇▇
##  891    ▇▇▇▇▇▇▇▇
##    5    ▇▇▁▇▆▁▇▇
rj <- right_join(df, new_df, by = 'PassengerId')
skim(rj)
## Skim summary statistics
##  n obs: 836 
##  n variables: 14 
## 
## Variable type: character 
##  variable missing complete   n min max empty n_unique
##     Cabin       0      836 836   0  15   645      140
##  Embarked       0      836 836   0   1     2        4
##      Name       0      836 836  12  82     0      836
##       Sex       0      836 836   4   6     0        2
##    Ticket       0      836 836   3  18     0      652
## 
## Variable type: factor 
##  variable missing complete   n n_unique                    top_counts
##    Pclass       0      836 836        3 3: 463, 1: 202, 2: 171, NA: 0
##  ordered
##    FALSE
## 
## Variable type: integer 
##  variable missing complete   n mean   sd p0 p25 p50 p75 p100     hist
##     Parch       0      836 836 0.37 0.8   0   0   0   0    6 ▇▁▁▁▁▁▁▁
##     SibSp       0      836 836 0.51 1.09  0   0   0   1    8 ▇▁▁▁▁▁▁▁
##  Survived       0      836 836 0.39 0.49  0   0   0   1    1 ▇▁▁▁▁▁▁▅
## 
## Variable type: numeric 
##     variable missing complete   n   mean     sd   p0    p25    p50    p75
##          Age     170      666 836  29.88  14.51 0.42  21     28.5   38.75
##         Fare       0      836 836  31.83  48.18 0      7.9   13.82  30.5 
##     Holidays      39      797 836 187.19 106.08 0     96    193    275   
##  PassengerId       0      836 836 443.75 261.79 1    217.75 440.5  673.25
##         Pets      36      800 836   2.53   1.72 0      1      2      4   
##    p100     hist
##   80    ▂▃▇▆▃▂▁▁
##  512.33 ▇▁▁▁▁▁▁▁
##  365    ▇▇▇▇▇▇▇▇
##  891    ▇▇▇▇▇▇▇▇
##    5    ▇▇▁▇▆▁▇▇
ij <- inner_join(df, new_df, by = 'PassengerId')
skim(ij)
## Skim summary statistics
##  n obs: 836 
##  n variables: 14 
## 
## Variable type: character 
##  variable missing complete   n min max empty n_unique
##     Cabin       0      836 836   0  15   645      140
##  Embarked       0      836 836   0   1     2        4
##      Name       0      836 836  12  82     0      836
##       Sex       0      836 836   4   6     0        2
##    Ticket       0      836 836   3  18     0      652
## 
## Variable type: factor 
##  variable missing complete   n n_unique                    top_counts
##    Pclass       0      836 836        3 3: 463, 1: 202, 2: 171, NA: 0
##  ordered
##    FALSE
## 
## Variable type: integer 
##  variable missing complete   n mean   sd p0 p25 p50 p75 p100     hist
##     Parch       0      836 836 0.37 0.8   0   0   0   0    6 ▇▁▁▁▁▁▁▁
##     SibSp       0      836 836 0.51 1.09  0   0   0   1    8 ▇▁▁▁▁▁▁▁
##  Survived       0      836 836 0.39 0.49  0   0   0   1    1 ▇▁▁▁▁▁▁▅
## 
## Variable type: numeric 
##     variable missing complete   n   mean     sd   p0    p25    p50    p75
##          Age     170      666 836  29.88  14.51 0.42  21     28.5   38.75
##         Fare       0      836 836  31.83  48.18 0      7.9   13.82  30.5 
##     Holidays      39      797 836 187.19 106.08 0     96    193    275   
##  PassengerId       0      836 836 443.75 261.79 1    217.75 440.5  673.25
##         Pets      36      800 836   2.53   1.72 0      1      2      4   
##    p100     hist
##   80    ▂▃▇▆▃▂▁▁
##  512.33 ▇▁▁▁▁▁▁▁
##  365    ▇▇▇▇▇▇▇▇
##  891    ▇▇▇▇▇▇▇▇
##    5    ▇▇▁▇▆▁▇▇
fj <- full_join(df, new_df, by = 'PassengerId')
skim(fj)
## Skim summary statistics
##  n obs: 891 
##  n variables: 14 
## 
## Variable type: character 
##  variable missing complete   n min max empty n_unique
##     Cabin       0      891 891   0  15   687      148
##  Embarked       0      891 891   0   1     2        4
##      Name       0      891 891  12  82     0      891
##       Sex       0      891 891   4   6     0        2
##    Ticket       0      891 891   3  18     0      681
## 
## Variable type: factor 
##  variable missing complete   n n_unique                    top_counts
##    Pclass       0      891 891        3 3: 491, 1: 216, 2: 184, NA: 0
##  ordered
##    FALSE
## 
## Variable type: integer 
##  variable missing complete   n mean   sd p0 p25 p50 p75 p100     hist
##     Parch       0      891 891 0.38 0.81  0   0   0   0    6 ▇▂▁▁▁▁▁▁
##     SibSp       0      891 891 0.52 1.1   0   0   0   1    8 ▇▁▁▁▁▁▁▁
##  Survived       0      891 891 0.38 0.49  0   0   0   1    1 ▇▁▁▁▁▁▁▅
## 
## Variable type: numeric 
##     variable missing complete   n   mean     sd   p0    p25    p50   p75
##          Age     177      714 891  29.7   14.53 0.42  20.12  28     38  
##         Fare       0      891 891  32.2   49.69 0      7.91  14.45  31  
##     Holidays      94      797 891 187.19 106.08 0     96    193    275  
##  PassengerId       0      891 891 446    257.35 1    223.5  446    668.5
##         Pets      91      800 891   2.53   1.72 0      1      2      4  
##    p100     hist
##   80    ▂▃▇▆▃▂▁▁
##  512.33 ▇▁▁▁▁▁▁▁
##  365    ▇▇▇▇▇▇▇▇
##  891    ▇▇▇▇▇▇▇▇
##    5    ▇▇▁▇▆▁▇▇

Бонус победителю!

Если все упражнения получились, можно смело нажимать Knit :)