Aula 08 — Módulo 2: Inferência Estatística
Como aprender sobre uma população observando apenas uma amostra?
Exemplo da aula: massa corporal dos pinguins do arquipélago Palmer.
Qual é a massa corporal média dos pinguins observados no arquipélago Palmer?
Imagine que medir todos seja caro, lento ou inviável.
| Coluna | Significado |
|---|---|
species |
espécie: Adelie, Chinstrap ou Gentoo |
island |
ilha de observação |
bill_length_mm, bill_depth_mm |
medidas do bico |
flipper_length_mm |
comprimento da nadadeira |
body_mass_g |
massa corporal usada na aula |
sex |
sexo registrado |
Dos 344 registros, 342 têm massa corporal observada. Esses 342 formam nossa população didática.
Note
Nesta aula, os registros completos serão nossa população conhecida. Assim podemos verificar se as estimativas funcionam.
plt.figure(figsize=(9, 5.2))
sns.histplot(data=penguins, x="body_mass_g", hue="species", bins=22,
palette=COLORS, multiple="stack", edgecolor="white")
plt.axvline(mu, color=INK, lw=3,
label=f"média da população = {mu:,.0f} g".replace(",", "."))
plt.xlabel("Massa corporal (g)")
plt.ylabel("Número de pinguins")
plt.title("A população que queremos resumir")
plt.legend(title="")
finish("populacao-massa.png")Os 342 pinguins com massa registrada.
O parâmetro descreve exatamente esse conjunto.
O processo biológico que poderia gerar outros pinguins semelhantes.
O parâmetro descreve um modelo mais amplo.
Amostragem troca completude por velocidade — e exige quantificar a incerteza.
Conjunto sobre o qual queremos concluir.
Aqui: todos os pinguins registrados na base.
Subconjunto efetivamente observado.
Aqui: pinguins selecionados para medição.
Uma amostra aleatória com \(n=20\) produziu \(\bar{x}=4.171\) g, enquanto \(\mu=4.202\) g.
sample_idx = rng.choice(penguins.index.to_numpy(), size=20, replace=False)
ordered = penguins.sort_values("body_mass_g").reset_index()
ordered["sample"] = ordered["index"].isin(sample_idx)
plt.figure(figsize=(9, 4.8))
plt.scatter(ordered["body_mass_g"], np.zeros(len(ordered)), s=18, color="#cbd5da", alpha=.75)
chosen = ordered[ordered["sample"]]
plt.scatter(chosen["body_mass_g"], np.zeros(len(chosen)), s=70, color=ORANGE,
edgecolor="white", linewidth=.8, label="amostra (n = 20)")
plt.axvline(mu, color=INK, lw=2.5,
label=f"μ = {mu:,.0f} g".replace(",", "."))
plt.axvline(chosen["body_mass_g"].mean(), color=ORANGE, lw=2.5, ls="--",
label=f"x̄ = {chosen['body_mass_g'].mean():,.0f} g".replace(",", "."))
plt.yticks([])
plt.xlabel("Massa corporal (g)")
plt.title("Uma amostra revela apenas parte da população")
plt.legend(ncol=3, loc="upper center")
finish("uma-amostra.png")
# Simulações reutilizadas.
def sample_means(values, n, reps=4000):
return np.array([rng.choice(values, size=n, replace=True).mean() for _ in range(reps)])
means_10 = sample_means(masses, 10)
means_30 = sample_means(masses, 30)
means_80 = sample_means(masses, 80)| Objeto | Símbolo | O que representa? |
|---|---|---|
| Parâmetro | \(\mu\) | valor fixo e geralmente desconhecido da população |
| Estimador | \(\widehat{\mu}=\bar{X}\) | regra aplicada a qualquer amostra |
| Estimativa | \(\bar{x}=4.171\) g | valor obtido em uma amostra específica |
O estimador é uma função; a estimativa é o resultado.
Assumimos uma família de distribuições com poucos parâmetros.
Exemplo: \(X\sim N(\mu,\sigma^2)\).
Evitamos especificar uma família completa.
Exemplo: CDF empírica e bootstrap.
Na mesma população, podemos querer estimar:
Não existe estimador sem um alvo bem definido.
Para uma amostra \(X_1,\ldots,X_n\):
\[ \widehat{\mu}=\bar{X}=\frac{1}{n}\sum_{i=1}^{n}X_i \]
Defina, para cada pinguim:
\[ Y_i= \begin{cases} 1, & \text{se é Gentoo}\\ 0, & \text{caso contrário} \end{cases} \]
Então \(Y_i\sim Bernoulli(p)\), onde \(p\) é a proporção populacional.
\[ P(Y=y)=p^y(1-p)^{1-y},\qquad y\in\{0,1\} \]
Propriedades:
\[ E[Y]=p, \qquad \operatorname{Var}(Y)=p(1-p) \]
\[ \widehat{p}=\frac{1}{n}\sum_{i=1}^{n}Y_i \]
Como cada \(Y_i\) vale zero ou um, a média conta a fração de sucessos.
\[ E[\widehat{p}]=p, \qquad \operatorname{Var}(\widehat{p})=\frac{p(1-p)}{n} \]
Com \(n=40\), os valores possíveis avançam em passos de \(1/40=0{,}025\).
p_gentoo = (penguins["species"] == "Gentoo").mean()
prop_samples = np.array([
(rng.choice(penguins["species"].to_numpy(), size=40, replace=True) == "Gentoo").mean()
for _ in range(5000)
])
plt.figure(figsize=(9, 5.2))
sns.histplot(prop_samples, bins=np.arange(0.1, 0.66, 0.025), color=BLUE)
plt.axvline(p_gentoo, color=ORANGE, lw=3, label=f"p = {p_gentoo:.3f}")
plt.xlabel("Proporção de Gentoo na amostra")
plt.ylabel("Frequência")
plt.title("Uma proporção também tem distribuição amostral")
plt.legend()
finish("proporcao-gentoo.png")Se \(Y_1,\ldots,Y_n\) são independentes e têm a mesma probabilidade \(p\), o número de Gentoo é:
\[ K=\sum_{i=1}^{n}Y_i \sim Binomial(n,p) \]
\[ P(K=k)=\binom{n}{k}p^k(1-p)^{n-k} \]
E como \(\widehat{p}=K/n\), a Binomial também descreve a proporção.
E se a população for finita?
Ao retirar uma amostra sem reposição de uma população com \(N\) indivíduos, dos quais \(M\) são Gentoo, as observações não são independentes. Nesse caso, a distribuição exata é
\[ K\sim\operatorname{Hipergeométrica}(N,M,n), \qquad P(K=k)=\frac{\binom{M}{k}\binom{N-M}{n-k}}{\binom{N}{n}}. \]
A Binomial com \(p=M/N\) é uma boa aproximação quando a população é muito grande em relação à amostra — ou quando a coleta é feita com reposição. Portanto, a Hipergeométrica é o modelo mais adequado para a população finita deste exemplo.
Ao repetir amostras aleatórias de mesmo tamanho, qual afirmação está correta?
Se repetirmos a coleta, os pinguins mudam.
Logo, a estimativa também muda:
\[ \bar{x}_1 \neq \bar{x}_2 \neq \bar{x}_3 \]
Para estudar um estimador, precisamos imaginar muitas amostras possíveis.
Não é a distribuição dos dados. É a distribuição de uma estatística entre amostras repetidas.
fig, axes = plt.subplots(1, 2, figsize=(11, 4.8))
for i in range(10):
sample = rng.choice(masses, size=20, replace=True)
axes[0].scatter(sample, np.full(20, i), s=13, color=BLUE, alpha=.55)
axes[0].scatter(sample.mean(), i, s=65, color=ORANGE, edgecolor="white")
axes[0].axvline(mu, color=INK, lw=2)
axes[0].set_yticks([])
axes[0].set_xlabel("Massa (g)")
axes[0].set_title("Cada amostra produz uma média")
sns.histplot(means_30, bins=28, color=BLUE, ax=axes[1])
axes[1].axvline(mu, color=ORANGE, lw=3)
axes[1].set_xlabel("Média amostral (g)")
axes[1].set_ylabel("Frequência")
axes[1].set_title("As médias formam uma distribuição")
finish("distribuicao-amostral.png")Deriva propriedades válidas para uma classe de populações e amostras.
Torna o comportamento visível e testa cenários específicos.
Concordância entre as duas aumenta nossa confiança no raciocínio.
Um estimador é não viesado quando, em média, acerta o parâmetro:
\[ E[\widehat{\theta}] = \theta \]
Seu viés é:
\[ B(\widehat{\theta})=E[\widehat{\theta}]-\theta \]
Um estimador é consistente quando se aproxima do parâmetro à medida que \(n\) cresce:
\[ \widehat{\theta}_n \xrightarrow{P} \theta \]
Se cada observação tem média \(\mu\):
\[ \begin{aligned} E[\bar{X}] &=E\left[\frac{1}{n}\sum_{i=1}^{n}X_i\right]\\ &=\frac{1}{n}\sum_{i=1}^{n}E[X_i]\\ &=\frac{1}{n}(n\mu)=\mu \end{aligned} \]
Não viesado não significa correto em toda amostra.
\[ \widehat{\theta}-\theta \]
Depende da amostra sorteada.
\[ E[\widehat{\theta}]-\theta \]
É uma propriedade da regra sob repetições.
Selecionar apenas pinguins Gentoo desloca toda a distribuição das estimativas.
gentoo = penguins.loc[penguins["species"] == "Gentoo", "body_mass_g"].to_numpy()
biased_means = sample_means(gentoo, 30)
plt.figure(figsize=(9, 5.2))
sns.kdeplot(means_30, fill=True, alpha=.25, color=BLUE, lw=3, label="amostra de toda a população")
sns.kdeplot(biased_means, fill=True, alpha=.20, color=ORANGE, lw=3, label="amostra apenas de Gentoo")
plt.axvline(mu, color=INK, lw=2.5, ls="--",
label=f"μ = {mu:,.0f} g".replace(",", "."))
plt.xlabel("Média amostral (g)")
plt.ylabel("Densidade")
plt.title("Uma amostra maior não corrige seleção enviesada")
plt.legend()
finish("amostragem-enviesada.png")A própria regra produz um valor esperado diferente do parâmetro.
O mecanismo de coleta representa mal a população.
Warning
Uma fórmula não corrige uma amostra que exclui sistematicamente parte da população.
Duas regras podem acertar o centro, mas variar de forma diferente.
\[ \operatorname{Var}(\widehat{\theta})=E\left[(\widehat{\theta}-E[\widehat{\theta}])^2\right] \]
Menor variância significa estimativas mais estáveis entre amostras.
Todas se concentram em torno de \(\mu\), mas amostras maiores oscilam menos.
plt.figure(figsize=(9, 5.2))
for values, label, color in [(means_10, "n = 10", ORANGE), (means_30, "n = 30", BLUE),
(means_80, "n = 80", "#6a4c93")]:
sns.kdeplot(values, label=label, color=color, fill=False, linewidth=3)
plt.axvline(mu, color=INK, lw=2, ls="--", label="μ")
plt.xlabel("Média amostral (g)")
plt.ylabel("Densidade")
plt.title("Aumentar n concentra as estimativas")
plt.legend()
finish("tamanho-amostra.png")Para observações independentes com variância \(\sigma^2\):
\[ \begin{aligned} \operatorname{Var}(\bar{X}) &=Var\left(\frac{1}{n}\sum_{i=1}^{n}X_i\right)\\ &=\frac{1}{n^2}\sum_{i=1}^{n}\operatorname{Var}(X_i)\\ &=\frac{\sigma^2}{n} \end{aligned} \]
O desvio padrão da distribuição amostral é o erro padrão:
\[ \operatorname{SE}(\bar{X})=\frac{\sigma}{\sqrt{n}} \]
Note
Para reduzir o erro padrão pela metade, precisamos multiplicar \(n\) por quatro.
O padrão empírico acompanha \(\sigma/\sqrt{n}\).
ns = np.array([5, 10, 20, 30, 50, 80, 120])
empirical_se = np.array([sample_means(masses, int(n), 2500).std(ddof=1) for n in ns])
theoretical_se = masses.std(ddof=0) / np.sqrt(ns)
plt.figure(figsize=(8.5, 5.2))
plt.plot(ns, empirical_se, "o-", lw=3, ms=8, color=ORANGE, label="simulação")
plt.plot(ns, theoretical_se, "--", lw=3, color=BLUE, label="σ / √n")
plt.xlabel("Tamanho da amostra (n)")
plt.ylabel("Erro padrão da média (g)")
plt.title("O erro padrão diminui com a raiz de n")
plt.legend()
finish("erro-padrao.png")Quando \(n\) cresce, a média amostral converge para a média da população:
\[ \bar{X}_n \xrightarrow{P} \mu \]
Mais dados reduzem a variabilidade aleatória — se o mecanismo de amostragem for adequado.
A média pode se afastar temporariamente de \(\mu\), mas suas oscilações tendem a diminuir.
sequence = rng.choice(masses, size=2500, replace=True)
running_mean = np.cumsum(sequence) / np.arange(1, len(sequence) + 1)
plt.figure(figsize=(9, 5.2))
plt.plot(np.arange(1, len(sequence) + 1), running_mean, color=BLUE, lw=2)
plt.axhline(mu, color=ORANGE, lw=3, ls="--",
label=f"μ = {mu:,.0f} g".replace(",", "."))
plt.xscale("log")
plt.xlabel("Número de observações (escala log)")
plt.ylabel("Média acumulada (g)")
plt.title("A média se estabiliza à medida que os dados chegam")
plt.legend()
finish("convergencia-media.png")Queremos a massa média de todas as espécies, mas coletamos apenas pinguins Gentoo. O que ocorre ao aumentar muito \(n\)?
Sob condições usuais, para \(n\) suficientemente grande:
\[ \frac{\bar{X}-\mu}{\sigma/\sqrt{n}} \approx N(0,1) \]
O formato da população não precisa ser Normal.
O TCL descreve a distribuição das médias, não transforma os dados originais.
right_skew = np.exp(rng.normal(0, .8, 20000))
right_skew = right_skew / right_skew.mean() * 100
clt_means = sample_means(right_skew, 30, 5000)
fig, axes = plt.subplots(1, 2, figsize=(11, 4.8))
sns.histplot(right_skew, bins=45, color=ORANGE, ax=axes[0])
axes[0].set_xlim(0, 500)
axes[0].set_title("População assimétrica")
axes[0].set_xlabel("X")
axes[0].set_ylabel("Frequência")
sns.histplot(clt_means, bins=35, color=BLUE, ax=axes[1])
axes[1].set_title("Médias de amostras com n = 30")
axes[1].set_xlabel("x̄")
axes[1].set_ylabel("Frequência")
finish("tcl-assimetria.png")Queremos estimar a proporção de pinguins de cada espécie no arquipélago.
Se existem vários estimadores, como decidir qual é melhor?
Na Aula 09, usaremos funções de perda e risco para comparar média, mediana e média aparada.
parulpandey/palmer-archipelago-antarctica-penguin-data.ICD: Aula 08 — Estimadoresvoltar para a Aula