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

  2. Visualizar que datos son los que faltan

  3. Ver los filas de los datos faltantes y la matriz de correlación

  4. Reemplazar los valores nulos de la columna mpg

  5. (Opcional) Reemplazar los valores nulos de mpg utilizando funciones programadas por mí

  6. Reemplazar los valores nulos de la columna caballos_potencia

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)