Binning de características numéricas

Prep

Binning de características numéricas

Creado: Última actualización: Tiempo de lectura: 2 min

El binning (discretización) convierte un rasgo continuo en categorías ordenadas. Es útil cuando un modelo no acepta valores reales o cuando queremos crear variables como "徠uintil de ingreso"・

Ancho fijo vs. frecuencia igual #

Sea (x_1, \dots, x_n) un rasgo numérico. Una regla de binning divide el rango en intervalos (I_k) y sustituye cada (x_i) por la etiqueta del intervalo donde cae.

  • Bins de ancho fijo (pandas.cut) utilizan intervalos de igual longitud.
  • Bins de frecuencia igual (pandas.qcut) dividen los datos ordenados para que cada intervalo contenga aproximadamente el mismo número de observaciones.

Los bins de frecuencia igual son más estables ante colas largas, mientras que los de ancho fijo conservan información sobre la distancia.

Visualizando bins de cuantiles #

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

rng = np.random.default_rng(18)
income = rng.lognormal(mean=10, sigma=0.55, size=1_000)
quantile_edges = np.quantile(income, np.linspace(0, 1, 6))

plt.hist(income, bins=40, color="steelblue", alpha=0.85)
for edge in quantile_edges[1:-1]:
    plt.axvline(edge, color="darkorange", linestyle="--", alpha=0.8)
plt.title("Contornos de bins por cuantiles (5 bins)")
plt.xlabel("Ingreso")
plt.ylabel("Cantidad")
plt.show()

Visualizando bins de cuantiles (figura)

Comparando qcut y cut #

quantile_bins = pd.qcut(income, q=5)
width_bins = pd.cut(income, bins=5)

quantile_counts = pd.Series(quantile_bins).value_counts(sort=False)
width_counts = pd.Series(width_bins).value_counts(sort=False)
indices = np.arange(len(quantile_counts))

fig, ax = plt.subplots(figsize=(7, 4))
ax.bar(indices - 0.2, quantile_counts.values, width=0.4, color="seagreen", alpha=0.8, label="qcut (misma frecuencia)")
ax.bar(indices + 0.2, width_counts.values, width=0.4, color="firebrick", alpha=0.6, label="cut (ancho fijo)")
ax.set_xticks(indices)
ax.set_xticklabels([f"Bin {i}" for i in indices])
ax.set_ylabel("Número de muestras")
ax.legend()
ax.set_title("Distribución de observaciones por bin")
plt.tight_layout()
plt.show()

Comparando qcut y cut (figura)

Con qcut cada bin recibe prácticamente el mismo número de observaciones. En cambio, con cut los datos se concentran en las zonas densas, dejando a los extremos con muy pocos registros.

Consejos #

  • Recorta outliers extremos antes de aplicar bins de ancho fijo; un solo valor puede expandir el rango y dejar bins vacíos.
  • Guarda los puntos de corte generados durante el entrenamiento y reutilízalos en producción para mantener definiciones consistentes.
  • En modelos basados en árboles el binning suele ser innecesario, pero en modelos lineales permite capturar efectos no lineales sin agregar demasiadas variables.