! pip install statsmodels
! pip install xlrd
! pip install openpyxl
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import statsmodels.api as sm
from statsmodels.formula.api import ols
from scipy.stats import t
from sklearn.linear_model import LogisticRegression
from sklearn.decomposition import PCA
from sklearn.pipeline import Pipeline
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.metrics import accuracy_score
from sklearn.ensemble import RandomForestClassifier
titanic = pd.read_excel('3_Titanic.xlsx')
EDA: Die Daten verstehen
titanic.head(10)
titanic.describe()
titanic.info()
EDA_cols = ['Age', 'Pclass']
EDA_data = titanic[EDA_cols]
plt.figure(figsize=(10, 10))
plt.style.use('ggplot')
sns.boxplot(x='Pclass', y='Age', data=EDA_data, palette='YlGnBu')
plt.ylabel('Alter')
plt.xlabel('Klasse')
plt.show()
EDA_cols2 = ['Survived', 'Pclass']
EDA_data2 = titanic[EDA_cols2]
plt.style.use('ggplot')
plt.figure(figsize=(10, 10))
sns.barplot(x='Pclass', y='Survived', data=EDA_data2, palette='YlGnBu')
plt.ylabel('Anteil Überlebender')
plt.xlabel('Klasse')
plt.show()
plt.style.use('ggplot')
plt.figure(figsize=(10, 10))
sns.barplot(x="Sex", y=titanic.index, data=titanic, palette='tab10', alpha=0.8)
plt.ylabel('Anzahl Personen')
plt.xlabel('Geschlecht')
plt.show()
plt.style.use('ggplot')
plt.figure(figsize=(10, 10))
sns.barplot(x='Sex', y='Survived', data=titanic, palette='tab10', alpha=0.8)
plt.ylabel('Überlebende')
plt.xlabel('Geschlecht')
plt.show()
Kategorische Daten encoden und maschinell lesbar machen
titanic['Sex'] = pd.get_dummies(titanic['Sex'])
titanic['Embarked'] = pd.get_dummies(titanic['Embarked'])
print(titanic.head(10))
ANOVA und Hypothese
titanic['Survived'].value_counts()
titanic['Parch'].value_counts()
parch_survivors = titanic.query('Survived >= 1 & Parch >= 1 ')
parch_survivors['Survived'].value_counts()
fem_parch_survivors = titanic.query('Survived >= 1 & Parch >= 1 & Sex == 1')
fem_parch_survivors['Survived'].value_counts()
hypothese = pd.DataFrame(columns=['Überlebt', 'Eltern/ Kind an Bord', 'Eltern/ Kind + Überlebt', 'Eltern/ Kind + Überlebt + weiblich'], dtype=float)
werte = {'Überlebt':342, 'Eltern/ Kind an Bord':213, 'Eltern/ Kind + Überlebt':109, 'Eltern/ Kind + Überlebt + weiblich':80}
hypothese = hypothese.append(werte, ignore_index=True)
plt.style.use('ggplot')
plt.figure(figsize=(10, 10))
sns.barplot(data=hypothese, palette='YlGnBu')
plt.xticks(rotation=10)
plt.show()
anova_model = ols('Survived ~ Parch', data=titanic).fit()
anova_ergebnisse = sm.stats.anova_lm(anova_model, typ=2)
print(anova_ergebnisse['PR(>F)'])
Korrelationen zwischen den Datenpunkten
plt.style.use('ggplot')
plt.figure(figsize=(10, 10))
corr_matrix = titanic.corr()
sns.heatmap(corr_matrix, annot=True, linewidths=1)
plt.show()
print(titanic.Age.mean())
print(titanic.Age.median())
titanic['Age'] = titanic['Age'].fillna(titanic.Age.mean())
print(titanic.head(10))
print(titanic.info())
feauture_cols = ['Pclass', 'Age', 'Parch', 'Sex', 'SibSp', 'Embarked']
# Auswahl der oben ausgewählten features
X = titanic.loc[:, feauture_cols]
print(X.shape)
# y als Zielparameter - hat die Person überlebt oder nicht?
y = titanic.Survived
print(y.shape)
Logistische Regression
logistic_reg = LogisticRegression()
# Training der Logistischen Variable mit X und y
logistic_reg.fit(X, y)
pred_lr = logistic_reg.predict(X)
print(accuracy_score(y, pred_lr))
# Aufteilen von x & y
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
# Initiierung der Pipeline
logreg = LogisticRegression()
pipe = Pipeline(steps=[('logistic_Reg', logreg)])
# Werte die getestet werden sollen. Das Modell mit den besten Parametern wird anschließend verwendet.
werte_raster = {'logistic_Reg__C': np.logspace(-4, 4, 5),
'logistic_Reg__penalty': ['l1', 'l2', 'none']}
# Training des Modells mittels GridsearchCV. CV steht für cross-validation. Hierbei wird der gesamte Datensatz in Stücke aufgeteilt, wobei ein Stück der Daten zurückgehalten wird, um die performance zu testen.
# Das hat den Vorteil, das wir den gesamten Datensatz zum trainieren verwenden können, ohne das Modell zu over-fitten oder die generalisierbarkeit aufzugeben. Der Datensatz ist recht klein, daher ist jeder Datenpunkt wertvoll.
model_lr = GridSearchCV(pipe, param_grid=werte_raster, cv = 5, verbose=True)
model_lr.fit(X_train, y_train)
pred = model_lr.predict(X_test)
print(accuracy_score(y_test, pred))
print(model_lr.best_params_)
Random Forest
# Aufsetzen eines Random Forest Modells mit 100 Estimators/ Bäumen
schwarzwald = RandomForestClassifier(n_estimators=100)
#Training des Modells
schwarzwald.fit(X_train, y_train)
# Überprüfung der Ergebnisse mit Hilfe des Testdatensatzes
y_pred = schwarzwald.predict(X_test)
acc_random_forest = schwarzwald.score(X_train, y_train)
print(acc_random_forest)
Rose und Jack: werden sie überleben?
fiktive_person = pd.DataFrame(columns=['Pclass', 'Age', 'Parch', 'Sex', 'SibSp', 'Embarked'], dtype=float)
fiktive_person.head()
rose = {'Pclass':1, 'Age':17, 'Parch':0, 'Sex':1, 'SibSp':1, 'Embarked':0}
jack = {'Pclass':3, 'Age':20, 'Parch':0, 'Sex':0, 'SibSp':0, 'Embarked':0}
fiktive_person = fiktive_person.append(rose, ignore_index=True)
fiktive_person = fiktive_person.append(jack, ignore_index=True)
fiktive_person
# Vorhersagen Rose und für Jack. 1 = Überlebt 0 = Überlebt nicht
roseandjack_prediction = schwarzwald.predict(fiktive_person)
print(roseandjack_prediction)
wahrscheinlichkeit_jackrose = schwarzwald.predict_proba(fiktive_person)
print(wahrscheinlichkeit_jackrose)
Wichtigkeit der Spalten
importances = schwarzwald.feature_importances_
feature_names = ['Pclass', 'Age', 'Parch', 'Sex', 'SibSp', 'Embarked']
forest_importances = pd.Series(importances, index=feature_names)
std = np.std([tree.feature_importances_ for tree in schwarzwald.estimators_], axis=0)
fig, ax = plt.subplots()
forest_importances.plot.bar(yerr=std, ax=ax)
ax.set_title("Wichtigkeit der jeweiligen Spalten")
ax.set_ylabel("%")
fig.tight_layout()
plt.show()