Saltar al contenido principal
InicioTutorialesAnálisis de datos

Comprender la asimetría y la curtosis y cómo trazarlas

Una completa guía visual sobre la asimetría/curtosis y cómo afectan a las distribuciones y, en última instancia, a tu proyecto de ciencia de datos.
27 abr 2024  · 10 min leer

Después de recopilar datos y pasar horas limpiándolos, ¡por fin puedes empezar a explorar! Esta etapa, a menudo denominada Análisis Exploratorio de Datos (EDA), es quizá la más importante de un proyecto de datos. Los conocimientos obtenidos de EDA afectan a todo lo demás.

Por ejemplo, uno de los pasos imprescindibles en EDA es comprobar las formas de las distribuciones. Identificar correctamente la forma influye en muchas decisiones posteriores del proyecto, como:

  • Otros pasos del preprocesamiento
  • Realizar o no la detección de valores atípicos y, tal vez, su eliminación
  • Pasos de transformación o escalado de rasgos
  • Selección de características
  • Selección del algoritmo

y así sucesivamente. Aunque existen visuales para realizar la tarea, necesitas métricas más fiables para cuantificar diversas características de las distribuciones. Dos de estas métricas son la asimetría y la curtosis. Puedes utilizarlas para evaluar el parecido entre tus distribuciones y una distribución normal perfecta.

Al terminar este artículo, aprenderás en detalle:

  • Qué son la asimetría y la curtosis
  • Los tipos de asimetría y curtosis
  • El efecto de la asimetría y la curtosis en los modelos de machine learning
  • Calcular la asimetría y la curtosis en Python manualmente y con paquetes de terceros
  • Visualizar las distribuciones para comprobar las puntuaciones de asimetría y curtosis (sección completa y divertida)

¡Empecemos!

¿Qué es la asimetría?

Vemos la distribución normal en todas partes: medidas del cuerpo humano, pesos de objetos, puntuaciones de CI, resultados de pruebas o incluso en el gimnasio:

Una imagen de una máquina de pesas en el gimnasio. Los agujeros de las pesas forman colectivamente una forma de distribución normal debido al uso excesivo durante mucho tiempo.

Fuente

Además de ser la distribución favorita de la naturaleza, es universalmente amada por casi todos los algoritmos de machine learning. Mientras que algunos quieren que mejore y estabilice su rendimiento, otros se niegan en redondo a trabajar bien con algo que no sea una distribución normal (te hablo a ti, modelos lineales).

Así que, para satisfacer la necesidad de normalidad de los algoritmos, necesitamos una forma de medir lo similares o (disímiles) que son nuestras propias distribuciones en comparación con la curva en forma de campana perfecta.

Curva en forma de campana perfecta de una distribución normal.

Empecemos por las colas. En una distribución normal perfecta, las colas tienen la misma longitud. Pero, cuando hay asimetría entre las colas, dándole un aspecto inclinado y aplastado hacia un lado, decimos que está sesgada. Y lo has adivinado, medimos el grado de esta asimetría con la asimetría.

Diferentes tipos de asimetría en los lados de una distribución normal no asimétrica.

Categorizar y medir correctamente la asimetría permite comprender cómo se distribuyen los valores en torno a la media e influir en la elección de técnicas estadísticas y transformaciones de datos. Por ejemplo, las distribuciones muy sesgadas podrían beneficiarse de técnicas de normalización o escalado para asemejarlas a una distribución normal. Esto ayudaría al rendimiento del modelo.

Tipos de asimetría

Hay tres tipos de asimetría: asimetría positiva, negativa y cero.

Empecemos por la última. Una distribución con asimetría cero tiene las siguientes características:

  • Distribución simétrica con valores centrados uniformemente alrededor de la media.
  • No hay inclinación, inclinación o cola hacia ningún lado.
  • La media, la mediana y la moda están en el punto central.

Una distribución normal (asimétrica cero) con media, mediana y moda alineadas en una sola línea.

En la práctica, la media, la mediana y la moda pueden no formar una línea recta superpuesta perfecta. Podrían estar ligeramente alejados el uno del otro, pero la diferencia sería demasiado pequeña para importar.

En una distribución con asimetría positiva (sesgada a la derecha):

  • La cola derecha de la distribución es más larga o más gorda que la izquierda.
  • La media es mayor que la mediana, y la moda es menor que la media y la mediana.
  • Los valores más bajos se agrupan en la "colina" de la distribución, mientras que los valores extremos están en la larga cola derecha.
  • También se conoce como distribución sesgada a la derecha.

Distribución asimétrica con media, mediana y moda anotadas.

En una distribución con asimetría negativa (sesgada a la izquierda):

  • La cola izquierda de la distribución es más larga o más gorda que la derecha.
  • La media es menor que la mediana, y la moda es mayor que la media y la mediana.
  • Los valores más altos se agrupan en la "colina" de la distribución, mientras que los valores extremos están en la larga cola izquierda.
  • También se conoce como distribución sesgada a la izquierda.

Distribución asimétrica izquierda con media, mediana y moda anotadas

Para recordar las diferencias entre asimetría positiva y negativa, piénsalo así: si quieres aumentar la media de una distribución, debes añadir a la distribución valores mucho más altos que la media. Para bajar la media, debes hacer lo contrario: introducir en la distribución valores mucho más bajos que la media. Por tanto, si la mayoría de los valores extremos es superior a la media, la asimetría será positiva porque aumentan la media. Si la mayoría de los valores extremos es menor que la media, la asimetría es negativa porque disminuyen la media.

Cómo calcular la asimetría en Python

Hay muchas formas de calcular la asimetría, pero la más sencilla es el segundo coeficiente de asimetría de Pearson, también conocido como asimetría media.

image.png

Implementemos la fórmula manualmente en Python:

import numpy as np
import pandas as pd
import seaborn as sns

# Example dataset
diamonds = sns.load_dataset("diamonds")
diamond_prices = diamonds["price"]

mean_price = diamond_prices.mean()
median_price = diamond_prices.median()
std = diamond_prices.std()

skewness = (3 * (mean_price - median_price)) / std

>>> print(
   f"The Pierson's second skewness score of diamond prices distribution is {skewness:.5f}"
)

The Pierson's second skewness score of diamond prices distribution is 1.15189

Otra fórmula muy influida por los trabajos de Karl Pearson es la fórmula basada en momentos para aproximar la asimetría. Es más fiable y se da de la siguiente manera

Otra fórmula para calcular la asimetría utilizando momentos

Toma:

  • n representa el número de valores de una distribución
  • x_i indica cada punto de datos

Implementémoslo también en Python:

def moment_based_skew(distribution):
   n = len(distribution)
   mean = np.mean(distribution)
   std = np.std(distribution)

   # Divide the formula into two parts
   first_part = n / ((n - 1) * (n - 2))
   second_part = np.sum(((distribution - mean) / std) ** 3)

   skewness = first_part * second_part

   return skewness

>>> moment_based_skew(diamond_prices)
1.618440289857168

Si no quieres calcular la asimetría manualmente (como yo), puedes utilizar los métodos integrados de pandas o scipy:

# Pandas version
diamond_prices.skew()
1.618395283383529

# SciPy version
from scipy.stats import skew

skew(diamond_prices)
1.6183502776053016

Aunque todas las fórmulas para aproximar la asimetría devuelven puntuaciones diferentes, sus diferencias son demasiado pequeñas para ser significativas o cambiar la categorización de la asimetría. Por ejemplo, todos los métodos que hemos utilizado hoy aprovechan fórmulas diferentes bajo el capó, pero los resultados son muy parecidos.

Una vez calculada la asimetría, puedes clasificar el grado de asimetría:

  • (-0,5, 0,5) - bajo o aproximadamente simétrico.
  • (-1, -0,5) U (0,5, 1) - moderadamente sesgada.
  • Más allá de -1 y 1 - Muy sesgado.

¿Qué es la curtosis y sus tipos?

Mientras que la asimetría se centra en la dispersión (colas) de la distribución normal, la curtosis se centra más en la altura. Nos dice cómo de puntiaguda o plana es nuestra distribución normal (o similar a la normal). El término, que significa curvo o arqueado en griego, fue acuñado por primera vez, como era de esperar, por el matemático británico Karl Pearson (se pasó la vida estudiando las distribuciones de probabilidad).

Una curtosis elevada indica:

  • Pico agudo en el centro de la distribución.
  • Más valores concentrados en torno a la media que la distribución normal.
  • Colas más pesadas debido a una mayor concentración de valores extremos o atípicos en las colas.
  • Mayor probabilidad de sucesos extremos.

Por otra parte, una curtosis baja indica:

  • Pico plano.
  • Menos valores concentrados en torno a la media, pero aún más que la distribución normal.
  • Colas más ligeras.
  • Menor probabilidad de sucesos extremos.

Según el grado, las distribuciones tienen tres tipos de curtosis:

  1. Distribución mesocúrtica (curtosis = 3, exceso de curtosis = 0): distribución normal perfecta o muy próxima a ella.
  2. Distribución leptocúrtica (curtosis > 3, exceso de curtosis > 0): pico agudo, colas pesadas
  3. Distribución platicúrtica (curtosis < 3, exceso de curtosis < 0): pico plano, colas ligeras

Tres tipos diferentes de distribuciones: leptocúrtica (alta curtosis), mesocúrtica (sin curtosis) y platicúrtica (baja curtosis)

Observa que aquí, el exceso de curtosis se define como curtosis - 3, tratando la curtosis de la distribución normal como 0. De este modo, las puntuaciones de curtosis son más interpretables.

Cómo calcular la curtosis en Python

Puedes calcular la curtosis en Python del mismo modo que la asimetría utilizando pandas o SciPy:

from scipy.stats import kurtosis

kurtosis(diamond_prices)
2.177382669056634

Pandas ofrece dos funciones para la curtosis: kurt y kurtosis. La primera es exclusiva de las Series Pandas, mientras que la otra puedes utilizarla en los DataFrames.

diamond_prices.kurt()
2.17769575924869

# Select numeric features and calculate kurtosis
diamonds.select_dtypes(include="number").kurtosis()
carat     1.256635
depth     5.739415
table     2.801857
price     2.177696
x        -0.618161
y        91.214557
z        47.086619
dtype: float64

De nuevo, los números difieren para la distribución porque pandas y SciPy utilizan fórmulas diferentes.

Si quieres un cálculo manual de la curtosis, puedes utilizar la siguiente fórmula:

La fórmula para calcular la curtosis mediante momentos, influida por Karl Pearson

Toma:

  • n representa el número de observaciones del conjunto de datos
  • x_i denota cada punto de datos individual

Implementaremos de nuevo la fórmula dentro de una función:

def moment_based_kurtosis(distribution):
   n = len(distribution)
   mean = np.mean(distribution)
   std = np.std(distribution)

   kurtosis = (1 / n) * sum(((distribution - mean) / std) ** 4) - 3

   return kurtosis

>>> moment_based_kurtosis(diamond_prices)
2.1773826690576463

Y descubrimos que los precios de los diamantes tienen un exceso de curtosis de 2,18, lo que significa que si trazamos la distribución, tendrá un pico más agudo que una distribución normal.

Así que, ¡hagámoslo!

Visualizar la asimetría y la curtosis en Python

Uno de los mejores medios visuales para ver la forma y, por tanto, la asimetría y la curtosis de las distribuciones es un gráfico de estimación de la densidad del kernel (KDE). Se puede utilizar a través de Seaborn:

import matplotlib.pyplot as plt

sns.kdeplot(diamond_prices)

plt.title("KDE plot of diamond prices")
plt.xlabel("Price ($)")

Un gráfico KDE de los precios de los diamantes

Este gráfico concuerda con las cifras que hemos visto hasta ahora: la distribución tiene una larga cola derecha, lo que indica una asimetría positiva, y tiene un pico muy agudo, que se corresponde con una curtosis elevada.

KDE no es la única parcela que ve la forma. También podemos utilizar histogramas:

sns.histplot(diamonds["carat"])

plt.xlabel("Carat")
plt.title("A histogram of the carat of diamonds")

Un histograma de quilates de diamante

La desventaja de los histogramas es que tienes que elegir tú mismo el número de intervalos (el recuento de barras). Aquí, hay demasiadas barras que crean ruido en la visual: no podemos definir claramente la forma. Por tanto, disminuyamos el número de contenedores:

sns.histplot(diamonds["carat"], bins=25)

plt.xlabel("Carat")
plt.title("A histogram of the carat of diamonds")

Un histograma con quilates de diamante con menos intervalos

Ahora, la forma está más definida, pero podemos mejorarla más. Poniendo kde=True dentro de histplot, podemos trazar una KDE de la distribución encima de las barras:

sns.histplot(diamonds["carat"], bins=25, kde=True)

plt.xlabel("Carat")
plt.title("A histogram of the carat of diamonds")

Un histograma superpuesto a un gráfico kde de quilates de diamante

La línea KDE superpuesta parece irregular, no la curva suave que nos permite ver la forma general. La razón de la irregularidad es que la distribución de quilates es naturalmente irregular y alejada de la distribución normal.

Pero podemos disminuir la sensibilidad de la KDE a estas fluctuaciones ajustando el ancho de banda. Esto se hace utilizando el parámetro bw_adjust, que por defecto es 1:

# Change the bandwidth from 1 to 3
sns.kdeplot(diamonds["carat"], bw_adjust=3, color="red")

plt.title("KDE of diamond carats");

Una KDE de quilates de diamante con mayor ajuste de ancho de banda

Esta versión parece mucho menos puntiaguda que el gráfico KDE superpuesto. Para ajustar el ancho de banda del KDE al utilizar un histograma superpuesto con un KDE, puedes utilizar el parámetro kde_kws:

ax = sns.histplot(
   diamonds["carat"],
   kde=True,
   kde_kws=dict(bw_adjust=3),
   bins=25,
)

plt.title("An overlaid histogram of diamond carats");

Un histograma superpuesto a un gráfico KDE al que se le ha ajustado el ancho de banda.

kde_kws acepta cualquier parámetro que sea aceptable por kdeplot función que controla el cálculo KDE.

Un truco que puedes utilizar al trazar KDEs es eliminar todo excepto la línea KDE. Dado que el objetivo principal de una KDE es ver la forma de la distribución, a veces son innecesarios otros detalles del gráfico, como las marcas de los ejes, las espinas y las etiquetas:

sns.kdeplot(diamond_prices, color="red")

# Remove the spine from three sides
sns.despine(top=True, right=True, left=True)

# Remove the ticks and ticklabels
plt.xticks([])
plt.yticks([])
plt.ylabel("")
plt.xlabel("")

# Set a title
plt.title("Diamond prices", fontdict=dict(fontsize=20));

Un gráfico KDE con todo eliminado, excepto la línea KDE y el título.

Esta parcela está mucho más ordenada. Puedes mejorar aún más el gráfico añadiendo líneas que indiquen la posición de la media, la mediana y la moda:

sns.kdeplot(diamond_prices, color="red")

sns.despine(top=True, right=True, left=True)
plt.xticks([])
plt.yticks([])
plt.ylabel("")
plt.xlabel("")
plt.title("Diamond prices", fontdict=dict(fontsize=20))

# Find the mean, median, mode
mean_price = diamonds["price"].mean()
median_price = diamonds["price"].median()
mode_price = diamonds["price"].mode().squeeze()

# Add vertical lines at the position of mean, median, mode
plt.axvline(mean_price, label="Mean")
plt.axvline(median_price, color="black", label="Median")
plt.axvline(mode_price, color="green", label="Mode")

plt.legend();

Un gráfico KDE con nada más que la línea KDE, el título y la media, mediana y moda anotadas.

Este gráfico verifica lo que comentamos en la sección de tipos de asimetría: en una distribución sesgada positivamente, la media es mayor que la mediana, y la moda es menor que la media y la mediana.

Conclusión

La asimetría y la curtosis, que a menudo se pasan por alto en el Análisis Exploratorio de Datos, revelan importantes conocimientos sobre la naturaleza de las distribuciones.

La asimetría indica la inclinación de los datos, si se inclinan a la izquierda o a la derecha, revelando su asimetría (si la hay). La inclinación positiva significa una cola que se estira hacia la derecha, mientras que la inclinación negativa se desvía en la dirección opuesta.

La curtosis tiene que ver con picos y colas. Una curtosis alta agudiza los picos y lastra las colas, mientras que una curtosis baja dispersa los datos, aligerando las colas.

Si quieres aprender más sobre la asimetría y la curtosis, puedes consultar estos excelentes cursos de análisis cuantitativo impartidos por expertos del sector en DataCamp:

Temas

Más información 

Course

Introduction to Portfolio Risk Management in Python

4 hr
23.6K
Evaluate portfolio risk and returns, construct market-cap weighted equity portfolios and learn how to forecast and hedge market risk via scenario generation.
See DetailsRight Arrow
Start Course
Ver másRight Arrow
Relacionado

blog

11 técnicas de visualización de datos para cada caso de uso con ejemplos

Descubra los análisis, técnicas y herramientas más populares para dominar el arte de la visualización de datos.

blog

La maldición de la dimensionalidad en el aprendizaje automático: Retos, repercusiones y soluciones

Explore la maldición de la dimensionalidad en el análisis de datos y el aprendizaje automático, incluidos sus retos, efectos en los algoritmos y técnicas como PCA, LDA y t-SNE para combatirla.
Abid Ali Awan's photo

Abid Ali Awan

7 min

blog

ROI de la Ciencia de Datos: Cómo calcularlo y maximizarlo

Esta completa guía te enseña a calcular y maximizar el ROI de la Ciencia de Datos. Descubre estrategias para medir el éxito e impulsar el valor empresarial.
Vinita Silaparasetty's photo

Vinita Silaparasetty

25 min

blog

Cómo crear un currículum de analista de datos

En este artículo, hablaremos de cómo crear un currículum de analista de datos que consiga que te contraten.
Matt Crabtree's photo

Matt Crabtree

7 min

tutorial

Tutorial de tablas de contingencia en R

En este tutorial, aprenderás a crear tablas de contingencia y a probar y cuantificar las relaciones visibles en ellas.
Łukasz Deryło's photo

Łukasz Deryło

10 min

tutorial

Introducción al t-SNE

Aprende a visualizar datos de alta dimensión en un espacio de baja dimensión utilizando una técnica de reducción no lineal de la dimensionalidad.
Abid Ali Awan's photo

Abid Ali Awan

14 min

See MoreSee More