Dans le cadre d'un examen de la conférence Python à Udemy, j'ai enquêté sur l'accident de naufrage du Titanic. L'environnement est Windows 10, Python 3.5.2 Tout est écrit dans le cahier Jupyter.
Commençons par importer des pandas.
import pandas as pd
from pandas import Series, DataFrame
Tout d'abord, afin d'obtenir les données du naufrage du Titanic, téléchargez le fichier train.csv depuis le site (https://www.kaggle.com/c/titanic) qui contient les données de Kaggle.
#Lire le fichier csv
titanic_df = pd.read_csv('train.csv')
#Afficher le début du fichier et vérifier l'ensemble de données
titanic_df.head()
PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 0 | 3 | Braund, Mr. Owen Harris | male | 22.0 | 1 | 0 | A/5 21171 | 7.2500 | NaN | S |
1 | 2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Th... | female | 38.0 | 1 | 0 | PC 17599 | 71.2833 | C85 | C |
2 | 3 | 1 | 3 | Heikkinen, Miss. Laina | female | 26.0 | 0 | 0 | STON/O2. 3101282 | 7.9250 | NaN | S |
3 | 4 | 1 | 1 | Futrelle, Mrs. Jacques Heath (Lily May Peel) | female | 35.0 | 1 | 0 | 113803 | 53.1000 | C123 | S |
4 | 5 | 0 | 3 | Allen, Mr. William Henry | male | 35.0 | 0 | 0 | 373450 | 8.0500 | NaN | S |
Voici les points importants de cette analyse.
##Importer numpy et seaborn
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
#Les données ont une colonne d'âge mais pas de colonne d'état de l'enfant
#Ici, les enfants de moins de 10 ans
def male_female_child(passenger):
age, sex = passenger
if age < 10:
return 'child'
else:
return sex
#Ajout d'une nouvelle colonne appelée personne pour les hommes et les femmes et les enfants
titanic_df['person'] = titanic_df[['Age','Sex']].apply(male_female_child, axis=1)
#Comptez le nombre de passagers (y compris les survivants)
sns.countplot('Pclass', data=titanic_df, hue='person')
En comparant les chambres de troisième classe avec les chambres de première classe, le nombre d'enfants est extrêmement important. Regardons ici la répartition par âge.
titanic_df['Age'].hist(bins=70)
titanic_df['Age'].mean()
29.69911764705882
Il semble que l'âge moyen global était d'environ 30 ans. Utilisons maintenant FacetGrid pour voir le groupe d'âge de chaque classe de salle.
fig = sns.FacetGrid(titanic_df, hue='Pclass', aspect=4)
fig.map(sns.kdeplot, 'Age', shade=True)
oldest = titanic_df['Age'].max()
fig.set(xlim=(0,oldest))
fig.add_legend()
J'ai fini par comprendre la situation approximative des passagers.
À propos, la colonne Embarqué (Embarquement ... embarquement) contient trois valeurs de "C", "Q" et "S". Cela signifie respectivement le port de Cherbourg, le port de Queenstown et le port de Southhampton pour voir la page Kaggle. Comme aucun d'entre eux n'est connu, je vais déduire des classes de chambres d'hôtes des personnes qui ont embarqué à partir de ce port.
sns.countplot('Embarked', data=titanic_df, hue='Pclass', color ='g')
Apparemment, le port de Southhampton est le plus grand d'entre eux. On suppose également que le port de Cherbourg était un terrain plus économique que le port de Queenstown.
#Voir la répartition des frais de pension par classe de chambre en utilisant FacetGrid
fig = sns.FacetGrid(titanic_df, hue='Pclass', aspect=3)
fig.map(sns.kdeplot, 'Fare', shade=True)
highest = titanic_df['Fare'].max()
fig.set(xlim=(0,highest))
fig.add_legend()
J'ai un graphique qui a l'air fou.
titanic_df['Fare'].max()
512.32920000000001
titanic_df['Fare'].mean()
32.2042079685746
Il y a des gens qui paient évidemment beaucoup d'argent ...
titanic_df[titanic_df['Fare']>300]
PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | person | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
258 | 259 | 1 | 1 | Ward, Miss. Anna | female | 35.0 | 0 | 0 | PC 17755 | 512.3292 | NaN | C | female |
679 | 680 | 1 | 1 | Cardeza, Mr. Thomas Drake Martinez | male | 36.0 | 0 | 1 | PC 17755 | 512.3292 | B51 B53 B55 | C | male |
737 | 738 | 1 | 1 | Lesurer, Mr. Gustave J | male | 35.0 | 0 | 0 | PC 17755 | 512.3292 | B101 | C | male |
Il semble que ces trois personnes aient payé un coût d'embarquement exceptionnellement élevé par rapport aux autres passagers. (Et, bien sûr, tout le monde a survécu à l'accident.)
Pour ceux qui sont intéressés, je publierai les liens du site pour les trois personnes ci-dessus.
Dessinons un graphique avec seulement ces trois personnes retirées.
drop_idx = [258, 679, 737]
titanic_df2 = titanic_df.drop(drop_idx)
fig = sns.FacetGrid(titanic_df2, hue='Pclass', aspect=4)
fig.map(sns.kdeplot, 'Fare', shade=True)
highest = titanic_df2['Fare'].max()
fig.set(xlim=(0,highest))
fig.add_legend()
Cela n'a pas l'air très facile ... Jetons un coup d'œil à l'histogramme des frais d'embarquement.
titanic_df['Fare'].hist(bins=70)
Tout d'abord, examinons rapidement le taux de survie global.
titanic_df['Survivor'] = titanic_df.Survived.map({0:'Dead', 1:'Alive'})
sns.countplot('Survivor', data=titanic_df, palette='husl')
Ensuite, à propos de la classe de chambre et du taux de survie.
sns.factorplot('Pclass', 'Survived', data=titanic_df)
Jusqu'ici, le résultat semble raisonnable.
Regardons de plus près en utilisant la teinte.
sns.factorplot('Pclass', 'Survived', hue='person', data=titanic_df, aspect=2)
C'est devenu une question pendant un moment, mais comme j'ai vérifié ci-dessus, il n'y avait presque pas d'enfants dans la salle de première classe.
Trouvons une ligne de régression sur le graphique du taux de survie pour chaque âge.
generations = [10,20,30,40,50,60,70,80]
sns.lmplot('Age', 'Survived', hue='Pclass', data=titanic_df,
hue_order=[1,2,3], x_bins=generations)
Vous pouvez voir qu'il existe une différence de taux de survie de 10 à 20% selon le rang de la chambre quel que soit l'âge, bien qu'il existe des variations.
sns.lmplot('Age','Survived',hue='Sex',data=titanic_df,palette='summer',
x_bins=generations)
Cependant, comparé par sexe, on a constaté que le taux de survie des femmes augmentait avec l'âge.
jupyter notebook Je n'y suis pas encore habitué, mais pour le moment, j'ai beaucoup écrit cette fois et j'ai trouvé que je pouvais le changer en Markdown avec le raccourci «esc + 'M».
Recommended Posts