Escolar Documentos
Profissional Documentos
Cultura Documentos
Livro - Paulo Rogério de Almeida Ribeiro
Livro - Paulo Rogério de Almeida Ribeiro
Livro - Paulo Rogério de Almeida Ribeiro
95
90
Peso (kg)
85
80
75
70
1.4
1.5
35
1.6 30
Al
tu 1.7
ra 25 )
(m os
) 1.8 20 e (an
d
1.9 15 Ida
2.0 10
3.0 2.5 2.0 1.5 1.0 0.5 0.0 0.5 1.0 1.5 2.0 2.5 3.0 3.5
z
Neste livro serão apresentados temas de análise exploratória (Capítulo 1) e inferência estatística (Capí-
tulo 2). Os capítulos são divididos em seções e após a explanação teórica de cada tema da seção constrói-se
um código em Python com o passo a passo da parte teórica abordada. Destaca-se que o uso de bibliotecas,
que implementam a teoria explanada, foi evitado ao máximo em um primeiro momento, para que o leitor
entenda cada passo elementar da teoria. Posteriormente, códigos usando bibliotecas (principalmente Sta-
tistics, NumPy, SciPy e Scikit-learn) são mostrados, assim como cita-se a função específica da biblioteca que
implementa a teoria previamente explicada.
40 códigos estão no corpo do texto, ou seja, o aluno acompanha o código conjuntamente com a teoria.
Os códigos estão como texto, não como figura, portanto, podem ser copiados para seu ambiente de desen-
volvimento preferido. As linhas do código são numeradas, sendo que a explicação no texto cita as linhas.
Essa numeração conectada a explicação teórica consolida o vínculo teoria-prática. Complementarmente,
os códigos são disponibilizados no Google Colab1 .
O Capítulo 1 (análise exploratória) discorre sobre: estatística, tipos de variáveis, medidas de tendência
central (média, mediana e moda), métricas de dispersão (amplitude, intervalo interquartil, variância, des-
vio padrão e coeficiente de variação), relação entre variáveis (coeficiente de correlação) e distribuições de
probabilidade (binomial, poisson e normal).
No Capítulo 2 (inferência estatística) os principais conceitos abordados são: estimação pontual e inter-
valar, teste de hipótese (teste Z, teste t pareado e não pareado, teste de Wilcoxon e teste de Mann-Whitney)
e análise de regressão (regressão linear simples e regressão linear múltipla).
1 Link
para os códigos no Google Colab: <https://colab.research.google.com/drive/1jDSUc3JYXrIXbOZ-N3iFJBMtxwAcQhFb?authuser
=1#scrollTo=ndjzFVR4zv50>
Lista de Figuras
1.1 Média . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.2 Criando função média . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.3 Nova função média . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.4 Criar diagrama de pontos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
1.5 Cálculo da mediana para 𝑛 ímpar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
1.6 Mediana para qualquer 𝑛 (par ou ímpar) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
1.7 Moda para amostra unimodal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
1.8 Código para gerar boxplot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
1.9 Boxplot com a Seaborn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
1.10 Função variância . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
1.11 Função desvio padrão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
1.12 Gerando diagrama de dispersão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
1.13 Coeficiente de correlação de Pearson . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
1.14 Distribuição Binomial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
1.15 Distribuição Poisson . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
1.16 Distribuição Normal Padrão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
1.17 Função mean do statistics - versão 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
1.18 Função mean do statistics - versão 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
1.19 Função mean do statistics - versão 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
1.20 Função mean do NumPy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
1.21 Função mean do SciPy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
1.22 Usando NumPy para estatísticas e probabilidades . . . . . . . . . . . . . . . . . . . . . . . . . 39
2.1 Propabilidade para estimação pontual . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
2.2 Intervalo com dois erros-padrão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
2.3 Obtenção de intervalo de confiança . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
2.4 Obtenção de intervalo com a SciPy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
2.5 Intervalo de confiança para variância populacional desconhecida . . . . . . . . . . . . . . . . 50
2.6 Intervalo de confiança para variância populacional desconhecida . . . . . . . . . . . . . . . . 51
2.7 Teste de hipótese (z-score) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
2.8 Teste de hipótese (z-score - valor 𝑝) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
2.9 Teste de hipótese (bilateral) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
2.10 Teste Z de duas amostras (bilateral) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
2.11 Teste t de duas amostras (bilateral) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
2.12 Teste t de duas amostras (bilateral) com a Scipy . . . . . . . . . . . . . . . . . . . . . . . . . . 64
2.13 Teste t pareado de duas amostras (bilateral) com a Scipy . . . . . . . . . . . . . . . . . . . . . 65
2.14 Teste de Wilcoxon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
2.15 Regressão Linear Simples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
2.16 Módulo com estatísticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
vii
2.17 Regressão Linear Simples com Scikit-learn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
2.18 Regressão Linear Múltipla com Scikit-learn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
Sumário
1 Análise Exploratória 11
1.1 Principais conceitos de estatística . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.2 Tipos de variáveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.3 Principais medidas de tendência central . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.3.1 Média . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.3.2 Mediana . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
1.3.3 Moda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
1.4 Principais medidas de dispersão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
1.4.1 Amplitude . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
1.4.2 Intervalo interquartil (IQR) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
1.4.3 Variância . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
1.4.4 Desvio Padrão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
1.4.5 Coeficiente de variação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
1.5 Análise de relação entre variáveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
1.6 Principais distribuições de probabilidade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
1.6.1 Distribuição de probabilidade para variável discreta . . . . . . . . . . . . . . . . . . . . 30
1.6.2 Distribuição de probabilidade para variável contínua . . . . . . . . . . . . . . . . . . . 33
1.7 Uso de módulos e bibliotecas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
2 Inferência Estatística 43
2.1 Estimação pontual e intervalar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
2.2 Teste de hipótese . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
2.2.1 Testes paramétricos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
2.2.2 Testes não paramétricos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
2.3 Análise de regressão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
2.3.1 Regressão Linear Simples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
2.3.2 Regressão Linear Múltipla . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
Capítulo 1
Análise Exploratória
Este capítulo aborda: estatística (definição, aplicação exemplos); tipos de variáveis (qualitativas: ordinal
ou nominal / quantitativas: discretas ou contínuas); medidas de tendência central (média, mediana e moda),
métricas de dispersão (amplitude, intervalo interquartil, variância, desvio padrão e coeficiente de variação),
relação entre variáveis (coeficiente de correlação de Pearson) e distribuições de probabilidade (binomial,
poisson e normal). Dados fictícios são criados para exemplificar os conceitos, assim como códigos em Python
são mostrados para calcular as métricas e consolidar o assunto.
Outro exemplo, do uso da Estatística, muito presente na vida dos brasileiros é o Instituto Brasileiro de
Geografia e Estatística (IBGE). O IBGE coleta dados do Brasil visando fornecer as informações para o conhe-
cimento da realidade do país e para o exercício da cidadania. Assim sendo, o IBGE identifica e analisa o
território, quantifica sua população, monitora a evolução da economia através do trabalho e da produção
das pessoas, assim como revela como elas vivem. Algumas das funções do IGBE são: Produção e análise
de informações estatísticas; Coordenação e consolidação das informações estatísticas; Produção e análise
de informações geográficas; Documentação e disseminação de informações; e Coordenação dos sistemas
estatístico e cartográfico nacionais (IBGE, 2023).
Destaca-se que o IBGE coleta os dados necessários via um questionário. Esse é idealizado pensando nas
variáveis de entrada e saída. Destaca-se um ponto relevante, na coleta de dados, denominado amostragem.
Ou seja, o IBGE não precisa entrevistar todos os brasileiros, mas sim uma parte da população denominada
amostra. Uma amostra é uma parte representativa da população. A palavra representativa é importante
porque senão a pesquisa pode apresentar resultados enviesados. Uma maneira de obter uma amostra re-
presentativa é via uma amostragem aleatória simples. Enumera-se os elementos da população e escolhe-se
um aleatoriamente, sendo que cada elemento tem a mesma probabilidade de pertencer a amostra.
Por exemplo, para uma empresa que produz 100.000 peças por dia e que deseja realizar o controle de
qualidade dessas peças, pode-se enumerar essas peças e sortear aleatoriamente 1000 números. Esses nú-
meros serão equivalentes às 1000 peças que compõem a amostra, sendo que cada uma dessas peças foi
aleatoriamente escolhida para fazer parte da amostra.
No entanto, essa abordagem não é interessante quando a população pode ser dividida em grupos hete-
rogêneos, pois pode-se sortear aleatoriamente apenas elementos de um determinado grupo e tornar a coleta
de dados tendenciosa, assim como as conclusões da análise desses dados. Por exemplo, pesquisa de inten-
ção de voto, sendo que às vezes essa varia de região para região dentro do Brasil. Assim sendo, essa coleta
pode ser dividida em grupos (estratos) por região, ou seja, uma amostragem estratificada. Ao final tem-se
uma amostra da população contendo partes de cada grupo (estrato). Esses tipos de amostragem (aleatória
e estratificada) são apenas alguns exemplos de amostragem. O objetivo da amostra é fornecer informações
sobre a população, por exemplo avaliando a média desses dados, seus desvios, relações entre os dados ou
concluir dados sobre a população usando inferência estatística3 .
12
CAPÍTULO 1. ANÁLISE EXPLORATÓRIA
Variáveis qualitativas são referentes a categorias, rótulos etc, ou seja, características não numéricas.
Exemplos dessas variáveis: nível de venda (baixo, médio, alto), cidade (São Luís, Imperatriz, Balsas) entre
outros. Adicionalmente, essa pode ser subdividida em ordinal ou nominal, sendo que a variável qualitativa
ordinal é quando existe uma ordem das categorias (por exemplo nível de venda: baixo, médio, alto) enquanto
que na variável qualitativa nominal não existe tal ordem (por exemplo cidade: São Luís, Imperatriz, Balsas).
As variáveis quantitativas são referentes a informações numéricas. Exemplos dessas variáveis: quanti-
dade de atendentes, taxa de clientes atendidos por hora, quantidade de eleitores etc. As variáveis quanti-
tativas podem ser subdivididas em discretas ou contínuas, sendo que a variável quantitativa discreta repre-
senta um conjunto finito/enumerável (por exemplo quantidade de atendentes ou a quantidade de eleitores)
enquanto a variável quantitativa contínua pode representar um conjunto com um número infinito de valores
(por exemplo, taxa de clientes atendidos por hora).
1.3.1 Média
Uma medida de tendência central dos dados é a média aritmética das amostras, denotada por 𝑥.̄ A
média representa a localização ou a tendência central dos dados e é obtida:
𝑛
∑ 𝑥𝑖
𝑥1 + 𝑥2 + 𝑥3 + ...𝑥𝑛 𝑖=1
𝑥̄ = =
𝑛 𝑛
Ou seja, para calcular a média amostral soma-se todos os 𝑥1 , 𝑥2 , 𝑥3 , ..., 𝑥𝑛 elementos da amostra e
divide-se essa soma por 𝑛. Portanto, um código para calcular a média pode usar um laço para somar todos
os elementos da amostra e por último dividir esse valor por 𝑛, conforme o Código 1.1 em Python4 . O Código
1.1 usa estruturas e funções típicas do Python, tais como lista, len, while, print etc.
1 #Amostra
2 amostra =[2, 8, 5]
3
4 Todos
os códigos deste livro estão disponíveis no Google Colab: <https://colab.research.google.com/drive/1jDSUc3JYXrIXbOZ-N3iFJ
BMtxwAcQhFb?authuser=1#scrollTo=ndjzFVR4zv50>
13
Paulo Ribeiro UFMA
Os elementos com # em verde (linhas 1, 4, 5, 6 etc) representam comentários, ou seja, não são executa-
dos pelo computador mas ajudam o leitor/programador no entendimento do código. O Código 1.1 usa uma
lista para armazenar as amostras: 2, 8 e 5. A função len retorna o tamanho da amostra, neste caso é 3. A
variável 𝑖 representa o índice da amostra. A variável 𝑠𝑜𝑚𝑎 guarda a soma atual, sendo que começa zerada.
Tem-se um laço da linha 9 a 12, ou seja, enquanto 𝑖 for menor que 𝑛 (tamanho da amostra) executa-se
as linhas 11 e 12. Inicialmente 𝑖 é igual a 0 e 𝑛 é igual a 3, logo, a condição 0 < 3 é verdadeira. Executa-se
a linha 11 e a variável 𝑠𝑜𝑚𝑎 será a adição do valor acumulado na variável 𝑠𝑜𝑚𝑎 que atualmente é 0 com a
amostra que está no índice/posição inicial que é 0, ou seja a primeira amostra que neste caso tem valor 2,
logo, 𝑠𝑜𝑚𝑎 = 0 + 2 e a variável 𝑠𝑜𝑚𝑎 passa a ter valor 2. Passa-se para a linha 12 e a variável 𝑖 que era zero
passa a ser 1, pois 𝑖 = 0 + 1. Como é um laço, volta-se a linha 9 para testar novamente a condição, sendo 𝑖
igual a 1 e 𝑛 igual a 3, logo, a condição 1 < 3 é verdadeira. Executa-se novamente as linhas 11 e 12, sendo
que a variável 𝑠𝑜𝑚𝑎 será igual a 10, pois 𝑠𝑜𝑚𝑎 = 2 + 8, ou seja, o valor que estava acumulado, neste caso 2,
mais o valor da próxima amostra que é 8, 𝑖 passa a ser 2. Testa-se mais uma vez a condição, 𝑖 é igual a 2 e 𝑛
é igual a 3, logo, a condição 2 < 3 é verdadeira. Executa-se novamente as linhas 11 e 12, a variável 𝑠𝑜𝑚𝑎 será
igual a 15, pois 𝑠𝑜𝑚𝑎 = 10 + 5 enquanto 𝑖 passa a ser 3. Testa-se mais uma vez a condição, 𝑖 é igual a 3 e 𝑛
é igual a 3, logo, a condição 3 < 3 é falsa. Portanto, executa-se a linha 15 e divide-se o valor armazenado na
variável 𝑠𝑜𝑚𝑎 que é 15 pelo valor de 𝑛 que é 3, logo, a média é 5. A linha 18 usa a função print para mostrar
na tela: "A média da amostra é 5".
Pode-se utilizar o Código 1.1, entretanto, o ideal é criar uma função. Uma função tem um nome, pode
receber parâmetros de entrada e retorna parâmetros de saída. O Código 1.2 cria a função denominada
FuncaoMedia que tem como parâmetro de entrada os dados da amostra em uma lista (𝑑𝑎𝑑𝑜𝑠_𝑎𝑚𝑜𝑠𝑡𝑟𝑎), e
retorna a média dos elementos dessa lista. Os elementos da linha 3 a 10 são equivalentes ao Código 1.1. A
linha 11 retorna o valor da média. A linha 16 mostra como usar a função criada nas linhas (de 2 a 11), ou seja,
a variável 𝑚𝑒𝑑𝑖𝑎 recebe o retorno da função FuncaoMedia que tem como parâmetro de entrada a amostra
dos dados que é a lista [2, 8, 5].
1 #Define a função média - FuncaoMedia
2 def FuncaoMedia(dados_amostra):
3 n=len(dados_amostra) # Obtém -se o tamanho da amostra
4 i=0
5 soma =0
6 #Laço para somar todos os elementos: somatório
7 while(i<n):
8 soma += dados_amostra[i] #Igual a soma=soma+dados_amostra[i]
9 i+=1
14
CAPÍTULO 1. ANÁLISE EXPLORATÓRIA
10 valor_media=soma/n
11 return valor_media
12
13 #Amostra
14 amostra =[2, 8, 5]
15 #A variável média recebe o valor da FuncaoMedia
16 media=FuncaoMedia(amostra)
17 #Por último mostra -se a média
18 print('A média da amostra é ', media)
Ao invés de criar todos os passos da função média, pode-se utilizar algumas funções do Python para
determinados passos, por exemplo a função sum que realiza a soma dos elementos de uma lista. A média
será a divisão dessa soma pelo tamanho da amostra (lista), que como visto acima pode ser obtido usando a
função len. O Código 1.3 representa essa implementação. Posteriormente, será abordado o uso de funções
de bibliotecas, sendo que será possível calcular a média com apenas uma linha (por exemplo com a função
mean).
1 #Define a função média - FuncaoMedia
2 def FuncaoMedia(dados_amostra):
3 n=len(dados_amostra) # Obtém -se o tamanho da amostra
4 soma=sum(dados_amostra) #Funcão 'sum' soma todos os dados
5 valor_media=soma/n
6 return valor_media
7
8 #Amostra
9 amostra =[2, 8, 5]
10 #A variável média recebe o valor da FuncaoMedia
11 media=FuncaoMedia(amostra)
12 #Por último mostra -se a média
13 print('A média da amostra é ', media)
Além de calcular o valor da média, pode-se visualizar a média em relação a amostra. Para isso pode-se
usar um gráfico chamado diagrama de pontos. A Figura 1.1 mostra o diagrama de pontos para a amostra (2,
8 e 5) representada por círculos verde enquanto a média (𝑥̄ = 5) é representada por um círculo azul maior.
Pela Figura 1.1 percebe-se como a média representa a tendência central dos dados.
2 3 4 5 6 7 8
15
Paulo Ribeiro UFMA
A Figura 1.1 é para uma amostra pequena. A Figura 1.2 mostra o digrama de pontos para outra amostra:
2, 3, 9, 1, 4, 8, 6, 7, 0, 5 com 𝑥̄ = 4, 5.
0 2 4 6 8
Pode-se gerar o diagrama de pontos mostrado na Figura 1.2 com o Código 1.4. Para calcular o diagrama
de qualquer amostra altera-se apenas os dados da linha 15 do Código 1.4.
1 # Biblioteca matplotlib e arviz
2 import matplotlib.pyplot as plt
3 import arviz as az
4
14 #Amostra
15 amostra =[2, 3, 9, 1, 4, 8, 6, 7, 0, 5]
16
17 #Calcula a média
18 media=sum(amostra)/len(amostra)
19
23 #Usa a função
24 PlotaDiagramaPontos (amostra , media)
16
CAPÍTULO 1. ANÁLISE EXPLORATÓRIA
1.3.2 Mediana
Similar a média tem-se a mediana como uma medida de representação central dos dados. No entanto,
essa divide os dados em duas partes, uma parte para os valores que são inferiores à mediana enquanto a
outra parte contém os valores maiores que a mediana. Ou seja, a mediana representa o meio dos dados.
No entanto, para obter a mediana os dados precisam estar ordenados. Desta forma, a mediana é obtida
encontrando o valor do meio desses dados ordenados:
𝑛+1
P𝑜𝑠 =
2
𝑛−1
Desta forma a parte inferior terá 2 elementos, assim como a parte superior. Por exemplo, para os
dados (5, 8, 2, 7, 1, 0, 3, 11, 6) tem-se que primeiramente ordenar os dados. A Tabela 1.1 mostra uma coluna
com a posição dos elementos, amostra inicial dos dados e os dados ordenados.
9+1
Como 𝑛 = 9 (ímpar), a posição da mediana é 2 = 5. Ou seja, a mediana será o 5ª elemento da amostra
ordenada, isto é, M𝑑 = 5 para a amostra 5, 8, 2, 7, 1, 0, 3, 11, 6 que ordenada fica 0, 1, 2, 3, 5, 6, 7, 8, 11. Percebe-
se que a mediana (M𝑑 = 5) divide os dados em dois grupos: i) grupo com valores menores que 5 (0, 1, 2, 3); ii)
grupo com valores maiores que 5 (6, 7, 8, 11). Adicionalmente, verifica-se que cada grupo (inferior e superior a
9−1
mediana) possui 2 = 4 elementos, pois a lista ordenada é: i) grupo inferior; ii) mediana; iii) grupo superior.
No entanto, pensando em Python deve-se lembrar que o índice/posição começa em zero. Ou seja, a
primeira coluna (posição) da Tabela 1.1 deve subtrair 1 de cada elemento, isto é, começar em 0 e ir até 8.
Desta forma, a mediana continua sendo 5, mas a sua posição agora é 4, conforme exemplificado na Tabela
1.2.
17
Paulo Ribeiro UFMA
Portanto, uma possível implementação para a mediana usando a equação da mediana acima deve sub-
𝑛+1
trair 1 ao final, ou seja, a posição da mediana pode ser calculada por P𝑜𝑠 = 2 − 1, conforme linha 11 do
Código 1.5.
1 #Amostra
2 amostra =[5, 8, 2, 7, 1, 0, 3, 11, 6]
3
Entretanto, caso n seja par, a mediana será a média aritmética dos dois valores no meio, ou seja, a média
𝑛 𝑛
do elemento na posição 2 e 2 + 1, conforme:
𝑥( 𝑛2 ) + 𝑥( 𝑛2 + 1)
M𝑑 =
2
Por exemplo, para os dados 2, 11, 9, 15, 7, 8, 6, 14, 3, 5 tem-se 𝑛 = 10 (par), sua versão ordenada é 2, 3, 5, 6, 7,
7+8
8, 9, 11, 14, 15, logo a mediana será M𝑑 = 2 = 7, 5, pois 7 está na posição 5 ( 𝑛2 com 𝑛 = 10) enquanto 8 está
na posição 6 ( 𝑛2 + 1 com 𝑛 = 10).
Em relação a programação em Python sabe-se que deve subtrair 1 do índice/posição, logo, a mediana
𝑥( 𝑛 𝑛
2 −1)+𝑥( 2 )
(𝑛 par) pode ser calculada por M𝑑 = 2 , conforme linha 14 do Código 1.6. Esse é o código completo
para qualquer 𝑛 (par ou ímpar). Foi criada a função FuncaoMediana que recebe como parâmetro de entrada
a amostra e retorna a mediana desses dados. A linha 9 testa se a amostra é impar, caso sim, executa as
18
CAPÍTULO 1. ANÁLISE EXPLORATÓRIA
linhas de 10 e 11, caso seja par executa a linha 14. Verifca-se que as linhas 10 e 11 são equivalentes ao do
Código 1.5 para 𝑛 sendo ímpar.
1 #Define a função mediana - FuncaoMediana
2 def FuncaoMediana(dados_amostra):
3 #Ordena -se os dados (ordem crescente)
4 amostra_ordenada=sorted(dados_amostra)
5
16 return mediana
17
18
19 #Amostra
20 amostra =[2, 11, 9, 15, 7, 8, 6, 14, 3, 5]
21
1.3.3 Moda
Outra medida interessante visando resumir os dados é chamada de moda (M𝑜 ). A moda é o valor mais
frequente nos dados, ou seja, o dado que mais aparece no conjunto. Portanto para os dados 1, 3, 12, 17, 6, 6, 7,
7, 6, 17 tem-se que a moda é M𝑜 = 6, pois ele aparece três vezes. Um conjunto de dados pode ser em relação
à moda (TAVARES, 2021): i) unimodal (possui apenas uma moda;); ii) amodal (não possui moda); iii) multi-
modal (possui mais de uma moda). O Código 1.7 mostra o cálculo para os dados acima, sendo essa uma
amostra unimodal.
1 #Biblioteca numpy
2 import numpy as np
3
4 #Amostra
5 amostra =[1, 3, 12, 17, 6, 6, 7, 7, 6, 17]
6
19
Paulo Ribeiro UFMA
A função unique da biblioteca NumPy retorna os elementos sem repetição e suas quantidades - linha 8.
Para a amostra 1, 3, 12, 17, 6, 6, 7, 7, 6, 17: tem-se que os elementos sem repetição são elementos (1, 3, 6, 7, 12, 17);
suas respectivas quantidades são quantidades (1, 1, 3, 2, 1, 2), ou seja, o número 1 aparece uma vez, 3 apa-
rece uma vez, 6 aparece três vezes, 7 aparece duas vezes, 12 aparece uma vez e 17 aparece duas vezes. A
linha 11 obtém o índice (2), pois essa é a posição do maior valor (3) da variável quantidades, isto é, as três re-
petições do valor seis. Com esse índice (indice_com_mais_repeticoes) acessa-se a variável elementos nessa
posição e obtém-se o valor 6.
1.4.1 Amplitude
A amplitude mede a distância entre o maior e o menor valor do conjunto de dados,
A = 𝑚𝑎𝑥(𝑥) − 𝑚𝑖𝑛(𝑥)
Por exemplo, para os dados 5, 8, 2, 7, 1, 0, 3, 11 e 6, exemplo da mediana (M𝑑 = 5) com 𝑛 = 9 (ímpar), sua
versão ordenada é 0, 1, 2, 3, 5, 6, 7, 8 e 11, ou seja, A = 𝑚𝑎𝑥(𝑥) − 𝑚𝑖𝑛(𝑥) = 11 − 0 = 11. Similarmente, para os
dados 2, 11, 9, 15, 7, 8, 6, 14, 3 e 5, exemplo da mediana (M𝑑 = 7, 5) com 𝑛 = 10 (par), sua versão ordenada é
2, 3, 5, 6, 7, 8, 9, 11, 14, e 15, logo A = 𝑚𝑎𝑥(𝑥) − 𝑚𝑖𝑛(𝑥) = 15 − 2 = 13.
Entretanto, a amplitude pode não ser uma boa métrica caso os extremos sejam discrepantes, por exem-
plo para uma amostra 0, 5, 6, 7, 6, 5, 7, 5 e 1000 tem-se uma mediana (M𝑑 = 6) e uma amplitude A = 𝑚𝑎𝑥(𝑥) −
𝑚𝑖𝑛(𝑥) = 1000 − 0 = 1000.
1. Primeiro Quartil ou quartil inferior (Q1): 25% dos dados estão abaixo dele;
2. Segundo Quartil (Q2): 50% abaixo e 50% acima, ou seja, é a mediana dos dados;
3. Terceiro Quartil ou quartil superior (Q3): 75% dos dados abaixo dele;
20
CAPÍTULO 1. ANÁLISE EXPLORATÓRIA
Com esses quartis pode-se definir o IQR, também chamada de amplitude inter-quartílica (AIQ), que é a
distância entre o primeiro e o terceiro quartil:
IQR = Q3 − Q1
Além de calcular essas métricas pode ser interessante vê-las visualmente, por exemplo usando um box-
plot (diagrama de caixa) como mostrado na Figura 1.3. No boxplot tem-se: outliers que são valores atípicos/-
discrepantes; limite inferior (Q1 − 1, 5 ∗ AIQ); primeiro quartil (Q1); segundo quartil (Q2 que é a mediana M𝑑 );
terceiro quartil (Q3); e limite superior (Q3 + 1, 5 ∗ AIQ).
Figura 1.3: Boxplot: outliers, limite inferior, Q1, Q2, Q3 e limite superior.
Pode-se visualmente analisar a dispersão dos dados com o boxplot. Por exemplo, o boxplot para os
dados 5, 8, 2, 7, 1, 0, 3, 11 e 6 (exemplo da mediana M𝑑 = 5) pode ser visto na Figura 1.4. Para esses dados não
existem outliers, logo o limite inferior é o menor valor dos dados (0); Q1 = 2; Q2 = M𝑑 = 5 e é representado
pela linha laranja; Q3 = 7; e o limite superior é o maior valor dos dados (11). Desta forma: IQR = 5.
10
8
6
4
2
0
1
21
Paulo Ribeiro UFMA
Esse gráfico pode ser obtido com o Código 1.8. A linha 10 usa a função boxplot da biblioteca Matplotlib.
1 # Biblioteca matplotlib
2 import matplotlib.pyplot as plt
3
4 #Amostra
5 amostra =[5, 8, 2, 7, 1, 0, 3, 11, 6]
6
Trocando os dados da linha 5, Código 1.8, por 5, 10, 70, 40, 50, 40, 60, 50, 70, 50, 70, 50, 120, 110, 100 obtém-
se a Figura 1.5 com: um outlier abaixo (5), limite inferior é 10; Q1 = 45; Q2 = M𝑑 = 50; Q3 = 70; limite superior
é 100; e tem-se dois outlier acima (110 e 120). Logo, IQR = 25. A dispersão desses dados pode ser observada
no boxplot, assim como via seu IQR.
120
100
80
60
40
20
0 1
22
CAPÍTULO 1. ANÁLISE EXPLORATÓRIA
10
8
6
4
2
0
5 #Amostra
6 amostra =[5, 8, 2, 7, 1, 0, 3, 11, 6]
7
1.4.3 Variância
Uma das medidas mais usadas para aferir a variabilidade ou dispersão nos dados é denominada variân-
cia (𝑠2 ). Essa métrica mostra se os dados estão próximos ou distantes do valor central. Ela soma o quadrado
desses desvios em relação a média, e divide esse somatório por 𝑛 − 1, ou seja:
𝑛
∑ (𝑥𝑖 − 𝑥)̄ 2
𝑖=1
𝑠2 =
𝑛−1
Considerando o termo quadrático na equação da variância, percebe-se que sua unidade é o quadrado
da unidade de observação. Por exemplo, se uma amostra de altura é medida em metros (𝑚), logo a unidade
da variância para esses dados será dada em 𝑚2 .
𝑎 𝑛
Tendo em vista que a equação da variância possui elementos similares a média, tais como ∑ 𝑥𝑖 ,
etc,
𝑖=1 𝑏
pode-se implementar uma função para variância similar ao Código 1.2, conforme demonstrado no Código
1.10.
1 #Define a função variância - FuncaoVariancia
2 def FuncaoVariancia(dados_amostra):
3 n=len(dados_amostra) # Obtém -se o tamanho da amostra
23
Paulo Ribeiro UFMA
4 i=0
5 soma =0
6 media=FuncaoMedia(dados_amostra) #Obtém média
7 #Laço para somar todos os desvios: somatório
8 while(i<n):
9 soma += (dados_amostra[i]-media)**2
10 i+=1
11 valor_variancia=soma /(n-1) #Divide por n-1
12 return valor_variancia
13
26 #Amostra
27 amostra =[5, 8, 2, 7, 1, 0, 3, 11, 6]
28 #A variável variância recebe o valor da FuncaoVariancia
29 variancia=FuncaoVariancia(amostra)
30 #Por último mostra -se a variância
31 print('A variância da amostra é ', variancia)
32
O Código 1.10 demonstra a importância do uso de funções, criadas com def em Python, pois para calcular
a variância precisa-se da média. Logo, a função FuncaoMedia (criada no Código 1.2) é chamada na linha 6
do código da variância. Ou seja, existe reutilização de código.
Executando esse código da variância para a amostra 5, 8, 2, 7, 1, 0, 3, 11, 6 (exemplo IQR) tem-se 𝑥̄ = 4, 77
e 𝑠2 = 12, 94 enquanto que o mesmo código para a amostra 5, 10, 70, 40, 50, 40, 60, 50, 70, 50, 70, 50, 120, 110, 100
(outro exemplo do IQR) tem-se 𝑥̄ = 59, 66 e 𝑠2 = 1051, 66. Desta forma, assim como pelo IQR, constata-se
que a segunda amostra tem uma dispersão maior que a primeira.
24
CAPÍTULO 1. ANÁLISE EXPLORATÓRIA
√ 𝑛
√
√ ∑ (𝑥𝑖 − 𝑥)̄ 2
√ 𝑖=1
𝑠=
⎷ 𝑛−1
Assim sendo, considerando que o desvio padrão (𝑠) é a raiz quadrada da variância pode-se construir um
código, usando a função variância do Código 1.10, que faz a raiz quadrada deste valor, conforme demons-
trado no Código 1.11. A linha 3 do Código 1.11 obtém a variância enquanto a linha 4 aplica a raiz quadrada,
√
ou seja, eleva a variância a 0, 5 pois 𝑥 = 𝑥0,5 .
1 #Define a função desvio padrão - FuncaoDesvioPadrao
2 def FuncaoDesvioPadrao (dados_amostra):
3 variancia=FuncaoVariancia(dados_amostra) #Obtém variância
4 valor_desvio_padrao =variancia **0.5 #Raiz quadrada
5 return valor_desvio_padrao
6
32 #Amostra
33 amostra =[5, 8, 2, 7, 1, 0, 3, 11, 6]
34 #A variável desvio padrão recebe o valor da FuncaoDesvioPadrao
35 desvio_padrao= FuncaoDesvioPadrao (amostra)
36 #Por último mostra -se o desvio padrão
37 print('O desvio padrão da amostra é ', desvio_padrao)
25
Paulo Ribeiro UFMA
𝑠
CV = × 100
𝑥̄
Ao invés de analisar isoladamente a altura (amostra 𝑎) ou o peso (𝑝), por exemplo usando a média ou
o desvio padrão, pode ser mais relevante analisar a relação da altura com o peso, ou seja, como 𝑎 varia em
relação a 𝑝. Para uma análise visual pode-se usar um diagrama de dispersão com mostrado na Figura 1.6,
sendo que essa foi construída com o Código 1.12
1 # Biblioteca matplotlib
2 import matplotlib.pyplot as plt
3
26
CAPÍTULO 1. ANÁLISE EXPLORATÓRIA
15 #Amostras
16 a=[1.6 , 1.9, 1.7, 1.5, 1.4, 2.0, 1.8]
17 p=[75, 95, 80, 70, 68, 98, 85]
18
19 #Usa a função
20 PlotaGrafico(a, p)
95
90
Peso (kg)
85
80
75
70
1.4 1.5 1.6 1.7 1.8 1.9 2.0
Altura (m)
Considerando que o peso (𝑝) tende a aumentar quando a altura (𝑎) aumenta diz-se que existe uma
correlação positiva entre essas variáveis. No entanto, pode ser preciso quantificar essa relação, por exemplo
usando o coeficiente de correlação linear de Pearson (𝑟𝑥𝑦 ) obtido por:
𝑛
∑ (𝑥𝑖 − 𝑥)̄ × (𝑦𝑖 − 𝑦)̄
𝑖=1
𝑟𝑥𝑦 =
𝑛 𝑛
√ ∑ (𝑥𝑖 − 𝑥)̄ 2 × √ ∑ (𝑦𝑖 − 𝑦)̄ 2
𝑖=1 𝑖=1
O coeficiente de correlação linear de Pearson (𝑟𝑥𝑦 ) não possui unidade de medida e está no intervalo
entre −1 e 1, sendo que: i) 𝑟𝑥𝑦 = −1 indica uma associação linear perfeita (negativa), ou seja, a medida que
27
Paulo Ribeiro UFMA
𝑥 cresce 𝑦 decresce; ii) 𝑟𝑥𝑦 = 1 indica uma associação linear perfeita (positiva), logo, a medida que 𝑥 cresce
𝑦 cresce; iii) 𝑟𝑥𝑦 = 0 indica ausência de associação linear entre as variáveis.
A Figura 1.6 sugere uma correlação positiva entre peso e altura, sendo que pode-se confirmar numeri-
camente essa relação com o coeficiente de correlação linear de Pearson que para esses dados é 𝑟𝑥𝑦 = 0, 99
(Código 1.13).
1 #Função para calcular correlação de Pearson
2 def CorrelacaoPearson (x, y):
3 n=len(x) # Obtém -se o tamanho da amostra
4 i=0
5 soma_num =0 # Soma numerador
6 soma_den_x =0 # Soma numerador
7 soma_den_y =0 # Soma numerador
8 media_x=FuncaoMedia(x) #Obtém média de x
9 media_y=FuncaoMedia(y) #Obtém média de y
10 #Laço para somar os elementos
11 while(i<n):
12 soma_num += (x[i]-media_x)*(y[i]-media_y) #Numerador
13 soma_den_x += (x[i]-media_x)**2 #Denominador x
14 soma_den_y += (y[i]-media_y)**2 #Denominador y
15 i+=1
16 #Após os somatórios
17 soma_den_x=soma_den_x **0.5 # Raiz quadrada denominado x
18 soma_den_y=soma_den_y **0.5 # Raiz quadrada denominado y
19 soma_denominador=soma_den_x*soma_den_y #Denominador
20 #Coeficiente: divisão da soma do numerador com a do denominador
21 coeficiente = soma_num/soma_denominador
22 return coeficiente
23
36 #Amostras
37 a=[1.6 , 1.9, 1.7, 1.5, 1.4, 2.0, 1.8]
38 p=[75, 95, 80, 70, 68, 98, 85]
39
No entanto, para uma análise de duas variáveis peso do carro (𝑘𝑔) e seu rendimento (𝑘𝑚/𝑙), sendo
𝑝 = [980, 1050, 900, 950, 920, 1080, 1000] e 𝑟 = [7.8, 7.2, 8.6, 8.0, 8.3, 7.0, 7.4] tem-se a Figura 1.7, obtida trocando
as amostras e os labels no Código 1.12 (linhas 11, 12, 16 e 17). Complementarmente, pode-se usar Código
1.13 para quantificar essa relação, nomeadamente 𝑟𝑥𝑦 = −0, 98. Como a correlação é negativa, os dados
sugerem que quanto maior o peso do carro menor o seu rendimento.
28
CAPÍTULO 1. ANÁLISE EXPLORATÓRIA
8.6
8.4
8.2
Rendimento (km/l)
8.0
7.8
7.6
7.4
7.2
7.0
900 925 950 975 1000 1025 1050 1075
Peso (kg)
29
Paulo Ribeiro UFMA
𝑝(𝑥𝑖 ) = P(X = 𝑥𝑖 )
Ou seja, para cada 𝑥𝑖 tem-se um número 𝑝(𝑥𝑖 ) denominado probabilidade de 𝑥𝑖 , sendo que devem
∞
satisfazer: i) 𝑝(𝑥𝑖 ) ≥ 0 ∀𝑖; ii) ∑ 𝑝(𝑥𝑖 ) = 1
𝑖=1
Distribuição Binomial
Caso a variável seja discreta e binária, ou seja, sucesso ou fracasso, defeituosa ou não defeituosa, sim
ou não 0 ou 1 etc pode-se usar a distribuição binomial para obter a probabilidade de ocorrência de 𝑘 suces-
sos/defeituosas/sim/1 sendo que probabilidade de sucesso/defeituosa/sim/1, denominada 𝑝, foi informada
e é constante durante o experimento (𝑛 repetições).
𝑛
P(X = 𝑘) = ( )𝑝𝑘 (1 − 𝑝)𝑛−𝑘
𝑘
Por exemplo, um restaurante consulta seus clientes sobre seus serviços, sendo que a resposta pode
ser gostou ou não gostou. A variável aleatória X pode ser a quantidade de clientes que gostaram. Um
experimento com 20 clientes é realizado. Logo, para uma probabilidade 𝑝 = 0, 4 do cliente gostar do serviço
e com 𝑛 = 20, calcula-se probabilidade para 𝑘 clientes gostarem:
20!
P(X = 0) = (0, 4)0 (1 − 0, 4)20−0 = 3, 66 × 10−5
0!(20 − 0)!
20!
P(X = 1) = (0, 4)1 (1 − 0, 4)20−1 = 4, 88 × 10−4
1!(20 − 1)!
...
20!
P(X = 8) = (0, 4)8 (1 − 0, 4)20−8 = 0, 18
8!(20 − 8)!
...
30
CAPÍTULO 1. ANÁLISE EXPLORATÓRIA
20!
P(X = 19) = (0, 4)19 (1 − 0, 4)20−19 = 3, 30 × 10−7
19!(20 − 19)!
20!
P(X = 20) = (0, 4)20 (1 − 0, 4)20−20 = 1, 10 × 10−8
20!(20 − 20)!
Esses resultados podem ser verificados com o Código 1.14, sendo que implementou-se a função fatorial
para modularizar mais a função da distribuição binomial. Percebe-se pela equação dessa distribuição que
o termo fatorial se repete três vezes, por isso a modularização em funções colabora no reaproveitamento de
código. Pode-se simular qualquer outro problema que use a distribuição binomial, alterando apenas o valor
de 𝑝, 𝑛 e 𝑘 nas linhas 25, 26 e 27, respectivamente.
1 #Define a função para distribuição binomial
2 def Distribuicao_Binomial (p, n, k):
3 #Inicialmente usa -se a função fatorial
4 fatorial_n=Fatorial(n)
5 fatorial_k=Fatorial(k)
6 fatorial_n_menos_k =Fatorial(n-k)
7 #Calcula a combinacao
8 combinacao =( fatorial_n)/( fatorial_k*fatorial_n_menos_k )
9 #Calcula as potências
10 potencias =(p**k)*((1-p)**(n-k))
11 #Calcula a probabilidade de k
12 probabilidade_k=combinacao*potencias
13 return probabilidade_k
14
Distribuição de Poisson
A distribuição de Poisson é muito útil para eventos que ocorrem dentro de um intervalo de tempo (ou
outra unidade). Por exemplo, para o problema do supermercado citado no início do capítulo, sabendo que
em média um atendente (caixa do supermercado) atende 100 clientes por dia, sendo essa taxa denominada
λ. Usando a distribuição de poisson pode-se calcular a probabilidade do caixa atender 0, 1, ...., 100, ...., ∞
clientes em um dia.
31
Paulo Ribeiro UFMA
𝑒−λ × λ 𝑘
P(X = 𝑘) =
𝑘!
Assim sendo, para esse caixa, com λ = 100, pode-se calcular a probabilidade dele atender 𝑘 clientes em
um dia:
𝑒−100 × 1000
P(X = 0) = = 3, 72 × 10−44
0!
𝑒−100 × 1001
P(X = 1) = = 3, 72 × 10−42
1!
...
𝑒−100 × 100100
P(X = 100) = = 0, 04
100!
...
𝑒−100 × 100110
P(X = 110) = = 0, 02
110!
...
𝑒−100 × 100150
P(X = 150) = = 6, 51 × 10−7
150!
Esses resultados podem ser verificados com o Código 1.15, sendo que a função fatorial previamente
implementada foi reutilizada. Pode-se simular qualquer outro problema — por exemplo a quantidade 𝑘 de
requisições que um servidor web vai atender por hora/dia, desde que se conheça a taxa média de requisições
por hora/dia — alterando apenas o valor de λ e 𝑘 nas linhas 24 e 25, respectivamente.
1 #Biblioteca math para calcular exponencial
2 import math
3
32
CAPÍTULO 1. ANÁLISE EXPLORATÓRIA
12 return probabilidade_k
13
𝑏
Como ∫𝑎 𝑓(𝑥)𝑑𝑥 é a integral da função entre 𝑎 e 𝑏, logo P(𝑎 ≤ X ≤ 𝑏) é a área sob 𝑓(𝑥) e é usada
para calcular a probabilidade de X assumir um valor em [𝑎, 𝑏].
Assim sendo, P(X = 𝑧) = 0 para qualquer valor de 𝑧 da variável aleatória contínua X, pois
𝑧
∫𝑧 𝑓(𝑥)𝑑𝑥 = 0. Não existe área no intervalo [𝑧, 𝑧].
Distribuição Normal
A função densidade de probabilidade normal, também chamada de gaussiana, é a mais importante das
distribuições contínuas. Ela tem aplicações em várias áreas, tais como computação, engenharia, saúde
etc. Essa é vastamente conhecida pela sua forma de sino, conforme Figura 1.8. Essa função densidade
probabilidade é caracterizada por seus dois parâmetros: média (μ) e desvio padrão (σ).
Percebe-se que ela é simétrica em relação a média. Adicionalmente, aproximadamente 68, 3% dos valo-
res se desviam 1 desvio padrão da média, ou seja, estão entre [μ − σ, μ + σ]. Complementarmente, 95, 5% dos
valores estão entre [μ − 2σ, μ + 2σ] e 99, 7% dos valores estão entre [μ − 3σ, μ + 3σ]. Assim sendo, caso o preço
médio do arroz branco 1𝑘𝑔 nos supermercados seja R$ 7, 20 com desvio padrão de R$ 0, 50, logo, sem nenhum
33
Paulo Ribeiro UFMA
Figura 1.8: Distribuição Normal com seus parâmetros: média (μ) e desvio padrão (σ)
cálculo complicado sabe-se que a probabilidade de encontrar um arroz com valor entre R$6, 70 e R$7, 70 é
aproximadamente 68%, ou seja, [7, 20 − 0, 50 , 7, 20 + 0, 50]. Logo, a probabilidade de encontrar um arroz mais
barato que R$5, 70 ou mais caro que R$8, 70 é baixa (menor que 0, 3%), pois seria menor que 7, 20 − 3 × 0, 50
ou maior que 7, 20 + 3 × 0, 50.
Desta forma, verifica-se a importância da distribuição normal, pois com seus parâmetros média (μ) e
desvio padrão (σ) várias informações e dados podem ser deduzidos. Para uma variável aleatória contínua X
com distribuição normal, tem-se:
2
1 (𝑥 − μ)
1 −
𝑓(𝑥) = √ 𝑒 2 σ2
σ 2π
No entanto, a distribuição não é comumente usada e opta-se pela sua versão padronizada Z, denomi-
nada distribuição normal padrão, tal que Z ∼ 𝒩(0, 1). Ou seja, os dados de X são normalizados para uma
distribuição com média 0 e variância 1.
X−μ
Z=
σ
Uma das vantagens em usar Z é que essa versão padronizada é tabelada. Com ela podemos calcular
P(Z ≤ 𝑧), ou seja o valor para Z no intervalo [−∞, 𝑧].
34
CAPÍTULO 1. ANÁLISE EXPLORATÓRIA
Para o caso da normal padrão, a função de distribuição acumulada é denotada por φ(𝑧) e como
μ = 0 e σ = 1, tem-se:
𝑧
1 𝑠2
F(𝑧) = φ(𝑧) = ∫ √ 𝑒− 2 𝑑𝑠
−∞ 2π
A Tabela 1.4 demonstra os valores das probabilidades para φ(𝑧). Ou seja, pode-se calcular P(Z ≤ 𝑧).
Essa tabela é facilmente encontradas em livros (MONTGOMERY; RUNGER, 2024; MEYER, 2011) e na internet
(<https://www.ime.unicamp.br/~cnaber/tabela_normal.pdf> e <http://www.leg.ufpr.br/~silvia/CE00
1/tabela-normal.pdf>). A primeira coluna dessa tabela possui alguns valores de 𝑧 5 . As demais colunas
representam as casas centesimais, enquanto a interseção da linha com a coluna é a probabilidade.
5 Pelo tamanho da tabela optou-se por mostrar apenas os positivos entre [0, 3]. Mas ela existe para valores negativos também
35
Paulo Ribeiro UFMA
A Figura 1.9 ilustra P(Z ≤ 0, 52), ou seja a área sob a função no intervalo [−∞, 0, 52]. Assim sendo, para
𝑧 = 0, 52, procura-se na primeira coluna da Tabela 1.4 o número 0, 5 (marcado de vermelho) enquanto que
na quarta coluna a casa centesimal 0, 02 (marcada de verde), logo, a interseção da linha com a coluna é a
probabilidade 0, 6985 (marcada de ciano), isto é, P(Z ≤ 0, 52) = 0, 6985. Desta forma, a probabilidade da
variável Z assumir um valor menor ou igual a 0, 52 é igual a 69, 85%.
Figura 1.9: Distribuição Normal padrão: P(Z ≤ 0, 52) é a área sombreada em ciano
0.40
0.35
0.30
0.25
0.20
f(z)
0.15
0.10
0.05
0.00
3.0 2.5 2.0 1.5 1.0 0.5 0.0 0.5 1.0 1.5 2.0 2.5 3.0 3.5
z
Para o exemplo do supermercado, sabendo que preço médio do arroz branco 1𝑘𝑔 nos supermercados é
R$ 7, 20 com desvio padrão de R$ 0, 50, ou seja, X ∼ 𝒩(7, 20 , 0, 5) pode-se determinar a probabilidade de
encontrar um arroz com valor menor ou igual a R$7, 50 isto é, P(X ≤ 7, 50). Primeiramente converte-se para
Z:
X−μ 7, 50 − 7, 20
Z= = = 0, 6
σ 0, 5
Uma vez obtido o valor de Z = 0, 6, procura-se na Tabela 1.4 e P(X ≤ 7, 50) = 0, 7257, logo, a probabili-
dade de encontrar um arroz com valor menor ou igual a R$7, 50 é de 72, 57%.
No entanto, pode ser necessário encontrar mais probabilidades, não apenas um preço com valor menor
ou igual a um determinado 𝑘, como encontrado anteriormente com preço menor ou igual R$7, 50, isto é, P(X ≤
7, 50). Por exemplo, pode ser interessante obter a probabilidade de encontrar um preço entre [7, 50 , 7, 60], ou
seja obter P(7, 50 ≤ X ≤ 7, 60). Para esses casos podemos obter a função densidade probabilidade usando
a distribuição acumulada.
36
CAPÍTULO 1. ANÁLISE EXPLORATÓRIA
Ou seja, para obter P(𝑎 ≤ X ≤ 𝑏) pode-se obter a área F(𝑏) de 𝑓(𝑥) no intervalo [−∞, 𝑏], a área
F(𝑎) de 𝑓(𝑥) no intervalo [−∞, 𝑎] e subtraindo essas áreas, F(𝑏) − F(𝑎), tem-se a área no intervalo
[𝑎, 𝑏], isto é P(𝑎 ≤ X ≤ 𝑏). Similarmente para a distribuição normal padrão:
Desta forma pode-se encontrar a probabilidade de encontrar um preço do arroz entre [7, 50 , 7, 60], ou
seja obter P(7, 50 ≤ X ≤ 7, 60), pois P(7, 50 ≤ X ≤ 7, 60) = F(7, 60) − F(7, 50) que para o caso da normal
X−μ
padronizada torna-se P(0, 6 ≤ Z ≤ 0, 8) = φ(0, 8) − φ(0, 6) usando Z = σ . Usando a Tabela 1.4 obtém-
se P(0, 6 ≤ Z ≤ 0, 8) = 0, 7881 − 0, 7257 = 0.0624. Portanto, a probabilidade de encontrar arroz branco
1𝑘𝑔 nos supermercados custando entre [7, 50 , 7, 60] é de 6, 24%. A Figura 1.10 mostra a representação de
P(0, 6 ≤ Z ≤ 0, 8), ou seja, á área da função entre [0, 6, 0, 8].
0.40
0.35
0.30
0.25
0.20
f(z)
0.15
0.10
0.05
0.00
3.0 2.5 2.0 1.5 1.0 0.5 0.0 0.5 1.0 1.5 2.0 2.5 3.0 3.5
z
O Código 1.16 converte os valores de X no intervalo [𝑎, 𝑏] para Z no intervalo [𝑐, 𝑑]. Com os valores de 𝑐 e
𝑑 consulta-se a Tabela 1.4 e subtrai-se as probabilidades φ(𝑑) − φ(𝑐), como demonstrado acima no cálculo
de P(7, 50 ≤ X ≤ 7, 60) usando P(0, 6 ≤ Z ≤ 0, 8).
1 #Distribuição normal
2 med =7.2 #media
3 des_pad =0.5 # desvio padrao
4
5 #Intervalo de X
6 a=7.5 # valor 'a' de X
7 b=7.6 # valor 'b' de X
8
37
Paulo Ribeiro UFMA
4 #Amostra
5 amostra =[2, 3, 9, 1, 4, 8, 6, 7, 0, 5]
6
Pode-se importar uma função específica de um módulo ou bilioteca, assim como várias outras funções.
Assim sendo, para não ter que digitar o nome de cada função pode-se usar a sintaxe da linha 1 do Código
1.18. No entanto, para usar a função mean deve-se usar o nome do módulo/bilioteca com um “.” e o nome da
função, conforme linha 8 do código: statistics.mean.
1 #Importa statistics
2 import statistics
3
4 #Amostra
5 amostra =[2, 3, 9, 1, 4, 8, 6, 7, 0, 5]
6
Pode-se abreviar o uso do nome do módulo/biblioteca com import statistics as est, como mostrado
na linha 1 do Código 1.19. Por isso a linha 8 desse código é est.mean. Isso evita ter que escrever statis-
tics.mean, sendo que optou-se pela abreviação est mas qualquer palavra pode ser usada.
1 #Importa statistics com abreviação
2 import statistics as est
3
4 #Amostra
5 amostra =[2, 3, 9, 1, 4, 8, 6, 7, 0, 5]
6
38
CAPÍTULO 1. ANÁLISE EXPLORATÓRIA
Similarmente para a NumPy e SciPy, conforme mostrado nos Códigos 1.20 e 1.216 .
1 #Importa numpy com abreviação
2 import numpy as np
3
4 #Amostra
5 amostra =[2, 3, 9, 1, 4, 8, 6, 7, 0, 5]
6
4 #Amostra
5 amostra =[2, 3, 9, 1, 4, 8, 6, 7, 0, 5]
6
Usando esses módulos/bibliotecas pode-se obter facilmente: média, mediana, variância, desvio padrão,
IQR, coeficiente de correlação, assim como probabilidades binomial, poisson e normal, conforme mostrado
no Código 1.22. Os valores da média, mediana, variância e desvio padrão são calculados com as funções
mean, median, var e std da numpy nas linhas 8, 9, 10 e 11, respectivamente. IQR é obtido com a função iqr da
scipy na linha 18. O coeficiente de correlação usa a função corrcoef da numpy na linha 25. Os parâmetros
da distribuição binomial são definidos nas linhas 32, 33 e 34 enquanto a probabilidade é calculada na linha
36 com a função binom.pmf da scipy. Similarmente para a distribuição Poisson, parâmetros nas linhas 40 e
41, probabilidade com a função poisson.pmf da scipy na linha 43. Para o caso da distribuição normal tem o
caso para P(Z ≤ 𝑧) da linha 47 a 49 e utilizando a função norm.cdf da scipy. Para o caso da probabilidade
em um intervalo P(𝑧1 ≤ Z ≤ 𝑧2) chama-se a função norm.cdf para 𝑧1 e 𝑧2 e subtrai-se as probabilidades
(linha 56 p_intervalo=prob2-prob1).
1 #Importa com abreviações
2 import numpy as np
3 import scipy.stats as sp
4
5 #Amostra
6 amostra =[5, 8, 2, 7, 1, 0, 3, 11, 6]
7 #Cálcula: média , mediana , variância e desvio padrão
8 media=np.mean(amostra)
9 mediana=np.median(amostra)
10 variancia=np.var(amostra , ddof =1)
11 desv_padrao=np.std(amostra , ddof =1)
6 Executando esse código tem-se que scipy.mean está depreciado e será removido na versão SciPy 2.0.0.
39
Paulo Ribeiro UFMA
12 #Mostra resultado
13 print('A média da amostra é ', media)
14 print('A mediana da amostra é ', mediana)
15 print('A variância da amostra é ', variancia)
16 print('O desvio padrão da amostra é ', desv_padrao)
17 #Cálcula IQR
18 IQR=sp.iqr(amostra)
19 print('\nO IQR é ', IQR)
20
28
31 #Parâmetros da Binomial
32 n=20
33 p=0.4
34 k=8
35 #Cálculo da probabilidade binomial
36 p_binomial=sp.binom.pmf(k, n, p)
37 print('\nBinomial: probabilidade para k=',k,'é',p_binomial)
38
39 #Parâmetros da Poison
40 valor_lambda =100
41 k=110
42 #Cálculo da probabilidade poisson
43 p_poisson=sp.poisson.pmf(k, valor_lambda)
44 print('Poisson: probabilidade para k=',k,'é',p_poisson)
45
Para o exemplo acima utilizou-se a NumPy e SciPy, entretanto, pode-se optar por apenas uma ou usar as
três, ou seja incluir a Statistics. O uso de bibliotecas depende do problema e da familiaridade do programador
com as bibliotecas.
40
CAPÍTULO 1. ANÁLISE EXPLORATÓRIA
• Statistics: <https://docs.python.org/pt-br/3/library/statistics.html>
• NumPy: <https://numpy.org/doc/stable/reference/routines.statistics.html>
• SciPy: <https://docs.scipy.org/doc/scipy/reference/stats.html>
41
Capítulo 2
Inferência Estatística
A inferência estatística fornece informações sobre uma população baseada em dados de uma amostra
representativa dessa população. Ou seja, ela permite generalizar, a partir dos dados amostrais, informações
sobre a população.
A inferência estatística pode ser dividida em: estimação de parâmetros e teste de hipótese (MONTGO-
MERY; RUNGER, 2024). Pode-se calcular a média da amostra, como abordado no capítulo anterior, entre-
tanto, com a inferência estatística pode-se fornecer uma estimativa pontual da média da população, assim
como definir um intervalo para essa estimativa. A teoria de probabilidade pode ser aplicada para determinar
esse intervalo. Adicionalmente, pode-se determinar o grau de confiança dessas estimativas. Complemen-
tarmente, pode-se prever — via regressão — valores para dados que não foram coletados. Por fim, experi-
mentos podem ser realizados para testar uma determinada hipótese, por exemplo para criação de um novo
remédio, vacina etc.
Desta forma, o presente capítulo aborda: estimação pontual e intervalar, teste de hipóteses, e regressão.
Por exemplo, para uma variável aleatória X normalmente distribuída e com média μ desconhecida, tem-
se que média da amostra é um estimador pontual de μ, ou seja, μ = 𝑥.̄ Similarmente, para o caso de uma
variância (σ2 ) desconhecida, isto é σ2 = 𝑠2 . Ou seja, a variável aleatória X̄ tem distribuição de probabilidade,
denominada distribuição amostral da média. Logo, considerando X1 , X2 , …, X𝑛 como variáveis aleatórias
independentes e com mesma distribuição de probabilidade, tem-se que:
μ + μ + ...μ
μX̄ = =μ
𝑛
2 σ2 + σ2 + ...σ2 σ2
σX ̄ = =
𝑛2 𝑛
Caso a distribuição de probabilidade seja desconhecida, a distribuição amostral da média será aproxi-
2
madamente normal, com média (μ) e variância ( σ𝑛 ), para um valor de 𝑛 grande, conforme o teorema central
do limite.
X̄ − μ
Z=
√σ
𝑛
quando 𝑛 → ∞, tende a distribuição normal padrão 𝒩(0, 1) (MONTGOMERY; RUNGER, 2024; MEYER,
2011).
Assim sendo, pelo teorema central do limite, a distribuição da média amostral 𝑥̄ é normal. No entanto,
essa aproximação depende do valor de 𝑛. Um valor comumente usado é 𝑛 > 30 (MONTGOMERY; RUNGER,
2024; TAVARES, 2021).
Por exemplo, sabendo que a potência média de uma lâmpada é 50 w, desvio padrão é5 e tem distribui-
ção normal. Pode-se realizar uma amostra com 40 lâmpadas e encontrar a probabilidade de encontrar uma
amostra com potência média menor que 48 w, isto é P(X̄ < 48). Primeiro calcula-se o desvio padrão, σ ̄ , X
também chamado de erro-padrão da média amostral:
σ 5
σX̄ = √σ2X̄ = √ = √ ≈ 0, 7906
𝑛 40
Com esse valor calcula-se Z (teorema central do limite):
X̄ − μ 48 − 50
Z= = = −2, 53
√σ 0, 7906
𝑛
Ou seja:
44
CAPÍTULO 2. INFERÊNCIA ESTATÍSTICA
4 #Tamanho da amostra
5 n=40
6
7 #Distribuição normal
8 med_amos =50 #media
9 des_pad_amos =5 # desvio padrao
10
14 #Valor de X
15 X=48
16
20 #Cálculo da probabilidade
21 probabilidade=norm.cdf(z)
22
Caso o desvio padrão (σ) não seja conhecido, pode-se substituir o desvio padrão (𝑠) da amostra, assim
sendo o erro-padrão estimado de X̄ é:
σ 𝑠
σX̄ = √ = √
𝑛 𝑛
Conforme comentado no capítulo anterior, para uma distribuição normal várias conclusões podem ser
facilmente obtidas. Assim sendo, com o estimador tendo uma distribuição normal, o valor verdadeiro do
parâmetro estará entre dois erros-padrão da estimativa. Para casos mais conservadores, o valor verdadeiro
do parâmetro difere da estimativa por no máximo quatro erros-padrão (MONTGOMERY; RUNGER, 2024).
Desta forma, pode-se determinar um intervalo para o valor verdadeiro do parâmetro. O Código 2.2 mos-
tra um exemplo para uma amostra qualquer (por exemplo peso de pessoas em 𝑘𝑔). A linha 23 calcula o limite
inferior como sendo a média menos duas vezes o erro padrão, assim como a linha 24 determina o limite su-
perior como sendo a média mais duas vezes o erro padrão. Para este exemplo tem-se: 𝑥̄ = 60, 22, 𝑠 = 0, 64,
𝑛 = 36, σX̄ = 0, 11 com intervalo [60, 01, 60, 44]. Desta forma, pode-se ter uma confiança que o valor médio,
neste caso peso médio, está entre 60, 22 ± 0, 22.
1 import numpy as np
2 from math import sqrt
3
4 #Amostra
5 amostra =[60.2 , 60.1, 60.7, 60.2, 61.2, 60.1,
6 60.1, 61.1, 59.3, 60.1, 58.9, 61.3,
2 Neste caso, uma com valores negativos de Z: <http://www.leg.ufpr.br/~silvia/CE001/tabela-normal.pdf>
45
Paulo Ribeiro UFMA
12 #Tamanho da amostra
13 n=len(amostra)
14
15 #Estatísticas da amostra
16 med_amos=np.mean(amostra) #media
17 des_pad_amos=np.std(amostra , ddof =1) #desvio padrao
18
22 #Cálculo do intervalo
23 lim_inf=med_amos -2* des_pad #Inferior
24 lim_sup=med_amos +2* des_pad #Superior
25
26 #Mostra valores
27 print('A média é ', med_amos)
28 print('O desvio padrão da amostra é ', des_pad_amos)
29 print('O erro padrão é ', des_pad)
30 print('Intervalo: [', lim_inf , ',', lim_sup , ']')
Adicionalmente, pode-se quantificar essa faixa de valores, ou seja, determinar um intervalo de confiança.
Esse nível de confiança pode ser 90%, 95%, 99% etc. Logo, a precisão da estimação pode ser medida pelo
comprimento do intervalo. Quanto menor o intervalo, mais precisa a estimação. O intervalo não afirma
com certeza, que o parâmetro está certamente dentro dessa faixa de valores, mas sim que com uma certa
confiança o intervalo pode ter o valor do parâmetro (MONTGOMERY; RUNGER, 2024).
Conforme abordado na distribuição normal [μ − 2σ, μ + 2σ] contempla 95, 5% dos valores (Figura 1.8),
logo para 95% [μ − 1, 96σ, μ + 1, 96σ]. Para o intervalo de confiança desejado, modifica-se o multiplicador de
σ por um valor, por exemplo 𝑘, No entanto, para uma amostra μ e σ são desconhecidos e tem-se o intervalo
de tolerância: [𝑥̄ − 𝑘𝑠, 𝑥̄ + 𝑘𝑠], sendo que 𝑥̄ e 𝑠 são estimativas, por isso 𝑘 deve ser maior que 1, 96 para
contemplar 95%, pois tem-se o erro das estimativas.
Para o caso da amostra aleatória (X1 , X2 , …, X𝑛 ), com distribuição normal, com μ desconhecida mas σ2
conhecida, pode-se determinar um intervalo de confiança para μ na forma 𝑙𝑖 ≤ μ ≤ 𝑙𝑠 , sendo 𝑙𝑖 o e 𝑙𝑠 o limite
inferior e superior, respectivamente. 𝑙𝑖 e 𝑙𝑠 são os extremos de variáveis aleatórias LI o e LS . Ou seja, pode-se
calcular a probabilidade P(𝑙𝑖 ≤ μ ≤ 𝑙𝑠 ) = 𝑝, sendo 𝑝 o coeficiente de confiança, ou seja, a probabilidade de
selecionar uma amostra para o qual o intervalo contém μ. 𝑝 é comumente expresso como 𝑝 = 1 − α. Para
α = 0, 5 tem-se 𝑝 = 0, 95 ou seja o intervalo tem 95% de confiança de conter μ (MONTGOMERY; RUNGER,
2024).
P(−𝑧 ≤ Z ≤ 𝑧) = 1 − α
46
CAPÍTULO 2. INFERÊNCIA ESTATÍSTICA
̄
X−μ
Sabendo que Z = √σ ,tem-se:
𝑛
X̄ − μ
P(−𝑧 ≤ ≤ 𝑧) = 1 − α
√σ
𝑛
σ σ
P(X̄ − 𝑧 √ ≤ μ ≤ X̄ + 𝑧 √ ) = 1 − α
𝑛 𝑛
Como a área sob o intervalo [𝑥̄ − 𝑧 √σ𝑛 , 𝑥̄ + 𝑧 √σ𝑛 ] é 1 − α, as áreas no intervalo [−∞, 𝑥̄ − 𝑧 √σ𝑛 ] e
[𝑥̄ + 𝑧 √σ𝑛 , ∞] são simétricas e tem valor α
2 cada. Ou seja, 𝑧 é escolhido de tal forma que P(𝑧 ≤ Z) = α
2
α
e P(𝑧 ≥ Z) = 2, portanto, tem-se o problema inverso ao abordado até o momento. Pois informava-se
𝑧 para obter sua probabilidade, por exemplo com a tabela da distribuição normal padrão. Para este
problema inverso, dada a probabilidade 1 − α2 descobre-se o 𝑧 associado a esta probabilidade, sendo
esse denotado por 𝑧 α2 , logo o intervalo para média é:
σ σ
𝑥̄ − 𝑧 α2 √ ≤ μ ≤ 𝑥̄ + 𝑧 α2 √
𝑛 𝑛
A Figura abaixo ilustra em ciano a área (delimitada pelas barras vermelhas) 1 − α do intervalo,
α
assim como as áreas laterais 2 para cada lado, e os equivalentes −𝑧 α2 e 𝑧 α2 .
Por exemplo, para a amostra do Código 2.2, visando um intervalo de confiança de 95% de conter μ tem-
se o Código 2.3. A linha 18 recebe o desvio padrão conhecido (0, 6 para efeitos de simulação). O valor de
α é definido na linha 24. Obtém-se 𝑧 α2 na linha 27 com a função norm.ppf da SciPy, sendo essa a inversa
α
da norm.cdf, pois informa-se a probabilidade (1 − 2 = 1 − 0, 025 = 0, 975) e obtém-se 𝑧0,975 ≈ 1, 96. Com
𝑥̄ = 60, 22, σ = 0, 6, 𝑛 = 36, σX̄ = 0, 10, o cálculo do intervalo é:
0, 10 0, 10
60, 22 − 1, 96 √ ≤ μ ≤ 60, 22 + 1, 96 √
36 36
Com o intervalo de confiança de 95% obtido (60, 026 , 60, 418) para a média (μ), não se pode afirmar que
95% das vezes a média amostral estará nesse intervalo. Pois para uma nova amostra aleatória, X̄ pode ser
47
Paulo Ribeiro UFMA
diferente, dado que ela é uma variável aleatória, logo possui extremos do intervalo de confiança diferentes.
Pode-se afirmar que 95% das vezes μ estará contida nesse intervalo (MEYER, 2011).
1 import numpy as np
2 from math import sqrt
3 from scipy.stats import norm
4
5 #Amostra
6 amostra =[60.2 , 60.1, 60.7, 60.2, 61.2, 60.1,
7 60.1, 61.1, 59.3, 60.1, 58.9, 61.3,
8 60.3, 60.2, 60.7, 59.2, 60.6, 59.6,
9 60.2, 61.0, 59.4, 61.2, 59.7, 60.2,
10 60.5, 58.7, 59.9, 59.8, 60.8, 60.1,
11 60.7, 59.9, 60.1, 60.7, 60.1, 61.1]
12
13 #Tamanho da amostra
14 n=len(amostra)
15
16 #Dados
17 med_amos=np.mean(amostra) #media
18 des_pad_conhecido =0.6 #desvio padrao conhecido
19
23 #Intervalo de confianca
24 alpha =0.05 # Intervalo de confianca 95%
25
29 #Cálculo do intervalo
30 lim_inf=med_amos -z*des_pad #Inferior
31 lim_sup=med_amos+z*des_pad #Superior
32
33 #Mostra valores
34 print('A média é ', med_amos)
35 print('O erro padrão é ', des_pad)
36 print('Intervalo: [', lim_inf , ',', lim_sup , ']')
O Código 2.3 foi criado para explicar cada passo da estimação do intervalo. No entanto, a biblioteca
SciPy já possui uma função para estimar um intervalo, nomeadamente norm.interval3 . Essa função recebe
três parâmetros como entrada: intervalo de confiança, média amostral e erro-padrão da média amostral, e
retorna o intervalo, conforme mostrado na linha 29 do Código 2.4. Percebe-se que com esse código não é
necessário obter 𝑧 α2 , nem calcular 𝑥̄ − 𝑧 α2 √σ𝑛 e 𝑥̄ + 𝑧 α2 √σ𝑛 .
1 import numpy as np
2 from math import sqrt
3 from scipy.stats import norm
4
5 #Amostra
6 amostra =[60.2 , 60.1, 60.7, 60.2, 61.2, 60.1,
7 60.1, 61.1, 59.3, 60.1, 58.9, 61.3,
8 60.3, 60.2, 60.7, 59.2, 60.6, 59.6,
9 60.2, 61.0, 59.4, 61.2, 59.7, 60.2,
3 https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.norm.html
48
CAPÍTULO 2. INFERÊNCIA ESTATÍSTICA
13 #Tamanho da amostra
14 n=len(amostra)
15
16 #Dados
17 med_amos=np.mean(amostra) #media
18 des_pad_conhecido =0.6 #desvio padrao conhecido
19
23 #Intervalo de confianca
24 alpha =0.05 # Intervalo de confianca 95%
25
26 #Mostra valores
27 print('A média é ', med_amos)
28 print('O erro padrão é ', des_pad)
29 print('Intervalo:', norm.interval (1-alpha , loc=med_amos , scale=des_pad))
Abordou-se o caso da amostra aleatória (X1 , X2 , …, X𝑛 ), com distribuição normal, com μ desconhecida
mas σ2 conhecida. Entretanto, σ2 geralmente não é conhecida. Para o caso de μ e σ2 desconhecidas tem-
se um raciocínio semelhante, mas com pequenas adaptações desde que a amostra seja grande. Pois pelo
σ2
teorema central do limite X tende a uma distribuição normal com média μ e variância 𝑛 . Mas como σ é
desconhecido e 𝑛 é grande pode-se usar o desvio padrão amostral (𝑠):
σ σ
𝑥̄ − 𝑧 α2 √ ≤ μ ≤ 𝑥̄ + 𝑧 α2 √
𝑛 𝑛
Fazendo σ ≈ 𝑠:
𝑠 𝑠
𝑥̄ − 𝑧 α2 √ ≤ μ ≤ 𝑥̄ + 𝑧 α2 √
𝑛 𝑛
Assim sendo, o Código 2.3 pode ser alterado, linha 18 que recebia o desvio padrão conhecido, para
calcular o desvio padrão amostral, conforme linha 19 do Código 2.5. Visando ter mais dados, uma linha
adicional de dados — linha 12 — foi adicionada na amostra (𝑛 = 42). Desta forma com 𝑥̄ = 60, 26, 𝑠 = 0, 652,
𝑛 = 42, σX̄ = 0, 10 e 𝑧0,975 ≈ 1, 96 obtém-se: 60, 070 ≤ μ ≤ 60, 464.
49
Paulo Ribeiro UFMA
1 import numpy as np
2 from math import sqrt
3 from scipy.stats import norm
4
5 #Amostra
6 amostra =[60.2 , 60.1, 60.7, 60.2, 61.2, 60.1,
7 60.1, 61.1, 59.3, 60.1, 58.9, 61.3,
8 60.3, 60.2, 60.7, 59.2, 60.6, 59.6,
9 60.2, 61.0, 59.4, 61.2, 59.7, 60.2,
10 60.5, 58.7, 59.9, 59.8, 60.8, 60.1,
11 60.6, 61.2, 59.7, 61.3, 60.7, 59.7,
12 60.7, 59.9, 60.1, 60.7, 60.1, 61.1]
13
14 #Tamanho da amostra
15 n=len(amostra)
16
17 #Dados
18 med_amos=np.mean(amostra) #media
19 des_pad_amostral=np.std(amostra , ddof =1) #desvio padrao
20
24 #Intervalo de confianca
25 alpha =0.05 # Intervalo de confianca 95%
26
30 #Cálculo do intervalo
31 lim_inf=med_amos -z*des_pad #Inferior
32 lim_sup=med_amos+z*des_pad #Superior
33
34 #Mostra valores
35 print('A média é ', med_amos)
36 print('O erro padrão é ', des_pad)
37 print('Intervalo: [', lim_inf , ',', lim_sup , ']')
Entretanto, para alguns problemas 𝑛 não é suficientemente grande. Mas pode-se seguir um raciocínio
̄
X−μ ̄
X−μ
similar com Z = √σ fazendo σ = 𝑠 e obtém-se uma outra variável aleatória (T), ou seja T = √S
com 𝑘 graus
𝑛 𝑛
4
de liberdade (𝑘 = 𝑛 − 1) . Desta forma uma distribuição diferente, denominada Distribuição t de Student é
necessária.
Essa distribuição é simétrica e similar a normal, vide Figura 2.1. Ela possui valor máximo para média
μ = 0. No entanto, destaca-se que ela tem extremidades (caudas) mais espessas que a distribuição normal,
portanto os valores nas extremidades são maiores do que seriam na distribuição normal. Destaca-se que
4 Graus de liberdade: número de observações independentes
50
CAPÍTULO 2. INFERÊNCIA ESTATÍSTICA
com o aumento de 𝑘, a distribuição t de Student tende a distribuição normal padrão (MEYER, 2011; MONT-
GOMERY; RUNGER, 2024), como pode ser observado na Figura 2.1.
0.40 k=5
0.35 k=10
0.30 k=50
0.25
0.20
f(t)
0.15
0.10
0.05
0.00
3 2 1 0 1 2 3
t
Similarmente a distribuição normal padrão, devido a sua importância, a distribuição t de Student também
é tabelada, conforme Tabela 2.1. Para determinar o seu valor deve-se especificar α e 𝑘, obtendo assim 𝑡α,𝑘 .
Na primeira coluna tem-se os valores de 𝑘 enquanto nas demais colunas têm-se os valores para α.
O Código 2.6 exemplifica este caso (𝑛 pequeno) usando uma amostra similar a usada até o momento.
Removeu-se algumas linhas da amostra para que essa tenha um 𝑛 pequeno (𝑛 = 24), logo 𝑘 = 23. Deseja-
se obter um intervalo de confiança de 95%, isto é, α = 0, 05. Para encontrar 𝑡0,05 , 9 utiliza-se a Tabela 2.1,
procura-se a linha com 𝑘 = 23 (marcado de vermelho), assim como a coluna com α = 0, 05 (marcado de
verde), tem-se como interseção da linha com a coluna a probabilidade 2, 0687 (marcada de ciano), isto é 𝑡0,05
, 9 ≈ 2, 07. Desta forma, com 𝑥̄ = 60, 23, 𝑠 = 0, 66, σX̄ = 0, 13 tem-se:
𝑠 𝑠
𝑥̄ − 𝑡α,𝑘 √ ≤ μ ≤ 𝑥̄ + 𝑡α,𝑘 √
𝑛 𝑛
0, 66 0, 66
60, 23 − 2, 07 √ ≤ μ ≤ 60, 23 + 2, 07 √
24 24
1 import numpy as np
2 from math import sqrt
3 from scipy.stats import t
51
Paulo Ribeiro UFMA
5 #Amostra
6 amostra =[60.2 , 60.1, 60.7, 60.2, 61.2, 60.1,
7 60.1, 61.1, 59.3, 60.1, 58.9, 61.3,
8 60.3, 60.2, 60.7, 59.2, 60.6, 59.6,
9 60.2, 61.0, 59.4, 61.2, 59.7, 60.2]
10
11 #Tamanho da amostra
12 n=len(amostra)
13 #n=10
14 k=n-1 #graus de liberdade
15
16 #Dados
17 med_amos=np.mean(amostra) #media
18 des_pad_amostral=np.std(amostra , ddof =1) #desvio padrao
19 #med_amos =10.48
20 #des_pad_amostral =1.36
21
25 #Intervalo de confianca
26 alpha =0.05 # Intervalo de confianca 95%
27
31 #Cálculo do intervalo
32 lim_inf=med_amos -t*des_pad #Inferior
33 lim_sup=med_amos+t*des_pad #Superior
34
35 #Mostra valores
36 print('A média é ', med_amos)
37 print('O erro padrão é ', des_pad)
38 print('Intervalo: [', lim_inf , ',', lim_sup , ']')
52
CAPÍTULO 2. INFERÊNCIA ESTATÍSTICA
𝑛/α 0.5 0.4 0.3 0.2 0.1 0.05 0.02 0.01 0.001
1 1.0000 1.3764 1.9626 3.0777 6.3138 12.7062 31.8205 63.6567 636.6192
2 0.8165 1.0607 1.3862 1.8856 2.9200 4.3027 6.9646 9.9248 31.5991
3 0.7649 0.9785 1.2498 1.6377 2.3534 3.1824 4.5407 5.8409 12.9240
4 0.7407 0.9410 1.1896 1.5332 2.1318 2.7764 3.7469 4.6041 8.6103
5 0.7267 0.9195 1.1558 1.4759 2.0150 2.5706 3.3649 4.0321 6.8688
6 0.7176 0.9057 1.1342 1.4398 1.9432 2.4469 3.1427 3.7074 5.9588
7 0.7111 0.8960 1.1192 1.4149 1.8946 2.3646 2.9980 3.4995 5.4079
8 0.7064 0.8889 1.1081 1.3968 1.8595 2.3060 2.8965 3.3554 5.0413
9 0.7027 0.8834 1.0997 1.3830 1.8331 2.2622 2.8214 3.2498 4.7809
10 0.6998 0.8791 1.0931 1.3722 1.8125 2.2281 2.7638 3.1693 4.5869
11 0.6974 0.8755 1.0877 1.3634 1.7959 2.2010 2.7181 3.1058 4.4370
12 0.6955 0.8726 1.0832 1.3562 1.7823 2.1788 2.6810 3.0545 4.3178
13 0.6938 0.8702 1.0795 1.3502 1.7709 2.1604 2.6503 3.0123 4.2208
14 0.6924 0.8681 1.0763 1.3450 1.7613 2.1448 2.6245 2.9768 4.1405
15 0.6912 0.8662 1.0735 1.3406 1.7531 2.1314 2.6025 2.9467 4.0728
16 0.6901 0.8647 1.0711 1.3368 1.7459 2.1199 2.5835 2.9208 4.0150
17 0.6892 0.8633 1.0690 1.3334 1.7396 2.1098 2.5669 2.8982 3.9651
18 0.6884 0.8620 1.0672 1.3304 1.7341 2.1009 2.5524 2.8784 3.9216
19 0.6876 0.8610 1.0655 1.3277 1.7291 2.0930 2.5395 2.8609 3.8834
20 0.6870 0.8600 1.0640 1.3253 1.7247 2.0860 2.5280 2.8453 3.8495
21 0.6864 0.8591 1.0627 1.3232 1.7207 2.0796 2.5176 2.8314 3.8193
22 0.6858 0.8583 1.0614 1.3212 1.7171 2.0739 2.5083 2.8188 3.7921
23 0.6853 0.8575 1.0603 1.3195 1.7139 2.0687 2.4999 2.8073 3.7676
24 0.6848 0.8569 1.0593 1.3178 1.7109 2.0639 2.4922 2.7969 3.7454
25 0.6844 0.8562 1.0584 1.3163 1.7081 2.0595 2.4851 2.7874 3.7251
26 0.6840 0.8557 1.0575 1.3150 1.7056 2.0555 2.4786 2.7787 3.7066
27 0.6837 0.8551 1.0567 1.3137 1.7033 2.0518 2.4727 2.7707 3.6896
28 0.6834 0.8546 1.0560 1.3125 1.7011 2.0484 2.4671 2.7633 3.6739
29 0.6830 0.8542 1.0553 1.3114 1.6991 2.0452 2.4620 2.7564 3.6594
30 0.6828 0.8538 1.0547 1.3104 1.6973 2.0423 2.4573 2.7500 3.6460
Além de estimar um valor para um determinado parâmetro, conforme seção anterior, pode-se optar por
assumir um determinado valor para esse parâmetro e, utilizando os dados da amostra e um teste de hipó-
tese, confirmar ou rejeitar esse valor assumido. Complementarmente, o teste de hipótese permite comparar
grupos/amostras (por exemplo X1 e X2 ), entretanto, essa comparação não é baseada somente nos valores
das médias, ou seja, não informa apenas se o valor numérico de X̄ 1 é maior que o valor numérico de X̄ 2 .
Por exemplo, dado um conjunto de dados de entrada para dois classificadores (C1 e C2 ), assim como
uma métrica (pode ser acurácia, precisão etc), tem-se que para parte desses dados a métrica para C1 vai
ser melhor que a métrica para C2 , enquanto que para outras partes C2 terá melhor métrica. Uma abordagem
é fazer a média desses resultados e comparar M̄ C1 e M̄ C2 , sendo MC𝑖 a métrica para o classificador 𝑖. Ao
final pode-se obter: M̄ C1 > M̄ C2 . No entanto, isso pode ter acontecido ao acaso. Com o teste de hipótese
pode-se calcular a probabilidade de M̄ C1 > M̄ C2 ter ocorrido ao acaso, isto é, o classificador C1 não é melhor
que C2 , mesmo tendo média de classificação numericamente maior que a média para C2 . Assim sendo, o
teste de hipótese fornece mais informações do que uma comparação direta do valor numérico das médias.
Para realização do teste de hipótese tem-se dois tipos de testes:
53
Paulo Ribeiro UFMA
1. Testes Paramétricos: A variável aleatória estudada assume uma determinada distribuição de proba-
bilidade;
Os testes paramétricos e não paramétricos serão apresentados em detalhes nas subseções seguintes.
Uma empresa farmacêutica tem um medicamento 𝑚𝑎 para febre, sendo 𝑚𝑎 um medicamento produzido
pela empresa há anos. Esse é bem aceito no mercado, ou seja, está consolidado. Sabe-se que o tempo neces-
sário (em minutos) para 𝑚𝑎 reduzir a febre (por exemplo de 40∘ C pra 36∘ C) é normalmente distribuído: 𝒩(60 ,
9). No entanto, após alguns anos um funcionário da empresa ouve relatos de pacientes que os remédios atu-
ais da empresa estão mais eficazes, isto é, reduzem mais rápido a febre dos pacientes. Considerando que o
√
mesmo processo para produção dos remédios é usado, tem-se que a variância é igual, ou seja, σ = 9 = 3.
Considerando a distribuição 𝒩(μ , σ) com σ conhecido e pretende-se comparar a média de uma amostra,
esse teste é denominado teste Z para uma amostra (one sample Z-test). Esse teste pode ser usado para
testar a hipótese dos usuários do remédio 𝑚𝑎 . Ele pode ser usado para uma população com distribuição
normal com desvio padrão populacional conhecido ou para uma amostra com 𝑛 grande.
Para realizar esse teste, também denominado experimento, realiza-se uma amostragem de pessoas com
febre. Destaca-se que essas pessoas devem ter características de febre similar, ou seja, valores semelhantes,
tempo similar de febre etc. O objetivo é testar se μ < 60. Ou seja, tem-se um conhecimento prévio H0 ∶ μ = 60
e pretende-se verificar H1 ∶ μ < 60, sendo H0 denominada hipótese nula (básica) enquanto H1 é a hipótese
alternativa. O teste de hipótese é formulado como:
H0 ∶ μ = μ 0
H1 ∶ μ < μ 0
Equação 2.6. Tipo de erro e nível de significância (α) do teste (MONTGOMERY, 2012)
54
CAPÍTULO 2. INFERÊNCIA ESTATÍSTICA
Em teste de hipóteses especifica-se um valor para o erro do tipo 1, isto é, α que é denominado nível de
significância do teste, sendo que valores comumente adotados para α são 0, 05 e 0, 01.
Tendo uma amostra 𝑛 suficientemente grande de pacientes, com média amostral 𝑥,̄ sabe-se que a variá-
𝑥−μ
̄ 𝑜
vel aleatória tenderá a distribuição normal, ou seja: Z𝑜 = √σ . Desta forma, dado um nível de significância
𝑛
α pode-se determinar qual seu Z equivalente — similar ao problema inverso da estimação intervalar da se-
ção anterior — denominado Zα ou ponto crítico. Portanto, para que os dados da amostra indiquem que a
redução de febre atualmente com o remédio 𝑚𝑎 é mais rápida que antigamente, tem-se que ter Z𝑜 < −Zα .
Para realizar o experimento uma amostra de pessoas ingere o remédio atual e registra-se o tempo em
minutos para reduzir a febre de cada pessoa de 40∘ C pra 36∘ C. O Código 2.7 ilustra cada passo do teste. Da
linha 6 a 11 tem-se o tempo que cada paciente precisou para baixar a febre. A linha 17 calcula a média dessa
amostra. Os dados da população estão na linha 20 e 21. O nível de significância (α) é escolhido como 0, 05
(linha 27). O Zα (ponto crítico) é determinado para o α especificado, sendo que para α = 0, 05 sabe-se, de
𝑥−μ
̄ 𝑜
exemplos anteriores e da tabela de distribuição normal, Zα ≈ 1, 64. Obtém-se Z𝑜 = √σ na linha 33. Por
𝑛
fim, compara se Z𝑜 < −Zα na linha 39, que caso verdadeiro rejeita H0 . Para esses dados, tem-se 𝑛 = 36,
𝑥̄ = 58, 72 e σ = 3, logo:
𝑥 ̄ − μ𝑜 58, 72 − 60
Z𝑜 = σ = ≈ −2, 55
√ 3
𝑛 √
36
Assim sendo, tem-se que −2, 55 < −1, 64 (Z𝑜 < −Zα ), portanto, pode-se rejeitar a hipótese nula (H0 ∶
μ = 60) e aceitar a hipótese alternativa H1 ∶ μ < 60 com um nível de confiança ≤ 5% (α = 0, 05). Logo, o
tempo que os remédios atuais levam para reduzir a febre é menor que 60 minutos, ou seja, mais rápido que
anteriormente.
1 import numpy as np
2 from math import sqrt
3 from scipy.stats import norm
4
5 #Amostra
6 amostra =[60.2 , 56.1, 60.7, 59.2, 61.2, 60.1,
7 56.1, 61.1, 59.3, 52.1, 58.9, 54.3,
8 60.3, 57.2, 58.7, 59.2, 57.6, 59.6,
9 57.2, 61.0, 59.4, 61.2, 54.7, 60.2,
10 59.5, 58.7, 56.9, 59.8, 60.8, 59.1,
11 60.7, 56.9, 60.1, 56.7, 58.1, 61.1]
12
13 #Tamanho da amostra
14 n=len(amostra)
15
16 #Dados da amostra
17 med_amos=np.mean(amostra) #media amostral
18
19 #Dados
20 med_populacao =60 # média conhecida
21 des_pad_populacao =3 #desvio padrão conhecido
22
26 #Nível de significância
27 alpha =0.05
28
55
Paulo Ribeiro UFMA
35 #Mostra z crítico e z
36 print('Valor de z crítico:', z_critico , ' e zo calculado ', zo)
37
A Figura 2.2 explana o processo para rejeição ou não de H0 . Para qualquer Z𝑜 no intervalo [−∞ , −Zα ],
isto é Z𝑜 < −Zα , rejeita-se H0 , bem como para Z𝑜 no intervalo [−Zα , ∞] não rejeita H0 . Para o exemplo do
remédio verifica-se que Z𝑜 = −2, 55, menor que −Z0,05 = −1, 64, portanto, rejeita-se H0 .
3.0 2.5 2.0 1.5 1.0 0.5 0.0 0.5 1.0 1.5 2.0 2.5 3.0 3.5
z
Adicionalmente, considerando que Z𝑜 é bem menor que −Zα , pode-se determinar o valor da probabili-
dade associada a Z𝑜 similarmente como encontrou-se que para α = 0, 05 tem-se Z0,05 = 1, 64. Este valor
para Z𝑜 é denominado valor-p e representa o menor nível de significância em que se pode rejeitar H0 usando
Z𝑜 (MONTGOMERY, 2012). Desta forma, 𝑝 = 0, 0053 para Z𝑜 = −2, 55. Este valor pode ser obtido via tabela
de distribuição normal ou com o a função norm.cdf. Ou seja, pode-se adicionar a linha p=norm.cdf(zo) no
Código 2.7 para obter o valor-p.
Destaca-se o uso do valor-p, pois esse é comumente usado em pesquisas científicas e engenharia. Opta-
se por reportar 𝑝, sendo que se 𝑝 < α tem-se um nível de significância menor que o especificado α. Assim
sendo, o Código 2.7 é reescrito, não sendo preciso calcular Zα , usa-se o valor 𝑝, vide Código 2.8. 𝑝 é obtido
na linha 33 e compara-se seu valor com o nível de significância desejado α, sendo que para 𝑝 < α pode-se
56
CAPÍTULO 2. INFERÊNCIA ESTATÍSTICA
rejeitar H0 com nível de significância 𝑝. Para este caso, 𝑝 = 0, 0053, por isso tem-se 0, 53% de chance de
cometer o erro de rejeitar H0 quando H0 for verdadeira, ou seja, da impressão que os pacientes têm de que
o remédio atual é mais eficaz acontecer ao acaso.
1 import numpy as np
2 from math import sqrt
3 from scipy.stats import norm
4
5 #Amostra
6 amostra =[60.2 , 56.1, 60.7, 59.2, 61.2, 60.1,
7 56.1, 61.1, 59.3, 52.1, 58.9, 54.3,
8 60.3, 57.2, 58.7, 59.2, 57.6, 59.6,
9 57.2, 61.0, 59.4, 61.2, 54.7, 60.2,
10 59.5, 58.7, 56.9, 59.8, 60.8, 59.1,
11 60.7, 56.9, 60.1, 56.7, 58.1, 61.1]
12
13 #Tamanho da amostra
14 n=len(amostra)
15
16 #Dados da amostra
17 med_amos=np.mean(amostra) #media amostral
18
19 #Dados
20 med_populacao =60 # média conhecida
21 des_pad_populacao =3 #desvio padrão conhecido
22
26 #Nível de significância
27 alpha =0.05
28
Um raciocínio similar pode ser usado para o caso do remédio demorar mais para fazer efeito, isto é,
μ > μ0 , tal que:
H0 ∶ μ = μ 0
H1 ∶ μ > μ 0
Logo, para rejeitar H0 tem-se que Z𝑜 > Zα . Para este caso, tem-se um gráfico semelhante a Figura 2.2,
entretanto, a área para rejeitar encontra-se do lado direito, pois Z𝑜 > Zα .
Os testes para essas duas hipóteses H1 ∶ μ < μ0 e H1 ∶ μ > μ0 são denominados teste unilateral a
esquerda e a direita, respectivamente. Para o caso H1 ∶ μ ≠ μ0 tem-se um teste bilateral. Por exemplo,
testar que a eficácia do remédio não mudou:
57
Paulo Ribeiro UFMA
H0 ∶ μ = μ 0
H1 ∶ μ ≠ μ 0
O teste bilateral é similar ao unilateral com a devida ressalva que para μ ≠ μ0 , tem-se que ter μ < μ0 ou
α α
μ > μ0 . Portanto, tem-se uma área a esquerda com valor 2, bem como a mesma área 2 a direita, ou seja,
similar ao exemplo do intervalo na seção anterior. Tem-se que ter um ponto crítico que separe essas duas
áreas (esquerda e direita), logo este é Z α2 .
A Figura 2.3 ilustra o processo para o teste bilateral. Para este exemplo escolheu-se α = 0, 05, logo,
Z α2 = 1, 96. Assim sendo, rejeita-se H0 para Z𝑜 < −Z α2 ou Z𝑜 > Z α2 , sendo que essa expressão pode ser
resumidamente escrita como |Z𝑜 | > Z α2 .
Não Rejeita H0
Rejeita H0
Rejeita H0
3.0 2.5 2.0 1.5 1.0 0.5 0.0 0.5 1.0 1.5 2.0 2.5 3.0 3.5
z
O Código 2.9 mostra um exemplo para o teste bilateral. A amostra foi levemente alterada para obter
um Z𝑜 diferendo do primeiro exemplo. As diferenças no código são o cálculo de Z α2 (linha 30), pois leva em
consideração α2 não apenas α como no teste unilateral. A linha 39 faz a comparação |Z𝑜 | > Z α2 , assim como
a linha 49 usa o valor-p (calculado na linha 46). Reforça-se que ambos os métodos têm o mesmo resultado,
mas com o valor-p tem-se mais informações. Para essa amostra tem-se: 𝑥̄ = 58, 58 e Z𝑜 = −2, 83 que é
menor que −Z 0,05 = −Z0,025 ≈ −1, 96. O valor-p encontrado foi 𝑝 = 0, 005. Portanto, rejeita-se H0 , e as
2
médias são diferentes. Diferente, logo pode ser maior ou menor que 60, para esses dados tem-se que é
menor: 58, 58 < 60.
1 import numpy as np
2 from math import sqrt
3 from scipy.stats import norm
4
5 #Amostra
6 amostra =[60.2 , 56.1, 60.7, 57.2, 61.2, 60.1,
7 56.1, 60.1, 59.3, 52.1, 58.9, 54.3,
8 60.3, 57.2, 58.7, 59.2, 57.6, 59.6,
9 57.2, 60.0, 59.4, 61.2, 54.7, 60.2,
10 58.5, 58.7, 56.9, 59.8, 60.8, 59.1,
58
CAPÍTULO 2. INFERÊNCIA ESTATÍSTICA
13 #Tamanho da amostra
14 n=len(amostra)
15
16 #Dados da amostra
17 med_amos=np.mean(amostra) #media amostral
18
19 #Dados
20 med_populacao =60 # média conhecida
21 des_pad_populacao =3 #desvio padrão conhecido
22
26 #Nível de significância
27 alpha =0.05
28
35 #Mostra z crítico e z
36 print('Valor de z crítico:', z_critico , ' e zo calculado ', zo)
37
H0 ∶ μ 𝑎 = μ 𝑏
H1 ∶ μ 𝑎 ≠ μ 𝑏
59
Paulo Ribeiro UFMA
Entretanto, essas hipóteses podem ser reescritas passando μ𝑏 para o lado esquerdo, ou seja, o teste é
se a diferença entre as médias é igual a 0:
H0 ∶ μ 𝑎 − μ 𝑏 = 0
H1 ∶ μ 𝑎 − μ 𝑏 ≠ 0
Considerando que para o caso do teste Z para uma amostra com H0 ∶ μ = μ0 , tem-se Z𝑜 = 𝑥−μ ̄ 𝑜
√σ , portanto,
𝑛
𝑥̄ − 𝑥𝑏̄
para o teste Z de duas amostras com H0 ∶ μ𝑎 − μ𝑏 = 0 tem-se Z𝑜 = 𝑎 , sendo σ𝑥̄𝑎 −𝑥̄𝑏 o erro padrão que
σ𝑥̄𝑎 −𝑥̄𝑏
σ2𝑎 σ2
+ 𝑏 (MONTGOMERY, 2012).
depende de σ𝑎 , σ𝑏 , 𝑛𝑎 e 𝑛𝑏 : σ𝑥̄𝑎 −𝑥̄𝑏 = √
𝑛𝑎 𝑛𝑏
Desta forma, a expressão completa de Z𝑜 para o teste Z de duas amostras é:
𝑥𝑎̄ − 𝑥𝑏̄
Z𝑜 =
σ2𝑎 σ2
√ + 𝑏
𝑛𝑎 𝑛𝑏
Uma vez obtido Z𝑜 , o teste Z de duas amostras segue o mesmo raciocínio para o caso do teste Z para
uma amostra, isto é:
O Código 2.10 ilustra para o teste Z de duas amostras (teste bilateral). Esse código é similar aos anterio-
res. Tem-se as amostras de altura das pessoas da cidade 𝑎 e 𝑏, com 𝑛𝑎 = 𝑛𝑏 = 36, e sabe-se que σ𝑎 = 0, 08 m
e σ𝑏 = 0, 06 m (linha 29 e 30, respectivamente). O erro padrão é calculado na linha 33, conforme a equação
para o teste Z de duas amostras. Z𝑜 é calculado na linha 42 como a diferença das médias dividida pelo erro
padrão. O restante do código é igual.
1 import numpy as np
2 from math import sqrt
3 from scipy.stats import norm
4
5 #Amostra
6 amos_cid_a =[1.82 , 1.71, 1.67, 1.92, 1.69, 1.81,
7 1.81, 1.75, 1.77, 1.93, 1.73, 1.71,
8 1.72, 1.83, 1.69, 1.72, 1.65, 1.67,
9 1.69, 1.92, 1.83, 1.85, 1.89, 1.91,
10 1.83, 1.72, 1.87, 1.90, 1.76, 1.83,
11 1.91, 1.65, 1.92, 1.82, 1.69, 1.93]
12
60
CAPÍTULO 2. INFERÊNCIA ESTATÍSTICA
21 na=len(amos_cid_a)
22 nb=len(amos_cid_a)
23
32 #Erro -padrão
33 des_pad=sqrt( (( des_pad_a **2)/na) + (( des_pad_b **2)/nb) )
34
35 #Nível de significância
36 alpha =0.05
37
44 #Mostra z crítico e z
45 print('Valor de z crítico:', z_critico , ' e zo calculado ', zo)
46
Para essa amostra tem-se: 𝑥𝑎̄ = 1, 79, 𝑥𝑏̄ = 1, 83, Z𝑜 = −2, 47 que é menor que −Z 0,05 = −Z0,025 ≈ −1, 96.
2
O valor-p encontrado foi 𝑝 = 0, 016. Portanto, rejeita-se H0 , e as médias são diferentes. Diferente, significa
que pode ser maior ou menor, para esses dados têm-se que 𝑥𝑎̄ < 𝑥𝑏̄ . Logo a hipótese de que as pessoas nas
cidades 𝑐𝑎 e 𝑐𝑏 têm alturas diferentes é verdadeira, sendo que as pessoas da cidade 𝑐𝑏 são maiores que as
pessoas da cidade 𝑐𝑎 .
Teste t
Recorda-se que para cálculo do intervalo de confiança para casos com distribuição normal com variância
𝑥−μ
̄ 𝑜
populacional (σ) conhecida ou 𝑛 suficientemente grande usou-se Z = √σ . Mas para variância populacional
𝑛
𝑥−μ
̄ 𝑜
(σ) desconhecida ou que 𝑛 não seja suficientemente grande adotou-se σ = 𝑠 para obter T𝑜 = √S
. Similar-
𝑛
61
Paulo Ribeiro UFMA
mente, diferenciam-se os testes z (uma ou duas amostras) dos testes t, isto é, usa-se o teste z para variância
populacional (σ) conhecida ou 𝑛 suficientemente grande enquanto que o teste t para o oposto.
Portanto, o teste t para uma amostra (one-sample t-test) é:
Ou seja, usa-se a distribuição t de student, ao invés da distribuição normal padrão Z, sendo que 𝑘 = 𝑛−1.
Similarmente para o teste t de duas amostras (two-sample t-test) X1 e X2 :
Sendo que o |T𝑜 | para o teste t de duas amostras é um pouco diferente para uma amostra, mas assim
como |T𝑜 | para uma amostra é similar a |Z𝑜 | de uma amostra, tem-se que |T𝑜 | para duas amostras é similar
ao |Z𝑜 | para duas amostras, isto é:
𝑥1̄ − 𝑥2̄
T𝑜 =
σ𝑥̄1 −𝑥̄2
σ𝑥̄1 −𝑥̄2 é o erro padrão que depende das variâncias amostrais (S21 e S22 ), assim como dos tamanhos
1 1
das amostras(𝑛1 e 𝑛2 ): σ𝑥̄1 −𝑥̄2 = S𝑝√ + , com S2𝑝 sendo uma estimativa da variância populacio-
𝑛1 𝑛2
nal comum (σ2 = σ21 = σ22 ) e calculado como:
O Código 2.11 ilustra um exemplo para o teste t de duas amostras (bilateral). Percebe-se que esse código
é semelhante ao Código 2.10 (teste z de duas amostras - bilateral). Criou-se duas amostras menores, 𝑛1 =
𝑛2 = 18, para usar o teste t, ao invés do z. Calcula-se as variâncias amostrais (linha 24 e 25) para obter a
variância comum (linha 28). Com esses valores calcula-se o erro padrão (linha 31). O valor de 𝑘 (graus de
liberdade) é obtido na linha 34. T𝑜 (valor crítico) é obtido na linha 40, sendo que utiliza-se a função t.ppf
(não a norm.ppf). Similarmente para o valor-p, usa-se t.cdf (não norm.cdf). Portanto, como esperado, a
principal diferença entre esses códigos (teste z e teste t) é o uso da distribuição t de student ao invés da
distribuição normal padrão.
1 import numpy as np
2 from math import sqrt
3 from scipy.stats import t
4
5 #Amostra
6 amos1 =[1.80 , 1.71, 1.61, 1.92, 1.69, 1.75,
7 1.81, 1.75, 1.70, 1.93, 1.70, 1.71,
62
CAPÍTULO 2. INFERÊNCIA ESTATÍSTICA
14
23 #Variâncias amostrais
24 var_a=np.var(amos1 , ddof =1)
25 var_b=np.var(amos2 , ddof =1)
26
27 #Variância comum
28 var_comum =( ( (n1 -1)*var_a + (n2 -1)*var_b ) / (n1+n2 -2) )
29
30 #Erro -padrão
31 erro_padrao=sqrt(var_comum)*sqrt ((1/ n1) + (1/n2))
32
33 # Graus de liberdade
34 k=n1+n2 -2
35
36 #Nível de significância
37 alpha =0.05
38
42 #Cálculo da variável to
43 to=( med_amos1 - med_amos2)/erro_padrao
44
45 #Mostra z crítico e z
46 print('Valor de t crítico:', t_critico , ' e to calculado ', to)
47
63
Paulo Ribeiro UFMA
Para essa amostra tem-se: 𝑥1̄ = 1, 76, 𝑥2̄ = 1, 83, T𝑜 = −2, 29 que é menor que −T 0,05 = −T0,025 ≈
2
−2, 03. O valor-p encontrado foi 𝑝 = 0, 028. Portanto, rejeita-se H0 , e as médias das amostras são diferentes.
Diferente, significa que pode ser maior ou menor, para esses dados têm-se que 𝑥1̄ < 𝑥2̄ . Logo a hipótese de
que os valores da amostra 1 e da amostra 2 são diferentes é verdadeira, sendo que os valores da amostra 2
são maiores que os da amostra 1.
O Código 2.11 foi construído visando mostrar cada passo do teste, entretanto, a função ttest_ind da
Scipy realiza o teste t para duas amostras, conforme mostrado na linha 13 do Código 2.12). Essa função
retorna T𝑜 e 𝑝, que para essas amostras são −2, 29 e 0, 028, respectivamente.
1 from scipy.stats import ttest_ind
2
3 #Amostra
4 amos1 =[1.80 , 1.71, 1.61, 1.92, 1.69, 1.75,
5 1.81, 1.75, 1.70, 1.93, 1.70, 1.71,
6 1.71, 1.65, 1.92, 1.82, 1.69, 1.83]
7
15 #Mostra to e p
16 print('Valor de to=', to , ' e de p=', p)
Para os casos de duas amostras comentados até o momento assume-se que as amostras são indepen-
dentes, por exemplo as alturas das pessoas na cidade 𝑐𝑎 são independentes das alturas das pessoas na
cidade 𝑐𝑏 , assim como os valores da amostra 1 são independentes da amostra 2. Para esses casos usou-se
um teste não pareado (unpaired test). No entanto, pode ser interessante ter amostras dependentes e para
isso um teste pareado (paired test) é necessário.
Por exemplo, deseja-se comparar a eficácia de um remédio para diminuir a febre com uma amostra com
20 participantes. No caso de um teste não pareado pode-se dividir a amostra em dois grupos: i) grupo
que não vai receber o medicamento (grupo denominado controle) com 𝑛 = 10; ii) grupo que vai receber o
medicamento (grupo denominado experimental) com 𝑛 = 10. Compara-se a média dos grupos com o teste t
para duas amostras, como explicado acima.
No entanto, para o mesmo exemplo do medicamento mas com um teste pareado, tem-se que: i) registra-
se a temperatura dos 20 participantes antes de tomarem a medicação (grupo geralmente chamado de pré);
ii) registra-se a temperatura dos 20 participantes após tomarem a medicação (grupo geralmente chamado de
pós). Compara-se a média dos grupos pré e pós, ou seja, usa-se um teste t pareado para duas amostras.
Nesse teste cada participante funciona como seu próprio controle, ou seja, ele está nos dois grupos mas em
instantes diferentes.
Uma das vantagens do teste pareado é a redução de ruído, pois como os participantes do grupo pré e
pós são os mesmos, logo tem-se uma redução na variação de algumas estimativas. Para o caso do teste
não pareado, como são pessoas diferentes em cada grupo (controle e experimental) tem-se uma variação
maior para as amostras e estimativas (MONTGOMERY, 2012).
64
CAPÍTULO 2. INFERÊNCIA ESTATÍSTICA
𝑑𝑗 = 𝑥2𝑗 − 𝑥1𝑗
sendo 𝑥1𝑗 o j-ésimo valor da amostra 𝑥1 (ou grupo pré) e 𝑥2𝑗 o j-ésimo valor da amostra 𝑥2 (ou grupo
pós).
Assim sendo, para verificar se existe diferença entre as médias μ1 − μ2 tem-se H0 μ1 = μ2 que
pode ser testado como a média das diferenças (μ𝑑 ) ser igual a 0:
H0 ∶ μ 𝑑 = 0
H1 ∶ μ 𝑑 ≠ 0
𝑑̄
𝑡𝑜 =
S
√𝑑
𝑛
𝑑 ̄ é a média amostral das diferenças das médias:
1 𝑛
𝑑 ̄= ∑𝑑
𝑛 𝑗=1 𝑗
Similar a função ttest_ind da Scipy que realiza o teste t não pareado para duas amostras, tem-se
a função ttest_rel para realizar o teste t pareado para duas amostras. O Código 2.13 exemplifica o uso
dessa função para mensurar a eficácia de um remédio para diminuir a febre. Os valores das temperaturas
dos pacientes antes de tomarem o remédio (grupo pré) estão nas linhas 4-5 enquanto que os valores para
depois de tomarem-o estão nas linhas 6-7. A função ttest_rel é chamada na linha 10 passando as amostras
como parâmetros e retorna T𝑜 e 𝑝, que para essas amostras são 3, 23 e 0, 0104, com 𝑛 = 10, 𝑥1̄ = 38, 64 (grupo
pré) e 𝑥2̄ = 37, 14 (grupo pós). Ou seja, teve redução de temperatura.
1 from scipy.stats import ttest_rel
2
3 #Amostras
4 pre =[39.3 , 38.2, 40.0, 37.7, 38.1,
5 38.1, 39.1, 37.8, 40.2, 37.9]
65
Paulo Ribeiro UFMA
12 #Mostra to e p
13 print('Valor de to=', to , ' e de p=', p)
Código em Python 2.13: Teste t pareado de duas amostras (bilateral) com a Scipy
Saiba mais 2.4. Teste de hipótese paramétrico para mais de dois grupos
Verificou-se que existe teste para um e dois grupos/amostras, tanto para o caso pareado quanto
para o não pareado. Entretanto, caso a comparação seja com mais de dois grupos?
• Para mais de dois grupos não pareados utiliza-se a Análise de variância (Analysis of variance -
ANOVA);
Exemplo para aplicação da ANOVA: Comparar as médias das alturas de 10 cidades. Utiliza-se
ANOVA porque são mais de dois grupos independentes, neste caso dez grupos.
Exemplo para aplicação da ANOVA de medidas repetidas: Comparar a efeito de uma medicação
para reduzir a febre ao longo de algumas horas. Registra-se as temperaturas dos pacientes: i) antes
do remédio; ii) depois de 1 hora; iii) depois de 2 horas; e iv) depois de 3 horas. Utiliza-se ANOVA de
medidas repetidas porque são mais de dois grupos dependentes, neste caso quatro grupos.
Percebeu-se na subseção anterior que assumia-se sempre que os dados seguiam a distribuição normal.
Essa é uma das características dos testes paramétricos. No entanto, algumas amostras podem não possuir
essa distribuição e para esses casos usa-se os testes não paramétricos. Um método não paramétrico não
assume uma distribuição para a amostra, pois infere-se sobre o centro da distribuição. Portanto, os testes
não paramétricos devem ser utilizados quando a amostra não é normalmente distribuída e o tamanho da
amostra é pequeno.
Adicionalmente, viu-se que as variáveis usadas na subseção anterior eram quantitativos, ou seja, os
testes paramétricos são usados para esse tipo de variável. Diferentemente desses testes, os testes não-
paramétricos além dos dados quantitativos também podem ser aplicados a dados qualitativos (nominal ou
ordinal (FÁVERO; BELFIORE, 2017).
Um exemplo de uma variável aleatória (sem distribuição normal) é uma amostra de salário de funcioná-
rios em uma empresa, pois uma parte grande recebe um valor mediano enquanto poucas pessoas recebem
salários maiores, ou seja, a amostra é assimétrica para a direita.
Os testes paramétricos têm seus equivalentes não paramétricos, conforme mostrado na Figura 2.4. A
primeira coluna é referente ao número de grupos, sendo que neste caso optou-se por mostrar só os mais
utilizados que é para 2 grupos ou ≥ 3 grupos. A segunda coluna é referente a um teste pareado ou não. A
terceira coluna lista a versão paramétrica. A última coluna (em destaque) lista a versão não paramétrica.
66
CAPÍTULO 2. INFERÊNCIA ESTATÍSTICA
Teste de Wilcoxon
O teste de Wilcoxon é o equivalente não paramétrico do teste t pareado para duas amostras, ou seja, os
grupos são dependentes. O teste é também chamado de teste t de Wilcoxon e Wilcoxon Signed-Ranks Test.
Esse teste foi desenvolvido por Frank Wilcoxon. O teste de Wilcoxon e o teste de Mann-Whitney, também
chamado de Wilcoxon-Mann-Whitney e é para duas amostras independentes de tamanhos iguais, foram
publicados no mesmo artigo em 1945 5 .
Dado um problema para comparar uma intervenção (remédio, máquina, linha de produção etc) usando
um teste pareado, sendo que a amostra não é distribuída normalmente, seja X𝑖 os valores da amostra antes
da intervenção, enquanto Y𝑖 os valores da amostra depois da intervenção: o teste de Wilcoxon leva em
consideração a magnitude da diferença (D𝑖 = Y𝑖 − X𝑖 ) para cada par (X𝑖 , Y𝑖 ). A hipótese nula assume que
a mediana das diferenças na população (MD ) seja zero, ou seja, as populações não diferem em localização,
logo, para um teste bilateral, tem-se (FÁVERO; BELFIORE, 2017):
H0 ∶ M D = 0
H1 ∶ M D ≠ 0
Por exemplo, seja X𝑖 os valores de temperatura de uma amostra de pessoas antes de uma medicação
para febre, enquanto Y𝑖 os valores da amostra depois dessa medicação. O teste de Wilcoxon, para uma
amostra de tamanho 𝑛, é realizado como segue:
5Wilcoxon, Frank (Dec 1945). Individual comparisons by ranking methods. Biometrics Bulletin. 1 (6): 80–83.
67
Paulo Ribeiro UFMA
D𝑖 = Y𝑖 − X𝑖
3. Ordena-se |D𝑖 | (ordem crescente) e para cada |D𝑖 |a associa-se um posto/ranque, isto é um índice
(𝑖 = 1, 2, ...N)
4. Cria-se uma coluna, denominada Postos +, para armazenar os postos para D𝑖 > 0
5. Cria-se uma coluna, denominada Postos -, para armazenar os postos para D𝑖 < 0
T = 𝑚𝑖𝑛(𝑠𝑜𝑚𝑎_𝑝𝑜𝑠𝑡𝑜𝑠_ + , 𝑠𝑜𝑚𝑎_𝑝𝑜𝑠𝑡𝑜𝑠_−)
10. Para N > 30 (TRIOLA, 2023): assume-se uma distribuição normal para a T (soma dos postos),
T − μT
ou seja, Z = . Ou seja, torna-se similar ao teste Z, compara-se Z com Zα ou Z α2 , se
σT
unilateral ou bilateral, respectivamente, sendo que:
N(N + 1)
μT =
4
N(N + 1)(2N + 1)
σT = √
24
a Caso tenha valores iguais: posto (índice relacionado a posição na lista ordenada) será a média dos postos empatados
b Tabela para Z crítico do teste de Wilcoxon <https://users.stat.ufl.edu/~winner/tables/wilcox_signrank.pdf>
Percebe-se que o teste foca nos postos (posição em relação a diferença das amostras) das amostras.
Os valores das amostras são trocados pelos seus postos.
A Figura 2.5 mostra um dataframe6 para exemplicar o teste de Wilcoxon. Este exemplo é com 10 amostras
(𝑛 = 10). O elemento mais esquerda representa os índices, sendo que começa em 0 e vai até 𝑛 − 1. As duas
primeiras colunas Pre e Pos representam os dados antes e depois da intervenção, por exemplo temperatura
antes e depois de tomar o remédio para febre. A terceira coluna Dif é D𝑖 , ou seja, D𝑖 = P𝑜𝑠𝑖 − P𝑟𝑒𝑖 . A quarta
coluna Dif Abs é o valor absoluto de Dif, isto é, |D𝑖 |. A quinta coluna Posto ant (ranque/posição) representa o
posto antigo (não definitivo), que será explicado em detalhes a seguir. A sexta coluna Posto (ranque/posição)
representa o posto final e será explicado a seguir. A sétima coluna é Posto+, ou seja, só os postos para D𝑖 > 0
6 Estruturade dados bidimensional. Similar a uma tabela com linhas e colunas. Muito utilizada para manipulação de dados com a
biblioteca Pandas (<https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.html>)
68
CAPÍTULO 2. INFERÊNCIA ESTATÍSTICA
enquanto a oitava coluna é Posto-, logo, os postos para D𝑖 < 0. NaN na sétima e oitava coluna significa sem
dados.
Figura 2.5: Exemplo do teste de Wilcoxon
Assim sendo, com média antes do remédio (38.18) e depois do rémedio (36.89):
(a) A quinta coluna Posto ant representa os postos (posição, começando em 1 e indo até N = 10, em
ordem crescente) sem considerar os valores iguais (0, 2) para |D𝑖 |;
(b) A sexta coluna Posto representa o posto final, sendo que para os empates os postos são as médias
dos postos antigos ( 1+2
2 = 1, 5)
8. T = 𝑚𝑖𝑛(3, 52) = 3
69
Paulo Ribeiro UFMA
Portanto, a média da temperatura depois é estatisticamente diferente da média antes, neste caso menor.
Desta forma, o remédio tem eficácia para baixar a temperatura. O Código 2.14 contém todos os passos
descritos acima. Adicionalmente, ele usa um teste de normalidade (teste de Shapiro Wilk) na amostra pre e
pos (linha 17 e 18) na linha 22, tendo 𝑝 = 0, 039 (pre) 𝑝 = 0, 0344 (pos), isto é ambas não normais. Na linha
26 cria-se o dataframe inicial só com as colunas Pre e Pos. A coluna Dif é criada na linha 29. A linha 32
remove linhas com diferenças nulas. A linha 38 cria a coluna Dif Abs. Ordena-se os dados baseado nessa
coluna na linha 41. Na linha 44 cria-se a coluna Posto, sendo que ela inicialmente recebe os postos iguais
as posições 1, 2, ...10. A linha 48 cria um novo dataframe para tratar os empates em Dif Abs. A linha 53 não
é útil neste contexto, pois ela reseta os índices do dataframe. Na linha 56 renomeia-se a coluna Posto para
Posto ant, pois na linha 59 os dados dos dataframes serão unidos e será utilizado o valor da coluna Posto
do dataframe que fez a média dos empates. A linha 62 e 63 criam as colunas Posto+ e Posto- para D𝑖 > 0
e D𝑖 < 0, respectivamente. A linha 68 e 71 soma os elementos das colunas Posto+ e Posto-. O valor de T é
obtido como o meno valor dessas somas (linha 74 a 77). A linha 80 testa o valor de N, caso seja menor ou
igual a 30 segue-se o raciocínio acima (comparar T obtido com TT𝑎𝑏𝑒𝑙𝑎𝑑𝑜 - linha 81 a 89. Para N > 30 segue-se
a mesma ideia do teste Z - linha 91 a 114.
1 import pandas as pd
2 import numpy as np
3 from math import sqrt
4 from scipy.stats import norm
5 from scipy.stats import shapiro
6
7 #Amostras
8 pre =[39.3 , 39.2, 40.0, 41.7, 36.1,
9 36.3, 36.2, 36.5, 36.2, 40.3]
10 pos =[38.5 , 36.2, 36.4, 39.1, 36.3,
11 35.1, 35.9, 35.8, 36.4, 39.2]
12
13 #Nível de significância
14 alpha =0.05
15
70
CAPÍTULO 2. INFERÊNCIA ESTATÍSTICA
71
Paulo Ribeiro UFMA
Novamente, construiu-se o código seguindo cada passo do teste. No entanto, vale mencionar que a
biblioteca Scipy possui uma função (wilcoxon) para esse teste, conforme mostrado nas linha 117-119.
72
CAPÍTULO 2. INFERÊNCIA ESTATÍSTICA
Para alguns poucos casos essa relação é determinística, ou seja, para um 𝑥𝑖 será obtido sempre o mesmo
𝑦𝑖 , por exemplo para uma relação do tipo dobro: Y = 2X. No entanto, para maioria dos casos esses modelos
são probabilísticos, pois não teremos o mesmo peso para todas as pessoas que têm 1, 65 m de altura.
Y = 𝑚𝑥 + 𝑛
Y = β 0 + β1 𝑥 + ϵ
Portanto, o problema reside em estimar β0 e β1 que melhor se ajusta ao conjunto de dados, isto é: (𝑥𝑖 , 𝑦𝑖 ),
para 𝑖 = 1, 2, ..., 𝑛, sendo 𝑛 o tamanho da amostra. Esse melhor ajuste depende de uma métrica e busca-se
minimizar a soma dos quadrados dos desvios em relação a variável dependente. Esse critério para estimar
os coeficientes de regressão é chamado método dos mínimos quadrados. 𝑦𝑖̂ é uma estimativa para cada um
dos 𝑛 valores de 𝑦 e é representada por (MONTGOMERY, 2012):
𝑦𝑖̂ = β0 + β1 𝑥𝑖
ϵ𝑖 = 𝑦𝑖 − 𝑦𝑖̂
𝑛
L = ∑ ϵ𝑖2 = (𝑦𝑖 − β0 − β1 𝑥𝑖 )2
𝑖=1
Assim sendo, formula-se um problema de otimização para encontrar β0 e β1 que minimiza a soma do
quadrado dos resíduos (desvios/erros), ou seja, β0 e β1 , que gerem uma menor diferença entre a previsão (𝑦)̂
e o valor observado (𝑦):
β0̂ = 𝑦 ̄ − β1 𝑥̄
𝑠𝑦
β1̂ = 𝑟𝑥𝑦
𝑠𝑥
com 𝑟𝑥𝑦 sendo coeficiente de correlação entre X e Y, 𝑠𝑦 e 𝑠𝑥 o desvio padrão amostral de X e Y, respec-
tivamente.
73
Paulo Ribeiro UFMA
Desta forma, pode se encontrar o modelo de regressão linear simples para a amostra de altura e peso,
conforme mostrado no Código 2.15. Esse código utiliza vária das funções previamente implementadas, sendo
que essas estão no módulo criado com o Código 2.16. Portanto, o Código 2.15 inicia, linha 1, importando o
ModuloEstatistica (Código 2.16). Isso evita ficar repetindo o código da média, desvio padrão e correlação que
são usados nas linha 8, 9, 12, 13 e 16, respectivamente. A linha 19 calcula β1 enquanto a linha 22 obtém β0 .
A linha 25 mostra o resultado para esses dados: Y = −9, 5 + 53, 57𝑥. Portanto, o peso para uma pessoa com
1, 65 m é estimado como 78, 89 kg (linha 28-30).
1 import ModuloEstatistica as Mod_Est
2
3 #Amostras
4 a=[1.6 , 1.9, 1.7, 1.5, 1.4, 2.0, 1.8] #X - Altura m
5 p=[75, 95, 80, 70, 68, 98, 85] #Y - Peso kg
6
7 #Obtém médias
8 media_x=Mod_Est.FuncaoMedia(a)
9 media_y=Mod_Est.FuncaoMedia(p)
10
74
CAPÍTULO 2. INFERÊNCIA ESTATÍSTICA
Enfatiza-se mais uma vez a construção do Código 2.15 referenciando a parte teórica explicada. Entre-
tanto, informa-se que a biblioteca Scikit-learn possui funções para regressão, conforme mostrado no Código
2.17. Esse código é similar ao Código 2.15, sendo que os coeficientes são obtidos vai função fit (linha 15) e
para predizer um valor ou conjunto de valores utiliza-se a função predict (linha 23 e 32). A linha 28 cria um
conjunto de alturas: 1, 4 , 1, 5, 1, 6 ... 2, 0 que são passados na linha 32 para estimar os pesos equivalentes.
Cria-se a Figura 2.6 nas linhas 36-44, sendo que os dados da amostra (𝑎 e 𝑝, linha 6 e 7) são plotados como
pontos azuis enquanto para o intervalo gerado produz-se uma reta de regressão vermelha.
1 from sklearn.linear_model import LinearRegression
2 import numpy as np
3 import matplotlib.pyplot as plt
4
5 #Amostras
6 a=[1.6 , 1.9, 1.7, 1.5, 1.4, 2.0, 1.8] #X - Altura m
75
Paulo Ribeiro UFMA
13 #Cria modelo
14 modelo = LinearRegression ()
15 modelo.fit(a, p) # Encontra coeficientes
16
34 #Faz a plot
35 # Aumenta tamanho da fonte
36 plt.rcParams.update ({'font.size ': 30})
37 #Plota as amostras como ponto
38 plt.scatter(a, p, s=200)
39 #Plota a reta para o intervalo
40 plt.plot(interv_alturas , inert_peso_est , color="red")
41 #Label para os eixos x e y
42 plt.xlabel('Altura (m)')
43 plt.ylabel('Peso (kg)')
44 plt.show () # Para visualizar o gráfico
76
CAPÍTULO 2. INFERÊNCIA ESTATÍSTICA
95
90
85
Peso (kg)
80
75
70
65
1.4 1.5 1.6 1.7 1.8 1.9 2.0
Altura (m)
Ŷ = β0 + β1 𝑥1 + β2 𝑥2 + ϵ
sendo Y o peso da pessoa, 𝑥1 a altura da pessoa e 𝑥2 a idade (anos). Essa equação descreve um plano
no espaço tridimensional de Y, 𝑥1 e 𝑥2 .
O Código 2.18 exemplifica a regressão linear múltipla, para o problema acima, usando a biblioteca Scikit-
learn, sendo que o código é muito similar ao da regressão linear simples (Código 2.17). Cria-se na linha 13 um
dataframe (Figura 2.7) com a coluna Altura, Idade e Peso igual a 𝑦, 𝑥1 e 𝑥2 , respectivamente. Separa-se só os
elementos de X na linha 16. As demais linhas, com exceção do plot, são iguais a regressão linear simples, pois
usar a biblioteca Scikit-learn para regressão resume-se a criar o modelo (linha 22) e chamar as funções fit
(linha 23) e predict (linha 48). As linhas 36-41 mostram os pontos (𝑥1 , 𝑥2 , 𝑦) no espaço tridimensional (Figura
2.8a) enquanto as linhas 45-57 criam o plano de regressão para o modelo: Y = −12, 52 + 31, 67𝑥1 + 0, 49𝑥2
(Figura 2.8b).
77
Paulo Ribeiro UFMA
7 #Amostras
8 a=[1.6 , 1.9, 1.7, 1.5, 1.4, 2.0, 1.8] #X1 - Altura m
9 i=[17, 30, 22, 12, 10, 35, 25] #X2 - Idade anos
10 p=[75, 95, 80, 70, 68, 98, 85] #Y - Peso pessoa kg
11
21 #Cria modelo
22 modelo = LinearRegression ()
23 modelo.fit(X, y) # Encontra coeficientes
24
28 #Faz a plot
29 # Aumenta tamanho da fonte
30 plt.rcParams.update ({'font.size ': 15})
31 # Define gráfico 3d
32 fig = plt.figure ()
33 ax = fig.add_subplot(projection = '3d')
34
43 #Plota superfície
44 #Cria malha de pontos de x1 e x2
45 malhax1 , malhax2 = np.meshgrid(X['Altura '], X['Idade '])
46 dados_x = pd.core.frame.DataFrame ({'Altura ': malhax1.ravel (), 'Idade ': malhax2.ravel ()})
47 #Estima z para as malhas
48 est_z = modelo.predict(dados_x)
49 fig2 = plt.figure ()
50 #Plota a superfície
51 ax2 = fig2.add_subplot(projection = '3d')
52 ax2.plot_surface(malhax1 , malhax2 , est_z.reshape(malhax1.shape), color='c')
53 #Label para os eixos x, y e z
54 plt.xlabel('Altura (m)')
55 plt.ylabel('Idade (anos)')
56 ax2.set_zlabel('Peso (kg)')
57 plt.show () # Para visualizar o gráfico
78
CAPÍTULO 2. INFERÊNCIA ESTATÍSTICA
95
90
95
Peso (kg)
85
90
Peso (kg)
80
85
75
80
70
75
70
35
1.4
30 1.5
35
25 1.6
s)
1.4 no Al 30
tu 1.7
ra
(a
1.5 20 25
(m os)
e
1.6
) 1.8 20 e (an
ad
Altu 1.7
Id
ra ( 15 d
m) 1.8 1.9 15 Ida
1.9 10
2.0 2.0 10
Para o problema para duas variáveis independentes e uma dependente precisa-se de um gráfico 3D para
visualização, pois tem-se uma superfície. Entretanto, outras variáveis podem ser incorporadas ao modelo —
por exemplo altura do pai (𝑥3 ) e altura da mãe (𝑥4 ) etc — mas a visualização direta fica comprometida. A
escolha de quantas e quais variáveis independentes devem ser incorporadas ao modelo é de fundamental
importância para o problema de regressão.
Portanto, para um modelo mais genérico com 𝑛 variáveis independentes (modelo abaixo) tem-se um
hiperplano no espaço 𝑛 + 1-dimensional de Y e as variáveis regressoras 𝑥𝑖 , 𝑖 = 1, 2, ..., 𝑛:
𝑛
Ŷ = β0 + ∑ β𝑖 𝑥𝑖 + ϵ
𝑖=1
O problema central é estimar os coeficientes β0 , β1 , ..., β𝑛 usando uma métrica para relacionar Y com Y,̂
por exemplo com o método dos mínimos quadrados.
79
Referências Bibliográficas
FÁVERO, L. P. et al. Manual de análise de dados: Estatística e Modelagem Multivariada com Excel, SPSS e
Stata. [S.l.]: LTC, 2017.
GASPAR, J. S. et al. Introdução à Análise de Dados em Saúde com Python. [S.l.]: Universidade Federal de
Minas Gerais, 2023.
IBGE. Instituto Brasileiro de Geografia e Estatística <https://www.ibge.gov.br/acesso-
informacao/institucional/o-ibge.html> [Acesso em: 03 de novembro de 2023]. 2023.
MEYER, P. L. Probabilidade: Aplicações à estatística. 2. ed. [S.l.]: LTC, 2011.
MONTGOMERY, D. C. Design and Analysis of Experiments. 8. ed. [S.l.]: John Wiley and Sons, 2012.
MONTGOMERY, D. C. et al. Estatística aplicada e probabilidade para engenheiros. 7. ed. [S.l.]: LTC, 2024.