Limpieza de datos con Python
Tags: datacleaning, datascience, python, tutorial
Published: 2020-04-27 05:58:34

# Primer paso: Exploración
En el momento de encontrarnos cara a cara con un dataset lo primero que hay que hacer es reconocer con que nos estamos enfrentando.
Para esto utilizaremos la función `.head()` de `pandas`, de esta manera entenderemos los tipos de información que contiene cada columna.
```python
import pandas as pd
f = pd.read_csv(file)
f.head()
```
Esta sentencia solo nos devuelve una muestra del dataset, pero para obtener datos rapidos de lo que hay dentro se puede utilizar el metodo `describe`.
```python
f.describe()
```
Si se lo escribe sin parametros, `describe` solo mostrará datos relevantes para columnas que contengan números. Ya que devolverá un cuadro en el que se observan la siguiente información:
* `count`: cantidad de valores que contiene la columna.
* `mean`: valor promedio.
* `std`: desviación estandar.
* `min`: valor mínimo.
* `25%`: primer cuartil.
* `50%`: segundo cuartil.
* `75%`: tercer cuartil.
* `max`: valor máximo.
* `dtype`: tipo de valores que contiene la columna.

Para obtener datos de columnas que contienen valores de otro tipo (por ejemplo `strings`), debemos agregar un parametro para que tome en cuenta a todo el dataset y no solo a los valores numéricos.
```python
f.describe(include = 'all')
```
Y de esta manera, el cuadro incluira tres nuevas categorias, presentadas a continuación:
* `unique`: cantidad de valores únicos.
* `top`: valor único con más repeticiones.
* `freq`: cantidad de veces que aparece el valor más repetido.

# Segundo paso: Tipos de datos

Para tener un dataset ordenado primero debemos confirmar que los tipos de datos de cada columna estan bien posicionados.
En primer lugar, obtenemos los tipos de datos de cada columna de la siguiente manera:
```python
f.dtypes()
```
Esto retornará el nombre de cada columna junto con el tipo de dato que contiene, en caso de que este errado, debemos sustituir el dato equivocado por el que es cierto. En caso de que corresponda `float`, seria asi:
```python
f[['column_name']] = f[['column_name']].astype(float)
```

# Tercer paso: Tratar con los datos perdidos

Luego de tener nuestro primer contacto con el set de datos, lo siguiente es averiguar si está completo o tiene datos perdidos, para poder tomar cartas en el asunto:
```python
missing_data = f.isnull()
for column in missing_data.columns.values.tolist():
    print(column)
    print(missing_data[column].value_counts())
    print('')
```
> En caso de que haya datos perdidos del mismo tipo que variable que debemos predecir, es muy recomendable eliminar la fila entera para que no de problemas en los modelos a desarrollar.

Esto se hace reemplazando los valores perdidos por `np.nan` (not a number), cortesía de la librería Numpy:
```python
import numpy as np
f.replace("?", np.nan, inplace = True)
f.dropna(subset=['column_name'], axis = 0, inplace= True)
f.reset_index(drop = True, inplace = True)
```
Tambien hay que reemplazar a los datos perdidos que seran útiles al momento de desarrollar nuestro modelo. Para esto hay que averiguar qué tipo de dato es y como tratarlo:
* Strings: la mejor práctica es reemplazar el dato perdido por el que se repite con más frecuencia.
* Integers: en este caso, el dato perdido debe reemplazarse por el promedio de su misma columna.

### Primer caso: Strings perdidos

Cuando el dato a reemplazar es del tipo `string`, primero hay que averiguar cual es el que se repite con más frecuencia dentro de la misma columna:
```python
f.describe(include=[np.object])
```
Esta linea imprimirá un recuadro en el cual solo se toman en cuenta las columnas de tipo `object` donde se observa los siguientes apartados: `count`, `unique`, `top` y `freq`. De esta forma, el string que aparezca en el apartado `top` sera el que se repita una mayor cantidad de veces y por el cual debemos reemplazar todos los `Nan` de su categoria.
```python
f['column_name'].replace(np.nan, 'Top string', inplace = True)
```

### Segundo caso: Integers perdidos

En el caso de los `integer` que faltan primero hay que identificar promedio de la columna para que este dato perdido no modifique los resultados de los entrenamientos y las pruebas del modelo.
El promedio se obtiene de la siguiente manera:
```python
average_column_name = f['column_name'].astype(float).mean(axis = 0)
```
Y luego se reemplaza los datos perdidos con este promedio:
```python
f['column_name'].replace(np.nan, average_column_name, inplace = True)
```

# Conclusion
Es todo por hoy.

---

**Nota:** estoy aprendiendo sobre data science y este es un tutorial que realicé para reforzar mi conocimiento. Por esa razón puede haber errores o no es tan completo como debería. Espero puedas entender y que este articulo sirva de algo. Gracias por leer.