<jupyter_start><jupyter_text>В ходе решения Titanic_2.0 мы получили baseline- 0.76077, проведем глубокое исследование данных и попытаемся улучшить эти значения Только 2 непрерывных признака, остальные дискретные. Возмодно можно будет понастраивать кодирование признаков<jupyter_code>train.info()
test.info()<jupyter_output><class 'pandas.core.frame.DataFrame'>
RangeIndex: 418 entries, 0 to 417
Data columns (total 11 columns):
PassengerId    418 non-null int64
Pclass         418 non-null int64
Name           418 non-null object
Sex            418 non-null object
Age            332 non-null float64
SibSp          418 non-null int64
Parch          418 non-null int64
Ticket         418 non-null object
Fare           417 non-null float64
Cabin          91 non-null object
Embarked       418 non-null object
dtypes: float64(2), int64(4), object(5)
memory usage: 36.0+ KB<jupyter_text>В обоих выборках много пропусков занчений признака "Age", практически отсутствуют значения признака "Cabin", пропущено одно значение прзнака Fare  в тестовой выборке  Survived<jupyter_code>train.Survived.describe()
plt.title(u'Количесто погибших/выжевших на титанике', y= 1.1, size=15)
sns.countplot(x='Survived', data = train)<jupyter_output><empty_output><jupyter_text>Классы получились не сбалансированными, учесть это при обучении моделей  Pclass<jupyter_code>train.Pclass.describe()
plt.title(u'Распределение выживших в зависимости от класса', y= 1.1, size = 20 )
sns.barplot(x = 'Pclass', y = 'Survived', data = train)<jupyter_output><empty_output><jupyter_text>сильный признак<jupyter_code>plt.title(u'Количество людей путешествубщих в каждоим классе', y= 1.1, size=15)
sns.countplot(x='Pclass', data = train)<jupyter_output><empty_output><jupyter_text>Sex<jupyter_code>sex_encoder  = LabelEncoder()
train['Sex_enc'] = sex_encoder.fit_transform(train.Sex)
test['Sex_enc'] = sex_encoder.transform(test.Sex)
plt.title(u'Число мужчин и женщин на борту', y =1.1, size = 20)
sns.countplot(x='Sex', data = train)
plt.title(u'Распределение выживших в зависимости от класса и пола', y= 1.1, size = 20 )
sns.barplot(x = 'Pclass', y = 'Survived', data = train, hue = 'Sex')<jupyter_output><empty_output><jupyter_text>Класс и пол - очень сильные признаки  SibSp and Parch<jupyter_code>sns.countplot(x='SibSp', data = train)
sns.countplot(x='Parch', data = train)<jupyter_output><empty_output><jupyter_text>создадим признак Family Size, чтобы добавить вес правому краю распредления<jupyter_code>for df in [train,test]:
    df['Fam_size'] = df.Parch + df.SibSp
sns.countplot(x='Fam_size', data = train)
fig = plt.figure(figsize = (10,10))
sns.barplot(x='Fam_size', y = 'Survived', hue = 'Sex',data = train)
fig = plt.figure(figsize = (10,10))
sns.barplot(x='Fam_size', y = 'Survived', hue = 'Pclass',data = train)<jupyter_output><empty_output><jupyter_text>Очень сильный признак. Бездетные люди из 3 класса практически не имели шансов выжить  Ticket<jupyter_code>train.Ticket.describe()
for elem in df.Ticket:
    print elem
    #print elem[0]<jupyter_output>330911
363272
240276
315154
3101298
7538
330972
248738
2657
A/4 48871
349220
694
21228
24065
W.E.P. 5734
SC/PARIS 2167
233734
2692
STON/O2. 3101270
2696
PC 17603
C 17368
PC 17598
PC 17597
PC 17608
A/5. 3337
113509
2698
113054
2662
SC/AH 3085
C.A. 31029
C.A. 2315
W./C. 6607
13236
2682
342712
315087
345768
1601
349256
113778
SOTON/O.Q. 3101263
237249
11753
STON/O 2. 3101291
PC 17594
370374
11813
C.A. 37671
13695
SC/PARIS 2168
29105
19950
SC/A.3 2861
382652
349230
348122
386525
PC 17608
349232
237216
347090
334914
PC 17608
F.C.C. 13534
330963
113796
2543
19950
382653
349211
3101297
PC 17562
113503
113503
359306
11770
248744
368702
2678
PC 17483
19924
349238
240261
2660
330844
A/4 31416
364856
29103
347072
345498
F.C. 12750
376563
13905
350033
19877
STON/O 2. 3101268
347471
A./5. 3338
11778
228414
365235
347070
2625
C 4001
330920
383162
3410
248734
237734
330968
PC 17531
329944
PC 17483
2680
2681
PP 9549
13050
SC/AH 29037
C.A. 33595
367227
13236
392095
368783
371362
350045
367226
211535
34[...]<jupyter_text>Первая буква билета может означать серию или еще какую-то информаци о продавце билетов, что возможно могло повлиять на групировку пассажиров на борту<jupyter_code>train['letter'] = df.Ticket.apply(lambda x: x[0])
fig = plt.figure(figsize = (10,10))
plt.title(u'Распределение пасажиров по классам в завимимость от первой буквы номер билета', size = 20)
sns.countplot(x='letter',hue='Pclass', data = train)
fig = plt.figure(figsize = (10,10))
sns.barplot(x='letter',y = 'Survived', hue='Pclass', data = train)<jupyter_output><empty_output><jupyter_text>Признак слабоват Некоторые номера билетов повторяются, разделим их на повторяющиеся и нет<jupyter_code>ticket = pd.concat((train.Ticket, test.Ticket), ignore_index = True)
ticket_freq = ticket.value_counts()

for df in (train,test):
    fticket_list = []
    for elem in df.Ticket:
        if ticket_freq[str(elem)]>1:
            fticket_list.append(1)
        else:
            fticket_list.append(0)
    df['ticket_freq'] = fticket_list
plt.title(u'Доля выживших в зависимости от пола и наличия у человека повторяющегося билета', size = 20)
sns.barplot(x = 'ticket_freq', y = 'Survived', data = train, hue = 'Sex')
plt.title(u'Доля выживших в зависимости от пола и наличия у человека повторяющегося билета', size = 20)
sns.barplot(x = 'ticket_freq', y = 'Survived', data = train, hue = 'Pclass')<jupyter_output><empty_output><jupyter_text>Признак средней силы, так как перекрываются доверительные интервалы  Fare<jupyter_code>fig = plt.figure(figsize=(10,10))
plt.title(u'Распределение стоимости билета  в обучающей выборке', y= 1.1, size = 20 )
sns.distplot(train.Fare)
fig = plt.figure(figsize=(10,10))
plt.title(u'Распределение стоимости билета  в тестовой выборке', y= 1.1, size = 20 )
sns.distplot(test.Fare.loc[test.Fare.isnull() == False])<jupyter_output><empty_output><jupyter_text>На обучении и на тесте распределение признака Fare явно не является нормальным. Объеденим значения и попытаемся привести их к нормальному распределению В ходе исследования признака оказальсь что есть пасажиры, которые не платили за билет, исследуем их<jupyter_code>train.Fare.loc[train.Fare == 0]
train.Survived.loc[train.Fare == 0]
sns.barplot(x =train.Fare.loc[train.Fare == 0] , y = 'Survived', data = train, hue = 'Pclass')
sns.barplot(x =train.Fare.loc[train.Fare == 0] , y = 'Survived', data = train, hue = 'Sex')<jupyter_output><empty_output><jupyter_text>Пасажиры с бесплатными билетами - мужчины из 3-его класса с практически нулевым шансом на выживание. Созжадим признак free_ticket, 1- бесплтный билет, 0 - платный билет<jupyter_code>for df in (train, test):
    df['free_ticket'] = df.Fare.apply(lambda x: 1 if x==0 else 0)
# заменим значения 0 на 0,01 так как дальнейшие преобразования с 0 будут плохо работать
for df in (train, test):
    df.Fare = df.Fare.apply(lambda x:0.01 if x==0 else x)

train['log_fare'] = train.Fare.apply(np.log10)

sns.distplot(train.log_fare)
sns.distplot(boxcox(train.Fare)[0])

shapiro(boxcox(train.Fare)[0])
train.Fare.loc[train.Fare <= 0]<jupyter_output><empty_output><jupyter_text>Ageвозьмемся под конец, так как надо заполнять пробелы<jupyter_code>plt.title(u'Распределение людей по возрасту', y= 1.1, size = 20 )
sns.distplot(train.Age.loc[train.Age.isnull()== False])
train.Age.loc[train.Age.isnull()== False].describe()<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.11037557416914348, 'fraction_numerical': 0.11645501215887598, 'mean_word_length': 5.226240538267452, 'pattern_counts': {'":': 0, '<': 57, '<?xml version=': 0, '>': 57, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '14', 'dir': 'jupyter-structured-clean-dedup', 'id': '32190', 'license': 'MIT', 'n_tokens_mistral': 3692, 'n_tokens_neox': 3348, 'n_words': 739, 'path': 'Titanic_3.0.ipynb', 'repo_name': 'VokhmintcevKirill/ti-nic_competition2', 'size': '7402'}