Testes de Normalidade usando Python

Conheça algumas técnicas estatísticas e visuais para verificar a normalidade dos seus dados utilizando a linguagem Python.

Thales Ferraz
6 min readFeb 7, 2023

--

Introdução

Muitos testes estatísticos tem a premissa que a distribuição dos dados segue uma normal (também conhecida como gaussiana). Ou seja, os resultados estatísticos que você obtiver destes testes consideram — de antemão — que a sua variável segue uma distribuição normal.

Alguns destes testes estatísticos são a regressão, correlação de Pearson, o teste t e a ANOVA. Até mesmo para a construção de intervalos de confiança é importante saber como está a normalidade dos seus dados.

Quando temos uma grande quantidade de registros (mais que 30), algumas vezes podemos utilizar o teorema do limite central e aplicar testes paramétricos.

Mas de maneira geral, como podemos saber se nossa variável segue uma distribuição normal?

Para todos os exemplos citados, vamos considerar nível de significância de 5%, ou seja, α = 0.05 (5%). Além disso, também será considerado que os testes são bicaudais.

Dois Métodos Principais

Podemos observar a normalidade dos dados de duas formas: de maneira visual e através de testes estatísticos.

Métodos Visuais

Estes métodos são utilizados para verificar de forma rápida a normalidade dos dados. Evidentemente, este tipo de representação não garante que a distribuição seja normal, porém facilita a interpretação e apresentação dos dados em artigos ou trabalhos.

  • Histogramas

O histograma é uma forma de visualizar a frequência de uma variável. Este gráfico nos ajuda a observar a existência do “formato de sino”(que é característico de uma normal), a presença de outliers ou verificar a descontinuidade dos dados.

Representação de um histograma

Para criar um histograma em Python, podemos utilizar diretamente o plot do Pandas:

  • QQ plot

Este gráfico também é conhecido como Quantile-Quantile plot. Ele serve para verificar se os dados seguem uma distribuição específica. No eixo vertical (y) colocamos as posições reais de nossos dados, já no eixo horizontal (x) são colocadas as posições esperadas (valores teóricos) caso os dados seguissem a distribuição escolhida.

Se as distribuições são semelhantes, então os pontos deverão cair em cima da linha vermelha (diagonal). Caso contrário, eles estarão bem afastados como mostra na segunda imagem abaixo.

O interessante desta ferramenta é que podemos não só comparar os dados com a normal, mas também com outras distribuições. Basta mudar o modo como calculamos o eixo horizontal.

De forma geral, análises da normalidade baseadas nos QQ plots são as mais confiáveis para amostras com mais de 5.000 unidades (Miot, 2017).

Para criar os quantile-quantile plot em Python, podemos utilizar o seguinte código:

Perceba que aqui devemos importar o pacote statsmodels.api. Ele utiliza por padrão a distribuição normal.

Testes Estatísticos para verificar a normalidade dos dados

Testes de normalidade de uma amostra de dados são necessários para verificar as premissas de variados testes estatísticos. Estes testes diferem dos métodos visuais porque trazem uma conclusão quantitativa para nossas hipóteses sobre as distribuições dos dados.

Existem dezenas de testes estatísticos que podem ser utilizados. Neste artigo traremos apenas 05 (junto com a explicação de cada um) e todos eles podem ser utilizados em Python. 🐍

  • Shapiro-Wilk

Este teste é um dos mais populares para o cálculo da normalidade. Ele é baseado na comparação de coeficientes calculados entre a distribuição da amostra e uma distribuição normal teórica.

De acordo com Miot (2017), ele pode ser utilizado independente do número de amostras. No entanto, caso sua amostra seja pequena (entre 4 a 30 registros), é preferível utilizar este teste. Uma vez que apresenta maior eficiência e robustez contra erros do tipo I.

As hipóteses do teste de Shapiro-Wilk são:

Hipótese Nula (H0): Os dados vem de uma distribuição normal.

Hipótese Alternativa (H1): Os dados observados não vêm de uma distribuição normal.

Para utilizar este teste em Python, dê uma olhada no código abaixo:

  • Kolmogorov-Smirnov (K-S) — com a correção de Lilliefors

O teste não paramétrico K-S é utilizado para comparar a distribuição dos dados com uma distribuição teórica (que você escolhe).

Este teste calcula a diferença entre estas distribuições. Ou seja, ele calcula a diferença entre a distribuição real e a distribuição teórica, verificando o quanto são similares ou diferentes.

Este teste por si mesmo não é ideal para verificar a normalidade dos dados, por conta disso temos que aplicar a correção de Lilliefors. Desta forma, este teste se torna mais robusto para amostras com mais de 30 unidades ou que contém outliers.

As hipóteses do teste K-S são:

Hipótese Nula (H0): Os dados vem de uma distribuição específica (pode ser a normal).

Hipótese Alternativa (H1): Os dados observados não vêm desta distribuição específica.

Para utilizar este teste em Python, dê uma olhada no código abaixo:

  • Anderson-Darling

O teste de Anderson-Darling também compara a aderência de uma determinada amostra de dados com uma distribuição específica, porém é mais rigoroso que o teste K-S.

Segundo Miot (2017) este teste é mais robusto e apresenta bom desempenho em amostras com mais de 50 unidades.

As hipóteses do teste de Anderson-Darling são:

Hipótese Nula (H0): Os dados vem de uma distribuição específica (pode ser a normal).

Hipótese Alternativa (H1): Os dados observados não vêm desta distribuição específica.

Para utilizar este teste em Python, dê uma olhada no código abaixo:

Esta função retorna o teste estatístico e um intervalo de valores com seus respectivos intervalos de significância.

Aqui por exemplo, o teste resultou em 0.25. Comparando este valor com o nível de significância α = 0.05 que tem o critical_values = 0.705, temos evidências suficientes para dizer que esta distribuição é normal (não rejeitar a hipótese nula), pois 0.25 < 0.705.

  • Jarque-Bera

Este teste estatístico verifica a normalidade dos dados calculando a skewness e a curtose da amostra. Após calcular estas medidas, ele faz a comparação com as estimativas teóricas para uma distribuição normal.

Este teste pode ser aplicado a amostras de qualquer tamanho, mas tem melhor desempenho quando a amostra é grande (>50). Quanto maior for a amostra, maior será a precisão da estimativa das estatísticas de skewness e curtose, e maior será a precisão do teste.

As hipóteses do teste de Jarque-Bera são:

Hipótese Nula (H0): Os dados vem de uma distribuição normal.

Hipótese Alternativa (H1): Os dados observados não vêm de uma distribuição normal.

O código abaixo executa este teste em Python:

  • D’Agostino-Pearson

Assim como o teste de Jarque-Bera, este teste estatístico considera a skewness e a curtose para verificar se a normalidade da distribuição dos dados.

De acordo com Miot (2017), este teste foi desenvolvido para lidar com amostras mais numerosas (>100), apresentando desempenhos mais robustos para estes casos.

As hipóteses do teste de D’Agostino-Pearson são:

Hipótese Nula (H0): Os dados vem de uma distribuição normal.

Hipótese Alternativa (H1): Os dados observados não vem de uma distribuição normal.

Para utilizar este teste em Python, dê uma olhada no código abaixo:

Referências

[1] Normality Tests for Statistical Analysis: A Guide for Non-Statisticians — PMC (nih.gov)

[2] SciELO — Brasil — Avaliação da normalidade dos dados em estudos clínicos e experimentais Avaliação da normalidade dos dados em estudos clínicos e experimentais

[3] Type I Error Rate and Power of Three Normality Tests (docsdrive.com)

[4] Methods for Normality Test with Application in Python | by Saloni Mishra | Towards Data Science

[5] How to Perform an Anderson-Darling Test in Python — Statology

--

--

Thales Ferraz
Thales Ferraz

Written by Thales Ferraz

Explorando a paixão por dados e modelagem matemática. Compartilho insights valiosos e soluções eficazes para problemas cotidianos.

No responses yet