Table of Contents

![altran_logo.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAqoAAAD/CAYAAAA5WfQHAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAEUESURBVHhe7d0HmNzUuT7wz93rtu69YhvbuOJuMNjGEHoxpFGSAAkk/5BCbhJyubm5wM1NLknIpQTSSIBQ08CmNxOKccG44AauGPe+3rW9buvy16s9smUhaTQzOpoz2vf3PPOMNLs7O6PRSK8+nXNU66hFiIiIiIgMU1vdExEREREZhUGViIiIiIzEoEpERERERmJQJSIiIiIjMagSERERkZEYVImIiIjISAyqRERERGQkBlUiIiIiMhKDKhEREREZiUGViIiIiIzEoEpERERERmJQJSIiIiIjMagSERERkZEYVImIiIjISAyqRERERGQkBlUiIiIiMhKDKhEREREZiUGViIiIiIzEoEpERERERmJQJSIiIiIjMagSERERkZEYVImIiIjISAyqRERERGQkBlUiIiIiMhKDKhEREREZiUGViIiIiIxU66hFTafehl37ZNHWXbJ4y27ZtveA7D5wyL7tOlh9v/tAlex2ptV90wZ1pZl1a1q/XvW9M+96rHOzEjmlbVPp36aptGncQP03IiIyQdWRI9Z2f5cssm4ryipP2MZXT1vbfs9jUL29r1e9vcd0fWcfUP0Ytv/92zaTAdb2v2/rpvbfULzmbSqX9RX7Zce+A7Jjb5V1OyDb91Xf2/P7Dh6bLqlXW1o1qi+trVurEuuG+0YNrOl6ahqPN5Ah7ZtxX11EUhlUd1mBExukRVt3H9s4Ld5aIWXWyq0bVn4E1urg2qxoAuyEh99VU/F687qxaip5d7y1VN5avV3NUZJum9BXxndvreai07Uemqh2rVrSsG5taVivjn1fUhf31dO479GikYzq3MIKQc3UX1AUK3bssbb31dv96n1AhSzdvkf9VJ+6tWup0FodXHGPeXyOFM3qnXtl/uZyeX9DucxaVyYz15fJgUNH1E/j1bNlYxnTpaWM6dxShnQolVPbl1pBt476KZkkFUH1g80V8tYn2+VtK5TM21Qhayv2qp+Yo58VVi/v11Eu6dteRnZqoR41R63bpqip+CCoFDqo3v7mUjVHScLnnmtQxXeZjkPVDjvUER1byGBrhzrE2qH2snayJFK+v+rYtn/6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)

Introduccion a pandas. Titanic Dataset

Clicar aquí para abrir el cuaderno en google Colab. Open In 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.

link text

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.

link text

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.

Tip: shape es una propiedad del objeto dataframe, por eso no tiene paréntesis al final. Los métodos en cambio, terminan en (), como veremos a continuación. Pero por ahora no te preocupes de eso.
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.

Tip: Buscar en google "como hacer en pandas tal cosa" será tu mejor aliado en esta etapa de aprendizaje. Si tienes preguntas, no dudes en usar el foro de la plataforma de EducAltran

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