Истински шедьовър на нашата епоха. Един от най-добрите филми, правени някога. Това еТитаник!
Джак и Роуз на Леонардо ди Каприо и Кейт Уинслет може да са били измислени, но основната история е истинска като айсберг.

Имаме много статистически факти за Титаник.

  • На борда е имало 2222 души (пътници и екипаж).
  • 706 е общият брой на хората, оцелели след потъването на Титаник
  • 37% процент от оцелелите пътници.
  • 49% процент от местата за пътници, които са останали неизползвани (загубата на живот все още може да е била много голяма).
    (Ресурс “https://titanicfacts.net/”)

Така че нека разберем заедно математиката зад тези факти и още!

Източник на рамка за данни =”https://www.kaggle.com/c/titanic

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import statsmodels.api as sm
import statsmodels.formula.api as smf
import dataframe_image as dfi
from sklearn.metrics import mean_squared_error
from sklearn.metrics import r2_score
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, confusion_matrix
from sklearn.model_selection import train_test_split
from patsy import dmatrices, dmatrix, demo_data
df_tit_reg=pd.read_csv("./titanic_train.csv")
df_tit_reg.head()

df_tit_reg.info()

Проверяват се всички NaN стойности в рамката с данни

sns.heatmap(df_tit_reg.isnull(),yticklabels=False,cbar=False,cmap="viridis")

Поради липса на толкова много данни, трябва да премахнем колоната „Кабина“.

df_tit_reg.drop("Cabin",axis=1,inplace=True)

За да направите по-добър модел, модифицирайте липсващите стойности в колоната за възраст

И така, имаме 3 различни типа „Класа на пътника“
Pclass“: Прокси за социално-икономически статус (SES)
1-ва = Горна
2-ра = Средна
3-та = Долна
Преди попълването на липсващите стойности на възрастта, нека да разгледаме разпределението на възрастта по „Pclass“

sns.boxplot(x="Pclass",y="Age",data=df_tit_reg);

Функция за попълване на нулеви стойности в колона за възраст

def fiil_ages(cols):
    Age=cols[0]
    Pclass=cols[1]
    if pd.isnull(Age):
        if Pclass==1:
            return 38
        elif Pclass==2:
            return 29
        else :
            return 25
    else:
        return Age


df_tit_reg["Age"]=df_tit_reg[["Age","Pclass"]].apply(fiil_ages,axis=1)

Нека проверим корелацията между нашите функции

Не го забравяйте! Когато използвахме функцията corr(), тя ни показва само корелацията на непрекъснати променливи. Но категориалните променливи също могат да бъдат доста важни. Ще говорим какво ще правим с категориалните променливи.

sns.heatmap(df_tit_reg.corr(),cmap="BuPu")
plt.show()

Търсене на полове и характеристики на Pclass Ефекти върху оцеляването

sns.set_style("whitegrid")
sns.countplot(x="Survived",hue="Sex",data=df_tit_reg)
sns.countplot(x="Survived",hue="Pclass",data=df_tit_reg);

Очевидно полът оказва силно влияние върху Survive. Трябва да използваме тази функция!

Преобразуване на категорични стойности като [SEX,PARCH] в непрекъснати променливи

Ще използваме функцията get_dummies за конвертиране на тези функции.

Функцията get_dummies се използва за преобразуване на категориални променливи във фиктивни или индикаторни променливи. Фиктивна или индикаторна променлива може да има стойност 0 или 1

sex=pd.get_dummies(df_tit_reg["Sex"],drop_first=True)
embark=pd.get_dummies(df_tit_reg["Embarked"],drop_first=True)
pd.get_dummies(df_tit_reg["Sex"],drop_first=True).head()

Търсене на корелацията на характеристиките с нова модифицирана рамка от данни

Според нашите съотношения на характеристики, да си беден и мъж е ужасно!

Да си мъж увеличава с 54% повече риска от смърт, отколкото да си жена.

Ако вашият Pclass номер е по-голям от 1, нещата са малко лоши за вас, защото сте в по-нисък социално-икономически статус и това се отразява зле на шанса ви за оцеляване.

Единственият изброим положителен ефект върху оцелелите е функцията „Fare“.
Ако сте платили повече, вашият шанс за оцеляване също е по-голям!

Статистически връзки между нашите функции

formula='Survived ~ Age + male + Fare +Pclass'
y, X=dmatrices(formula,df_tit_reg,return_type="dataframe")

model=sm.OLS(y,X)

fit=model.fit()

fit.summary()

Така че нашата стойност на R-квадрат е 0,385, което означава ;
Моделът показва, че полът, възрастта, тарифата и класата представляват 38,5% от дисперсията.

Колоната coef обяснява силата на всяка променлива, за да обясни съответствието в модела.

Логистичен регресионен модел за прогнозиране на оцеляването

Сега дефинираме нашата зависима променлива и независими променливи
X= Характеристики(Dописателни атрибути)
y=Етикет(Aизкушение за предсказване)

X = df_tit_reg.drop('Survived', axis = 1)
y = df_tit_reg['Survived']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.33, random_state = 5)

Правене на модел

log_reg = LogisticRegression()
log_reg.fit(X_train, y_train)
y_pred = log_reg.predict(X_test)
accuracy_score(y_pred, y_test)
Output: 0.8135593220338984

По същество….