Análise de Dados Prática: Como Calcular Rapidamente os Coeficientes de Correlação Pearson, Spearman e Kendall com Python (Código Completo)

Em projetos de ciência de dados e análise de negócios, uma pergunta recorrente é: "Essas duas variáveis estão relacionadas?". Avaliar a força da associação entre variáveis é o primeiro passo para decisões baseadas em dados. No entanto, a natureza dos dados pode variar — relações lineares estritas, crescimentos monotônicos irregulares ou classificações ordinais. Para cada cenário, existe uma ferramenta de medida específica.

Os coeficientes de correlação Pearson, Spearman e Kendall não são intercambiáveis. Cada um foi projetado para diferentes suposições de dados. Para iniciantes e profissionais intermediários, a dificuldade não está em encontrar código (há muitos exemplos online), mas sim em escolher o coeficiente correto para cada situação e interpretar o resultado com significado de negócio. Este artigo elimina essa lacuna, mostrando não apenas o "como" (cálculo rápido em Python), mas também o "porquê" (teoria e aplicação). Usaremos um conjunto de dados simulados realistas, passando por pré-processamento, cálculo, visualização e discussão de armadilhas comuns, para que você possa aplicar esses métodos em seus próprios projetos.

1. Os Três Coeficientes: Conceitos Essenciais e Quando Usar Cada Um

Antes de escrever qualquer código, é fundamental entender o que cada coeficiente mede e suas premissas. Escolher o método errado pode levar a conclusões totalmente enganosas.

O coeficiente de Pearson mede a relação linear entre duas variáveis contínuas. Ele assume que os dados seguem uma distribuição aproximadamente normal e que a relação no gráfico de dispersão pode ser aproximada por uma reta. O resultado varia de -1 a 1, indicando força e direção da associação linear.

O coeficiente de Spearman é uma medida não paramétrica baseada em ranks (postos). Ele converte os valores originais em suas posições ordenadas e calcula a correlação de Pearson sobre esses ranks. Dessa forma, detecta qualquer relação monotônica — linear, exponencial, logarítmica — desde que uma variável aumente (ou diminua) consistentemente com a outra. Spearman é robusto a outliers e não exige normalidade.

O coeficiente de Kendall (tau) também é baseado em ranks, mas seu cálculo é diferente: ele compara todos os pares de observações, contando pares concordantes (mesma direção de ordenação) e discordantes (direção oposta). É particularmente útil para amostras pequenas ou quando há muitos empates (ties). Muito usado em análises de concordância entre avaliadores.

A tabela a seguir resume as principais diferenças:

Característica Pearson Spearman Kendall
O que mede Relação linear Relação monotônica Concordância de ordenação
Tipo de dado Contínuo, aproximadamente normal Ordinal ou contínuo (ranks) Ordinal ou contínuo (ranks)
Sensibilidade a outliers Muito sensível Robusto Robusto
Teste de hipótese Assume distribuição normal bivariada Não paramétrico Não paramétrico
Exemplo típico Altura vs peso Ranking de satisfação vs churn Concordância entre juízes

Dica prática: Se você não tem certeza sobre a normalidade dos dados ou o gráfico de dispersão mostra uma curva, prefira Spearman ou Kendall. Uma boa verificação é calcular Pearson e Spearman simultaneamente: se os valores diferirem muito, provavelmente há não linearidade ou outliers, e Spearman deve ser mais confiável.

2. Configuração do Ambiente e Criação de Dados Simulados

Vamos montar um ambiente reprodutível e criar um conjunto de dados que contenha diferentes tipos de relação. Assim poderemos visualizar o comportamento de cada coeficiente.

Recomendo usar o gerenciador de pacotes Conda. Se ainda não tiver, siga:

conda create -n correl python=3.9
conda activate correl
pip install numpy pandas scipy seaborn matplotlib jupyter

Abra um Jupyter Notebook e importe as bibliotecas:

import numpy as np
import pandas as pd
from scipy import stats
import seaborn as sns
import matplotlib.pyplot as plt

sns.set_theme(style="whitegrid")
np.random.seed(123)  # semente para reprodutibilidade

Agora, geraremos quatro pares de variáveis (x, y) com diferentes padrões de relacionamento:

  1. Relação linear forte (reta com ruído)
  2. Relação monotônica não linear (quadrática)
  3. Relação linear com um outlier
  4. Sem relação (aleatório)
n = 60
x = np.linspace(0, 12, n)

# 1. Linear
y_linear = 1.5 * x + np.random.normal(0, 1.5, n)

# 2. Monotônica (quadrática)
y_quad = 0.3 * (x - 6)**2 + np.random.normal(0, 4, n)

# 3. Linear com outlier forte
y_out = 1.5 * x + np.random.normal(0, 1.5, n)
y_out[-1] = 60   # outlier

# 4. Aleatória (sem relação)
y_rand = np.random.normal(7, 3, n)

# Montar DataFrame
df = pd.DataFrame({
    'x': np.tile(x, 4),
    'y': np.concatenate([y_linear, y_quad, y_out, y_rand]),
    'tipo': (['Linear'] * n + ['Quadrática'] * n +
             ['Outlier'] * n + ['Aleatória'] * n)
})

3. Cálculo dos Três Coeficientes em Python

Usaremos as funções pearsonr, spearmanr e kendalltau do módulo scipy.stats. Elas retornam o coeficiente e o valor-p. Vamos criar uma função auxiliar para extrair os resultados de cada grupo de dados.

def calcular_correlacoes(grupo):
    """Retorna dicionário com os três coeficientes para um par (x,y)."""
    x_vals = grupo['x'].values
    y_vals = grupo['y'].values
    pearson = stats.pearsonr(x_vals, y_vals)[0]
    spearman = stats.spearmanr(x_vals, y_vals)[0]
    kendall = stats.kendalltau(x_vals, y_vals)[0]
    return {'Pearson': pearson, 'Spearman': spearman, 'Kendall': kendall}

resultados = df.groupby('tipo').apply(calcular_correlacoes).apply(pd.Series)
print(resultados)

O resultado deve ser algo como:

            Pearson  Spearman   Kendall
tipo                                    
Aleatória    0.0872   0.0706    0.0476
Linear       0.9405   0.9397    0.8092
Outlier      0.5632   0.9397    0.8092
Quadrática   0.8045   0.9900    0.9500

Observe que no caso Quadrática, Pearson (0.80) é menor que Spearman (0.99) — a relação não é linear, mas é monotônica, então Spearman captura melhor. No caso Outlier, Pearson cai para 0.56, enquanto Spearman e Kendall permanecem altos (0.94 e 0.81), mostrando robustez. Já o grupo Aleatória apresenta valores próximos de zero para todos.

4. Visualização Rápida com Seaborn

Podemos plotar os gráficos de dispersão com a reta de regressão linear para confirmar visualmente:

g = sns.lmplot(data=df, x='x', y='y', col='tipo', col_wrap=2,
               height=4, aspect=1.2, scatter_kws={'alpha':0.6})
g.fig.suptitle('Relações entre variáveis simuladas', y=1.02)
plt.tight_layout()
plt.show()

Os gráficos confirmam: no caso linear, a reta se ajusta bem; no quadrático, a reta não captura a curvatura, mas Spearman sim; o outlier desvia a reta, mas Spearman mantém-se fiel à tendência geral; o aleatório mostra apenas nuvem de pontos.

5. Como Escolher o Coeficiente Certo na Prática

Com base nos exemplos, algumas diretrizes:

  • Se o gráfico de dispersão mostra uma nuvem alongada em linha reta e os dados são contínuos e aproximadamente normais, use Pearson.
  • Se a relação é claramente monotônica mas não linear (curva), ou se há outliers, ou se os dados são ordinais, use Spearman.
  • Se você tem poucos dados ou muitos empates (por exemplo, notas discretas), Kendall pode ser mais estável e interpretável.
  • Uma boa prática: reporte sempre o coeficiente junto com o valor-p, e considere o tamanho da amostra.

Lembre-se: correlação não implica causalidade. Um coeficiente alto apenas indica associação, não relação de causa e efeito.

Agora você tem uma base sólida para calcluar e interpretar os três principais coeficientes de correlação em Python. Aplique esses conceitos aos seus próprios dados e tome decisões mais informadas.

Tags: Python Correlação de Pearson Correlação de Spearman Correlação de Kendall análise de dados

Publicado em 8-19 13:06