Pular para o conteúdo principal
InicioTutoriaisData Analysis

Entendendo a assimetria e a curtose e como traçá-las

Um guia visual abrangente sobre assimetria/curtose e como elas afetam as distribuições e, por fim, seu projeto de ciência de dados.
24 de abr. de 2024  · 10 min leer

Depois de coletar dados e passar horas limpando-os, você pode finalmente começar a explorar! Esse estágio, geralmente chamado de Análise Exploratória de Dados (EDA), talvez seja a etapa mais importante em um projeto de dados. As percepções obtidas com a EDA afetam tudo no futuro.

Por exemplo, uma das etapas obrigatórias na EDA é verificar as formas das distribuições. A identificação correta da forma influencia muitas decisões posteriores no projeto, tais como

  • Outras etapas de pré-processamento
  • Realizar ou não a detecção e, talvez, a remoção de outliers
  • Etapas de transformação ou dimensionamento de recursos
  • Seleção de recursos
  • Seleção do algoritmo

e assim por diante. Embora existam recursos visuais para realizar a tarefa, você precisa de métricas mais confiáveis para quantificar várias características das distribuições. Duas dessas métricas são a assimetria e a curtose. Você pode usá-las para avaliar a semelhança entre suas distribuições e uma distribuição normal perfeita.

Ao terminar este artigo, você aprenderá em detalhes:

  • O que são a assimetria e a curtose
  • Os tipos de assimetria e curtose
  • O efeito da assimetria e da curtose nos modelos de aprendizado de máquina
  • Cálculo da assimetria e da curtose em Python manualmente e com pacotes de terceiros
  • Visualização de distribuições para verificar as pontuações de assimetria e curtose (seção abrangente e divertida)

Vamos começar!

O que é Skewness?

Vemos a distribuição normal em todos os lugares: medidas do corpo humano, pesos de objetos, pontuações de QI, resultados de testes ou até mesmo na academia:

Uma imagem de uma máquina de pesos em uma academia. Os furos dos pinos no peso formam coletivamente uma forma de distribuição normal devido ao uso excessivo por um longo período.

Fonte

Além de ser a distribuição favorita da natureza, ela é universalmente apreciada por quase todos os algoritmos de aprendizado de máquina. Enquanto alguns querem que ele melhore e estabilize seu desempenho, outros se recusam terminantemente a trabalhar bem com qualquer coisa que não seja uma distribuição normal (estou falando com vocês, modelos lineares).

Portanto, para satisfazer a necessidade de normalidade dos algoritmos, precisamos de uma maneira de medir a semelhança (ou dissemelhança) de nossas próprias distribuições em relação à curva perfeita em forma de sino.

Curva perfeita em forma de sino de uma distribuição normal.

Vamos começar com as caudas. Em uma distribuição normal perfeita, as caudas são iguais em comprimento. No entanto, quando há assimetria entre as caudas, dando a ela uma aparência inclinada e esmagada para um lado, dizemos que ela está inclinada. E você adivinhou, medimos a extensão dessa assimetria com a assimetria.

Diferentes tipos de assimetria nos lados de uma distribuição normal não enviesada.

A categorização e a medição corretas da assimetria fornecem percepções sobre como os valores são distribuídos em torno da média e influenciam as escolhas de técnicas estatísticas e transformações de dados. Por exemplo, as distribuições altamente distorcidas podem se beneficiar de técnicas de normalização ou dimensionamento para que se assemelhem à distribuição normal. Isso ajudaria no desempenho do modelo.

Tipos de assimetria

Há três tipos de assimetria: assimetria positiva, negativa e zero.

Vamos começar com a última. Uma distribuição com skewness zero tem as seguintes características:

  • Distribuição simétrica com valores uniformemente centralizados em torno da média.
  • Não há inclinação, inclinação ou cauda para nenhum dos lados.
  • A média, a mediana e a moda estão todas no ponto central.

Uma distribuição normal (com distorção zero) com média, mediana e moda, todas alinhadas em uma única linha.

Na prática, a média, a mediana e a moda podem não formar uma linha reta sobreposta perfeita. Eles podem estar um pouco distantes um do outro, mas a diferença seria muito pequena para ter importância.

Em uma distribuição com distorção positiva (distorção à direita):

  • A cauda direita da distribuição é mais longa ou mais gorda do que a esquerda.
  • A média é maior que a mediana, e a moda é menor que a média e a mediana.
  • Os valores mais baixos estão agrupados na "colina" da distribuição, enquanto os valores extremos estão na longa cauda direita.
  • Também é conhecida como distribuição enviesada à direita.

Distribuição distorcida à direita com média, mediana e moda anotadas.

Em uma distribuição com distorção negativa (distorção à esquerda):

  • A cauda esquerda da distribuição é mais longa ou mais gorda do que a direita.
  • A média é menor que a mediana, e a moda é maior que a média e a mediana.
  • Os valores mais altos estão agrupados na "colina" da distribuição, enquanto os valores extremos estão na longa cauda esquerda.
  • Ela também é conhecida como distribuição enviesada à esquerda.

Distribuição assimétrica à esquerda com média, mediana e moda anotadas

Para lembrar as diferenças entre a assimetria positiva e negativa, pense da seguinte forma: se quiser aumentar a média de uma distribuição, você deve adicionar valores muito mais altos do que a média à distribuição. Para diminuir a média, você deve fazer o oposto: introduzir valores muito mais baixos do que a média na distribuição. Portanto, se a maioria dos valores extremos for maior que a média, a assimetria será positiva porque eles aumentam a média. Se a maioria dos valores extremos for menor do que a média, a assimetria é negativa porque eles diminuem a média.

Como calcular a assimetria em Python

Há muitas maneiras de calcular a assimetria, mas a mais simples é o segundo coeficiente de assimetria de Pearson, também conhecido como assimetria mediana.

image.png

Vamos implementar a fórmula manualmente em 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

Outra fórmula altamente influenciada pelos trabalhos de Karl Pearson é a fórmula baseada em momentos para aproximar a assimetria. Ele é mais confiável e é dado da seguinte forma:

Outra fórmula para calcular a assimetria usando momentos

Aqui:

  • n representa o número de valores em uma distribuição
  • x_i representa cada ponto de dados

Vamos implementá-lo em Python também:

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

Se você não quiser calcular a assimetria manualmente (como eu), poderá usar os métodos incorporados de pandas ou scipy:

# Pandas version
diamond_prices.skew()
1.618395283383529

# SciPy version
from scipy.stats import skew

skew(diamond_prices)
1.6183502776053016

Embora todas as fórmulas para aproximar a assimetria retornem pontuações diferentes, suas diferenças são muito pequenas para serem significativas ou alterar a categorização da assimetria. Por exemplo, todos os métodos que usamos hoje utilizam fórmulas diferentes, mas os resultados são muito próximos.

Depois de calcular a assimetria, você pode categorizar a extensão da assimetria:

  • (-0,5, 0,5) - baixa ou aproximadamente simétrica.
  • (-1, -0,5) U (0,5, 1) - moderadamente inclinado.
  • Além de -1 e 1 - altamente distorcido.

O que é curtose e seus tipos?

Enquanto a assimetria se concentra na dispersão (caudas) da distribuição normal, a curtose se concentra mais na altura. Ele nos diz o quanto nossa distribuição normal (ou semelhante à normal) é plana ou com picos. O termo, que significa curvo ou arqueado em grego, foi cunhado pela primeira vez, sem surpresa, pelo matemático britânico Karl Pearson (ele passou a vida estudando distribuições de probabilidade).

Curtose alta indica:

  • Pico acentuado no centro da distribuição.
  • Mais valores concentrados em torno da média do que a distribuição normal.
  • Caudas mais pesadas devido a uma maior concentração de valores extremos ou discrepantes nas caudas.
  • Maior probabilidade de eventos extremos.

Por outro lado, a baixa curtose indica:

  • Pico plano.
  • Menos valores concentrados em torno da média, mas ainda assim mais do que a distribuição normal.
  • Caudas mais leves.
  • Menor probabilidade de eventos extremos.

Dependendo do grau, as distribuições têm três tipos de curtose:

  1. Distribuição mesocúrtica (curtose = 3, excesso de curtose = 0): distribuição normal perfeita ou muito próxima disso.
  2. Distribuição leptocúrtica (curtose > 3, excesso de curtose > 0): pico acentuado, caudas pesadas
  3. Distribuição platicúrtica (curtose < 3, excesso de curtose < 0): pico plano, caudas leves

Três tipos diferentes de distribuições: leptocúrtica (alta curtose), mesocúrtica (sem curtose) e platicúrtica (baixa curtose)

Observe que, aqui, a curtose excessiva é definida como curtose - 3, tratando a curtose da distribuição normal como 0. Dessa forma, os escores de curtose são mais interpretáveis.

Como calcular a curtose em Python

Você pode calcular a curtose em Python da mesma forma que a assimetria usando pandas ou SciPy:

from scipy.stats import kurtosis

kurtosis(diamond_prices)
2.177382669056634

O Pandas oferece duas funções para curtose: kurt e kurtosis. O primeiro é exclusivo para Pandas Series, enquanto o outro pode ser usado em 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

Novamente, os números diferem para a distribuição porque o pandas e o SciPy usam fórmulas diferentes.

Se quiser fazer um cálculo manual da curtose, você pode usar a seguinte fórmula:

A fórmula para calcular a curtose usando momentos, influenciada por Karl Pearson

Aqui:

  • n representa o número de observações no conjunto de dados
  • x_i representa cada ponto de dados individual

Implementaremos a fórmula dentro de uma função novamente:

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

E descobrimos que os preços dos diamantes têm uma curtose excessiva de 2,18, o que significa que, se traçarmos a distribuição, ela terá um pico mais acentuado do que uma distribuição normal.

Então, vamos fazer isso!

Visualizando a assimetria e a curtose em Python

Um dos melhores recursos visuais para ver a forma e, portanto, a assimetria e a curtose das distribuições é um gráfico de estimativa de densidade de kernel (KDE). Ele está disponível para uso por meio da Seaborn:

import matplotlib.pyplot as plt

sns.kdeplot(diamond_prices)

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

Um gráfico KDE dos preços dos diamantes

Esse gráfico está de acordo com os números que vimos até este ponto: a distribuição tem uma longa cauda direita, indicando uma assimetria positiva, e tem um pico muito acentuado, que corresponde a uma curtose alta.

O KDE não é o único gráfico a ver a forma. Também podemos usar histogramas:

sns.histplot(diamonds["carat"])

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

Um histograma de quilates de diamantes

A desvantagem dos histogramas é que você mesmo precisa escolher o número de compartimentos (a contagem de barras). Aqui, há muitas barras que criam ruído no visual - não é possível definir claramente a forma. Então, vamos diminuir o número de compartimentos:

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

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

Um histograma com quilates de diamante com menos compartimentos

Agora, a forma está mais bem definida, mas podemos aprimorá-la ainda mais. Ao definir kde=True dentro de histplot, podemos traçar um KDE da distribuição na parte superior das barras:

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

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

Um histograma sobreposto a um gráfico kde de quilates de diamantes

A linha do KDE sobreposta parece irregular, e não a curva suave que nos permite ver a forma geral. O motivo da irregularidade é o fato de a distribuição de quilates ser naturalmente pontiaguda e distante da distribuição normal.

Porém, podemos diminuir a sensibilidade do KDE a essas flutuações ajustando a largura de banda. Isso é feito usando o parâmetro bw_adjust, cujo padrão é 1:

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

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

Um KDE de quilates de diamante com maior ajuste de largura de banda

Essa versão parece muito menos espinhosa do que o gráfico do KDE sobreposto. Para ajustar a largura de banda do KDE ao usar um histograma sobreposto a um KDE, você pode usar o 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");

Um histograma sobreposto a um gráfico do KDE que teve sua largura de banda ajustada.

kde_kws aceita qualquer parâmetro que seja aceitável pela função kdeplot que controla o cálculo do KDE.

Um truque que você pode usar ao plotar KDEs é remover tudo, exceto a linha do KDE. Como o objetivo principal de um KDE é ver a forma da distribuição, outros detalhes do gráfico, como os ticks dos eixos, as espinhas e os rótulos, às vezes são desnecessários:

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));

Um gráfico do KDE com tudo removido, exceto a linha do KDE e o título.

Essa trama é muito mais organizada. Você pode melhorar ainda mais o gráfico adicionando linhas para indicar a posição da média, mediana e 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();

Um gráfico KDE com nada além da linha KDE, o título e a média, mediana e modo anotados.

Esse gráfico confirma o que discutimos na seção sobre tipos de assimetria: em uma distribuição com assimetria positiva, a média é maior que a mediana e a moda é menor que a média e a mediana.

Conclusão

A assimetria e a curtose, muitas vezes negligenciadas na Análise Exploratória de Dados, revelam percepções significativas sobre a natureza das distribuições.

A assimetria indica a inclinação dos dados, seja para a esquerda ou para a direita, revelando sua assimetria (se houver). A inclinação positiva significa uma cauda que se estende para a direita, enquanto a inclinação negativa se inclina na direção oposta.

A curtose tem tudo a ver com picos e caudas. A curtose alta acentua os picos e reduz as caudas, enquanto a curtose baixa espalha os dados, aliviando as caudas.

Se quiser saber mais sobre assimetria e curtose, confira estes excelentes cursos de análise quantitativa ministrados por especialistas do setor no DataCamp:

Temas

Saiba mais! 

Course

Introduction to Portfolio Risk Management in Python

4 hr
23.7K
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 maisRight Arrow
Relacionado

blog

As 10 principais ferramentas de ciência de dados a serem usadas em 2024

As ferramentas essenciais de ciência de dados para iniciantes e profissionais de dados, para que possam ingerir, processar, analisar, visualizar e modelar os dados com eficiência.
Abid Ali Awan's photo

Abid Ali Awan

9 min

blog

A maldição da dimensionalidade no aprendizado de máquina: Desafios, impactos e soluções

Explore a maldição da dimensionalidade na análise de dados e no aprendizado de máquina, incluindo seus desafios, efeitos nos algoritmos e técnicas como PCA, LDA e t-SNE para combatê-la.
Abid Ali Awan's photo

Abid Ali Awan

7 min

blog

Como analisar dados para sua empresa em 5 etapas

Descubra as diferentes etapas para analisar dados e extrair valor deles, bem como os métodos e técnicas envolvidos no processo.
Javier Canales Luna's photo

Javier Canales Luna

14 min

blog

11 técnicas de visualização de dados para cada caso de uso com exemplos

Descubra as análises, técnicas e ferramentas mais populares para dominar a arte do assistente de visualização de dados

tutorial

Introdução ao t-SNE

Aprenda a visualizar dados de alta dimensão em um espaço de baixa dimensão usando uma técnica de redução de dimensionalidade não linear.
Abid Ali Awan's photo

Abid Ali Awan

14 min

tutorial

Entendendo o desvio de dados e o desvio de modelo: Detecção de deriva em Python

Navegue pelos perigos do desvio de modelo e explore nosso guia prático para o monitoramento do desvio de dados.
Moez Ali's photo

Moez Ali

9 min

See MoreSee More