ТИТАНИК

15 апреля 1912 года в северной атлантике столкнулся
с айсбергом и затонул пароход «Титаник».


На борту было 1309 человек, пассажиры и экипаж.
Спаслось 500 человек, погибло 809.

В этом цикле роликов мы исследуем вероятности выживаемости
пассажиров в зависимости от различных, хорошо задокументированных
факторов.

Первый слайд посвящен получению данных, переносу их в СУБД Postgres
и изучению их в psql - терминале Postgres.


Скачать архивный файл с помощью wget (30 Кб)
Команда выполняются в командной строке терминала Linux

wget an2k.ru/data/level2/201-titanic/titanic3.csv.zip

Распаковать архив

unzip titanic3.csv.zip

В файле titanic3.csv содержатся все необходимые данные.


Но, гораздо удобнее работать с данными в SQL базе данных, чем в Excel.

Перенесём данные в Postgres


Датасет titanic3.csv содержит следующие поля:

id       — идентификатор, который был присвоен в базе
pclass   — класс купленного билета (1-й, 2-й, или 3-й)
survived — выжил 1 или нет 0 пассажир
name     — имя пассажира
sex      — пол пассажира
age      — возраст пассажира
sibsp    — количество братьев или супругов у пассажира на борту
parch    — количество родителей или детей у пассажира на борту
ticket   — номер билета
fare     — сумма денег, которую заплатили за билет
cabin    — номер каюты, в которой находился пассажир
embarked — порт (город), где пассажир сел на титаник
boat     — номер лодки куда попал выживший
body     — номер лодки куда было поднято тело погибшего
home     — домашний адрес


Данные Go to SQL

Создать базу

create database titanic;

Перейти в созданную базу
\c titanic

Создать таблицу tit0

create table tit0 (
  pclass   int,
  survived int,
  name     varchar,
  sex      varchar,
  age      varchar,
  sibsp    int,
  parch    int,
  ticket   varchar,
  fare     varchar,
  cabin    varchar,
  embarked varchar,
  boat     varchar,
  body     varchar,
  home     varchar
);

Залить файл в таблицу tit0

COPY tit0 FROM '/home/an2k/py/lessons/Titanic/titanic3.csv'
  DELIMITER '	' CSV HEADER;


Создать таблицу tit1

create table tit1 (
  id serial,
  pclass   int,
  survived int,
  name     varchar,
  sex      varchar,
  age      varchar,
  sibsp    int,
  parch    int,
  ticket   varchar,
  fare     varchar,
  cabin    varchar,
  embarked varchar,
  boat     varchar,
  body     varchar,
  home     varchar
);

create UNIQUE index on tit1 (id);

Залить данные в таблицу tit1

insert into tit1 (
  pclass   ,
  survived ,
  name     ,
  sex      ,
  age      ,
  sibsp    ,
  parch    ,
  ticket   ,
  fare     ,
  cabin    ,
  embarked ,
  boat     ,
  body     ,
  home
)
select * from tit0;


Откомментоировать поля таблицы tit1

comment on column tit1.id        is 'Идентификатор, который был присвоен в базе';
comment on column tit1.pclass    is 'Класс купленного билета (1-й, 2-й, или 3-й)';
comment on column tit1.survived  is 'Выжил 1 или нет 0 пассажир';
comment on column tit1.name      is 'Имя пассажира';
comment on column tit1.sex       is 'Пол пассажира';
comment on column tit1.age       is 'Возраст пассажира';
comment on column tit1.sibsp     is 'Количество братьев или супругов у пассажира на борту';
comment on column tit1.parch     is 'Количество родителей или детей у пассажира на борту';
comment on column tit1.ticket    is 'Номер билета';
comment on column tit1.fare      is 'Сумма денег, которую заплатили за билет';
comment on column tit1.cabin     is 'Номер каюты, в которой находился пассажир';
comment on column tit1.embarked  is 'Порт (город), где пассажир сел на титаник';
comment on column tit1.boat      is 'Номер лодки куда попал выживший';
comment on column tit1.body      is 'Номер лодки куда было поднято тело погибшего';
comment on column tit1.home      is 'Домашний адрес';



Посмотреть структуру таблицы tit1

\d+ tit1


Посмотреть данные таблицы tit1

select * from tit1 limit 1;

select count(*) from tit1 ;
 count
-------
  1309

select count(*) from tit1 where survived = 1;
 count
-------
   500

select count(*) from tit1 where survived = 0;
 count
-------
   809

select survived, count(*) from tit1 group by survived;
 survived | count
----------+-------
        0 |   809 -- Погибли
        1 |   500 -- Выжили

select sex, count(*) from tit1 group by sex;
  sex   | count
--------+-------
 male   |   843  -- Мужчины
 female |   466  -- Женщины


select sex, survived, count(*) from tit1
  group by sex, survived order by sex, survived;

  sex   | survived | count
--------+----------+-------
 female |        0 |   127
 female |        1 |   339
 male   |        0 |   682
 male   |        1 |   161


Как посчитать проценты погибших (survived=0) и выживших (survived=1)?

  sex   | survived | count | percent
--------+----------+-------+---------
 female |        0 |   127 |   ?
 female |        1 |   339 |   ?
 male   |        0 |   682 |   ?
 male   |        1 |   161 |   ?


Вот так подсказывает ИИ phind.com:

https://www.phind.com/search/cmfmdi8ne00002v6qo02wgbkh

SELECT
    sex,
    survived,
    count,
    ROUND(
        100.0 * count /
        SUM(count) OVER (PARTITION BY sex),
        2
    ) as percent
FROM (
    SELECT
        sex,
        survived,
        count(*) as count
    FROM tit1
    GROUP BY sex, survived
) subquery
ORDER BY sex, survived;


  sex   | survived | count | percent
--------+----------+-------+---------
 female |        0 |   127 |   27.25
 female |        1 |   339 |   72.75
 male   |        0 |   682 |   80.90
 male   |        1 |   161 |   19.10