18

PlatziDataChallenge #1

PlatziDataChallenge Parte 1, las instrucciones y tips las encontrarás en el blog de Platzi cada lunes.

Para resolver este primer reto los pasos son: - Aprobar el Curso de Manipulación y Análisis de Datos con Pandas y Python - Descargar los datos del Titanic desde kaggle.com/c/titanic - Unir los tres CSVs (gender_submission, test y train) - Responder las siguientes preguntas: 1. ¿Cuántas personas iban en el titanic? 2. ¿Cuántos hombres y mujeres sobrevivieron? 3. ¿Cuál fue el top 10 de edad que más sobrevieron y el top 10 de edad que no lo lograron? 4. ¿Cuántos cargos o títulos iban en el barco? Ejemplo: Capitanes, Mrs. Miss, etc. (Acá usarás expresiones regulares) 5. ¿Cuánto es la sumatoria del valor de los tickets en USD (yep en USD)?

Escribe tu comentario
+ 2
Ordenar por:
3
2715Puntos

Para poder analizar nuestros datos primero realize la union de nuestros 3 datasets. Usando merge y concat, luego puse los indices de la columna PassengerId
1.¿Cuántas personas iban en el titanic?
Para poder contestar esta pregunta, como dice personas. Busqué en wikipedia y aproximadamente 2208 personas iban en el titanic (pasajeros y tripulacion). Nuestro dataset es de los pasajeros.
2208 personas, 1309 pasajeros

2 ¿Cuántos hombres y mujeres sobrevivieron?
De nuestro dataset seleccione a las personas que sobrevivieron, y hize el conteo de los valores en la columna Sex.
385 mujeres y 109 hombres

test1.png

3. ¿Cuál fue el top 10 de edad que más sobrevieron y el top 10 de edad que no lo lograron?
Pesajeros que sobrevivieron
Seleccione los pasajeros que sobrevivieron, realize el conteo de valores de la columna Age, seleccione los primeros 10 valores y tenemos el siguiente gráfico:
test2.png
Pesajeros que No sobrevivieron
Similar a la anterior forma solo con la diferencia de con los que no sobrevivieron.
test3.png

4. ¿Cuántos cargos o títulos iban en el barco? Ejemplo: Capitanes, Mrs. Miss, etc. (Acá usarás expresiones regulares)
Seleccione la columna Name, utilizando expresiones lambda y expresiones regulares obtuve el cargo.
Hay 18 cargos
test4.png
5. ¿Cuánto es la sumatoria del valor de los tickets en USD (yep en USD)?
Pensé que haciendo una sumatoria a la columna, esa no sería la respuesta, ya que dice “yep en USD”. Entonces me puse a investigar y encontré que el precio de los tickets vendidos estaban en pounds (lo que es libras esterlinas, la moneda del reino unido).
Entonces para poder realizar la estimación en dólares encontré de que en ese tiempo £ 1 = $ 4.87. También se puede redondear a $ 5. Entonces la sumatoria de los valores de la columna Fare nos da 43550.48, haciendo la conversion a USD que es multiplicando por 4.87 nos da $ 212090.87 esta vendría a ser la respuesta del valor en USD.

Si quisieramos saber cuanto es ese valor en nuestro tiempo en 2020, comparando la inflación con respecto a 1912.
Según esta web tenemos que 1 USD en 1912 es igual a 26.71 USD en 2020.
Monto en USD al 2020 $ 5664947.16

CÓDIGO FUENTE:
Fuentes para la pregunta 5

PD: En el jupyter notebook del repositorio se encuentran las fuentes que consulte para resolver las preguntas.

2
29410Puntos

1. ¿Cuántas personas iban en el titanic? 1,309
2. ¿Cuántos hombres y mujeres sobrevivieron? 385 Mujeres, 109 Hombres
3. ¿Cuál fue el top 10 de edad que más sobrevieron y el top 10 de edad que no lo lograron?
covid.png
4. ¿Cuántos cargos o títulos iban en el barco? Ejemplo: Capitanes, Mrs. Miss, etc. (Acá usarás expresiones regulares)
covid.png
5. ¿Cuánto es la sumatoria del valor de los tickets en USD (yep en USD)? $43550.49 (Creo que esta pregunta tiene truco no podía ser tan fácil)

1
14968Puntos

Creo haberlo hecho.
Para cargar los archivos usé:

gender =pd.read_csv('/content/gender_submission.csv')
test1=pd.read_csv('/content/test.csv')
train=pd.read_csv('/content/train.csv')

Para juntarlos utilicé merge 2 veces

x=gender.merge(test,how='inner')
y=x.merge(train,how='outer')

1. ¿Cuántas personas iban en el titanic?
Usando

y.PassengerId.nunique

tengo que el número de pasajero es de 1309

2. ¿Cuántos hombres y mujeres sobrevivieron?
Para crear un dataframe solamente con losque sobrevivieron

vivos = y.loc[y.Survived==1]

Las mujeres que sobrevivieron estan en el siguiente dataframe

v_mujeres = vivos.loc[vivos.Sex=='female']

y los hombres en

v_hombres=vivos.loc[vivos.Sex=='male']

Analizando las dimensiones de cada dataframe, los hombres que sobrevivieron fueron 109 y las mujeres 385.

3. ¿Cuál fue el top 10 de edad que más sobrevieron y el top 10 de edad que no lo lograron?

Usando numpy y la función map transformo los datos al inmediato inferior para evitar tener edades con decimales

import numpy as np
vivos['Age']=vivos.Age.map(lambda x: np.floor(x))

Luego con grupby se puede contar las personas que sobrevivieron de acuerdo a sus edades.

x1 =vivos.groupby(['Age'])['Survived'].count()
x1=x1.sort_values(ascending=False)
x1.head(10)

El top 10 de edades que sobrevivieron fue de 22, 24, 18, 36, 30, 27, 35, 29, 19 y 45.

Los que no sobrevivieron estan en el dataframe siguiente

muertos=  y.loc[y.Survived==0]

Smodifica la edad como hice antes

muertos.Age=muertos.Age.map(lambda x : np.floor(x))

Se agrega una columna de “unos” para que sea fácil sumar

muertos['ones']=1

Y se usa groupby de la misma forma que se hizo con los que sobrevivieron

x2= muertos.groupby(['Age'])['ones'].count()
x2=x2.sort_values(ascending=False)
x2.head(10)

las edades de las personas que no lo lograron fueron de 21, 24, 25, 28, 30, 18, 22, 26, 32 y 36.

4. ¿Cuántos cargos o títulos iban en el barco? Ejemplo: Capitanes, Mrs. Miss, etc. (Acá usarás expresiones regulares)

La verdad no supe cómo hacer. Pueda que me equivoque pero en el curso de pandas no se vió algo relacionado a esto.
En este link encontré que se puede hacer de esta forma:

Se define una función que encuentra el título de una persona viendo el texto que está entre una coma y un punto en su nombre

defget_title(name):if'.'in name:
        return name.split(',')[1].split('.')[0].strip()
    else:
        return'Unknown'

Luego se aplica la función

titles = sorted(set([x for x in y.Name.map(lambda x: get_title(x))]))
print('Different titles found on the dataset:')print(len(titles), ':', titles)
print()

Se encontraron 18 títulos, los cuales fueron ‘Capt’, ‘Col’, ‘Don’, ‘Dona’, ‘Dr’, ‘Jonkheer’, ‘Lady’, ‘Major’, ‘Master’, ‘Miss’, ‘Mlle’, ‘Mme’, ‘Mr’, ‘Mrs’, ‘Ms’, ‘Rev’, ‘Sir’ y ‘the Countess’.

5. ¿Cuánto es la sumatoria del valor de los tickets en USD (yep en USD)?

Con

y.Fare.sum()

el resultado fue de 43550.4859

1
16425Puntos

Primer reto completado.

Estaré terminando el curso durante el fin de semana.

1
25066Puntos

Reto realizado. Esta es mi solución (instrucciones para Notebook IPython):

import pandas as pd

# Importando datos de una carpeta 'data'

gender_df = pd.read_csv('data/gender_submission.csv')
test_df = pd.read_csv('data/test.csv')
train_df = pd.read_csv('data/train.csv')

# Mezclando datos de los CSV

test_gender_df = pd.merge(test_df, gender_df)
full_df = pd.concat([train_df, test_gender_df]).reset_index(drop = True)

# 1. ¿Cuántas personas iban en el Titanic?

full_df.shape[0]  

# R. 1309 personas

# 2. ¿Cuántos hombres y mujeres sobrevivieron?

full_df[full_df['Survived'] == 1]['Sex'].value_counts()

# R. Sobrevivieron 385 mujeres y 109 hombres

# 3. ¿Cuál es el top 10 de edad de sobrevivientes y top 10 de no sobrevivientes?

list(full_df[full_df['Survived'] == 1]['Age'].dropna().value_counts().sort_values().tail(10).sort_index().index)
list(full_df[full_df['Survived'] == 0]['Age'].dropna().value_counts().sort_values().tail(10).sort_index().index)

# R. El top 10 de edades que sobrevivieron es 18.0, 19.0, 22.0, 24.0, 27.0, 29.0, 30.0, 35.0, 36.0, 45.0

# El top 10 de edades que no sobrevivieron es 18.0, 19.0, 21.0, 22.0, 24.0, 25.0, 26.0, 28.0, 29.0, 30.0

# 4. ¿Cuántos cargos o títulos iban en el barco? (Mr., Miss, Capitán, etc.)

def separate_title(name):
    returnname.split('.')[0].split(', ')[-1]

titles = full_df['Name'].apply(separate_title)

list(titles.unique())
len(titles.unique())

# R. Hay 18 títulos en el dataset: 'Mr', 'Mrs', 'Miss', 'Master', 'Don', 'Rev', 'Dr', 'Mme', 'Ms', 'Major', 'Lady', 'Sir', 'Mlle', 'Col', 'Capt', 'the Countess', 'Jonkheer', 'Dona'5. Sumatoria del valor de los tickets en USD

full_df['Fare'].sum()

# La sumatoria de tickets es de $43550.49 (aproximado)
1
6288Puntos

Reto cumplido. Realmente me dio dificultad la pregunta #4. Pero se logró.

1
51030Puntos

Le comparto mi solucion, vere los aportes de los compañeros y mejorare mi codigo.

1
10299Puntos

Que buena iniciativa!!
Sin embargo en la tercera pregunta de la edad, al ser variable cuantitativa continua, lo mejor seria asignar rangos no?
0-10, 10-20…

1

Hola! primero quiero dejar el Github donde subí todo lo que hice (De momento solo esta el reto, pero sin explicaciones). Github

- Importando librerias, los datos requeridos y haciendo los merge correspondientes:

import pandas as pdimport numpy as np
df_gender = pd.read_csv('gender_submission.csv')
df_train = pd.read_csv('train.csv')
df_test = pd.read_csv('test.csv')

Merge:

# Realizo un merge del df_test y del df_genderdf_1_merge = pd.merge(df_test,df_gender, on = ['PassengerId'], how = 'inner')

# Reorganizo las columnas para mi propia comodidadcols = df_1_merge.columns.tolist()
col = cols[-1:] + cols[:-1]
df_merge = df_1_merge[col]

# Realizo una concatenación del df_train y df_mergedf = pd.concat([df_train, df_merge], ignore_index = True)
df

  1. ¿Cuantas personas iban en el titanic?
numeropasajeros.PNG
  1. ¿Cuantas Mujeres y hombres sobrevivieron?
generopasajerosvivos.PNG
  1. ¿Cuál fue el top 10 de edad que más sobrevivieron y de los que no?

Aquí hay dos formas de hacerlo segun mi perspectiva:

  • Haciendolo directamente
  • Tomar las edades de los niños menores a 1 año como si tuvieran 1 año,

Haciendolo directamente quedaria

top_survived= vivos.groupby(['Age'])['Survived'].count().sort_values(ascending=False).head(10)
top_survived
top10sur_sin1.PNG

Tomando a los menores de 1 año como de 1 año de edad

df.loc[df['Age'] < 1, 'Age'] = 1

vivos_2 = df.loc[df.Survived== 1]

top_survived_r = vivos_2.groupby(['Age'])['Survived'].count().sort_values(ascending=False).head(10)
top_survived_r
top10_con1.PNG

Podemos ver claramente que hay el top cambia con esta inclusión

Top 10 no sobrevivientes:

top_no_s.PNG
  1. Cargos o titulos dentro del barco:

Investigando un poco acerca de como otros participantes habían realizado esta operación (en Kaggle), encontré que la forma más fácil era generar una nueva columna, en la cual separaríamos primero por ‘,’ con el comando split, ya que si vemos la columna “Name” los nombre siguen el siguiente patrón [Nombre, Titulo. Nombre], al separar por la coma no quedamos con el segundo elemento del string y luego usamos split por ‘.’ y nos quedamos con el primer elemento, es decir el Titulo. Con strip generamos una copia de un string y eliminamos lo que se encuentra hacia a izquierda y derecha

#Titulos
df['Title'] = df.Name.apply(lambda name: name.split(',')[1].split('.')[0].strip())
df.groupby(['Title'])['PassengerId'].count().sort_values(ascending=False)
titulos.PNG
  1. Sumatoria de los tickets en USD
sumatoria.PNG