Curso de introducción a la programación con Python¶

    Autor: Luis Fernando Apáez Álvarez
    -Curso PyM-
    Práctica 7: Librería Pandas
    Fecha: 03 de Septiembre del 2022
    Solución


Descripción: En esta práctica realizaremos un pequeño análisis de datos utilizando la librería Pandas, lo cual nos permitirá poner en práctica los principales conceptos abordados en clase, así como ver algunas cosas adicionales. La base de datos con la que trabajaremos es referente a cierta información sobre los pasajeros del titanic.

(Tiempo estimado: 25 minutos)

Comenzaremos por cargar la base de datos:

In [19]:
# Importamos la libreria Pandas
import pandas as pd

# Cargamos los datos externos en un dataframe

df = pd.read_csv('https://cursopypagina.github.io/CursoPy/titanic.csv')

# Con el metodo head() vemos las primeras 5 filas de nuestro dataframe
df.head()
Out[19]:
survived pclass age sibsp parch fare male age_was_missing embarked_from_cherbourg embarked_from_queenstown embarked_from_southampton
0 0 3 22.0 1 0 7.2500 1 False 0 0 1
1 1 1 38.0 1 0 71.2833 0 False 1 0 0
2 1 3 26.0 0 0 7.9250 0 False 0 0 1
3 1 1 35.0 1 0 53.1000 0 False 0 0 1
4 0 3 35.0 0 0 8.0500 1 False 0 0 1

Notemos que tenemos varias columnas que almacenan datos numéricos, de tal manera sería buena idea utilizar el método describe() para ver algunas estadísticas sobre nuestros datos.

In [2]:
df.describe()
Out[2]:
survived pclass age sibsp parch fare male embarked_from_cherbourg embarked_from_queenstown embarked_from_southampton
count 891.000000 891.000000 891.000000 891.000000 891.000000 891.000000 891.000000 891.000000 891.000000 891.000000
mean 0.383838 2.308642 29.699118 0.523008 0.381594 32.204208 0.647587 0.188552 0.086420 0.722783
std 0.486592 0.836071 13.002015 1.102743 0.806057 49.693429 0.477990 0.391372 0.281141 0.447876
min 0.000000 1.000000 0.420000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
25% 0.000000 2.000000 22.000000 0.000000 0.000000 7.910400 0.000000 0.000000 0.000000 0.000000
50% 0.000000 3.000000 29.699118 0.000000 0.000000 14.454200 1.000000 0.000000 0.000000 1.000000
75% 1.000000 3.000000 35.000000 1.000000 0.000000 31.000000 1.000000 0.000000 0.000000 1.000000
max 1.000000 3.000000 80.000000 8.000000 6.000000 512.329200 1.000000 1.000000 1.000000 1.000000

Notamos que en total hay 891 filas, esto es, la base de datos almacena información sobre 891 pasajeros del titanic; el promedio de edad de dicha cantidad de pasajeros es de 29.7 años; la edad mínima de los 891 pasajeros fue de 0.41 (es decir, un bebé) y la edad mayor fue de 80 años.

En la columna male, si tenemos un valor 1 significa que la persona es del sexo masculino y si tenemos 0 significa que la persona es del sexo femenino. Dado que el promedio que obtuvimos en la salida anterior es de 0.64, entonces podemos asegurar que hubo más hombres que mujeres.

Lo que haremos después será centrarnos en la columna male. Para ello crearemos un dataframe que almacena la información pero sólo de dicha columna:

In [7]:
# Extraemos la informacionde de la columna male
df_male = pd.DataFrame( df['male'] )
df_male
Out[7]:
male
0 1
1 0
2 0
3 0
4 1
... ...
886 1
887 0
888 0
889 1
890 1

891 rows × 1 columns

Veamos cuántos hombres y cuántas mujeres fueron en total de entre esos 891 pasajeros. Para ello, del dataframe df_male, aislaremos la información únicamente para cuando tenemos el valor de 1

In [10]:
# Primero veamos el nombre de las columnas
# de nuestro dataframe
df_male.columns
Out[10]:
Index(['male'], dtype='object')
In [11]:
# Despues, seleccionemos solo los valores de dicha
# columna donde el valor sea igual a 1
df_male.male == 1
Out[11]:
0       True
1      False
2      False
3      False
4       True
       ...  
886     True
887    False
888    False
889     True
890     True
Name: male, Length: 891, dtype: bool

En el resultado anterior vemos que las entradas ahora son booleanas, donde el valor de True es colocado si el valor de dicha entrada en el dataframe df_male es igual a 1, y se coloca False si el valor de la entrada en df_male si no es igual a 1. De tal manera, todas las entradas que tienen asignado el valor de True son hombres y las que tienen asociadas el valor de False son mujeres. Prácticamente podemos decir que lo anterior es muy similar a las máscaras booleanas que ocupabamos en NumPy, de tal manera:

In [13]:
df_male[df_male.male == 1]
Out[13]:
male
0 1
4 1
5 1
6 1
7 1
... ...
883 1
884 1
886 1
889 1
890 1

577 rows × 1 columns

nos arroja un dataframe sólo con la información de las entradas que tienen asignado el valor de 1, es decir, nos arroja la información únicamente de los hombres. De manera totalmente análoga, el siguiente código nos dejará sólo con la información de las mujeres

In [14]:
df_male[df_male.male == 0]
Out[14]:
male
1 0
2 0
3 0
8 0
9 0
... ...
880 0
882 0
885 0
887 0
888 0

314 rows × 1 columns

Podemos concluir entonces que en total hay 577 hombres, pues el dataframe que vimos en la celda de código antepasada nos arrojó que dicho dataframe tiene 577 filas; análogamente, hay en total 314 mujeres.

Por otro lado, gracias a lo que aprendimos antes nos podemos preguntar la edad promedio pero sólo de las mujeres, o la edad promedio pero sólo de los hombre. Para ello:

In [20]:
# Del dataframe original solo nos quedamos que la informacion
# de las mujeres
df_mujer = df[df['male'] == 0]
df_mujer
Out[20]:
survived pclass age sibsp parch fare male age_was_missing embarked_from_cherbourg embarked_from_queenstown embarked_from_southampton
1 1 1 38.000000 1 0 71.2833 0 False 1 0 0
2 1 3 26.000000 0 0 7.9250 0 False 0 0 1
3 1 1 35.000000 1 0 53.1000 0 False 0 0 1
8 1 3 27.000000 0 2 11.1333 0 False 0 0 1
9 1 2 14.000000 1 0 30.0708 0 False 1 0 0
... ... ... ... ... ... ... ... ... ... ... ...
880 1 2 25.000000 0 1 26.0000 0 False 0 0 1
882 0 3 22.000000 0 0 10.5167 0 False 0 0 1
885 0 3 39.000000 0 5 29.1250 0 False 0 1 0
887 1 1 19.000000 0 0 30.0000 0 False 0 0 1
888 0 3 29.699118 1 2 23.4500 0 True 0 0 1

314 rows × 11 columns

Dentro de Pandas tenemos el método mean() que podemos utilizar para hallar el promedio de columnas de datos. Por ejemplo, de la columna age de nuestro dataframe df_mujer, podemos obtener el promedio escribiendo

In [22]:
# Filtramos para solo considerar la columna edad
# y obtenemos el promedio
df_mujer['age'].mean()
Out[22]:
28.21673004870738

De tal manera, en promedio, la edad de las mujeres era de 28.2 años. De manera análoga podemos obtener la edad promedio de los hombres.

In [25]:
# Lo haremos de una manera mas directa
# Consideramos   | del dataframe 
# solo el caso   | anterior, filtramos
# en que male ==2| solo para la
#                | columna age y sacamos el promedio
df[df['male']==1]['age'].mean()
Out[25]:
30.505824243042102