DEV Community

Cover image for Por que 9 passageiros não contam a história toda: O Teorema do Limite Central na prática
Luiz Gustavo Falqueto
Luiz Gustavo Falqueto

Posted on

Por que 9 passageiros não contam a história toda: O Teorema do Limite Central na prática

Você já analisou um conjunto de dados e se perguntou: "Qual o tamanho de amostra suficiente para eu confiar na minha média?"

Para responder a isso, peguei o famoso dataset de idades Titanic Passenger Dataset de passageiros e fiz um experimento simples em Python. O resultado prova o poder de um dos pilares mais importantes da estatística: O Teorema do Limite Central (TLC).

O Caos do Dado Original

Histograma de Distribuição de Idades

Olhando para a distribuição original de idades de todos os passageiros, os dados não formam uma curva perfeita. Há picos em crianças, uma grande concentração de jovens e uma queda brusca para idosos.

Se pegássemos apenas 1 pessoa ao acaso, a chance de pegar um valor extremo (como um bebê de 1 ano ou um idoso de 80) seria considerável.

💡 Nota rápida: Neste meu teste usando o dataset do Titanic, a média das idades df['age'].mean() é de aproximadamente 35,7 anos!

O que é o Teorema do Limite Central (TLC)?

Se a estatística tivesse uma "fórmula mágica", ela seria o Teorema do Limite Central.

Em termos simples, o TLC afirma que:

Não importa qual seja a forma dos seus dados originais (tortos, assimétricos ou bimodais), se você tirar várias amostras e calcular a média de cada uma, a distribuição dessas médias SEMPRE seguirá uma Curva Normal (formato de sino).

O Experimento: Amostragens Repetidas

Criei uma função em Python para simular um cenário real: coletar X amostras aleatórias de tamanho N, calcular a média de cada uma e plotar os resultados num histograma.

Histogramas de Frequência para tamanhos de amostras 1 e 10

Veja o que acontece com a distribuição das médias à medida que aumentamos o tamanho de cada amostra. O formato de sino vai existir em ambos! A diferença real que o TLC promove com o aumento da amostra não é a "formação" do sino, mas a LARGURA do sino:

  • Em n = 1: O sino é largo e achatado. As médias flutuam bastante (ex: de 0 a 60 anos).
  • Em n = 10: O sino é estreito e pontudo. As médias ficam presas em um intervalo minúsculo ( ex: de 20 a 40 anos).

2 Lições Práticas para seu dia a dia em Dados

  1. A forma original não importa: Não importa o quão "tortos" ou assimétricos sejam seus dados originais — a distribuição das médias amostrais sempre tenderá a uma Normal se a amostra for grande o suficiente.

  2. Mais dados = Menos ruído: Amostras maiores reduzem o Erro Padrão. Se você toma decisões de negócio com base em amostras minúsculas, está apenas reagindo ao acaso.

💬 E você? Já viu alguma decisão de produto ou negócio ser tomada com base em uma amostra pequena demais? Conta aqui nos comentários!

💻 O Código em Python (Simples e Direto)

import seaborn as sns
import matplotlib.pyplot as plt

# Carrega os dados
idades = df['Age'].dropna()

idades = idades[(idades % 1 == 0)]

def tlc(tamanho_da_amostra, quantidade_de_amostras):
  media = [idades.sample(tamanho_da_amostra, replace=True).mean() for _ in range(int(quantidade_de_amostras))]
  return media

# Plotando os gráficos comparativos
fig, axes = plt.subplots(1, 2, figsize=(10, 4),sharex=True, sharey=True)

# Grafico 1
medias_idades_amostrais = tlc(1, 1000)
p = sns.histplot(data=medias_idades_amostrais, ax=axes[0], bins=50, kde=True)
y_max = max([patch.get_height() for patch in p.patches])
axes[0].set_title(f'Tamanho da Amostra (n = 1)')
axes[0].set_xlabel('Média das Idades')
axes[0].set_ylabel('Frequência')
axes[0].vlines(np.mean(medias_idades_amostrais), 0, y_max * 1.1, linestyles='dashed', colors='red')

# Grafico 1
medias_idades_amostrais = tlc(10, 1000)
p = sns.histplot(data=medias_idades_amostrais, ax=axes[1], bins=50, kde=True)
y_max = max([patch.get_height() for patch in p.patches])
axes[1].set_title(f'Tamanho da Amostra (n = 10)')
axes[1].set_xlabel('Média das Idades')
axes[1].set_ylabel('Frequência')
axes[1].vlines(np.mean(medias_idades_amostrais), 0, y_max * 1.1, linestyles='dashed', colors='red')

plt.tight_layout()
plt.show()
Enter fullscreen mode Exit fullscreen mode

Top comments (0)