# -*- coding: utf-8 -*-
"""limpieza_datos_titanic_sesion_1_machine_learning_plantilla.ipynb

Automatically generated by Colab.

Original file is located at
    https://colab.research.google.com/drive/1MlN8BMKBurm15kR4F9S4OUW1BNxLuPCa

# Sesión 1 – Limpieza y tratamiento de datos
## Dataset: Titanic

### Objetivo de la sesión

En esta sesión se busca que el estudiante reconozca los principales problemas de calidad de datos y comprenda por qué el tratamiento de datos es un paso fundamental antes de entrenar cualquier modelo de machine learning.

Durante la práctica se trabajarán los siguientes aspectos:
- Valores perdidos (numéricos y categóricos)
- Valores especiales
- Datos irrelevantes o redundantes
- Errores conceptuales (clases duplicadas o mal representadas)
- Valores atípicos
- Importancia de la limpieza de datos en el desempeño de modelos de machine learning

### Carga del dataset

Trabajaremos con el dataset Titanic en un solo archivo, lo que representa un escenario más cercano a un proyecto real de machine learning, donde primero se reciben los datos completos y luego se procesan.

Usaremos el dataset presente en:
"https://raw.githubusercontent.com/mwaskom/seaborn-data/master/titanic.csv"
"""

import pandas as pd

url = "https://raw.githubusercontent.com/mwaskom/seaborn-data/master/titanic.csv"
df = pd.read_csv(url)

df.head()

"""### Exploración inicial del dataset

Antes de limpiar los datos, es fundamental explorar el dataset para entender:
- Qué variables existen
- Qué tipo de datos contiene cada columna
- Si hay valores faltantes

"""

df.info()

df.describe(include="all")

"""### Identificación de valores perdidos

Los valores perdidos son uno de los problemas más comunes en los datasets reales.
Un modelo de machine learning no puede trabajar directamente con valores nulos, por lo que deben ser tratados.

En este paso identificaremos valores faltantes tanto en variables numéricas como categóricas.

"""

df.isnull().sum()

"""### Tratamiento de valores faltantes numéricos

La variable `age` es numérica y contiene valores faltantes.
Una estrategia común es reemplazar estos valores por la media o la mediana.

En este caso se utilizará la mediana, ya que es menos sensible a valores extremos.

"""

df['age'].fillna(df['age'].median(), inplace=True)

"""### Tratamiento de valores faltantes categóricos

Las variables categóricas requieren un tratamiento diferente a las numéricas.

- Si una variable tiene pocos valores faltantes, se puede imputar con la moda.
- Si una variable tiene demasiados valores faltantes, puede ser más conveniente eliminarla.

En este dataset:
- `embarked` se imputará con la moda.
- `deck` será eliminada debido a la gran cantidad de valores faltantes.

"""

df['embarked'].fillna(df['embarked'].mode()[0], inplace=True)
df.drop(columns=['deck'], inplace=True)

"""### Datos irrelevantes o redundantes

No todas las variables aportan información útil para el modelo.
Algunas columnas contienen información duplicada o redundante.

Ejemplos:
- `alive` duplica la información de `survived`
- `class` duplica `pclass`
- `embark_town` duplica `embarked`

Estas variables serán eliminadas.

"""

df.drop(columns=['alive', 'class', 'embark_town'], inplace=True)

"""### Variables derivadas y consideraciones conceptuales

Algunas variables del dataset han sido creadas a partir de otras, como:
- `adult_male`
- `who`
- `alone`

Estas variables pueden introducir redundancia o fuga de información.
Para esta sesión introductoria, se eliminarán para simplificar el análisis.

"""

df.drop(columns=['adult_male', 'who', 'alone'], inplace=True)

"""### Valores atípicos (outliers)

Los valores atípicos pueden afectar el desempeño de muchos algoritmos de machine learning.
En la variable `fare` se observan valores extremadamente altos.

En este punto se analiza su distribución y se discuten posibles tratamientos.

"""

df['fare'].describe()

df.boxplot(column='fare')

"""### Revisión final del dataset

Después del proceso de limpieza, se revisa nuevamente el dataset para verificar:
- Que no existan valores faltantes
- Que las variables sean coherentes
- Que los datos estén listos para el modelado

"""

df.info()

df.isnull().sum()

"""### Conclusión de la sesión

El tratamiento de datos no es un paso opcional en machine learning.
La calidad del modelo depende directamente de la calidad de los datos utilizados.

Un modelo aprende exactamente a partir de los datos que recibe.
Datos con errores, valores faltantes o ruido generan modelos poco confiables.

"""