-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathlimpieza.qmd
90 lines (60 loc) · 3.09 KB
/
limpieza.qmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
---
title: "Limpieza de datos"
---
- Es la tarea que consume la mayor cantidad de tiempo en el area de ciencia de datos y aprendizaje automático.
- Todos los conjuntos de datos son "sucios" en algún grado, incluso los más cuidadosamente preparados. Es cuestión de encontrar en donde y como.
- La calidad de los datos y su utilidad no necesariamente están correlacionados
```{python}
import pandas as pd
import numpy as np
```
```{python}
df = pd.read_parquet("data/air_quality_uci2.parquet")
```
Con frecuencia, un problema de contenido termina conduciendo a un problema de limpieza, o viceversa. Es buena idea reevaluar el conjunto de datos después de cada transformación.
## Formato de los valores
Podemos ver que algunas columnas que deberían ser numéricas aparecen como `object`. Esto en pandas sucede cuando hay más de un tipo de dato (entero, cadena, float, etc.) dentro de esta columna.
En este caso, origina durante el proceso de carga, debido a que el separador de la parte decimal utiliza una coma `,` en lugar de un punto `.`:
```{python}
df.dtypes
```
Como sabemos que todas las columnas son numéricas, solo tenemos que seleccionar las que son `object`.
```{python}
object_cols = df.select_dtypes(include='object').columns.tolist()
object_cols
```
Después de cambiar el separador de la parte decimal, realizamos una conversión de datos de cadena a float en estas columnas.
```{python}
for col in object_cols:
df[col] = df[col].str.replace(',', '.').astype(float)
df.info()
```
No siempre hace falta modificar los datos de esta forma. En este caso, como el conjunto de datos es relativamente sencillo, también lo podríamos haber solucionado desde la lectura inicial, haciendo:
``` python
df = pd.read_csv('data/AirQualityUCI.csv', sep=';', decimal=',')
```
## Valores faltanes
Como se mencionó anteriormente, en este conjunto de datos los valores faltantes están marcados con el numero `-200`. Posteriormente, será más comodo trabajar con estos valores si se les interpeta como nulos en pandas, para no entorpecer procesos de análisis, visualización, o aprendizaje.
Marquemos los valores faltantes, como `np.nan`:
```{python}
df = df.replace(-200, np.nan)
# df.replace(-200, np.nan, inplace=True)
```
```{python}
df.info()
```
De esta forma, se reconoceran como valores nulos al usar los metodos de pandas.
## Volvamos a revisar el contenido:
```{python}
df.describe()
```
## Manejo de faltantes
Siempre es bueno preguntarse:
- ¿Tiene sentido descartar los faltantes?
- ¿Tiene sentido imputar los faltantes?
En este caso, se podría o no descartar los faltantes. La proporción de faltantes es relativamente baja, pero aún no sabemos cuáles variables serán relevantes para nuestro modelo, o para que se utilizará nuestro modelo.
Dependiendo del caso de uso, y si encontramos patrones consistentes en el conjunto, se podrían sustituir estos valores nulos por valores númericos, siempre y cuando el criterio para esta sustitución sea confiable (y útil para nuestro modelo).
Guardemos otra vez para continuar:
```{python}
df.to_parquet("data/air_quality_uci3.parquet")
```