--Background: Je me suis finalement inscrit avec Kaggle, donc je l'ai essayé pour le moment. (lent)
Obtenez des données sur les survivants du Titanic --Une fois que vous démarrez Kaggle, récupérez les données de Example Competition. --Créer un cahier avec Kaggle Kernal --Cliquez sur "Nouveau carnet" sur la page Concours.
Lire les données --Lorsque vous créez un cahier à partir de la page du concours, la première boîte doit ressembler à ceci, alors exécutez-la.
Lire les données csv et les stocker en tant que dataframe
train_csv = pd.read_csv('../input/titanic/train.csv', sep=',')
train_csv.head()
#Dimension des données
train_csv.shape
#Résultat de sortie
(891, 12)
Il semble contenir des données pour 891 passagers.
#Nombre de valeurs manquantes dans chaque ligne
train_csv.isnull().sum()
#Résultat de sortie
PassengerId 0
Survived 0
Pclass 0
Name 0
Sex 0
Age 177
SibSp 0
Parch 0
Ticket 0
Fare 0
Cabin 687
Embarked 2
dtype: int64
Il manque de nombreuses valeurs pour Age et Cabin.
Les détails des données sont décrits sur la page du concours, je les omettrai donc. Ces données prédit qui peut survivre grâce aux attributs des passagers du Titanic. Il existe plusieurs attributs du passager, mais nous déciderons quel attribut utiliser et comment l'utiliser lors de l'analyse des données.
Si le passager a survécu ou non est enregistré dans Survived à 0/1. 0 signifie la mort, 1 signifie la survie. Combien de personnes ont survécu?
#Probabilité de survie
train_csv['Survived'].mean()
#Résultat de sortie
0.3838383838383838
Il semble qu'un peu moins de 40% des personnes aient survécu.
train_csv['Survived'].value_counts()
#Résultat de sortie
0 549
1 342
Name: Survived, dtype: int64
Cela ressemble à ceci en termes de nombre de personnes.
Examinons maintenant la relation entre chaque attribut et Survived.
Contient des valeurs entières de 1 à 3. Il semble que plus le nombre est petit, meilleure est la classe. En regardant le film, je pense que les passagers de la classe supérieure étaient préférentiellement sur le canot de sauvetage. Croisons-nous avec Survived et voyons l'impact * 1.
pd.crosstab(train_csv['Pclass'], train_csv['Survived'])
Le taux de mortalité des passagers de la 3ème classe est largement plus élevé que dans les autres classes. Au contraire, les passagers de 1ère classe ont un taux de survie élevé. Après tout, meilleure est la classe, plus le taux de survie est élevé, donc cette fois je vais l'utiliser tel quel pour le modèle.
2.2. Name Cela peut avoir quelque chose à voir avec cela, mais je ne l'utiliserai pas cette fois car il est difficile d'expliquer la cause et l'effet. (Il peut y avoir quelque chose si seul le titre est extrait.)
homme et femme sont inclus tels quels dans la chaîne de caractères. En cas d'urgence, la survie des femmes a tendance à être une priorité, il semble donc que plus de femmes sont en vie que d'hommes dans ce cas également. Crosstab avec Survived.
pd.crosstab(train_csv['Sex'], train_csv['Survived'])
Les femmes ont de nombreux survivants, mais les hommes ont peu de survivants. Je vais donc fabriquer un mannequin féminin et le mettre dans le modèle.
L'âge est entré numériquement, mais certaines valeurs manquent. Au stade de l'analyse, les valeurs manquantes sont exclues et comparées. De manière générale, les jeunes ont plus de chances de survivre. Par conséquent, comparons l'âge moyen des passagers morts et survivants. * 2
#Âge moyen des décès
train_csv[(train_csv['Age'].isnull() == False) & (train_csv['Survived'] == 0)].Age.mean()
#Résultat de sortie
30.62617924528302
#Âge moyen des survivants
train_csv[(train_csv['Age'].isnull() == False) & (train_csv['Survived'] == 1)].Age.mean()
#Résultat de sortie
28.343689655172415
Les survivants sont plus jeunes. Cependant, tel quel, il manque des valeurs et il ne peut pas être inclus dans le modèle. La méthode la plus rapide et la plus populaire consiste à compléter les données avec des valeurs représentatives (moyenne ou médiane). Cette fois, les valeurs manquantes seront complétées par la valeur moyenne globale et incluses dans le modèle.
SibSp contient le nombre de frères et de conjoints, et Parch contient le nombre de parents et d'enfants. Il semble que les gens avec de nombreuses familles sont plus susceptibles de le trouver, alors j'ai l'impression d'être en vie. Dessinons un histogramme SibSp / Parch pour chacun des survivants et des morts.
import matplotlib.pyplot as plt
# SibSp
plt.hist([train_csv[train_csv['Survived']==0].SibSp, train_csv[train_csv['Survived']==1].SibSp], label=['Died', 'Survived'])
plt.legend()
#Parch
plt.hist([train_csv[train_csv['Survived']==0].Parch, train_csv[train_csv['Survived']==1].Parch], label=['Died', 'Survived'])
plt.legend()
Dans les deux cas, 0 personne a beaucoup de morts, mais même 1 personne a plusieurs survivants ou le même. Une réalité douloureuse pour une personne. Puisque les distributions de SibSp et Parch sont similaires, nous utiliserons Parch comme représentant cette fois. (Parce que mettre des variables similaires entraîne une colinéarité multiple) Parch est transformé en une variable factice par 0 personne et 1 personne ou plus et mis dans le modèle.
2.6. Ticket Il y a peut-être quelque chose à voir avec cela, mais je ne comprends pas vraiment la signification des chiffres et des lettres, donc je ne peux pas expliquer si cela me concerne. Donc je ne l'utiliserai pas cette fois.
Le montant est une valeur entière. Plus la personne est élevée, plus elle a de chances de survivre.
#le défunt
train_csv[train_csv['Survived']==0].Fare.mean()
#Résultat de sortie
22.117886885245877
#Survivant
train_csv[train_csv['Survived']==1].Fare.mean()
#Résultat de sortie
48.39540760233917
Il y avait une grande différence. Regardons également la distribution.
plt.hist([train_csv[train_csv['Survived']==0].Fare, train_csv[train_csv['Survived']==1].Fare], label=['Died', 'Survived'], bins=20)
plt.legend()
C'est un peu difficile à voir, mais il semble qu'il y ait plus de survivants lorsque le tarif est élevé. Alors je l'ai juste mis dans le modèle.
2.8. Cabin Puisqu'il y a trop de valeurs manquantes, j'ai décidé de ne pas l'utiliser cette fois.
Il est représenté par trois bases sur lesquelles vous êtes arrivé. Les différences dans les conditions de santé et économiques propres à la résidence, la race et le temps d'embarquement selon le lieu d'embarquement peuvent affecter les taux de survie. Il manque des valeurs, mais elles sont insignifiantes et seront ignorées.
pd.crosstab(train_csv['Embarked'], train_csv['Survived'])
Le nombre de décès de passagers en provenance de S (Southampton) est important. Faisons un mannequin S et mettons-le dans le modèle.
Pourquoi les passagers de Southampton sont-ils morts? Si quelqu'un sait, faites-le moi savoir.
Modélisons en fonction du résultat de l'analyse.
La modélisation elle-même est facile, mais vous devez travailler avec les variables. Comme ça.
train = pd.DataFrame()
train = train.drop(['Name', 'SibSp', 'Ticket', 'Cabin'] , axis=1) #Supprimer les colonnes inutilisées
#Faire un mannequin féminin
train['Female'] = train['Sex'].map(lambda x: 0 if x == 'male' else 1 ).astype(int)
#Complétez la valeur manquante de l'âge par la valeur moyenne
train['Age'].fillna(train['Age'].mean(), inplace=True)
#Parch fait 0 et plus de mannequins
# Parch=0 quand 0, Prach>=Quand 1 1
train['Parch_d'] = train['Parch'].map(lambda x: 0 if x == 0 else 1).astype(int)
#Embarqué rend S et autres mannequins
train['Embarked_S'] = train['Embarked'].map(lambda x: 0 if x == 'S' else 1).astype(int)
Puis modèle.
#Génération de modèle
from sklearn.linear_model import LogisticRegression
X = train[['Pclass', 'Age', 'Parch_d', 'Fare', 'Female', 'Embarked_S']]
y = train['Survived']
model = LogisticRegression()
result = model.fit(X, y)
Tout d'abord, vérifiez quel type de modèle est devenu le modèle.
#coefficient
result.coef_
#Résultat de sortie
rray([[-1.02255162e+00, -2.89166539e-02, -7.14935760e-02,
1.19056911e-03, 2.49662371e+00, -4.29002495e-01]]
#Section
result.intercept_
#Résultat de sortie
array([1.98119965])
La femme (mannequin femme) semble avoir le plus d'influence.
Voyons ensuite si le modèle créé est un bon modèle * 3. Premièrement, obtenons le coefficient de décision.
model.score(X, y)
#Résultat de sortie
0.792368125701459
Ça n'a pas l'air mal. Le facteur de décision est également appelé R 2 </ sup>, mais il montre dans quelle mesure la valeur prédite du modèle créé précédemment correspond aux données réelles. (Les valeurs ci-dessus sont les valeurs des données d'entraînement) Il est représenté par 0 à 1, et plus il est proche de 1, meilleure est la prédiction.
Maintenant, prédisons et confirmons avec les données de test. Continuez vers la section de prédiction. → https://qiita.com/anWest/items/cad88fe7b6f26fe86480
Recommended Posts