Ejercicio Feature Engineering
Contenido
Ejercicio Feature Engineering¶
Reemplace todos los valores nulos o vacíos del archivo csv pertinente¶
Este ejercicio consiste en cargar un archivo csv que tiene valores nulos en más de una columna. Es requerido reemplazar los valores nulos por el mejor valor posible.
1. Importar las librerias y cargar el archivo csv¶
import os
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import math
autos = pd.read_csv(os.path.join('./csv/', 'datos_automoviles.csv'))
---------------------------------------------------------------------------
ModuleNotFoundError Traceback (most recent call last)
Input In [1], in <module>
2 import pandas as pd
3 import numpy as np
----> 4 import matplotlib.pyplot as plt
5 import seaborn as sns
6 import math
ModuleNotFoundError: No module named 'matplotlib'
2. Visualizar que datos son los que faltan¶
autos.describe(include='all')
nombre | cilindros | peso | anio | territorio | aceleracion | mpg | caballos_potencia | desplazamiento | |
---|---|---|---|---|---|---|---|---|---|
count | 406 | 406.000000 | 406.000000 | 406.000000 | 406 | 406.000000 | 398.000000 | 400.000000 | 406.000000 |
unique | 312 | NaN | NaN | NaN | 3 | NaN | NaN | NaN | NaN |
top | Ford Pinto | NaN | NaN | NaN | USA | NaN | NaN | NaN | NaN |
freq | 6 | NaN | NaN | NaN | 254 | NaN | NaN | NaN | NaN |
mean | NaN | 5.475369 | 2979.413793 | 1975.921182 | NaN | 15.519704 | 23.514573 | 105.082500 | 194.779557 |
std | NaN | 1.712160 | 847.004328 | 3.748737 | NaN | 2.803359 | 7.815984 | 38.768779 | 104.922458 |
min | NaN | 3.000000 | 1613.000000 | 1970.000000 | NaN | 8.000000 | 9.000000 | 46.000000 | 68.000000 |
25% | NaN | 4.000000 | 2226.500000 | 1973.000000 | NaN | 13.700000 | 17.500000 | 75.750000 | 105.000000 |
50% | NaN | 4.000000 | 2822.500000 | 1976.000000 | NaN | 15.500000 | 23.000000 | 95.000000 | 151.000000 |
75% | NaN | 8.000000 | 3618.250000 | 1979.000000 | NaN | 17.175000 | 29.000000 | 130.000000 | 302.000000 |
max | NaN | 8.000000 | 5140.000000 | 1982.000000 | NaN | 24.800000 | 46.600000 | 230.000000 | 455.000000 |
3. Ver los filas de los datos faltantes y la matriz de correlación¶
autos.loc[autos['mpg'].isnull()]
nombre | cilindros | peso | anio | territorio | aceleracion | mpg | caballos_potencia | desplazamiento | |
---|---|---|---|---|---|---|---|---|---|
10 | Citroen Ds-21 Pallas | 4 | 3090 | 1970 | Europe | 17.5 | NaN | 115.0 | 133.0 |
11 | Chevrolet Chevelle Concours (Sw) | 8 | 4142 | 1970 | USA | 11.5 | NaN | 165.0 | 350.0 |
12 | Ford Torino (Sw) | 8 | 4034 | 1970 | USA | 11.0 | NaN | 153.0 | 351.0 |
13 | Plymouth Satellite (Sw) | 8 | 4166 | 1970 | USA | 10.5 | NaN | 175.0 | 383.0 |
14 | Amc Rebel Sst (Sw) | 8 | 3850 | 1970 | USA | 11.0 | NaN | 175.0 | 360.0 |
17 | Ford Mustang Boss 302 | 8 | 3353 | 1970 | USA | 8.0 | NaN | 140.0 | 302.0 |
39 | Volkswagen Super Beetle 117 | 4 | 1978 | 1971 | Europe | 20.0 | NaN | 48.0 | 97.0 |
367 | Saab 900S | 4 | 2800 | 1981 | Europe | 15.4 | NaN | 110.0 | 121.0 |
autos.loc[autos['caballos_potencia'].isnull()]
nombre | cilindros | peso | anio | territorio | aceleracion | mpg | caballos_potencia | desplazamiento | |
---|---|---|---|---|---|---|---|---|---|
38 | Ford Pinto | 4 | 2046 | 1971 | USA | 19.0 | 25.0 | NaN | 98.0 |
133 | Ford Maverick | 6 | 2875 | 1974 | USA | 17.0 | 21.0 | NaN | 200.0 |
337 | Renault Lecar Deluxe | 4 | 1835 | 1980 | Europe | 17.3 | 40.9 | NaN | 85.0 |
343 | Ford Mustang Cobra | 4 | 2905 | 1980 | USA | 14.3 | 23.6 | NaN | 140.0 |
361 | Renault 18I | 4 | 2320 | 1981 | Europe | 15.8 | 34.5 | NaN | 100.0 |
382 | Amc Concord Dl | 4 | 3035 | 1982 | USA | 20.5 | 23.0 | NaN | 151.0 |
Se quiere saber que variable(columna) tiene la mejor correlación con la variable que tiene valores nulos en este caso, la variable que tiene la mejor correlación con mpg es peso.
Pero, como peso puede adqurir múltiples valores es mejor utilizar a la variable cilindros, porque cilindros sólo puede adqurir pocos valores, por tanto, el valor de la mediana será más preciso.
autos.corr()
cilindros | peso | anio | aceleracion | mpg | caballos_potencia | desplazamiento | |
---|---|---|---|---|---|---|---|
cilindros | 1.000000 | 0.895220 | -0.360762 | -0.522452 | -0.775396 | 0.844158 | 0.951787 |
peso | 0.895220 | 1.000000 | -0.315389 | -0.430086 | -0.831741 | 0.866586 | 0.932475 |
anio | -0.360762 | -0.315389 | 1.000000 | 0.301992 | 0.579267 | -0.424419 | -0.381714 |
aceleracion | -0.522452 | -0.430086 | 0.301992 | 1.000000 | 0.420289 | -0.697124 | -0.557984 |
mpg | -0.775396 | -0.831741 | 0.579267 | 0.420289 | 1.000000 | -0.778427 | -0.804203 |
caballos_potencia | 0.844158 | 0.866586 | -0.424419 | -0.697124 | -0.778427 | 1.000000 | 0.898326 |
desplazamiento | 0.951787 | 0.932475 | -0.381714 | -0.557984 | -0.804203 | 0.898326 | 1.000000 |
4. Reemplazar los valores nulos de la columna mpg¶
cilindros_agrupacion = autos.groupby('cilindros')
# Esto crea una serie del mismo tamaño del DataFrame que contiene el valor de la mediana de las mpg con respecto
# a los cilindros.
mediana_mpg_por_cilindro = cilindros_agrupacion['mpg'].transform('median')
# Reemplazar los valores nulos de mpg con la mediana obteniad anteriormente
autos['mpg'].fillna(mediana_mpg_por_cilindro, inplace=True)
5. (Opcional) Reemplazar los valores nulos de mpg utilizando funciones programadas por mí¶
cilindros_agrupacion = autos.groupby('cilindros')
# Crear una serie que tenga como índices los cilindros y como valor la mediana de las mpg seǵun los cilindros
mediana_mpg_segun_cilindros = cilindros_agrupacion['mpg'].median()
# Funcion que recibe una fila y si tiene la columna mpg como nan le pone el valor de la mediana de las mpg
# según el cilindro
def poner_mediana_en_mpg_nulos(fila):
if math.isnan(fila['mpg']):
fila['mpg'] = mediana_mpg_segun_cilindros[fila['cilindros']]
return fila
# Aplicar a cada fila del data frame la funcion definida arriba
autos_con_mpg = autos.apply(poner_mediana_en_mpg_nulos, axis=1)
# La misma funcion pero utilizando cálculo lambda
#autos_con_mpg = autos.apply(lambda x: mediana_mpg_segun_cilindros[x['cilindros']] if math.isnan(x['mpg']) else x, axis=1)
6. Reemplazar los valores nulos de la columna caballos_potencia¶
# El procedimiento es el mismo que el de reemplazar los valores nulos de mpg
mediana_caballos_potencia_segun_cilindros = cilindros_agrupacion['caballos_potencia'].transform('median')
autos['caballos_potencia'].fillna(mediana_caballos_potencia_segun_cilindros, inplace=True)