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:
# 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()
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.
df.describe()
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:
# Extraemos la informacionde de la columna male
df_male = pd.DataFrame( df['male'] )
df_male
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
# Primero veamos el nombre de las columnas
# de nuestro dataframe
df_male.columns
Index(['male'], dtype='object')
# Despues, seleccionemos solo los valores de dicha
# columna donde el valor sea igual a 1
df_male.male == 1
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:
df_male[df_male.male == 1]
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
df_male[df_male.male == 0]
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:
# Del dataframe original solo nos quedamos que la informacion
# de las mujeres
df_mujer = df[df['male'] == 0]
df_mujer
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
# Filtramos para solo considerar la columna edad
# y obtenemos el promedio
df_mujer['age'].mean()
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.
# 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()
30.505824243042102