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