PlatziDataChallenge #1

Pregunta de la clase:
Jose Antonio Padron Fernandez

Jose Antonio Padron Fernandez

EstudiantePregunta

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 - 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)?

20 respuestas
    Gabriel Salvador

    Gabriel Salvador

    Estudiante

    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

    def get_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

    Angello Villanueva Menichetti

    Angello Villanueva Menichetti

    Estudiante

    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 pd import 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_gender df_1_merge = pd.merge(df_test,df_gender, on = ['PassengerId'], how = 'inner') # Reorganizo las columnas para mi propia comodidad cols = 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_merge df = 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

    Julián Andrés Santos Méndez

    Julián Andrés Santos Méndez

    Estudiante

    Hola a todos.

    Mi implementación está acá: PlatziDataChallenge #1 Julian Santos

    Juan Camilo Alvarez Jurado

    Juan Camilo Alvarez Jurado

    Estudiante

    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): return name.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)
    Emmanuel Guerra Sánchez

    Emmanuel Guerra Sánchez

    Estudiante

    Primer reto completado.

    Estaré terminando el curso durante el fin de semana.

    Mayra Carolina Morataya Guerra

    Mayra Carolina Morataya Guerra

    Estudiante

    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)

    Guillermo Sanchez

    Guillermo Sanchez

    Estudiante

    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.....