Ciencia de datos

Seleccionar el número de bins en un histograma

Emplear la cantidad adecuada de bins a la hora de crear un histograma es un factor clave para visualizar estos de forma correcta. Cuando se usan demasiados bins, los histogramas resultantes muestran básicamente ruido, mientras el caso contrario, menos de los necesarios, puede ocultar los patrones que se desean observar en la gráfica. Problema que se ha explicado en detalle en una entrada anterior. En esta ocasión se van a explicar una serie de reglas que se pueden utilizar para seleccionar el número de bins en un histograma, alternativas a los de las reglas de Sturges y de Freedman–Diaconis.

La regla de la raíz cuadrada

Posiblemente una de las reglas para seleccionar el número de bins en un histograma más fáciles de implementar es la de la raíz cuadrada. La cual se basa en la idea intuitiva de distribuir los datos en una cantidad de bins proporcional al número de observaciones. Usando para ello la raíz cuadrada como una forma simple de obtener un valor aproximado de bins k_{sqrt} = \sqrt{n}, donde n es el número de observaciones en el conjunto de datos

La regla de Rice

Otra regla que únicamente usa el tamaño de los datos para estimar el número de bins es la regla de Rice. Esta regla usa dos veces la raíz cúbica del número de observaciones k_{rice} = \sqrt[3]{n}. Este método generalmente sobreestima el bins necesarios, por lo que puede ser una buena opción cuando no se desea terminar con un cantidad insuficiente de bins.

La regla de Scott

A diferencia de las reglas anteriores, la regla de Scott también tiene en cuenta la variabilidad de los datos para estimar el número de bins. Usando para ello un enfoque diferente. En lugar de calcular el número de bins, calcular el ancho óptimo como 3,49 veces la desviación estándar partido de la raíz cúbica del número de registros en los datos h_{scott} = \frac{3.49 \sigma(x)}{\sqrt[3]{n}}. Una vez obtenido el ancho es fácil calcular el número de bins necesarios.

Los resultados son similares a los obtenidos mediante la regla de Freedman-Diaconis. Aunque, es más sensible a la presencia de valores atípicos ya que la desviación estándar no es tan robusta cuando en el conjunto de datos existen registros de este tipo.

La regla de Doane

Finalmente, la regla de Doane es una modificación de la regla de Sturges en la que se intenta mejorar el rendimiento para datos que no son normales. Usando para ello el sesgo (skewness) de los datos. La fórmula usada por la regla de Doane es k_{doane} = 1 + \log2\left | n \right | + \log2\left | 1 + \frac{s}{\sigma_s} \right |, donde s es el sesgo y \sigma_s se define como \sigma_s = \sqrt{\frac{6 (n - 2)}{(n+1)(n+3)}}.

Implementación de las reglas en Python

Las reglas anteriores se pueden implementar fácilmente en Python, tal como se hace en el siguiente ejemplo.

import math
import numpy as np
from scipy.stats import skew


def square_root_bins(datos):
    """
    Calcula el número de bins para un histograma utilizando la regla de la raíz cuadrada.

    Parámetros:
    -----------
    datos : list, array-like
        Los datos de los cuales se desea calcular el número de bins.

    Retorna:
    --------
    numero_bins : int
        El número de bins calculado según la regla de la raíz cuadrada.
    """

    n = len(datos)
    numero_bins = math.ceil(math.sqrt(n))
    return numero_bins


def rice_bins(datos):
    """
    Calcula el número de bins para un histograma utilizando la regla de Rice.

    La regla de Rice elige un número de bins usando la raíz cubica del número de observaciones.

    Parámetros:
    -----------
    datos : array-like
        Los datos de los cuales se desea calcular el número de bins.

    Retorna:
    --------
    numero_bins : int
        El número de bins calculado según la regla de Rice.
    """

    n = len(datos)
    numero_bins = int(np.ceil(np.power(n, 1/3) * 2))
    return numero_bins


def scott_bins(datos):
    """
    Calcula el número de bins para un histograma utilizando la regla de Scott.

    La regla de Scott estima el ancho óptimo de los bins basándose en el error estándar de la muestra y el tamaño total de la muestra.

    Parámetros:
    -----------
    datos : array-like
        Los datos de los cuales se desea calcular el número de bins.

    Retorna:
    --------
    numero_bins : int
        El número de bins calculado según la regla de Scott.
    """

    datos = np.asarray(datos)
    n = len(datos)
    std = np.std(datos)
    if std == 0:
        return 1
    ancho_optimo = 3.49 * std / np.power(n, 1/3)
    numero_bins = int(np.ceil((np.max(datos) - np.min(datos)) / ancho_optimo))
    return numero_bins


def doane_bins(datos):
    """
    Calcula el número de bins para un histograma utilizando la regla de Doane.

    La regla de Doane ajusta el número de bins para tener en cuenta el sesgo (skewness) de la distribución de los datos.

    Parámetros:
    -----------
    datos : array-like
        Los datos de los cuales se desea calcular el número de bins.

    Retorna:
    --------
    numero_bins : int
        El número de bins calculado según la regla de Doane.
    """

    datos = np.asarray(datos)
    n = len(datos)
    skewness = skew(datos)
    se_skewness = np.sqrt((6 * (n - 2)) / ((n + 1) * (n + 3)))

    numero_bins = 1 + math.log2(n) + math.log2(1 + (abs(skewness) / se_skewness))
    return int(numero_bins)

Conclusiones

Hoy se han visto cuatro reglas alternativas que se pueden usar para seleccionar el número de bins en un histograma que complementan a la de Sturges y de Freedman–Diaconis.

¿Te ha parecido de utilidad el contenido?

Daniel Rodríguez

Share
Published by
Daniel Rodríguez
Tags: Matplotlib

Recent Posts

De la Regresión Logística al Scorecard: La Transformación Matemática

En un entrada previa explicamos qué son el WOE y el IV y por qué…

1 día ago

Analytics Lane lanza la versión 1.1 del laboratorio con nuevas suites de CLV y Scoring

Seguimos evolucionando el laboratorio de Analytics Lane y hoy lanzamos la versión 1.1, disponible en:…

2 días ago

Interés compuesto: la fuerza que multiplica tu dinero (y los errores que la anulan)

“El interés compuesto es la octava maravilla del mundo. El que lo entiende lo gana…

6 días ago

Cómo comparar datos con barras en Matplotlib: agrupadas, apiladas y porcentuales

Tienes los datos de ventas de tres productos en dos años distintos y quieres saber…

1 semana ago

Costes hundidos en ciencia de datos: cuándo mantener un modelo y cuándo migrar

Imagina la situación. Tu equipo lleva tres años con un modelo en producción. No es…

2 semanas ago

WOE e IV: La Base Matemática del Credit Scoring

Cuando un banco evalúa una solicitud de crédito necesita responder a una pregunta aparentemente simple:…

2 semanas ago

This website uses cookies.