Je commence à jouer avec Kaggle's Titanic, mais avant de compléter les valeurs manquantes ou de revoir les hyperparamètres, j'aimerais regarder de plus près les données et les regarder. Je voudrais regrouper rapidement les données lues par la valeur de `` Survived '' et dessiner un graphique, mais cela ne fonctionne pas très bien. Parce que "GroupBy" de Pandas n'est pas bien compris.
Il existe de nombreux exemples de dessin de graphes par nos prédécesseurs sur le net, mais j'ai écrit cet article en pensant qu'il pourrait être utile pour les débutants en décrivant le chemin de ma compréhension.
Dessinez un graphique comme celui ci-dessous.
Dans ce graphique, l'axe horizontal est le symbole de Ticket '', l'axe vertical est la survie (
s ''), la mort ( d ''), inconnue (
na``). Le nombre de personnes dans ) est accumulé et trié par ordre décroissant en fonction du nombre total de personnes. Par exemple, le symbole de ticket
`CA.2343 '' à l'extrême gauche est de 11 personnes au total, 4 personnes inconnues et le reste. 7 personnes sont décédées.
Je veux dessiner un tel graphique rapidement.
Lisez les données et vérifiez le numéro de chaque même symbole dans les données de `` Ticket ''.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
train_data = pd.read_csv("../train.csv")
test_data = pd.read_csv("../test.csv")
total_data = pd.concat([train_data, test_data]) # train_données et test_Concaténer les données
ticket_freq = total_data["Ticket"].value_counts()
CA. 2343 11
CA 2144 8
1601 8
S.O.C. 14879 7
3101295 7
..
350404 1
248706 1
367655 1
W./C. 14260 1
350047 1
Name: Ticket, Length: 929, dtype: int64
CA.2343 sont 11 personnes,8 CA 2144,Etc.
# Créer des données pour les graphiques
## Grouper par groupby
Tout d'abord, groupez `` total_data '' par symbole de ticket.
```python
total_data_ticket = total_data.groupby("Ticket")
#production
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x000001F5A14327C8>
L'inconvénient de groupby est,Il n'affiche pas le contenu des données.ici, ***Groupé***Comprends dans ma tête,Aller au suivant.
## Extraire uniquement les informations de survie
Ensuite, récupérez les informations de survie (`` Survived '').
```python
total_data_ticket = total_data.groupby("Ticket")["Survived"]
total_data_ticket
#production
<pandas.core.groupby.generic.SeriesGroupBy object at 0x000001F5A1437B48>
Les données ne sont pas affichées ici non plus.
Continuez à utiliser
value_counts ()
pour compter le nombre de chaque valeur de`
Survived```. ..
total_data_ticket = total_data.groupby("Ticket")["Survived"].value_counts(dropna=False)
total_data_ticket
#production
Ticket Survived
110152 1.0 3
110413 1.0 2
0.0 1
110465 0.0 2
110469 NaN 1
..
W.E.P. 5734 NaN 1
0.0 1
W/C 14208 0.0 1
WE/P 5735 0.0 1
1.0 1
Name: Survived, Length: 1093, dtype: int64
Pour dessiner un graphique, modifiez les données telles que la survie, la mort et les données inconnues dans le sens d'une colonne.Utilisez `` unstack () ''.
total_data_ticket = total_data.groupby("Ticket")["Survived"].value_counts(dropna=False).unstack()
total_data_ticket
#production
Survived NaN 0.0 1.0
Ticket
110152 NaN NaN 3.0
110413 NaN 1.0 2.0
110465 NaN 2.0 NaN
110469 1.0 NaN NaN
110489 1.0 NaN NaN
... ... ... ...
W./C. 6608 1.0 4.0 NaN
W./C. 6609 NaN 1.0 NaN
W.E.P. 5734 1.0 1.0 NaN
W/C 14208 NaN 1.0 NaN
WE/P 5735 NaN 1.0 1.0
929 rows × 3 columns
En regardant la sortie ci-dessus, la valeur a toujours
NaN, alors définissez `` NaN
sur 0.
total_data_ticket.fillna(0, inplace=True)
total_data_ticket
#production
Survived NaN 0.0 1.0
Ticket
110152 0.0 0.0 3.0
110413 0.0 1.0 2.0
110465 0.0 2.0 0.0
110469 1.0 0.0 0.0
110489 1.0 0.0 0.0
... ... ... ...
W./C. 6608 1.0 4.0 0.0
W./C. 6609 0.0 1.0 0.0
W.E.P. 5734 1.0 1.0 0.0
W/C 14208 0.0 1.0 0.0
WE/P 5735 0.0 1.0 1.0
929 rows × 3 columns
Les noms de colonne sont
NaN, `` 0.0
, `` 1.0```, mais c'est gênant, alors changez le nom de la colonne.
total_data_ticket.columns = ["nan", "d", "s"]
total_data_ticket
#production
nan d s
Ticket
110152 0.0 0.0 3.0
110413 0.0 1.0 2.0
110465 0.0 2.0 0.0
110469 1.0 0.0 0.0
110489 1.0 0.0 0.0
... ... ... ...
W./C. 6608 1.0 4.0 0.0
W./C. 6609 0.0 1.0 0.0
W.E.P. 5734 1.0 1.0 0.0
W/C 14208 0.0 1.0 0.0
WE/P 5735 0.0 1.0 1.0
929 rows × 3 columns
Je veux trier par nombre total de personnes dans l'ordre décroissant, donc je calcule le nombre total de personnes et l'enregistre dans une nouvelle colonne.Pour calculer le total, utilisez
sum () '', mais comme il est calculé dans le sens de la colonne,
somme (axe = 1) `` ''.
total_data_ticket["count"] = total_data_ticket.sum(axis=1)
total_data_ticket
#production
nan d s count
Ticket
110152 0.0 0.0 3.0 3.0
110413 0.0 1.0 2.0 3.0
110465 0.0 2.0 0.0 2.0
110469 1.0 0.0 0.0 1.0
110489 1.0 0.0 0.0 1.0
... ... ... ... ...
W./C. 6608 1.0 4.0 0.0 5.0
W./C. 6609 0.0 1.0 0.0 1.0
W.E.P. 5734 1.0 1.0 0.0 2.0
W/C 14208 0.0 1.0 0.0 1.0
WE/P 5735 0.0 1.0 1.0 2.0
929 rows × 4 columns
Vous êtes maintenant prêt à dessiner le graphique.
Le code est affiché en premier et expliqué dans l'ordre.
total_data_ticket[total_data_ticket["count"] > 3].sort_values("count", ascending=False)[["nan", "d", "s"]].plot.bar(figsize=(15,10),stacked=True)
code | Contenu |
---|---|
total_data_ticket[total_data_ticket["count"] > 3] |
"count" Données supérieures à 3 |
.sort_values("count", ascending=False) |
"count" Trier par ordre décroissant |
[["nan", "d", "s"]] |
Extraire uniquement les trois colonnes de gauche("count" N'est pas utile) |
.plot.bar(figsize=(15,10),stacked=True) |
Dessinez un graphique à barres.Précisez la taille,J'en ai fait une méthode d'empilement |
Vous pouvez maintenant dessiner le graphique affiché au début.
En regardant cela, les personnes avec
CA.2343 et `` `` CA 2144
peuvent imaginer
Survived = 0``` ...
Enfin, tout le code est affiché.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
train_data = pd.read_csv("../train.csv")
test_data = pd.read_csv("../test.csv")
total_data = pd.concat([train_data, test_data])
ticket_freq = total_data["Ticket"].value_counts()
ticket_freq
total_data_ticket = total_data.groupby("Ticket")["Survived"].value_counts(dropna=False).unstack()
total_data_ticket.fillna(0, inplace=True)
total_data_ticket.columns = ["nan", "d", "s"]
total_data_ticket["count"] = total_data_ticket.sum(axis=1)
total_data_ticket[total_data_ticket["count"] > 3].sort_values("count", ascending=False)[["nan", "d", "s"]].plot.bar(figsize=(15,10),stacked=True)
En utilisant cette technique, nous vérifierons également d'autres données non numériques telles que le nom et le titre de Embarqué '',
Cabine '', `` Nom ''.
Recommended Posts