Table of Contents

Introduccion a pandas. Titanic Dataset¶
Clicar aquí para abrir el cuaderno en google Colab.
Toca sin miedo, te aseguramos que no se romperá.
Qué es pandas y porqué es tan interesante aprenderlo¶
pandas
es una biblioteca de software escrita como extensión de NumPy para manipulación y análisis de datos para el lenguaje de programación Python. En particular, ofrece estructuras de datos y operaciones para manipular tablas numéricas y series temporales.
Dicho de un modo más sencillo, pandas nos permite realizar operaciones sobre tablas, como hariamos en Excel. La gran ventaja, es que puede manejar volúmenes de datos mucho más grande que Excel, y de forma más rápida.
Empezamos¶
Cargamos la libreria de pandas¶
Para empezar a utilizar pandas, lo primero que debemos hacer es cargar la librería
import pandas as pd
Truco, para ejecutar cada celda de código puedes pulsar Shift+Enter
.
import pandas
carga le dice al notebook que vamos a utilizar esta librería, y con
as pd
le indicamos un alias, un mote, para poder llamar a la librería como pd
, y de esta forma que el código quede más limpio. Podriamos haberla llamada panditas
, pero por convención la llamamos pd
.
Cargamos el CSV en pandas¶
Hemos elegido el mítico dataset del Titanic. Contiene información sobre los pasajeros del naufragado barco. Este dataset lo hemos escogido por uno de loa tradicionales para empezar en el mundo del Machine Learning o ML. Pero de momento nos centraremos en hacer un Exploratory Data Analysis o EDA.
Vamos a cargar el archivo test.csv
. Para ello debemos cargar este archivo en Google Colab, y lo haremos de la siguiente forma.
df = pd.read_csv('https://raw.githubusercontent.com/mrBronnWow/Curso_Beginners/main/1_Dataset_titanic/train.csv')
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 |
Esta linea lee una URL de un repositorio en Github, pero no te preocupes por ello ahora. Si tienes curiosidad por saberqué significa cada columna, puedes consultar la web de kaggle https://www.kaggle.com/c/titanic/overview
Con la sentencia pd.head()
podemos ver las primeras 5 lineas de nuestro dataset, es decir, la cabecera. ¿Adivinas qué hará pd.tail()
? Escribelo en la siguiente celda y ejecutalo ;)
podemos comprobar qué tipo de variable es df
type(df)
pandas.core.frame.DataFrame
Es un pandas dataframe! es el objeto básico de pandas
, es una forma de trabajar con tablas dentro de Python.
Obteniendo informacion sobre el dataset¶
df.shape
(891, 12)
La propiedad shape del objeto df, nos informa del numero de filas y columnas del dataset. que (por eso se escribe sin parentesis al final.
df.describe()
PassengerId | Survived | Pclass | Age | SibSp | Parch | Fare | |
---|---|---|---|---|---|---|---|
count | 891.000000 | 891.000000 | 891.000000 | 714.000000 | 891.000000 | 891.000000 | 891.000000 |
mean | 446.000000 | 0.383838 | 2.308642 | 29.699118 | 0.523008 | 0.381594 | 32.204208 |
std | 257.353842 | 0.486592 | 0.836071 | 14.526497 | 1.102743 | 0.806057 | 49.693429 |
min | 1.000000 | 0.000000 | 1.000000 | 0.420000 | 0.000000 | 0.000000 | 0.000000 |
25% | 223.500000 | 0.000000 | 2.000000 | 20.125000 | 0.000000 | 0.000000 | 7.910400 |
50% | 446.000000 | 0.000000 | 3.000000 | 28.000000 | 0.000000 | 0.000000 | 14.454200 |
75% | 668.500000 | 1.000000 | 3.000000 | 38.000000 | 1.000000 | 0.000000 | 31.000000 |
max | 891.000000 | 1.000000 | 3.000000 | 80.000000 | 8.000000 | 6.000000 | 512.329200 |
Si algunas vez tienes dudas de cómo usar un comando, una sentencia, siempre puedes escribir ?
despues del comando y ejecutar la celda, esto abrirá la documentación.
df.describe?
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 PassengerId 891 non-null int64
1 Survived 891 non-null int64
2 Pclass 891 non-null int64
3 Name 891 non-null object
4 Sex 891 non-null object
5 Age 714 non-null float64
6 SibSp 891 non-null int64
7 Parch 891 non-null int64
8 Ticket 891 non-null object
9 Fare 891 non-null float64
10 Cabin 204 non-null object
11 Embarked 889 non-null object
dtypes: float64(2), int64(5), object(5)
memory usage: 83.7+ KB
Este comando nos indican información sobre qué tipo de datos contiene cada una de las columnas. En este caso tenemos integer, float o object.
Los object es la forma genérica que tiene pandas
de decirnos que no sabe descifrar qué tipo de dato es, y la guarda como cadena de texto, un string
.
la columna Non-null nos dice cuantas celdas con contenido hay en cada columna. Observa que de 891 filas (entries), la columna 11, Embarked, tiene solo 889 datos no nulos. En las columnaAge
y Cabin
, tampoco tenemos 891 registros, sino 714 y 204 respecticamente. ¡La columna cabin está casi vacía!
Accediendo a los datos¶
en pandas
tenemos dos formas de acceder a la información de las columnas.
#nos dice los nombres de las columnas presentes en el df
df.columns
Index(['PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp',
'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'],
dtype='object')
Si quiero acceder solo a la columna Name, por ejemplo
df.Name
0 Braund, Mr. Owen Harris
1 Cumings, Mrs. John Bradley (Florence Briggs Th...
2 Heikkinen, Miss. Laina
3 Futrelle, Mrs. Jacques Heath (Lily May Peel)
4 Allen, Mr. William Henry
...
886 Montvila, Rev. Juozas
887 Graham, Miss. Margaret Edith
888 Johnston, Miss. Catherine Helen "Carrie"
889 Behr, Mr. Karl Howell
890 Dooley, Mr. Patrick
Name: Name, Length: 891, dtype: object
Tambien puedo acceder de esta forma. Lo vereis mucho.
df['Name']
0 Braund, Mr. Owen Harris
1 Cumings, Mrs. John Bradley (Florence Briggs Th...
2 Heikkinen, Miss. Laina
3 Futrelle, Mrs. Jacques Heath (Lily May Peel)
4 Allen, Mr. William Henry
...
886 Montvila, Rev. Juozas
887 Graham, Miss. Margaret Edith
888 Johnston, Miss. Catherine Helen "Carrie"
889 Behr, Mr. Karl Howell
890 Dooley, Mr. Patrick
Name: Name, Length: 891, dtype: object
Si quisiera acceder a más de una columna, debemos empacar los nombres de las columnas desealas en una lista
df[['Name', 'Age']]
Name | Age | |
---|---|---|
0 | Braund, Mr. Owen Harris | 22.0 |
1 | Cumings, Mrs. John Bradley (Florence Briggs Th... | 38.0 |
2 | Heikkinen, Miss. Laina | 26.0 |
3 | Futrelle, Mrs. Jacques Heath (Lily May Peel) | 35.0 |
4 | Allen, Mr. William Henry | 35.0 |
... | ... | ... |
886 | Montvila, Rev. Juozas | 27.0 |
887 | Graham, Miss. Margaret Edith | 19.0 |
888 | Johnston, Miss. Catherine Helen "Carrie" | NaN |
889 | Behr, Mr. Karl Howell | 26.0 |
890 | Dooley, Mr. Patrick | 32.0 |
891 rows × 2 columns
Una vez hayamos seleccionado los datos, podemos realizar operaciones sobre ellos, como sum
, mean
, `max’ entre muchas otras.
Sacando informacion del dataset¶
La columna Survived nos dice si este pasajero sobrevivió al naufragio (valor 1) o por el contrario falleció (valor 0)
df
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 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
886 | 887 | 0 | 2 | Montvila, Rev. Juozas | male | 27.0 | 0 | 0 | 211536 | 13.0000 | NaN | S |
887 | 888 | 1 | 1 | Graham, Miss. Margaret Edith | female | 19.0 | 0 | 0 | 112053 | 30.0000 | B42 | S |
888 | 889 | 0 | 3 | Johnston, Miss. Catherine Helen "Carrie" | female | NaN | 1 | 2 | W./C. 6607 | 23.4500 | NaN | S |
889 | 890 | 1 | 1 | Behr, Mr. Karl Howell | male | 26.0 | 0 | 0 | 111369 | 30.0000 | C148 | C |
890 | 891 | 0 | 3 | Dooley, Mr. Patrick | male | 32.0 | 0 | 0 | 370376 | 7.7500 | NaN | Q |
891 rows × 12 columns
df['Survived'].value_counts()
0 549
1 342
Name: Survived, dtype: int64
De esta forma hemos seleccionado la columna Survived, y le hemos pedido que nos devuelva cuantos valores hay contenidos. Hay valores 0 y 1. Hay 549 filas con valore 0, y 342 con valor 1 . Es decir, sobrevivieron 342 personas, y fallecieron 549.
Para terminar, vamos a ver si la expresión “¡Mujeres y niños primero!” fue una realidad. ¿Sobrevivieron más mujeres que hombres?
Ahora podemos realizar nuestro primer filtro!
df_females = df[ df['Sex'] == 'female']
df_females
PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
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 |
8 | 9 | 1 | 3 | Johnson, Mrs. Oscar W (Elisabeth Vilhelmina Berg) | female | 27.0 | 0 | 2 | 347742 | 11.1333 | NaN | S |
9 | 10 | 1 | 2 | Nasser, Mrs. Nicholas (Adele Achem) | female | 14.0 | 1 | 0 | 237736 | 30.0708 | NaN | C |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
880 | 881 | 1 | 2 | Shelley, Mrs. William (Imanita Parrish Hall) | female | 25.0 | 0 | 1 | 230433 | 26.0000 | NaN | S |
882 | 883 | 0 | 3 | Dahlberg, Miss. Gerda Ulrika | female | 22.0 | 0 | 0 | 7552 | 10.5167 | NaN | S |
885 | 886 | 0 | 3 | Rice, Mrs. William (Margaret Norton) | female | 39.0 | 0 | 5 | 382652 | 29.1250 | NaN | Q |
887 | 888 | 1 | 1 | Graham, Miss. Margaret Edith | female | 19.0 | 0 | 0 | 112053 | 30.0000 | B42 | S |
888 | 889 | 0 | 3 | Johnston, Miss. Catherine Helen "Carrie" | female | NaN | 1 | 2 | W./C. 6607 | 23.4500 | NaN | S |
314 rows × 12 columns
El dataset df_females solo contiene las filas de mujeres.
df_females['Survived'].sum()
233
De las 314 mujeres que tenemos información, 233 sobrevivieron.
Para ver cuantos hombres y mujeres tenemos en el dataset
df['Sex'].value_counts()
male 577
female 314
Name: Sex, dtype: int64
Podemos hacer este proceso en una sola línea, para los hombres
df[ df['Sex'] == 'male']['Survived'].sum()
109
De 577 los hombres que tenemos información, solo 109 sobrevivieron
Un simple calculo nos dirá que el ratio de supervivencia para hombres y mujeres:
rat_men = 107/577
rat_women = 233/314
print(f' Los hombres tenian una prob de {rat_men} de sobrevivir')
print(f'Mientras que la de las mujeres fue de {rat_women}')
Los hombres tenian una prob de 0.1854419410745234 de sobrevivir
Mientras que la de las mujeres fue de 0.7420382165605095
(opcional) Para ampliar conocimientos¶
Incluso podriamos crear una tabla pivote, pero no te preocupes ahora por esto, te lo mostramos para que conozcas las posibilidades
pd.crosstab(index=df['Sex'], columns=df['Survived'])
Survived | 0 | 1 |
---|---|---|
Sex | ||
female | 81 | 233 |
male | 468 | 109 |
import numpy as np
pd.pivot_table(df,index=['Sex','Pclass'], values = 'Survived', aggfunc = 'sum' )
Survived | ||
---|---|---|
Sex | Pclass | |
female | 1 | 91 |
2 | 70 | |
3 | 72 | |
male | 1 | 45 |
2 | 17 | |
3 | 47 |
Incluso desde pandas podemos crear gráficos
import seaborn as sns
g = sns.catplot(data=df, x="Survived", col="Sex", kind="count")
---------------------------------------------------------------------------
ModuleNotFoundError Traceback (most recent call last)
<ipython-input-21-ff8183aa1528> in <module>
----> 1 import seaborn as sns
2 g = sns.catplot(data=df, x="Survived", col="Sex", kind="count")
ModuleNotFoundError: No module named 'seaborn'
Si quieres profundizar más, te recomendamos encarecidamente el tutorial de 10 minutes to pandas