DICOTOMIZACIÓN DE VARIABLES

La dicotomización de una variable consiste en dividir los valores observados en dos grupos que representan dos categorías exhaustivas y mutuamente excluyentes, a menudo en base a un punto de corte.

Esta técnica se utiliza a menudo cuando se desea convertir una variable continua en una variable categórica binaria para su análisis.

DICOTOMIZACIÓN DE VARIABLES

Para ejemplificar en forma simple, supongamos que tenemos un dataset de juguete con información sobre el nombre, la ciudad en la que vive y la edad de una serie de personas:

import pandas as pd

# Generamos los datos "de juguete"
df = pd.DataFrame({
    'Nombre': ['Ana', 'Juan', 'Pedro', 'Maria', 'Luis', 'Elena', 'Florencia', 'Agustín'],
    'Ciudad': ['Rosario', 'Rosario', 'Funes', 'Roldán', 'Funes', 'Funes', 'Roldán' ,'Rosario'],
    'Edad': [14, 22, 18, 35, 16, 20, 38, 25]
})

DICOTOMIZACIÓN DE VARIABLES

# Mostramos el dataset resultante
df
Nombre Ciudad Edad
0 Ana Rosario 14
1 Juan Rosario 22
2 Pedro Funes 18
3 Maria Roldán 35
4 Luis Funes 16
5 Elena Funes 20
6 Florencia Roldán 38
7 Agustín Rosario 25

DICOTOMIZACIÓN DE VARIABLES

Podemos dicotomizar la variable Edad según si la persona alcanzó o no los 18 años de edad:

df['18_cumplidos'] = df['Edad'].apply(lambda x: 'Si' if x >= 18 else 'No')

df.head()
Nombre Ciudad Edad 18_cumplidos
0 Ana Rosario 14 No
1 Juan Rosario 22 Si
2 Pedro Funes 18 Si
3 Maria Roldán 35 Si
4 Luis Funes 16 No

BINNING

En este caso, en lugar de dividir los datos de una variable en dos grupos, la división se realiza en grupos múltiples exhaustivos y mutuamente excluyentes llamados bins o buckets.

BINNING

Por ejemplo, sobre nuestros datos de juguete podríamos definir la variable Grupo_etario para clasificar a las personas según su Edad en: 18 años o menos, 18-30 o Mayores de 30.


Para ello, una opción rápida es utilizar la función cut() de Pandas

# Definimos los puntos de corte y los labels
cortes = [0, 18, 30, 100]
etiquetas = ['18 o menos', '18-30', 'Mayor a 30']

# Creamos la nueva variable
df['Grupo_etario'] = pd.cut(df['Edad'], bins = cortes, labels = etiquetas)

BINNING

df
Nombre Ciudad Edad 18_cumplidos Grupo_etario
0 Ana Rosario 14 No 18 o menos
1 Juan Rosario 22 Si 18-30
2 Pedro Funes 18 Si 18 o menos
3 Maria Roldán 35 Si Mayor a 30
4 Luis Funes 16 No 18 o menos
5 Elena Funes 20 Si 18-30
6 Florencia Roldán 38 Si Mayor a 30
7 Agustín Rosario 25 Si 18-30

BINNING

Importante:

  • Cuando usamos pd.cut(), debemos recordar que si queremos definir n intervalos, necesitamos un total de (n + 1) puntos de corte (bins).

  • Tener en cuenta que, por default, el parámetro right de pd.cut() está seteado en True, por lo que los intervalos se definen de manera automática con el extremo superior cerrado. En el ejemplo anterior, las personas se clasifican en tres grupos etarios correspondientes a los intervalos: (0, 18], (18, 30] y (30, 100] años.

BINNING

Si buscamos un poco más de flexibilidad en la construcción de los intervalos —por ejemplo, clasificar a las personas en los grupos: Menores de 18 años, Entre 18 y 30 (inclusive) o Mayores a 30 años— podemos usar una función lambda para aplicar esta lógica de forma explícita:

# Creamos la nueva variable
df['Grupo_etario_2'] = df['Edad'].apply(
  lambda edad: 'Menor a 18' if edad < 18
  else ('18 a 30' if edad <= 30
  else 'Mayor a 30')
)

BINNING

df.drop(columns = 'Grupo_etario')
Nombre Ciudad Edad 18_cumplidos Grupo_etario_2
0 Ana Rosario 14 No Menor a 18
1 Juan Rosario 22 Si 18 a 30
2 Pedro Funes 18 Si 18 a 30
3 Maria Roldán 35 Si Mayor a 30
4 Luis Funes 16 No Menor a 18
5 Elena Funes 20 Si 18 a 30
6 Florencia Roldán 38 Si Mayor a 30
7 Agustín Rosario 25 Si 18 a 30

CODIFICACIÓN DE VARIABLES CATEGÓRICAS

La mayoría de los algoritmos de aprendizaje automático no pueden manejar variables categóricas a menos que las convirtamos en valores numéricos.

El rendimiento de muchos algoritmos varía en función de cómo se codifican las variables categóricas, por lo que debe analizarse muy bien el método de codificación previo al entrenamiento del modelo.

ONE-HOT ENCODING

En este método, asignamos cada categoría de la variable cualitativa a un vector que contiene 1 y 0, con los que se denota la presencia o ausencia de la característica, respectivamente. El número de vectores generados dependerá del número de categorías o niveles en la variable de interés.

Para aplicarlo, contamos con la función get_dummies() de Pandas.

ONE-HOT ENCODING

Si usamos este método de codificación sobre Ciudad, obtenemos lo siguiente:

df = pd.get_dummies(data = df, prefix = 'Ciudad', columns = ['Ciudad'])

df.head()
Nombre Edad Ciudad_Funes Ciudad_Roldán Ciudad_Rosario
0 Ana 14 False False True
1 Juan 22 False False True
2 Pedro 18 True False False
3 Maria 35 False True False
4 Luis 16 True False False

ONE-HOT ENCODING

dtype = 'int' nos devuelve 0 y 1 en lugar de booleanos.

df = pd.get_dummies(data = df, prefix = 'Ciudad', columns = ['Ciudad'], dtype = int)

df.head()
Nombre Edad Ciudad_Funes Ciudad_Roldán Ciudad_Rosario
0 Ana 14 0 0 1
1 Juan 22 0 0 1
2 Pedro 18 1 0 0
3 Maria 35 0 1 0
4 Luis 16 1 0 0

ONE-HOT ENCODING

Para la Unidad que viene, tener en cuenta que si utilizamos este método de codificación para introducir la información de una variable categórica a un modelo, debemos considerar (N-1) variables dummy como predictoras para representar una variable categórica, ya que de lo contrario caemos en la Dummy Variable Trap.

En esta situación, las variables predictoras se predicen perfectamente unas y otras creando multicolinearidad.

ORDINAL ENCODING

Se trata de una técnica de preprocesamiento utilizada para convertir datos categóricos de variables ordinales en valores numéricos que preservan su orden inherente. De esta manera, presenta dos beneficios:

  • Codifica datos categóricos en datos numéricos que los algoritmos pueden entender.

  • Retiene la información ordinal entre categorías, que se perdería con otros métodos como one-hot encoding.

ORDINAL ENCODING

La codificación ordinal funciona asignando cada valor de categoría único a un número entero diferente. Normalmente, los números enteros comienzan en 0 y aumentan en 1 por cada categoría adicional.

Por ejemplo, una variable de “tamaño” con las categorías [“pequeño”, “mediano”, “grande”] se asignaría a [0, 1, 2]. De esta forma, se mantienen las relaciones ordinales: “pequeño” < “mediano” < “grande”.

ORDINAL ENCODING

Algunas consideraciones importantes:

  • La codificación ordinal supone un orden secuencial significativo entre categorías. No debe usarse para categorías nominales.

  • Los números enteros utilizados deben espaciar uniformemente las categorías. Si se dejan espacios en blanco, algunos modelos pueden inferir incorrectamente cercanía entre categorías.

  • La codificación ordinal funciona bien para variables cualitativas con una pequeña cantidad de niveles diferentes, pero puede resultar engorrosa si existen muchas categorías.

RESUMEN FINAL

Técnica Tipo de variable Ventajas principales Cuándo evitarla
Dicotomización Continua Simplicidad, útil para clasificación binaria Pérdida de información, arbitrariedad del corte
Binning (cut) Continua Agrupación interpretable, reducción de ruido Pérdida de detalle, depende del corte
One-Hot Encoding Categórica nominal No impone orden, funciona bien con modelos lineales Muchas categorías = alta dimensionalidad
Ordinal Encoding Categórica ordinal Preserva orden, simple No usar con categorías sin orden real