</center> Автор материала: программист-исследователь Mail.ru Group, старший преподаватель Факультета Компьютерных Наук ВШЭ Юрий Кашницкий. Материал распространяется на условиях лицензии Creative Commons CC BY-NC-SA 4.0. Можно использовать в любых целях (редактировать, поправлять и брать за основу), кроме коммерческих, но с обязательным упоминанием автора материала.
Соревнование Kaggle "Titanic: Machine Learning from Disaster".
In [1]:
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
Считываем обучающую выборку.
In [2]:
train_df = pd.read_csv("../data/titanic_train.csv",
index_col='PassengerId')
In [3]:
train_df.head(2)
Out[3]:
In [4]:
train_df.describe(include='all')
Out[4]:
In [5]:
train_df.info()
Выкинем признак Cabin
, а потом – все строки, где есть пропуски.
In [6]:
train_df = train_df.drop('Cabin', axis=1).dropna()
Постройте попарные зависимости признаков Age
, Fare
, Pclass
, Sex
, SibSp
, Parch
, Embarked
и Survived
. (метод scatter_matrix
Pandas или pairplot
Seaborn).
In [7]:
sns.pairplot(train_df[['Survived', 'Age', 'Fare',
'Pclass', 'Sex', 'SibSp',
'Parch', 'Embarked']]);
Как плата за билет (Fare
) зависит от класса каюты (Pclass
)? Постройте boxplot.
In [8]:
sns.boxplot(x='Pclass', y='Fare', data=train_df);
Такой boxplot получается не очень красивым из-за выбросов.
Опционально: создайте признак Fare_no_out
(стоимости без выбросов) – стоимости без выбросов, в котором исключаются стоимости, отличающиеся от средней по классу более чем на 2 стандартных отклонения. Важно: надо исключать выбросы именно в зависимости от класса каюты. Иначе исключаться будут только самые большие (1 класс) и малые (3 класс) стоимости.
In [9]:
train_df['Fare_no_out'] = train_df['Fare']
fare_pclass1 = train_df[train_df['Pclass'] == 1]['Fare']
fare_pclass2 = train_df[train_df['Pclass'] == 2]['Fare']
fare_pclass3 = train_df[train_df['Pclass'] == 3]['Fare']
fare_pclass1_no_out = fare_pclass1[(fare_pclass1 -
fare_pclass1.mean()).abs()
< 2 * fare_pclass1.std()]
fare_pclass2_no_out = fare_pclass2[(fare_pclass2 -
fare_pclass2.mean()).abs()
< 2 * fare_pclass2.std()]
fare_pclass3_no_out = fare_pclass3[(fare_pclass3 -
fare_pclass3.mean()).abs()
< 2 * fare_pclass3.std()]
train_df['Fare_no_out'] = fare_pclass1_no_out.append(fare_pclass2_no_out)\
.append(fare_pclass3_no_out)
In [10]:
sns.boxplot(x='Pclass', y='Fare_no_out', data=train_df);
Каково соотношение погибших и выживших в зависимости от пола? Отобразите c помощью Seaborn.countplot c аргументом hue.
In [11]:
pd.crosstab(train_df['Sex'], train_df['Survived'])
Out[11]:
In [12]:
sns.countplot(x="Sex", hue="Survived", data=train_df);
Каково соотношение погибших и выживших в зависимости от класса каюты? Отобразите c помощью Seaborn.countplot c аргументом hue.
In [13]:
sns.countplot(x="Pclass", hue="Survived", data=train_df);
Как факт выживания зависит от возраста пассажира? Проверьте (графически) предположение, что молодые чаще выживали. Пусть, условно, молодые - младше 30 лет, пожилые – старше 60 лет.
In [14]:
sns.boxplot(x='Survived', y='Age', data=train_df);
По такой картинке сложно что-то сказать. Попробуем по-другому.
In [15]:
train_df['age_cat'] = train_df['Age'].apply(lambda age: 1 if age < 30
else 3 if age > 60 else 2);
In [16]:
sns.countplot(x='age_cat', hue='Survived', data=train_df);
Заметно, что процент выживших среди пожилых выше (это можно и точно посчитать), но данных для оценки маловато.