<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 Tabla de contenidos
Step1:  Luego se cargan los datos de la competencia
Step2:  Visualización de datos y estudio inicial
En esa sección haremos una visualización de los datos con los que contamos. Primero se hace una tabla que muestra los datos que están almacenados en train, el tipo de datos, cantidad de columnas, cantidad de datos.
Step3:  Como puede observarse hay un total de 12 columnas de las cuales 5 son datos categóricos. De los datos numéricos que se pueden ver en la tabla (de descripción) se puede deducir lo siguiente
Step4:  Como vemos, el dato de Cabin estamos perdiendo aproximadamente el 77%. Me parece que eso no es bueno. En cuanto a edad, tenemos casi el 20% de los datos perdidos, y el 0.22% de datos perdidos de Embarked. 
Visualización
Lo primero es conocer el porcentaje de sobrevivientes que existen en el DataFrame
Step5:  Ahora vamos a estudiar las features del DataFrames, haciendo comparativas de si sobrevivió o no.
Step6:  Analizando los gráficos realizados se pueden sacar algunas conclusiones. Por el lado la edad, se observa que la mayoría de los que iban en el Titanic eran entre 20 y 40 años. De los cuales podemos decir que, mas o menos entre los 20 y 30 la mayoría no sobrevivió. Mientras que entre los 30 y 40 había una pequeña chance mayor de sobrevivir. También se observa que, lo niños entre 0 y 10 años tenían mejor chance de sobrevivir.   
En el siguiente gráfico, se puede notar que las mujeres tenía una mayor chance de sobrevivir. 
Igualmente, se puede observar que las personas que viajaban en primera clase, fueron los que más sobrevivieron. Mientras que si viajabas en tercera clase, no tenías muchas chances de sobrevivir. 
En el tercer gráfico, también se puede observar cosas interesantes. Aquellas personas que viabajan con solos o con 1 o 2 hermanos o pareja (SibSp) tenían más chance de sobrevivir. A diferencia de aquellos que viabajan con 3 o 4 hermanos o parejas, pero tiene un barra de error bastante grande. Es curioso, como las personas que viajaban solos tenían menos chance de sobrevivir que las que tenían 1 o 2 SibSp. Podría darse la situación que estas personas, viajen en su mayoría en tercera clase, de ahí es su baja chance de sobrevivir en comparación a la categoría de 1 o 2 SibSP.
En el cuarto gráfico, podemos observar que aquellas peronsas que viajaban con 1,2 o 3 padres o hijos (Parch), tienen más chances de sobrevivir. Mientras que los que viajaban sin padres o hijos (al igual sin hermanos, es decir solos) tenían menos chances de sobrevivir. Otra cosa a destacar es que tienen bastante error los datos de Parch = 3.
También otra cosa para observar, es que las personas que tienen Embarqued = C tienen más chances de sobrevivir.
Un poco más de estudio de los features
A continuación trabajaremos en la combinación entre los features. Por ejemplo, si el hecho de haber una probabilidad mayor de sobrevivir si eras mujer, se debe a que las mujeres eran jóvenes? o por el hecho de ser mujer? Igualmente sucede con los niños. Otra cosa a investigar es conocer la relación que existe entre las personas que viajaban sin heramano/pareja o hijos/padres, con su clase, o embarque.
Para ver la relación entre las variables podemos llevar a cabo una matriz de correlación de todas las variables numéricas.
Step7:  En primer lugar puede observarse que la diagonal es igual a 1. Esto siempre es así, la correlación de una variable consigo misma, siempre es máxima. 
En este mapa de calor podemos observar que aquellas relacione que tiene un color fuerte, es decir aproximados a -6 y 6, tienen mayor correlación. De esta manera, podemos decir que Pclass y Fare, están altamente correlacionados (negativamente). Esto es esperable ya que a medida que se reduce la PClass aumenta su precio. 
Otras dos variables correlacionadas son Parch y SibSp. 
La edad y la PClass, se encuentran correlacionadas negativamente, esto debería explicar que las mientras más grande de edad las personas, se ubicarían en clases más altas.
PClass y la Variable Survived también presentan una correlación interesante. Esto daría indicios de que a mejor clase más posibilidad de sobrevivir había.
Ahora veremos la relación entre la Variable Sex y Age.
Step8:  Se puede observar que existe una mayor probabilidad de sobrevivir aquellas mujeres entre 20 y 40 años. En cambio para los hombres esto no se cumple. Por otro lado, los niños varones recién nacios y hasta los 10 años aproximadamente tiene más probabilidad de sobrevivir, esto se observa además, con la mujeres mayores de edad. 
Veamos que sucede si hacemos la misma comparación pero con PClass y Survived.
Step9:  De estos gráficos se pueden deducir que existe una mayor proporción de hombres que han muerto pertenecientes a la clase 3 en comparación de aquellos que iban en las otras clases. En cambio, para los sobrevivientes (hombres) existe una relación casi idéntica de sobrevivientes de la clase 1 con los de la clase 3. 
Por otro lado, Se puede observar que para el caso de las mujeres, murieron una proporción baja para la clase 1 y 2 (3 y 9 respectivamente). También se puede obervar que tuvieron un mayor cantidad de sobrevivientes en comparación a la de los hombres. En cuanto a la proporción de sobrevivientes mujeres, se puede obervar que son "casi" idénticas.
Step10:  En estes gráficos podemos observar el rango de edades en las que los hombres y mujeres tuvieron mayores probabilidad de sobrevivir.
Podemos observar lo siguiente, por el lado de los hombres
Step11:  Del gráfico anterior podemos observar que la clase 3 en su mayoría son personas jóvenes, miestras que la clase 1, si bien cubre el mayor rango de edades, la masa se concentra entre los 30 y 50 años de edad. 
Heads or Tails en Pytanic estudia la relación entre Fare y Pclass, que me pareció interesante colocarla aquí.
Step12:  De estos gráficos se puede observar que (y es el análisis realizado por Heads or Tails) dentro de la primera clase hay dos tipos de grupos, los ricos y los super ricos. 
También se puede observar que dentro de cada clase, hay boletos más caros que otros. EL grupo de los más caros, fueron los que tuvieron más chances de sobrevivir. Es decir, que dentro de tu clase, si pagabas más, podías sobrevivir.
Esto se lo puede ver mejor en los siguientes gráficos.
Step13:  Valores perdidos
Veamos nuevamente la info de los datos que tenemos
Step14:  Podemos observar que hay una gran cantidad de valores perdidos de la variable 'Cabin' (77.10% de valores perdidos). No creo que haya mucho para hacer. 
Por otro lado vemos que hay solo 2 valores perdidos de 'Embarked', veamos cuales son;
Step15:  Son dos mujeres, una de 38 años y otra de 62 años. Ninguna con familiares. Lo que haremos es decidir que "Embarked" es mejor para estas mujeres.
Step16:  Aquí, simplemente lo que hice fue comparar las mujeres que se parecen a las dos "perdidas". Viendo la variable 'Fare' de este grupo, observamos que hay 1 sola mujer que pagó 83.1583, mientras que hay 3 mujeres que pagaron 86.5. Siendo este grupo dónde yo voy a poner a la dos mujeres.
Step17:  Veremos quien es al que le falta la variable 'Fare' en el dataframe de Test
Step18:  Lo que haemos será ponerle el promedio de todos los 'Fare' que compartan el mismo Sibsp, Parch, Sex, Embarked, Pclass
Step19:  Feature Engineering
Feature engineering es el proceso de usar el dominio del conocimiento de lo datos para crear nuevos feature para ser utilizados en los algoritmos de aprendizaje. Estas variables son fundamentales en la aplicación de machine learning, pero son difíciles y caros de conseguir. 
Lo que buscaríamos en esta sección sería descubrir cuales son las variables que derivan de las variables ya conocidas, que me puedan ayudar a mejorar la clasificación de sobrevividos/no sobrevividos. Por ejemplo, podríamos crear las variables de mujeres ricas y/u hombres pobres. 
En esta sección utilizaré la estrategia de Heads Or Tails de listar todas las nuevas features engineering al principio, y luego analizarlas. Si surjen nueva features engineering, se las agrega a la lista inicial y se realiza su análisis. De esta manera se puede ser más organizado en el trabajo. Se trabajará con la combinación de datos train y test, para asegurarnos de utilizar todos la información que tenemos y luego separamos los dos dataframes.
Step20:  Niños
Se estudiará la posibilidad de sobrevivir de los niños.
Step21:  De los estudiado podemos obervar que iban muy pocos niños en la clase 1, de los cuales aparentemente sobrevivieron todos. Por el lado de la clase 2 y 3, vemos una mayor cantidad de niños y niña, de los cuales tiene un gran porcentaje de superviviencias. Se puede decir que lo niños de la clase 2 y 3 tenían más chances de sobrevivir. 
Otro dato interesante es que hay "casi" la misma cantidad de niños que niñas. Pero, las niñas tenían una chance mayor (no mucha) de sobrevivir.
Edad conocida
Estudiamos la variable
Step22:  Del primer gráfico se puede concluir que existe una mayor probabilidad de que si alguien sobrevive, se le conozca la edad (un 40%). En contrapartida, si una persona no se le conoce la edad tiene una chance de sobrevivir de unos 30%. 
Del segundo gráfico se puede observar que que si no se conocía la edad es muy probable que seas de la clase 3. Igualmente, por la diferencia en cantidades de personas que iban en las diferentes clases, este estudio puede distorcionar los resultados. 
Del último gráfico se puede observar que había más chances de que si se conocía la edad de alguien sea de un hombre. Pero esto puede estar influenciado por la cantidad de hombres. 
Familia
Otra variable que resulta interesante estudiar es la 'familia'
Step23:  Aquí se puede observar lo que veníamos estudiando anteriormente, existe una mayor probabilidad de sobrevivir si había personas que viajaban con varios familiares. Aquí observarmos que lo ideal es viajar con 1, 2 hasta 3 familiares más. 
Viajantes solitarios
En esta sección estudiaremos los viajantes solitarios.
Step24:  Se puede observar, como vimos anteriormente, que si se viajaba solo tenía menos chances de sobrevivir. Vemos los que viajaron solo sobrevivieron el 30.35%. Mientras que los que no viajaron solos sobrevivieron el 50%.
Step25:  Título
Siguiendo los pasos de heardsortail (si, llegúe a la sección de Modelado y me di cuenta que mis modelos no son tan buenos), vamos vemo que podemos aprender del título de las personas.
El título se encuentra dentro de la variable Name
Step26:  Ahora hay que buscar patrones en los títulos para ello veremos cuales son los diferente títulos y cuantos con ese títulos hay. Además buscaremos un promedio de la edad de ese titulo.
Step27:  Como podemos observar los títulos de Rev. y Dr. lo tienen muy pocas personas, por lo tanto no nos aportaría mucha información. Por otro lado podemos observar que
Step28:  Nos preparamos para el modelado
Lo que haremos aqui será llevar todos los string a enteros, para que de esta manera poder aplicar los modelos. Lo haremos tal como se hace en Pytanic.
Step29:  Modelado
Regresión logística
Step30:  Perceptrón
<ASSISTANT_TASK:>
Python Code:
#%matplotlib inline
import warnings
warnings.filterwarnings("ignore")
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
from scipy import stats
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.linear_model import Perceptron
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import KFold
from sklearn.metrics import confusion_matrix
from sklearn.model_selection import GridSearchCV
Explanation: Tabla de contenidos:
Imports and load datas
Visualización de datos y estudio inicial
Visualización
Un poco más de estudio de los feature
Valores perdidos
Feature Engineering
Nos preparamos para el modelado
Modelado
Imports and load datas
En primer luegar se importa los módulos que se van a utilizar en este estudio. Los principales son los siguiente:
* pandas
* numpy
* sklearn
* matplotlib
* seaborn
Esta lista de imports debería ir creciendo a medida que se van realizando nuevos análisis y tratamiento de los datos.
End of explanation
train = pd.read_csv('train.csv')
test = pd.read_csv('test.csv')
Explanation: Luego se cargan los datos de la competencia
End of explanation
print('Train Dataset info')
train.head(10)
print('La cantidad de columnas en train es: %i y la cantidad de renglones es: %i'\
     %(len(train.columns), len(train.index)))
train.describe()
print(train.info())
Explanation: Visualización de datos y estudio inicial
En esa sección haremos una visualización de los datos con los que contamos. Primero se hace una tabla que muestra los datos que están almacenados en train, el tipo de datos, cantidad de columnas, cantidad de datos.
End of explanation
train.isnull().sum()
Explanation: Como puede observarse hay un total de 12 columnas de las cuales 5 son datos categóricos. De los datos numéricos que se pueden ver en la tabla (de descripción) se puede deducir lo siguiente:
PassengerId: Es el ID. Mucha información de aquí no se puede sacar.
Survived: De estos datos se pueden observar que sobrevivieron aproximadamente 38% de la muestra.
Pclass
Age: Existen 714 datos. Hay 891 - 714 = 177 datos NaN
SibSp
Parch 
Fare: El ticket promedio era de 32.20$(¿?)
En cuanto a los tipos de datos tenemos lo siguiente:
* int64:
    * PassengerID
    * Survived
    * Pclass
    * SibSp
    * Parch
* string:
    * Name
    * Sex
    * Ticket
    * Cabin
    * Embarked
* float64:
    * Age -> Esto debería ser int64
    * Fare
Paso siguiente veremos los datos faltantes:
End of explanation
total = len(train.index)
sobrev = train[train['Survived'] == 1]
nosobrev = train[train['Survived'] == 0]
s = float(len(sobrev))
ns = float(len(nosobrev))
s_percent = s/total*100.0
sobre_color = 'green'
nosobre_color = 'red'
print('Sobrevivió el %.2f porciento. En el DataFrame hay un total de %i sobrevivientes y un\
 total de %i no sobrevivientes' %(s_percent, s, ns))
Explanation: Como vemos, el dato de Cabin estamos perdiendo aproximadamente el 77%. Me parece que eso no es bueno. En cuanto a edad, tenemos casi el 20% de los datos perdidos, y el 0.22% de datos perdidos de Embarked. 
Visualización
Lo primero es conocer el porcentaje de sobrevivientes que existen en el DataFrame
End of explanation
plt.figure()
# Estudio de la edad
sns.distplot(sobrev['Age'].dropna().values, bins=range(0, 100, 1), color=sobre_color, label='Sobrevivio')
sns.distplot(nosobrev['Age'].dropna().values, bins=range(0, 100, 1), color=nosobre_color, axlabel='Age', label='No Sobrevivio')
plt.show()
plt.figure()
# Estudio del sexo
sns.barplot('Sex', 'Survived', data=train, palette='Reds_d')
plt.show()
#Estudio de Pclass
plt.figure()
sns.barplot('Pclass','Survived', data=train)
plt.show()
# SibSp study
plt.figure()
sns.barplot('SibSp', 'Survived', data=train)
plt.show()
# Parch study
plt.figure()
sns.barplot('Parch', 'Survived', data=train)
plt.show()
# Embarked Study
plt.figure()
sns.barplot('Embarked', 'Survived', data=train)
plt.show()
# Fare study
plt.figure()
sns.distplot(sobrev['Fare'].dropna().values, bins=range(0, 513, 1), color=sobre_color, label='Sobrevivio')
sns.distplot(nosobrev['Fare'].dropna().values, bins=range(0, 513, 1), color=nosobre_color, label='No Sobrevivio', axlabel="Fare")
plt.show()
Explanation: Ahora vamos a estudiar las features del DataFrames, haciendo comparativas de si sobrevivió o no.
End of explanation
plt.figure(figsize=(14,12))
cm = sns.heatmap(train.drop('PassengerId', axis=1).corr(), vmax=0.6, square=True, annot=True)
plt.show()
Explanation: Analizando los gráficos realizados se pueden sacar algunas conclusiones. Por el lado la edad, se observa que la mayoría de los que iban en el Titanic eran entre 20 y 40 años. De los cuales podemos decir que, mas o menos entre los 20 y 30 la mayoría no sobrevivió. Mientras que entre los 30 y 40 había una pequeña chance mayor de sobrevivir. También se observa que, lo niños entre 0 y 10 años tenían mejor chance de sobrevivir.   
En el siguiente gráfico, se puede notar que las mujeres tenía una mayor chance de sobrevivir. 
Igualmente, se puede observar que las personas que viajaban en primera clase, fueron los que más sobrevivieron. Mientras que si viajabas en tercera clase, no tenías muchas chances de sobrevivir. 
En el tercer gráfico, también se puede observar cosas interesantes. Aquellas personas que viabajan con solos o con 1 o 2 hermanos o pareja (SibSp) tenían más chance de sobrevivir. A diferencia de aquellos que viabajan con 3 o 4 hermanos o parejas, pero tiene un barra de error bastante grande. Es curioso, como las personas que viajaban solos tenían menos chance de sobrevivir que las que tenían 1 o 2 SibSp. Podría darse la situación que estas personas, viajen en su mayoría en tercera clase, de ahí es su baja chance de sobrevivir en comparación a la categoría de 1 o 2 SibSP.
En el cuarto gráfico, podemos observar que aquellas peronsas que viajaban con 1,2 o 3 padres o hijos (Parch), tienen más chances de sobrevivir. Mientras que los que viajaban sin padres o hijos (al igual sin hermanos, es decir solos) tenían menos chances de sobrevivir. Otra cosa a destacar es que tienen bastante error los datos de Parch = 3.
También otra cosa para observar, es que las personas que tienen Embarqued = C tienen más chances de sobrevivir.
Un poco más de estudio de los features
A continuación trabajaremos en la combinación entre los features. Por ejemplo, si el hecho de haber una probabilidad mayor de sobrevivir si eras mujer, se debe a que las mujeres eran jóvenes? o por el hecho de ser mujer? Igualmente sucede con los niños. Otra cosa a investigar es conocer la relación que existe entre las personas que viajaban sin heramano/pareja o hijos/padres, con su clase, o embarque.
Para ver la relación entre las variables podemos llevar a cabo una matriz de correlación de todas las variables numéricas.
End of explanation
msobre = train[(train['Survived'] == 1) & (train['Sex'] == 'male')]
mNosobre = train[(train['Survived'] == 0) & (train['Sex'] == 'male')]
fsobre = train[(train['Survived'] == 1) & (train['Sex'] == 'female')]
fNosobre = train[(train['Survived'] == 0) & (train['Sex'] == 'female')]
plt.figure(figsize=(18,6))
plt.subplot(121)
sns.distplot(msobre['Age'].dropna().values, bins=range(0, 100, 1), color=sobre_color, label='Sobrevivido')
sns.distplot(mNosobre['Age'].dropna().values, bins=range(0, 100, 1), color=nosobre_color, label='No Sobrevivido', 
             axlabel='Edad hombres')
plt.subplot(122)
sns.distplot(fsobre['Age'].dropna().values, bins=range(0, 100, 1), color=sobre_color, label='Sobrevivido')
sns.distplot(fNosobre['Age'].dropna().values, bins=range(0, 100, 1), color=nosobre_color, label='No Sobrevivido',
            axlabel="Edad Mujeres")
plt.show()
Explanation: En primer lugar puede observarse que la diagonal es igual a 1. Esto siempre es así, la correlación de una variable consigo misma, siempre es máxima. 
En este mapa de calor podemos observar que aquellas relacione que tiene un color fuerte, es decir aproximados a -6 y 6, tienen mayor correlación. De esta manera, podemos decir que Pclass y Fare, están altamente correlacionados (negativamente). Esto es esperable ya que a medida que se reduce la PClass aumenta su precio. 
Otras dos variables correlacionadas son Parch y SibSp. 
La edad y la PClass, se encuentran correlacionadas negativamente, esto debería explicar que las mientras más grande de edad las personas, se ubicarían en clases más altas.
PClass y la Variable Survived también presentan una correlación interesante. Esto daría indicios de que a mejor clase más posibilidad de sobrevivir había.
Ahora veremos la relación entre la Variable Sex y Age.
End of explanation
male = train[(train['Sex'] == 'male')]
female = train[(train['Sex'] == 'female')]
tabMale = pd.crosstab(male['Survived'], male['Pclass'])
print('Hombres - Clase - Sobrevivientes')
print(tabMale)
tabFemale = pd.crosstab(female['Survived'], female['Pclass'])
print('\n\nMujeres - Clase - Sobrevivientes')
print(tabFemale)
plt.figure(figsize=(18,6))
plotMale = tabMale.div(tabMale.sum(1).astype(float), axis=0).plot(kind="bar", stacked=True)
plt.xlabel('Sobreviviente')
plt.ylabel('Porcentaje')
plt.title("Hombres")
plt.show()
plt.figure(figsize=(18,6))
plotFemale = tabFemale.div(tabFemale.sum(1).astype(float), axis=0).plot(kind="bar", stacked=True)
plt.title("Mujeres")
plt.xlabel('Sobreviviente')
plt.ylabel('Porcentaje')
plt.show()
Explanation: Se puede observar que existe una mayor probabilidad de sobrevivir aquellas mujeres entre 20 y 40 años. En cambio para los hombres esto no se cumple. Por otro lado, los niños varones recién nacios y hasta los 10 años aproximadamente tiene más probabilidad de sobrevivir, esto se observa además, con la mujeres mayores de edad. 
Veamos que sucede si hacemos la misma comparación pero con PClass y Survived.
End of explanation
# Class 1 Male
msobreClass1 = train[(train['Survived'] == 1) & (train['Sex'] == 'male') & (train['Pclass'] == 1)]
mnosobreClass1 = train[(train['Survived'] == 0) & (train['Sex'] == 'male') & (train['Pclass'] == 1)]
# Class 2 Male
msobreClass2 = train[(train['Survived'] == 1) & (train['Sex'] == 'male') & (train['Pclass'] == 2)]
mnosobreClass2 = train[(train['Survived'] == 0) & (train['Sex'] == 'male') & (train['Pclass'] == 2)]
# Class 3 Male
msobreClass3 = train[(train['Survived'] == 1) & (train['Sex'] == 'male') & (train['Pclass'] == 3)]
mnosobreClass3 = train[(train['Survived'] == 0) & (train['Sex'] == 'male') & (train['Pclass'] == 3)]
# Class 1 Female
fsobreClass1 = train[(train['Survived'] == 1) & (train['Sex'] == 'female') & (train['Pclass'] == 1)]
fnosobreClass1 = train[(train['Survived'] == 0) & (train['Sex'] == 'female') & (train['Pclass'] == 1)]
# Class 2 Female
fsobreClass2 = train[(train['Survived'] == 1) & (train['Sex'] == 'female') & (train['Pclass'] == 2)]
fnosobreClass2 = train[(train['Survived'] == 0) & (train['Sex'] == 'female') & (train['Pclass'] == 2)]
# Class 3 Female
fsobreClass3 = train[(train['Survived'] == 1) & (train['Sex'] == 'female') & (train['Pclass'] == 3)]
fnosobreClass3 = train[(train['Survived'] == 0) & (train['Sex'] == 'female') & (train['Pclass'] == 3)]
print("Graficos Hombres")
plt.figure(figsize=(16,6))
plt.subplot(131)
sns.distplot(msobreClass1['Age'].dropna().values, bins=range(0,100,1), 
             color=sobre_color, label='Sobreviviente Clase 1')
sns.distplot(mnosobreClass1['Age'].dropna().values, bins=range(0,100,1), 
             color=nosobre_color, label='No sobreviviente Clase 1', axlabel="Edad")
plt.title("Class 1")
plt.subplot(132)
sns.distplot(msobreClass2['Age'].dropna().values, bins=range(0,100,1), 
             color=sobre_color, label='Sobreviviente Clase 2')
sns.distplot(mnosobreClass2['Age'].dropna().values, bins=range(0,100,1), 
             color=nosobre_color, label='No sobreviviente Clase 2', axlabel="Edad")
plt.title("Class 2")
plt.subplot(133)
sns.distplot(msobreClass3['Age'].dropna().values, bins=range(0,100,1), 
             color=sobre_color, label='Sobreviviente Clase 3')
sns.distplot(mnosobreClass3['Age'].dropna().values, bins=range(0,100,1), 
             color=nosobre_color, label='No sobreviviente Clase 3', axlabel="Edad")
plt.title("Class 3")
plt.show()
print("Graficos mujeres")
plt.figure(figsize=(16,6))
plt.subplot(131)
sns.distplot(fsobreClass1['Age'].dropna().values, bins=range(0,100,1), color=sobre_color, label='Sobreviviente Clase 1')
sns.distplot(fnosobreClass1['Age'].dropna().values, bins=range(0,100,1), color=nosobre_color, label='No sobreviviente Clase 1')
plt.title("Class 1")
plt.subplot(132)
sns.distplot(fsobreClass2['Age'].dropna().values, bins=range(0,100,1), color=sobre_color, label='Sobreviviente Clase 2')
sns.distplot(fnosobreClass2['Age'].dropna().values, bins=range(0,100,1), color=nosobre_color, label='No sobreviviente Clase 2')
plt.title("Class 2")
plt.subplot(133)
sns.distplot(fsobreClass3['Age'].dropna().values, bins=range(0,100,1), color=sobre_color, label='Sobreviviente Clase 3')
sns.distplot(fnosobreClass3['Age'].dropna().values, bins=range(0,100,1), color=nosobre_color, label='No sobreviviente Clase 3')
plt.title("Class 3")
plt.show()
Explanation: De estos gráficos se pueden deducir que existe una mayor proporción de hombres que han muerto pertenecientes a la clase 3 en comparación de aquellos que iban en las otras clases. En cambio, para los sobrevivientes (hombres) existe una relación casi idéntica de sobrevivientes de la clase 1 con los de la clase 3. 
Por otro lado, Se puede observar que para el caso de las mujeres, murieron una proporción baja para la clase 1 y 2 (3 y 9 respectivamente). También se puede obervar que tuvieron un mayor cantidad de sobrevivientes en comparación a la de los hombres. En cuanto a la proporción de sobrevivientes mujeres, se puede obervar que son "casi" idénticas.
End of explanation
class1 = train[(train['Pclass'] == 1)]
class2 = train[(train['Pclass'] == 2)]
class3 = train[(train['Pclass'] == 3)]
plt.figure()
ax = sns.distplot(class1['Age'].dropna().values, bins=range(0, 100, 1),
                  label="Class 1")
ax.legend(loc="best")
ax = sns.distplot(class2['Age'].dropna().values, bins=range(0, 100, 1),
                  label='Class 2')
ax.legend(loc="best")
ax = sns.distplot(class3['Age'].dropna().values, bins=range(0, 100, 1),
                  label='Class 3', axlabel='Clases')
ax.legend(loc="best")
plt.show()
Explanation: En estes gráficos podemos observar el rango de edades en las que los hombres y mujeres tuvieron mayores probabilidad de sobrevivir.
Podemos observar lo siguiente, por el lado de los hombres:
* Pclass1 = Tuvieron más chances de vivir los hombres entre los 20 y 40 años.
* Pclass2 = no tuvieron muchas chances de vivir. Se puede observar que los niños sobrevivieron.
* Pclass3 = No tuvieron muchas chances de vivir. Se puede observar que los niños sobrevivieron.
Por el lado de las mujereS:
* Pclass1 = Tuvieron más probabilidades de sobrevivir las mujeres desde aproximádamente desde los 20 años hasta los 50. 
* Pclass2 = Rondando los 20 años tuvieron levemente más chances de sobrevivir.
* Pclass3 = nuevamente rondando los 20 años tuvieron mejores posibilidades.
End of explanation
plt.figure(figsize=(12,10))
# Class 1
plt.subplot(311)
ax1 = sns.distplot(np.log10(sobrev['Fare'][sobrev['Pclass'] == 1].dropna().values+1), 
                 color=sobre_color)
ax1 = sns.distplot(np.log10(nosobrev['Fare'][nosobrev['Pclass'] == 1].dropna().values+1),
                  color=nosobre_color, axlabel='Fare')
ax1.set_xlim(0, np.max(np.log10(train['Fare'].dropna().values)))
ax1.legend(loc="best")
# Class 2
plt.subplot(312)
ax2 = sns.distplot(np.log10(sobrev['Fare'][sobrev['Pclass'] == 2].dropna().values+1), 
                 color=sobre_color)
ax2 = sns.distplot(np.log10(nosobrev['Fare'][nosobrev['Pclass'] == 2].dropna().values+1),
                  color=nosobre_color, axlabel='Fare')
ax2.set_xlim(0, np.max(np.log10(train['Fare'].dropna().values)))
ax2.legend(loc="best")
# Class 3
plt.subplot(313)
ax3 = sns.distplot(np.log10(sobrev['Fare'][sobrev['Pclass'] == 3].dropna().values+1), 
                 color=sobre_color)
ax3 = sns.distplot(np.log10(nosobrev['Fare'][nosobrev['Pclass'] == 3].dropna().values+1),
                  color=nosobre_color, axlabel='Fare')
ax3.set_xlim(0, np.max(np.log10(train['Fare'].dropna().values)))
ax3.legend(loc="best")
# Config Plot
plt.subplots_adjust(top=1, bottom=0.08, left=0.10, right=1, hspace=0.25, wspace=0.35)
plt.show()
Explanation: Del gráfico anterior podemos observar que la clase 3 en su mayoría son personas jóvenes, miestras que la clase 1, si bien cubre el mayor rango de edades, la masa se concentra entre los 30 y 50 años de edad. 
Heads or Tails en Pytanic estudia la relación entre Fare y Pclass, que me pareció interesante colocarla aquí.
End of explanation
plt.figure(figsize=(12,10))
ax = sns.boxplot(x="Pclass", y="Fare", hue="Survived", data=train);
ax.set_yscale('log')
plt.show()
Explanation: De estos gráficos se puede observar que (y es el análisis realizado por Heads or Tails) dentro de la primera clase hay dos tipos de grupos, los ricos y los super ricos. 
También se puede observar que dentro de cada clase, hay boletos más caros que otros. EL grupo de los más caros, fueron los que tuvieron más chances de sobrevivir. Es decir, que dentro de tu clase, si pagabas más, podías sobrevivir.
Esto se lo puede ver mejor en los siguientes gráficos.
End of explanation
print("Train Dataframe")
print(train.info())
print("Test Dataframe")
print(test.info())
Explanation: Valores perdidos
Veamos nuevamente la info de los datos que tenemos:
End of explanation
print(train[train['Embarked'].isnull()])
Explanation: Podemos observar que hay una gran cantidad de valores perdidos de la variable 'Cabin' (77.10% de valores perdidos). No creo que haya mucho para hacer. 
Por otro lado vemos que hay solo 2 valores perdidos de 'Embarked', veamos cuales son;
End of explanation
combine = pd.concat([train, test])
combine.where((combine['Pclass'] < 1.5) &
              (combine['Sex'] == "female") &
              (combine['SibSp'] == 0.0) &
              (combine['Parch'] == 0.0) ).groupby(['Embarked','Pclass','Sex','Parch','SibSp', 'Fare', 'Survived']).size()
Explanation: Son dos mujeres, una de 38 años y otra de 62 años. Ninguna con familiares. Lo que haremos es decidir que "Embarked" es mejor para estas mujeres.
End of explanation
train['Embarked'].iloc[61] = "S"
train['Embarked'].iloc[829] = "S"
Explanation: Aquí, simplemente lo que hice fue comparar las mujeres que se parecen a las dos "perdidas". Viendo la variable 'Fare' de este grupo, observamos que hay 1 sola mujer que pagó 83.1583, mientras que hay 3 mujeres que pagaron 86.5. Siendo este grupo dónde yo voy a poner a la dos mujeres.
End of explanation
print(test[test['Fare'].isnull()])
Explanation: Veremos quien es al que le falta la variable 'Fare' en el dataframe de Test
End of explanation
combine = pd.concat([train, test])
test['Fare'].iloc[152] = combine['Fare'][(combine['Pclass'] == 3) &
                      (combine['Sex'] == "male") &
                      (combine['SibSp'] == 0.0) &
                      (combine['Parch'] == 0.0) &
                      (combine['Embarked'] == "S")].dropna().median()
print("El valor que se agregó fue: " + str(test['Fare'].iloc[152]))
Explanation: Lo que haemos será ponerle el promedio de todos los 'Fare' que compartan el mismo Sibsp, Parch, Sex, Embarked, Pclass
End of explanation
# Defininf combine
combine = pd.concat([train.drop('Survived', 1), test])
survived = train['Survived']
# creating feature eng
combine['Child'] = combine['Age'] <= 12
combine['Age_know'] = combine["Age"].isnull() == False
combine['Family'] = combine['SibSp'] + combine['Parch']
combine['Alone']  =  (combine['SibSp'] + combine['Parch']) == 0
combine['Title'] = combine['Name'].str.split(', ', expand=True)[1].str.split('. ', expand=True)[0]
combine['Young'] = (combine['Age'] <= 30) & (combine['Age'] >= 12)
combine['Old'] = combine['Age'] >= 60
# come back to train and test data
train = combine.iloc[:len(train)]
test = combine.iloc[len(test):]
# add survived again
train['Survived'] = survived
# update sobrev and nosobrev
sobrev = train[train['Survived'] == 1]
nosobrev = train[train['Survived'] == 0]
Explanation: Feature Engineering
Feature engineering es el proceso de usar el dominio del conocimiento de lo datos para crear nuevos feature para ser utilizados en los algoritmos de aprendizaje. Estas variables son fundamentales en la aplicación de machine learning, pero son difíciles y caros de conseguir. 
Lo que buscaríamos en esta sección sería descubrir cuales son las variables que derivan de las variables ya conocidas, que me puedan ayudar a mejorar la clasificación de sobrevividos/no sobrevividos. Por ejemplo, podríamos crear las variables de mujeres ricas y/u hombres pobres. 
En esta sección utilizaré la estrategia de Heads Or Tails de listar todas las nuevas features engineering al principio, y luego analizarlas. Si surjen nueva features engineering, se las agrega a la lista inicial y se realiza su análisis. De esta manera se puede ser más organizado en el trabajo. Se trabajará con la combinación de datos train y test, para asegurarnos de utilizar todos la información que tenemos y luego separamos los dos dataframes.
End of explanation
tab = pd.crosstab(train['Child'], train['Pclass'])
print("\nNiños vs Clases")
print(tab)
tab = pd.crosstab(train['Child'], train['Sex'])
print("\nNiños vs Sexo")
print(tab)
tab = pd.crosstab(train['Child'], train['Survived'])
print("\nNiños vs Sobrevivientes")
print(tab)
plt.figure()
sns.factorplot(x="Sex", y="Survived", hue="Child", col='Pclass',
              data=train, kind='bar')
plt.show()
Explanation: Niños
Se estudiará la posibilidad de sobrevivir de los niños.
End of explanation
tab = pd.crosstab(train['Age_know'], train['Survived'])
print("\nEdad conocida vs Sobrevivientes")
print(tab)
plt.figure()
buff = tab.div(tab.sum(1).astype('float'), axis=0).plot(kind='bar',stacked=True)
plt.xlabel('Edad conocida')
plt.ylabel('Porcentaje')
plt.show()
tab = pd.crosstab(train['Age_know'], train['Pclass'])
print("\nEdad conocida vs Class")
print(tab)
plt.figure()
buff = tab.div(tab.sum(1).astype('float'), axis=0).plot(kind='bar',stacked=True)
plt.xlabel('Edad conocida')
plt.ylabel('Porcentaje')
plt.show()
tab = pd.crosstab(train['Age_know'], train['Sex'])
print("\nEdad conocida vs Sexo")
print(tab)
plt.figure()
buff = tab.div(tab.sum(1).astype('float'), axis=0).plot(kind='bar',stacked=True)
plt.xlabel('Edad conocida')
plt.ylabel('Porcentaje')
plt.show()
Explanation: De los estudiado podemos obervar que iban muy pocos niños en la clase 1, de los cuales aparentemente sobrevivieron todos. Por el lado de la clase 2 y 3, vemos una mayor cantidad de niños y niña, de los cuales tiene un gran porcentaje de superviviencias. Se puede decir que lo niños de la clase 2 y 3 tenían más chances de sobrevivir. 
Otro dato interesante es que hay "casi" la misma cantidad de niños que niñas. Pero, las niñas tenían una chance mayor (no mucha) de sobrevivir.
Edad conocida
Estudiamos la variable: 'Age_know'
End of explanation
tab = pd.crosstab(train['Family'], train['Survived'])
print("\nTamaño de la familia vs Sobrevivientes")
print(tab)
plt.figure(figsize=(18,14))
buff = tab.div(tab.sum(1).astype('float'), axis=0).plot(kind='bar',stacked=True)
plt.xlabel('Cantidad de miembros de la familia')
plt.ylabel('Porcentaje')
plt.show()
Explanation: Del primer gráfico se puede concluir que existe una mayor probabilidad de que si alguien sobrevive, se le conozca la edad (un 40%). En contrapartida, si una persona no se le conoce la edad tiene una chance de sobrevivir de unos 30%. 
Del segundo gráfico se puede observar que que si no se conocía la edad es muy probable que seas de la clase 3. Igualmente, por la diferencia en cantidades de personas que iban en las diferentes clases, este estudio puede distorcionar los resultados. 
Del último gráfico se puede observar que había más chances de que si se conocía la edad de alguien sea de un hombre. Pero esto puede estar influenciado por la cantidad de hombres. 
Familia
Otra variable que resulta interesante estudiar es la 'familia'
End of explanation
tab = pd.crosstab(train['Alone'], train['Survived'])
print("\nViajantes solitarios vs Sobrevivientes")
print(tab)
plt.figure(figsize=(18,14))
buff = tab.div(tab.sum(1).astype('float'), axis=0).plot(kind='bar',stacked=True)
plt.xlabel('Viajantes solitarios')
plt.ylabel('Porcentaje')
plt.show()
Explanation: Aquí se puede observar lo que veníamos estudiando anteriormente, existe una mayor probabilidad de sobrevivir si había personas que viajaban con varios familiares. Aquí observarmos que lo ideal es viajar con 1, 2 hasta 3 familiares más. 
Viajantes solitarios
En esta sección estudiaremos los viajantes solitarios.
End of explanation
stats.binom_test(x=374,n=163+374,p=175/(175.+179.))
Explanation: Se puede observar, como vimos anteriormente, que si se viajaba solo tenía menos chances de sobrevivir. Vemos los que viajaron solo sobrevivieron el 30.35%. Mientras que los que no viajaron solos sobrevivieron el 50%.
End of explanation
train.loc[:,['Name', 'Age']].head(10)
train.loc[:,['Name', 'Age', 'Title']].head(10)
Explanation: Título
Siguiendo los pasos de heardsortail (si, llegúe a la sección de Modelado y me di cuenta que mis modelos no son tan buenos), vamos vemo que podemos aprender del título de las personas.
El título se encuentra dentro de la variable Name:
End of explanation
print(combine['Age'].groupby(combine['Title']).count())
print(combine['Age'].groupby(combine['Title']).mean())
plt.figure(figsize=[12,10])
title = combine[combine['Title'].isin(['Mr', 'Mrs', 'Miss', 'Master', 'Rev', 'Dr'])]
foo = title['Age'].hist(by=title['Title'], bins=np.arange(0,80,1))
plt.show()
print(combine[combine['Title'].isin(["Mrs"])]['Age'].describe())
Explanation: Ahora hay que buscar patrones en los títulos para ello veremos cuales son los diferente títulos y cuantos con ese títulos hay. Además buscaremos un promedio de la edad de ese titulo.
End of explanation
print("Young")
tab =  pd.crosstab(train['Survived'], train['Young'])
print(tab)
sns.barplot('Young', 'Survived', data=train)
plt.show()
print("Old")
tab =  pd.crosstab(train['Survived'], train['Old'])
print(tab)
sns.barplot('Old', 'Survived', data=train)
plt.show()
Explanation: Como podemos observar los títulos de Rev. y Dr. lo tienen muy pocas personas, por lo tanto no nos aportaría mucha información. Por otro lado podemos observar que:
Master: Lo tiene los de menos de 15 años. Y son todos hombres. Los Mr son los mayores de 15 años enm su mayoría. 
Miss: En este caso tenemos que son mujeres, niñas hasta mayores en menor medida. Y por el lado de Mrs se tiene que son mujeres, en un rango un poco más acotado, entre 14 y 76. Se observa que hay una superposición entre los 14 y 30 años.
En nuestro estudio vamos a dividir en Jovenes (Young, para seguir con el utilizado en Pytanic que serán los menores de 25 años y adultos (Old) mayores de 60 años.
End of explanation
combine = pd.concat([train.drop('Survived',1), test])
survived = train['Survived']
combine['Sex'] = combine['Sex'].astype('category')
combine['Sex'].cat.categories = [0,1]
combine['Sex'] = combine['Sex'].astype('int')
combine["Embarked"] = combine["Embarked"].astype("category")
combine["Embarked"].cat.categories = [0,1,2]
combine["Embarked"] = combine["Embarked"].astype("int")
test = combine.iloc[len(test):]
train = combine.iloc[:len(train)]
train['Survived'] = survived
Explanation: Nos preparamos para el modelado
Lo que haremos aqui será llevar todos los string a enteros, para que de esta manera poder aplicar los modelos. Lo haremos tal como se hace en Pytanic.
End of explanation
training, testing = train_test_split(train, test_size=0.2, random_state=0)
cols = ['Sex', 'Pclass', 'Child', 'Alone', 'Family', 'Age_know', 'Young', 'Old']
tcols = np.append(['Survived'], cols)
df = training.loc[:,tcols].dropna()
X = df.loc[:,cols]
y = np.ravel(df.loc[:,['Survived']])
clf_log = LogisticRegression()
clf_log = clf_log.fit(X,y)
score_log = cross_val_score(clf_log, X, y, cv=5).mean()
print(score_log)
Explanation: Modelado
Regresión logística
End of explanation
clf_pctr = Perceptron(
    class_weight='balanced'
    )
clf_pctr = clf_pctr.fit(X,y)
score_pctr = cross_val_score(clf_pctr, X, y, cv=5).mean()
print(score_pctr)
Explanation: Perceptrón
End of explanation
<END_TASK>