Conceitos Gerais de Estatística - Estimativa por Intervalos
Importação
import statsmodels.api as sm
import scipy.stats as ss
import pandas as pd
import numpy as np
Statsmodels
A biblioteca statsmodels é um módulo Python que fornece classes e funções para a estimativa de muitos modelos estatísticos diferentes, bem como para a realização de testes estatísticos e a exploração de dados. Para saber mais sobre essa biblioteca, acesse aqui.
Intervalos de Confiança
O objetivo central da Inferência Estatística é obter informações para uma população a partir do conhecimento de uma única amostra. Em geral, a população é representada por uma variável aleatória X, com função de distribuição ou densidade de probabilidade $f_{x}$ que depende de um parâmetro θ desconhecido. Se $X_{1}, X_{2}, \ldots, X_{n}$ é uma amostra aleatória dessa população, então as estatísticas $\hatθ_{1}$ e $\hatθ_{2}$ formam um intervalo de $100 × (1 − α) %$ confiança para θ, se:
$P(\hatθ_{1} ≤ θ ≤ \hatθ_{2}) ≥ 1 − α$
Na prática, temos apenas uma amostra e, assim, é importante que se dê alguma informação sobre essa possível variabilidade do estimador. Ou seja, é importante informar o valor do estimador $\hatθ$ obtido com uma amostra específica, mas é importante informar também que o verdadeiro valor do parâmetro θ poderia estar em um determinado intervalo, digamos, no intervalo $[\hatθ − \varepsilon , \hatθ + \varepsilon ]$. Dessa forma, informamos a nossa margem de erro no processo de estimação, com essa margem sendo a consequência do processo de seleção aleatória da amostra.
Nesse material será apresentado como obter esse intervalo, de modo a “acertar na maioria das vezes”, isto é, mostraremos um procedimento que garanta que, na maioria das vezes (ou das amostras possíveis), o intervalo obtido conterá o verdadeiro valor do parâmetro. Em outras palavras, com alta probabilidade (em geral, indicada por 1−α), o intervalo $[\hat{θ}−ε,\hat{θ}+ε]$ conterá o verdadeiro valor do parâmetro θ.
Com probabilidade alta (em geral, indicada por $1 − α$ ), o intervalo $[\hat{θ} − \varepsilon ; \hat{θ} + \varepsilon ]$ conterá o verdadeiro valor do parâmetro θ, ou seja, o procedimento de construção garante uma alta probabilidade (1−α) de se obter um intervalo que contenha o verdadeiro valor do parâmetro.
$1 − α$ é chamado nível de confiança, enquanto o valor α é conhecido como nível de significância. O intervalo $[\hat{θ} − \varepsilon ; \hat{θ} + \varepsilon ]$ é chamado de intervalo de confiança de nível $1 − α$.
OBS: Mesmo representado através de uma probabilidade, não podemos interpretar o intervalo de confiança da forma: “A probabilidade de θ pertencer ao intervalo $[\hat{θ}{1}, \hat{θ}{2}]$ é maior ou igual a 1-α.”, pois θ não é variável aleatória.
Exemplo: Em um estudo sobre o Índice de Massa Corporal (IMC), foi reportado o seguinte intervalo de confiança de 95% para o IMC médio µ da população da cidade de Niterói - RJ, com base em uma amostra de 650 pessoas: $[26, 8 − 0, 6; 26, 8 + 0, 6]$. Dessa forma podemos afirmar que com 95% de confiança esse intervalo contém o verdadeiro valor do IMC médio da população residente de Niterói - RJ.
Intervalos de Confiança para a Média
Seja $X_{1}, X_{2}, \ldots, X_{n}$ uma amostra aleatória proveniente de uma população $X \sim N(µ,σ²)$ com variância desconhecida, temos que:
$X \sim N(µ; σ^{2})⇒ \bar{X} ∼ N(µ;\frac{\sigma^{2}}{n}) ⇒ T = \frac{\bar{X}-\mu }{\frac{S}{\sqrt{n}}} ∼ t_{n−1}$
Logo,
Ou seja, o intervalo de confiança para µ de nível de confiança 1 − α é:
$\left [ \bar{X}-t_{n-1;\alpha /2}\cdot \frac{S}{\sqrt{n}};\bar{X}+t_{n-1;\alpha /2}\cdot \frac{S}{\sqrt{n}} \right ]$
onde $t_{n−1, α/2}$ é o valor crítico da distribuição t-Student com n−1 graus de liberdade que deixa área $\frac{α}{2}$ acima dele.
Para realizar a construção de um intervalo de confiança para a média, devemos utilizar a função
t.interval()
da biblioteca scipy.stats, cujos argumentos de entrada são:
alpha
: nível de confiança, ou seja, 1-α. (Sim, alpha = 1 - $\alpha$)df
: tamanho dos graus de liberdade, ou seja, n-1.loc
: $\bar{x}$, ou seja, a média dos dados da amostra.scale
: $\frac{S}{\sqrt{n}}$.
Para demonstrar aplicações dessa função utilizaremos o banco de dados a seguir, que representa uma amostra aleatória simples de clientes de um banco alemão.
df = pd.read_csv('german_credit_risk_target.csv')
df.head()
Unnamed: 0 | Age | Sex | Job | Housing | Saving accounts | Checking account | Credit amount | Duration | Purpose | Risk | |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 67 | male | 2 | own | NaN | little | 1169 | 6 | radio/TV | good |
1 | 1 | 22 | female | 2 | own | little | moderate | 5951 | 48 | radio/TV | bad |
2 | 2 | 49 | male | 1 | own | little | NaN | 2096 | 12 | education | good |
3 | 3 | 45 | male | 2 | free | little | little | 7882 | 42 | furniture/equipment | good |
4 | 4 | 53 | male | 2 | free | little | little | 4870 | 24 | car | bad |
Exemplo 1: Supondo que a idade das mulheres segue uma distribuição normal, vamos estimar a idade média das mulheres dessa população através da amostra de 310 mulheres contida nesse banco de dados. Para isso calcularemos um intervalo de 95% de confiança.
df2 = df[df['Sex'] == "female"] # Filtrar apenas os dados das mulheres
df2.head()
Unnamed: 0 | Age | Sex | Job | Housing | Saving accounts | Checking account | Credit amount | Duration | Purpose | Risk | |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | 1 | 22 | female | 2 | own | little | moderate | 5951 | 48 | radio/TV | bad |
10 | 10 | 25 | female | 2 | rent | little | moderate | 1295 | 12 | car | bad |
11 | 11 | 24 | female | 2 | rent | little | little | 4308 | 48 | business | bad |
12 | 12 | 22 | female | 2 | own | little | moderate | 1567 | 12 | radio/TV | good |
14 | 14 | 28 | female | 2 | rent | little | little | 1403 | 15 | car | good |
ss.t.interval(alpha = 0.95, df = len(df2['Age'])-1, loc = np.mean(df2['Age']), scale = ss.sem(df2['Age']))
(31.48960295935143, 34.1168486535518)
Logo, podemos concluir que com 95% de confiança o intervalo $[31.4896;34.1169]$ contém o verdadeiro valor da idade média das mulheres dessa população.
Exemplo 2: Supondo que a idade das pessoas pertencentes a empresa 3 segue uma distribuição normal, vamos estimar a idade média dessa população através da amostra de 148 pessoas presentes no banco de dados. Para isso calcularemos um intervalo de 99% de confiança.
df3 = df[df['Job'] == 3] # Filtrar apenas os dados das pessoas que trabalham na empresa 3
df3.head()
Unnamed: 0 | Age | Sex | Job | Housing | Saving accounts | Checking account | Credit amount | Duration | Purpose | Risk | |
---|---|---|---|---|---|---|---|---|---|---|---|
7 | 7 | 35 | male | 3 | rent | little | moderate | 6948 | 36 | car | good |
9 | 9 | 28 | male | 3 | own | little | moderate | 5234 | 30 | car | bad |
18 | 18 | 44 | female | 3 | free | little | moderate | 12579 | 24 | car | bad |
34 | 34 | 33 | female | 3 | own | little | rich | 1474 | 12 | furniture/equipment | good |
40 | 40 | 30 | male | 3 | own | quite rich | NaN | 2333 | 30 | radio/TV | good |
ss.t.interval(alpha = 0.99, df = len(df3['Age'])-1, loc = np.mean(df3['Age']), scale = ss.sem(df3['Age']))
(36.463454992835125, 41.590599061218924)
Portanto, podemos concluir que com 99% de confiança o intervalo $[36.4635;41.5906]$ contém o verdadeiro valor da idade média dos trabalhadores da empresa 3.
Intervalo de Confiança para a proporção populacional
Seja ${X_{1}, X_{2}, …, X_{n}}$ uma amostra aleatórial proveniente de uma população ${X \sim Ber(p)}$, logo ${\hat{p} \sim N(p, p(1-p))}$, ${\hat{p}}$ estimador de p, então
$\frac{\hat{p} - p}{\sqrt{\frac{p(1-p)}{n}}} \sim N(0, 1)$
Logo,
Como não sabemos o parâmetro populacional p
, temos duas opções para substitui-lo no Intervalo de Confiança:
-
${\hat{p}}$ no lugar do p;
-
maximizar o valor de p(1 - p) => p = 0,5 (conhecido como IC conservador)
Para realizar a construção de um intervalo de confiança para a proporção, utilizaremos a função
proportion_confint()
da biblioteca statsmodels.stats, cujos argumentos de entrada são:
count
: a quantidade de ocorrências.nobs
: o tamanho da amostra.alpha
: nível de significância.
Exemplo 3: Utilizando a mesma base do exemplo anterior, vamos construir um intervalo de confiança para a proporção de pessoas com Risk
classificado como good
.
df['Risk'] = df['Risk'].map({'good' : 1, 'bad' : 0}) # transformando a variável Risk para valores numéricos
sm.stats.proportion_confint(count = sum(df['Risk']), nobs = len(df['Risk']), alpha = 0.05)
(0.6715974234910674, 0.7284025765089325)
Desse modo, temos que com 95% de confiança o intervalo ${[0,6716; 0,7284]}$ contém o verdadeiro valor da proporção de clientes avaliados como good
.
Intervalo de Confiança para a variância populacional
Seja ${X_{1}, X_{2}, …, X_{n}}$ uma amostra aleatória proveniente de uma população ${X \sim N(µ, σ²)}$, então
$\frac{(n - 1)S^{2}}{\sigma ^{2}} \sim X^{2}_{n-1}$
Logo,
Nem o statmodels
e nem o scipy
possuem funções que geram intervalo de confiança para a variância. Então, vamos construir a nossa!
def variancia_int(amostra, alfa):
n = len(amostra)
s_2 = np.var(amostra, ddof=1)
gl = n - 1
limite_inferior = (n - 1) * s_2 / ss.chi2.ppf(1 - alfa / 2, gl)
limite_superior = (n - 1) * s_2 / ss.chi2.ppf(alfa / 2, gl)
print('(%.16f, %.16f)' % (limite_inferior, limite_superior))
Exemplo 4: Agora, vamos construir um intervalo de confiança para a variância da idade dos homens utilizando os dados da amostra.
df_homens = df[df['Sex'] == "male"]
variancia_int(df_homens['Age'], 0.05)
(108.9517847841306661, 134.5924067459885407)
Assim, podemos concluir que com 95% de confiança o intervalo ${[108,9518; 134,5924]}$ contém o verdadeiro valor da variância dos homens dessa população alvo.
Referências
FARIAS, A. M. L. Apostila de Estatística II. Departamento de Estatística. 2017. Universidade Federal Fluminense. Velarde, L. G. C. CAVALIERE, Y. F. Apostila Inferência Estatística. Departamento de Estatística. Universidade Federal Fluminense