Livro - Paulo Rogério de Almeida Ribeiro

Você também pode gostar

Você está na página 1de 81

Universidade Federal do Maranhão - UFMA

Diretoria de Tecnologias na Educação - DTED

Introdução à Ciência de Dados: Análise


Exploratória e Inferência Estatística

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

Rejeita H0 Não 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

Paulo Rogério de Almeida Ribeiro


Universidade Federal do Maranhão (UFMA)

Preparação Paulo Rogério de Almeida Ribeiro


Revisão Alcione Miranda dos Santos

©2024 Diretoria de Tecnologias na Educação (DTED) - UFMA


PREFÁCIO

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).

Boa leitura do texto e instigante consolidação usando Python!

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 Amostra de dados: 2, 8 e 5 em verde. Média da amostra (𝑥̄ = 5) em azul. . . . . . . . . . . . . 15


1.2 Amostra de dados: 2, 3, 9, 1, 4, 8, 6, 7, 0, e 5 em verde. Média da amostra (𝑥̄ = 4, 5) em azul. . . 16
1.3 Boxplot: outliers, limite inferior, Q1, Q2, Q3 e limite superior. . . . . . . . . . . . . . . . . . . . 21
1.4 Boxplot dos dados 5, 8, 2, 7, 1, 0, 3, 11 e 6 com mediana (M𝑑 = 5) . . . . . . . . . . . . . . . . . 21
1.5 Boxplot para uma amostra com outliers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
1.6 Gráfico de dispersão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
1.7 Gráfico de dispersão - correlação negativa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
1.8 Distribuição Normal com seus parâmetros: média (μ) e desvio padrão (σ) . . . . . . . . . . . 34
1.9 Distribuição Normal padrão: P(Z ≤ 0, 52) é a área sombreada em ciano . . . . . . . . . . . . 36
1.10 Distribuição Normal padrão: P(0, 6 ≤ Z ≤ 0, 8) é a área sombreada em ciano . . . . . . . . . 37

2.1 Distribuição t de student para 𝑘 = 5, 𝑘 = 10 e 𝑘 = 50 . . . . . . . . . . . . . . . . . . . . . . . . 51


2.2 Teste de hipótese . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
2.3 Teste de hipótese bilateral . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
2.4 Testes paramétricos e seus equivalentes não paramétricos . . . . . . . . . . . . . . . . . . . 67
2.5 Exemplo do teste de Wilcoxon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
2.6 Amostra (Peso x altura) em azul e sua regressão em vermelho . . . . . . . . . . . . . . . . . . 77
2.7 Dataframe para dados regressão linear múltipla . . . . . . . . . . . . . . . . . . . . . . . . . . 78
2.8 Regressão linear múltipla . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
Lista de Tabelas

1.1 Exemplo de mediana . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17


1.2 Exemplo de mediana com índice começando em zero . . . . . . . . . . . . . . . . . . . . . . . 18
1.3 Amostras de altura e peso de pessoas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
1.4 Valores da função de distribuição normal padronizada: P(Z ≤ 𝑧) . . . . . . . . . . . . . . . . . 35

2.1 Valores da distribuição t de student para 𝑡α,𝑘 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53


Lista de Códigos em Python

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.

1.1 Principais conceitos de estatística


Segundo Montgomery e Runger (2024): “Estatística é a ciência que nos ajuda a tomar decisões e a tirar
conclusões na presença de variabilidade”. A Estatística aborda a coleta de dados, sua apresentação, análise
e uso dos dados para a tomada de decisões, resolver problemas e planejar produtos e processos, portanto,
para os autores Estatística é a Ciência de Dados.
Pode-se aplicar Estatística em vários problemas, por exemplo para determinar a quantidade de aten-
dentes (caixas) necessários para um atendimento eficiente no supermercado. Para isso deve-se analisar
quantos clientes fazem compras no local, assim como registrar esse fluxo por horário. Percebe-se que existe
uma variabilidade no fluxo de clientes por horário no supermercado, assim sendo a Estatística pode ser usada
para ajudar a determinar o número ideal de atendentes (caixas) de forma que minimize o tempo de espera
do cliente, mas que ao mesmo tempo evite ter atendentes ociosos.
No entanto, para usar a Estatística, precisa-se de dados. Uma etapa importante é a coleta dos dados.
Quais dados serão coletados? Como esses dados serão coletados? Precisa-se definir quais variáveis devem
ser coletadas, bem como a periodicidade da coleta (a cada 1 minuto, 1 hora, 1 dia, 1 semana etc).
Pensando em um sistema que tem entradas que modificam as saídas tem-se respectivamente variáveis
independentes (entradas) e dependentes (saídas). Por exemplo, para um problema de regressão1 a entrada
geralmente é denominada por X (variável regressora) enquanto a saída Y (variável resposta). Escreve-se
um modelo de Y em função de X, ou seja, Y varia com X. Para o presente exemplo do supermercado, X
poderia ser uma matriz contendo variáveis (por exemplo número de clientes na loja e horário) enquanto Y a
quantidade de atendentes (caixas) necessários. Assim sendo, para X = [30, 10:00] (número de clientes na
loja e horário) pode-se obter Y = 8 atendentes enquanto para X = [60, 16:00] pode-se ter Y = 14 atendentes.
Percebe-se que Y neste caso é um valor inteiro2 (e positivo), ou seja, não é possível ter 11, 3 atendentes nem
−5 atendentes.
1 Tema será abordado na seção 2.3 do Capítulo 2.
2 Os tipos das variáveis serão abordados na próxima seção.
Paulo Ribeiro UFMA

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).

Saiba mais 1.1. Funções do IBGE


Saiba mais sobre as funções do IBGE em: <https://www.ibge.gov.br/acesso-informacao/instituc
ional/o-ibge.html>

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 .

Saiba mais 1.2. Tipos de amostragem


Saiba mais sobre os diferentes tipos de amostragem em: TAVARES, M. Estatística aplicada à
administração. 3. ed. [S.l.]: Departamento de Ciências da Administração / UFSC; [Brasília]: CAPES:
UAB, 2021.

1.2 Tipos de variáveis


Em Estatística, a variável armazena informações sobre o estudo. Por exemplo, para o caso do super-
mercado mencionado acima uma variável pode ser a quantidade de atendentes, consumidores, assim como
quantidade e nome dos candidatos para o caso de uma pesquisa eleitoral. As variáveis podem ser qualitati-
vas ou quantitativas.
3 Assunto a ser abordado no Capítulo 2

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 Principais medidas de tendência central


Considerando que para Montgomery e Runger (2024), estatística é a ciência de dados, desta forma, além
da coleta dos dados — comentada na subseção anterior — necessita-se organizá-los e resumi-los, sendo
esse o papel da estatística descritiva. No entanto, esse resumo deve realçar as características importantes
dos dados, por exemplo sua tendência central e variabilidade.

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:

Equação 1.1. Média


Sejam 𝑥1 , 𝑥2 , 𝑥3 , ..., 𝑥𝑛 as 𝑛 amostras, a média amostral é calculada:

𝑛
∑ 𝑥𝑖
𝑥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 n=len(amostra) # Obtém -se o tamanho da amostra


5 i=0 # Índice da amostra
6 soma =0 # Variável que mantém o valor da soma , começa zerada
7

8 #Laço para somar todos os elementos: somatório


9 while(i<n):
10 #Adiciona -se o valor acumulado em 'soma ' com o valor da amostra i
11 soma=soma+amostra[i]
12 i=i+1
13

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

14 #Após o somatório , divide -se esse valor por n


15 media=soma/n
16

17 #Por último mostra -se a média


18 print('A média da amostra é ', media)

Código em Python 1.1: Média

Saiba mais 1.3. Tutorial de Python


Para saber mais sobre Python pode-se consultar a documentação em português: <https://docs
.python.org/pt-br/3/tutorial/>

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".

Importante 1.1. Índice em Python


Em Python o primeiro índice/posição é 0. Por isso que amostra[0] é igual a 2.

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)

Código em Python 1.2: Criando função média

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)

Código em Python 1.3: Nova função média

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.

Figura 1.1: Amostra de dados: 2, 8 e 5 em verde. Média da amostra (𝑥̄ = 5) em azul.

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.

Figura 1.2: Amostra de dados: 2, 3, 9, 1, 4, 8, 6, 7, 0, e 5 em verde. Média da amostra (𝑥̄ = 4, 5) em azul.

0 2 4 6 8

Importante 1.2. Separador decimal em Python


O separador decimal em Python é o “.” (ponto), não a “,” (vírgula). Por isso que quando o código
acima é executado o print mostra que média é igual a 4.5, não 4, 5.

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

5 #Define função para plotar gráfico


6 def PlotaDiagramaPontos (amostra , media):
7 # Aumenta tamanho da fonte
8 plt.rcParams.update ({'font.size ': 30})
9 #Para plotar define dado , cor e tamanho do círculo
10 az.plot_dot(amostra , 1, dotcolor="g", dotsize =0.1)
11 az.plot_dot(media , dotcolor="b", dotsize =1.0)
12 plt.show () # Para visualizar o gráfico
13

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

20 #Mostra valor da média


21 print('A media é ', media)
22

23 #Usa a função
24 PlotaDiagramaPontos (amostra , media)

Código em Python 1.4: Criar diagrama de pontos

16
CAPÍTULO 1. ANÁLISE EXPLORATÓRIA

Saiba mais 1.4. Biblioteca Matplotlib


O Código 1.4 usa duas bibliotecas (matplotlib e arviz) para plotagem dos dados, sendo que a
matplotlib é uma das bibliotecas mais usadas para plotagem de dados. Para saber mais sobre a
Matplotlib pode-se consultar sua documentação: <https://matplotlib.org/stable/index.html>

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:

Equação 1.2. Mediana com n ímpar


Para uma amostra 𝑥1 , 𝑥2 , 𝑥3 , ..., 𝑥𝑛 , ordenada com tamanho n ímpar a posição (P𝑜𝑠) do elemento
denominado mediana (M𝑑 ) é obtida:

𝑛+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.

Tabela 1.1: Exemplo de mediana

Posição Amostra inicial Amostra ordenada


1 5 0
2 8 1
3 2 2
4 7 3
5 1 5
6 0 6
7 3 7
8 11 8
9 6 11

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

Tabela 1.2: Exemplo de mediana com índice começando em zero

Posição Amostra inicial Amostra ordenada


0 5 0
1 8 1
2 2 2
3 7 3
4 1 5
5 0 6
6 3 7
7 11 8
8 6 11

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

4 #Ordena -se os dados (ordem crescente)


5 amostra_ordenada=sorted(amostra)
6

7 #Obtém -se o tamanho da amostra


8 n=len(amostra_ordenada )
9

10 #Posição da mediana (n sendo ímpar): int para gerar divisão inteira


11 posicao_mediana =int((n+1) /2) -1 #Subtrai 1 porque Python começa em 0
12

13 #Calcula -se a mediana via posição obtida acima


14 mediana=amostra_ordenada [posicao_mediana]
15

16 #Mostra -se a mediana


17 print('A mediana da amostra é ', mediana)
18

19 #Mostra -se também a amostra ordenada


20 print('Dados ordenados: ', amostra_ordenada)

Código em Python 1.5: Cálculo da mediana para 𝑛 ímpar

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:

Equação 1.3. Mediana com n par


Para uma amostra 𝑥1 , 𝑥2 , 𝑥3 , ..., 𝑥𝑛 , ordenada e com tamanho n par, a mediana (M𝑑 ) é obtida:

𝑥( 𝑛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

6 #Obtém -se o tamanho da amostra


7 n=len(amostra_ordenada )
8

9 if(n%2!=0): #Caso n seja ímpar


10 posicao_mediana=int((n+1) /2) -1 #Subtrai 1
11 mediana=amostra_ordenada [posicao_mediana] #Calcula -se a mediana
12 else: #Caso n seja par
13 #Subtrai 1 porque Python começa em 0
14 mediana =( amostra_ordenada [int(n/2) -1] + amostra_ordenada [int((n)/2)])/2
15

16 return mediana
17

18

19 #Amostra
20 amostra =[2, 11, 9, 15, 7, 8, 6, 14, 3, 5]
21

22 #A variável média recebe o valor da FuncaoMedia


23 mediana=FuncaoMediana(amostra)
24

25 #Mostra -se a mediana


26 print('A mediana da amostra é ', mediana)

Código em Python 1.6: Mediana para qualquer 𝑛 (par ou ímpar)

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

7 #Função 'unique ' retorna os elementos sem repetição e suas quantidades


8 elementos , quantidades = np.unique(amostra , return_counts=True)
9

10 #Obtém o índice do elemento que mais se repete


11 indice_com_mais_repeticoes = np.argmax(quantidades)
12

13 #A moda está nessa posição 'indice_com_mais_repeticoes '


14 moda=elementos[ indice_com_mais_repeticoes ]
15

16 #Mostra -se a moda

19
Paulo Ribeiro UFMA

17 print('A moda da amostra é ', moda)

Código em Python 1.7: Moda para amostra unimodal

Saiba mais 1.5. Biblioteca NumPy


O Código 1.7 usa a biblioteca NumPy, sendo que essa é muito utilizada na área de dados para
computação científica. Para saber mais sobre a NumPy pode-se consultar sua documentação: <https:
//numpy.org/>

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 Principais medidas de dispersão


As medidas de tendência central fornecem um bom resumo dos dados. Entretanto, como saber se os
dados estão próximos ou distantes dessas medidas? As medidas de dispersão tem essa finalidade.

1.4.1 Amplitude
A amplitude mede a distância entre o maior e o menor valor do conjunto de dados,

Equação 1.4. Amplitude


Para uma amostra 𝑥1 , 𝑥2 , 𝑥3 , ..., 𝑥𝑛 , a amplitude (A) é obtida:

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.4.2 Intervalo interquartil (IQR)


Outra medida de dispersão é o intervalo interquartil (IQR), sendo que os quartis dividem os valores da
variável em:

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.

Fonte: Silva (2011)

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.

Figura 1.4: Boxplot dos dados 5, 8, 2, 7, 1, 0, 3, 11 e 6 com mediana (M𝑑 = 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

7 # Aumenta tamanho da fonte


8 plt.rcParams.update ({'font.size ': 30})
9 #Função 'boxplot ' da matplotlib
10 plt.boxplot(amostra)
11 plt.show () # Para visualizar o gráfico

Código em Python 1.8: Código para gerar boxplot

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.

Figura 1.5: Boxplot para uma amostra com outliers

120
100
80
60
40
20
0 1

Saiba mais 1.6. Biblioteca Seaborn


Além da Matplotlib, outra biblioteca largamente usada para plotagem de dados é a Seaborn.
Para saber mais sobre a Seaborn pode-se consultar sua documentação: <https://seaborn.pyda
ta.org/index.html>. A biblioteca Seaborn tem uma função similar a boxplot da Matplotlib. Assim
sendo, para gerar um boxplot usando a Seaborn pode-se facilmente modificar o Código 1.8: adi-
cionando a linha import seaborn as sns após a linha import matplotlib.pyplot as plt, e trocar
plt.boxplot(amostra) por sns.boxplot(amostra). Assim gera-se o boxplot abaixo com a Seaborn,
conforme Código 1.9.

22
CAPÍTULO 1. ANÁLISE EXPLORATÓRIA

10
8
6
4
2
0

1 # Biblioteca matplotlib e seaborn


2 import matplotlib.pyplot as plt
3 import seaborn as sns
4

5 #Amostra
6 amostra =[5, 8, 2, 7, 1, 0, 3, 11, 6]
7

8 # Aumenta tamanho da fonte


9 plt.rcParams.update ({'font.size ': 30})
10 #Função 'boxplot ' da seaborn
11 sns.boxplot(amostra)
12 plt.show () # Para visualizar o gráfico

Código em Python 1.9: Boxplot com a Seaborn

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:

Equação 1.5. Variância


Sejam 𝑥1 , 𝑥2 , 𝑥3 , ..., 𝑥𝑛 as 𝑛 amostras, a variância amostral é calculada:

𝑛
∑ (𝑥𝑖 − 𝑥)̄ 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

14 #Reutiliza o código da média


15 def FuncaoMedia(dados_amostra):
16 n=len(dados_amostra) # Obtém -se o tamanho da amostra
17 i=0
18 soma =0
19 #Laço para somar todos os elementos: somatório
20 while(i<n):
21 soma += dados_amostra[i] #Igual a soma=soma+dados_amostra[i]
22 i+=1
23 valor_media=soma/n
24 return valor_media
25

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

33 from statistics import variance


34 print('A variância da amostra é ', variance(amostra))

Código em Python 1.10: Função variância

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.

1.4.4 Desvio Padrão


A variância é muito útil mas reflete o quadrado da unidade da amostra. Uma medida similar mas que
expresse a dispersão na mesma unidade auxilia na compreensão da variabilidade dos dados. Assim sendo,
tem-se desvio padrão (𝑠) que é a medida mais usada para analisar variabilidade ou dispersão nos dados,
sendo que essa tem uma relação com a variância. O desvio padrão (𝑠) é a raiz quadrada da variância (𝑠2 ),
isto é:

Equação 1.6. Desvio Padrão


Sejam 𝑥1 , 𝑥2 , 𝑥3 , ..., 𝑥𝑛 as 𝑛 amostras, o desvio padrão da amostra é calculado:

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

7 #Define a função variância - FuncaoVariancia


8 def FuncaoVariancia(dados_amostra):
9 n=len(dados_amostra) # Obtém -se o tamanho da amostra
10 i=0
11 soma =0
12 media=FuncaoMedia(dados_amostra) #Obtém média
13 #Laço para somar todos os desvios: somatório
14 while(i<n):
15 soma += (dados_amostra[i]-media)**2
16 i+=1
17 valor_variancia=soma /(n-1) #Divide por n-1
18 return valor_variancia
19

20 #Reutiliza o código da média


21 def FuncaoMedia(dados_amostra):
22 n=len(dados_amostra) # Obtém -se o tamanho da amostra
23 i=0
24 soma =0
25 #Laço para somar todos os elementos: somatório
26 while(i<n):
27 soma += dados_amostra[i] #Igual a soma=soma+dados_amostra[i]
28 i+=1
29 valor_media=soma/n
30 return valor_media
31

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)

Código em Python 1.11: Função desvio padrão

25
Paulo Ribeiro UFMA

Saiba mais 1.7. Crie seu próprio módulo de funções estatísticas


Ao invés de copiar as funções média, mediana, moda, variância etc para um arquivo toda vez que
for utilizá-las pode-se criar um módulo e importá-lo quando precisar de alguma dessas funções, ou
seja, criar seu próprio módulo de funções estatísticas. Para saber mais sobre módulos e bibliotecas:
<https://algoritmosempython.com.br/cursos/programacao-python/modulos-bibliotecas/>

1.4.5 Coeficiente de variação


Uma medida adimensional (medida percentualmente) é o coeficiente de variação (CV). Ele reflete a
variabilidade relativa dos dados em relação à média aritmética. Essa métrica é útil para comparar duas
amostras com ordens de grandeza diferentes.

Equação 1.7. Coeficiente de variação


Sejam 𝑥1 , 𝑥2 , 𝑥3 , ..., 𝑥𝑛 as 𝑛 amostras, o coeficiente de variação (CV) é calculado:

𝑠
CV = × 100
𝑥̄

1.5 Análise de relação entre variáveis


A obtenção de uma medida de tendência central, assim como sua dispersão, de uma amostra podem
fornecer informações importantes sobre os dados. No entanto, pode-se querer analisar a relação dessa
amostra com uma outra amostra. Por exemplo, seja 𝑎 uma amostra da altura (em metros 𝑚) de pessoas e 𝑝
uma amostra do peso (em quilogramas 𝑘𝑔) dessas pessoas, tal como a Tabela 1.3.

Tabela 1.3: Amostras de altura e peso de pessoas

Amostra Altura (m) Peso (kg)


1 1,6 75
2 1,9 95
3 1,7 80
4 1,5 70
5 1,4 68
6 2,0 98
7 1,8 85

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

4 #Define função para plotar gráfico


5 def PlotaGrafico(a, p):
6 # Aumenta tamanho da fonte
7 plt.rcParams.update ({'font.size ': 30})

26
CAPÍTULO 1. ANÁLISE EXPLORATÓRIA

8 #Para plotar define dado , cor e tamanho do círculo


9 plt.scatter(a, p, s=200)
10 #Label para os eixos x e y
11 plt.xlabel('Altura (m)')
12 plt.ylabel('Peso (kg)')
13 plt.show () # Para visualizar o gráfico
14

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)

Código em Python 1.12: Gerando diagrama de dispersão

Figura 1.6: Gráfico de dispersão

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:

Equação 1.8. Coeficiente de correlação de Pearson


Sejam 𝑥 e 𝑦 duas variáveis quantitativas com valores 𝑥1 , 𝑥2 , 𝑥3 , ..., 𝑥𝑛 e 𝑦1 , 𝑦2 , 𝑦3 , ..., 𝑦𝑛 , o coefi-
ciente de correlação linear de Pearson (𝑟𝑥𝑦 ) é calculado:

𝑛
∑ (𝑥𝑖 − 𝑥)̄ × (𝑦𝑖 − 𝑦)̄
𝑖=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

24 #Reutiliza o código da média


25 def FuncaoMedia(dados_amostra):
26 n=len(dados_amostra) # Obtém -se o tamanho da amostra
27 i=0
28 soma =0
29 #Laço para somar todos os elementos: somatório
30 while(i<n):
31 soma += dados_amostra[i] #Igual a soma=soma+dados_amostra[i]
32 i+=1
33 valor_media=soma/n
34 return valor_media
35

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

40 #A variável recebe o valor da CorrelacaoPearson


41 coeficiente_Pearson =CorrelacaoPearson (a, p)
42

43 #Por último mostra -se o coeficiente de Pearson


44 print('O coeficiente de correlação de Pearson é ', coeficiente_Pearson )

Código em Python 1.13: Coeficiente de correlação de Pearson

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

Figura 1.7: Gráfico de dispersão - correlação negativa

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)

Importante 1.3. Correlação x Causalidade


Correlação não implica causalidade. Não se deve interpretar uma correlação como evidência de
causalidade entre as variáveis.

1.6 Principais distribuições de probabilidade


Uma distribuição de probabilidade é um modelo matemático que associa um valor de uma variável com
a sua probabilidade de ocorrência. Por exemplo, um experimento lança uma moeda várias vezes para o alto
e deseja-se saber qual a probabilidade de ocorrer cara? No entanto, precisa-se associar um número a cada
resultado do experimento, por exemplo o número de caras. Desta forma tem-se uma variável aleatória.

Importante 1.4. Definição de variável aleatória


O conjunto de todos os resultados do experimento é denominado espaço amostral S e cada re-
sultado do experimento é 𝑠. Assim sendo, uma função X que associa cada 𝑠 ∈ S um número, X(𝑠), é
denominada variável aleatória (MEYER, 2011).

Assim sendo, distribuição de probabilidades de uma variável aleatória X descreve as probabilidades


associadas aos possíveis valores de X (MONTGOMERY; RUNGER, 2024). Caso a variável aleatória X seja
discreta tem-se uma distribuição de probabilidade para variável discreta, assim como para uma variável
aleatória contínua uma distribuição de probabilidade para variável contínua.

29
Paulo Ribeiro UFMA

1.6.1 Distribuição de probabilidade para variável discreta

Equação 1.9. Função de probabilidade de uma variável discreta


Seja X uma variável aleatória discreta com espaço amostral S = {𝑥1 , 𝑥2 , 𝑥3 , ...} a função de
probabilidade é definida (MONTGOMERY; RUNGER, 2024; MEYER, 2011):

𝑝(𝑥𝑖 ) = 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).

Equação 1.10. Distribuição Binomial


X tem distribuição binomial com parâmetros 𝑝 e 𝑛:

𝑛
P(X = 𝑘) = ( )𝑝𝑘 (1 − 𝑝)𝑛−𝑘
𝑘

sendo que (𝑛𝑘) = 𝑛!


𝑘!(𝑛−𝑘)!

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:

• Para 𝑘 = 0 (nenhum cliente gostar):

20!
P(X = 0) = (0, 4)0 (1 − 0, 4)20−0 = 3, 66 × 10−5
0!(20 − 0)!

• Para 𝑘 = 1 (1 cliente gostar):

20!
P(X = 1) = (0, 4)1 (1 − 0, 4)20−1 = 4, 88 × 10−4
1!(20 − 1)!

...

• Para 𝑘 = 8 (8 clientes gostarem):

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

• Para 𝑘 = 19 (19 clientes gostarem):

20!
P(X = 19) = (0, 4)19 (1 − 0, 4)20−19 = 3, 30 × 10−7
19!(20 − 19)!

• Para 𝑘 = 20 (todos os clientes gostarem):

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

15 #Define a função fatorial


16 def Fatorial(numero):
17 valor_fatorial =1; #Inicia em 1
18 i=1 #Indice incial
19 while (i<= numero):
20 valor_fatorial=valor_fatorial*i
21 i=i+1
22 return valor_fatorial #Fatorial obtido
23

24 #Dados para simulação


25 p=0.4 # Probabilidade de gostar
26 n=20 # Quantidade de pessoas no experimento
27 k=0 # k clientes gostarem (neste caso 0)
28 print('Para k=',k, 'a probabilidade é', Distribuicao_Binomial (p, n, k))

Código em Python 1.14: Distribuição Binomial

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

Equação 1.11. Distribuição de Poisson


X tem distribuição poisson com parâmetro λ:

𝑒−λ × λ 𝑘
P(X = 𝑘) =
𝑘!

Assim sendo, para esse caixa, com λ = 100, pode-se calcular a probabilidade dele atender 𝑘 clientes em
um dia:

• Para 𝑘 = 0 (não atender nenhum cliente):

𝑒−100 × 1000
P(X = 0) = = 3, 72 × 10−44
0!

• Para 𝑘 = 1 (atender apenas um cliente):

𝑒−100 × 1001
P(X = 1) = = 3, 72 × 10−42
1!

...

• Para 𝑘 = 100 (atender dois clientes):

𝑒−100 × 100100
P(X = 100) = = 0, 04
100!

...

• Para 𝑘 = 110 (atender 𝑘 = 110 clientes):

𝑒−100 × 100110
P(X = 110) = = 0, 02
110!

...

• Para 𝑘 = 150 (atender 𝑘 = 150 clientes):

𝑒−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

4 #Define a função para distribuição de poison


5 def Distribuicao_Poison (cons_lambda , k):
6 #Numerador
7 numerador =( math.exp(-cons_lambda))*( cons_lambda **k)
8 #Denominador
9 denominador=Fatorial(k)
10 #Calcula a probabilidade de k
11 probabilidade_k=numerador/denominador

32
CAPÍTULO 1. ANÁLISE EXPLORATÓRIA

12 return probabilidade_k
13

14 #Define a função fatorial


15 def Fatorial(numero):
16 valor_fatorial =1; #Inicia em 1
17 i=1 #Indice incial
18 while (i<= numero):
19 valor_fatorial=valor_fatorial*i
20 i=i+1
21 return valor_fatorial #Fatorial obtido
22

23 #Dados para simulação


24 valor_lambda =100 # Taxa média de eventos por tempo
25 k=0 # quantidade de clientes
26 print('Para k=',k, 'a probabilidade é', Distribuicao_Poison (valor_lambda , k))

Código em Python 1.15: Distribuição Poisson

1.6.2 Distribuição de probabilidade para variável contínua


Nas distribuições discretas objetiva-se encontrar uma distribuição de probabilidade para posteriormente
obter P(X = 𝑘), ou seja calcular a probabilidade para qualquer valor 𝑘 da variável aleatória X. No entanto,
para uma variável contínua é mais apropriado o termo função densidade de probabilidade (fdp), ao invés de
uma distribuição de probabilidade. Assim sendo, objetiva-se o valor da probabilidade para um intervalo de
X, não para um valor específico de X.

Equação 1.12. Função densidade de probabilidade de uma variável contínua


Seja X uma variável aleatória contínua, uma função densidade de probabilidade 𝑓(𝑥) é uma fun-
ção tal que (MONTGOMERY; RUNGER, 2024; MEYER, 2011):

• 𝑓(𝑥) ≥ 0 para todo x



• ∫−∞ 𝑓(𝑥)𝑑𝑥 = 1
𝑏
• P(𝑎 ≤ X ≤ 𝑏) = ∫𝑎 𝑓(𝑥)𝑑𝑥, para quaisquer 𝑎 e 𝑏, com −∞ ≤ 𝑎 ≤ 𝑏 ≤ ∞

𝑏
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 (σ)

Fonte: Gaspar et al. (2023)

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:

Equação 1.13. Distribuição Normal


Diz-se que X ∼ 𝒩(μ, σ2 ), sendo calculada por:

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.

Equação 1.14. Distribuição Normal Padrão


X ∼ 𝒩(μ, σ2 ) é convertido em Z ∼ 𝒩(0, 1) usando a expressão:

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

Equação 1.15. Função de distribuição acumulada - normal padrão


Seja Z uma variável aleatória contínua, sua função de distribuição acumulada é F(𝑧) = P(Z ≤ 𝑧):
𝑧
F(𝑧) = ∫ 𝑓(𝑠)𝑑𝑠
−∞

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.

Tabela 1.4: Valores da função de distribuição normal padronizada: P(Z ≤ 𝑧)

z 0 0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09


0 0.5000 0.5040 0.5080 0.5120 0.5160 0.5199 0.5239 0.5279 0.5319 0.5359
0.1 0.5398 0.5438 0.5478 0.5517 0.5557 0.5596 0.5636 0.5675 0.5714 0.5753
0.2 0.5793 0.5832 0.5871 0.5910 0.5948 0.5987 0.6026 0.6064 0.6103 0.6141
0.3 0.6179 0.6217 0.6255 0.6293 0.6331 0.6368 0.6406 0.6443 0.6480 0.6517
0.4 0.6554 0.6591 0.6628 0.6664 0.6700 0.6736 0.6772 0.6808 0.6844 0.6879
0.5 0.6915 0.6950 0.6985 0.7019 0.7054 0.7088 0.7123 0.7157 0.7190 0.7224
0.6 0.7257 0.7291 0.7324 0.7357 0.7389 0.7422 0.7454 0.7486 0.7517 0.7549
0.7 0.7580 0.7611 0.7642 0.7673 0.7704 0.7734 0.7764 0.7794 0.7823 0.7852
0.8 0.7881 0.7910 0.7939 0.7967 0.7995 0.8023 0.8051 0.8078 0.8106 0.8133
0.9 0.8159 0.8186 0.8212 0.8238 0.8264 0.8289 0.8315 0.8340 0.8365 0.8389
1 0.8413 0.8438 0.8461 0.8485 0.8508 0.8531 0.8554 0.8577 0.8599 0.8621
1.1 0.8643 0.8665 0.8686 0.8708 0.8729 0.8749 0.8770 0.8790 0.8810 0.8830
1.2 0.8849 0.8869 0.8888 0.8907 0.8925 0.8944 0.8962 0.8980 0.8997 0.9015
1.3 0.9032 0.9049 0.9066 0.9082 0.9099 0.9115 0.9131 0.9147 0.9162 0.9177
1.4 0.9192 0.9207 0.9222 0.9236 0.9251 0.9265 0.9279 0.9292 0.9306 0.9319
1.5 0.9332 0.9345 0.9357 0.9370 0.9382 0.9394 0.9406 0.9418 0.9429 0.9441
1.6 0.9452 0.9463 0.9474 0.9484 0.9495 0.9505 0.9515 0.9525 0.9535 0.9545
1.7 0.9554 0.9564 0.9573 0.9582 0.9591 0.9599 0.9608 0.9616 0.9625 0.9633
1.8 0.9641 0.9649 0.9656 0.9664 0.9671 0.9678 0.9686 0.9693 0.9699 0.9706
1.9 0.9713 0.9719 0.9726 0.9732 0.9738 0.9744 0.9750 0.9756 0.9761 0.9767
2 0.9772 0.9778 0.9783 0.9788 0.9793 0.9798 0.9803 0.9808 0.9812 0.9817
2.1 0.9821 0.9826 0.9830 0.9834 0.9838 0.9842 0.9846 0.9850 0.9854 0.9857
2.2 0.9861 0.9864 0.9868 0.9871 0.9875 0.9878 0.9881 0.9884 0.9887 0.9890
2.3 0.9893 0.9896 0.9898 0.9901 0.9904 0.9906 0.9909 0.9911 0.9913 0.9916
2.4 0.9918 0.9920 0.9922 0.9925 0.9927 0.9929 0.9931 0.9932 0.9934 0.9936
2.5 0.9938 0.9940 0.9941 0.9943 0.9945 0.9946 0.9948 0.9949 0.9951 0.9952
2.6 0.9953 0.9955 0.9956 0.9957 0.9959 0.9960 0.9961 0.9962 0.9963 0.9964
2.7 0.9965 0.9966 0.9967 0.9968 0.9969 0.9970 0.9971 0.9972 0.9973 0.9974
2.8 0.9974 0.9975 0.9976 0.9977 0.9977 0.9978 0.9979 0.9979 0.9980 0.9981
2.9 0.9981 0.9982 0.9982 0.9983 0.9984 0.9984 0.9985 0.9985 0.9986 0.9986
3 0.9987 0.9987 0.9987 0.9988 0.9988 0.9989 0.9989 0.9989 0.9990 0.9990

Fonte: Adaptada de <https://freakonometrics.hypotheses.org/9404>

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.

Equação 1.16. Função densidade probabilidade via distribuição acumulada


𝑥
Sabendo que a função de distribuição acumulada é F(𝑥) = P(X ≤ 𝑥) = ∫−∞ 𝑓(𝑠)𝑑𝑠, ou seja, a
área sob 𝑓(𝑠) no intervalo [−∞, 𝑥]. A obtenção de P(𝑎 ≤ X ≤ 𝑏) é a área da função no intervalo [𝑎, 𝑏],
logo:

P(𝑎 ≤ X ≤ 𝑏) = F(𝑏) − F(𝑎)

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:

P(𝑐 ≤ Z ≤ 𝑑) = φ(𝑑) − φ(𝑐)

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].

Figura 1.10: Distribuição Normal padrão: P(0, 6 ≤ Z ≤ 0, 8) é 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

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

9 #Cálculo da variável padronizada Z


10 c=(a - med)/des_pad
11 d=(b - med)/des_pad
12

13 #Mostra o valor padronizado


14 print('X=[', a, ',', b, '] para Z=[', c, ',', d, ']')

Código em Python 1.16: Distribuição Normal Padrão

37
Paulo Ribeiro UFMA

1.7 Uso de módulos e bibliotecas


Nas seções anteriores construiu-se o código em Python para os principais tópicos, sendo que evitou-
se ao máximo o uso de funções e bibliotecas. Essa abordagem inicial é necessária para entender bem os
conceitos, entretanto, para problemas cotidianos recomenda-se o uso de bibliotecas.
Python possui vários módulos e bibliotecas que podem ser usadas para tarefas de análise exploratória
dos dados, por exemplo Statistics, NumPy e SciPy. Assim sendo, os exemplos das seções anteriores podem
ser resolvidos com funções desses módulos e bibliotecas, por exemplo para o caso da média, pode-se facil-
mente obtê-la usando a função mean do Statistics como mostrado no Código 1.17. A linha 1 do código importa
a função mean que é chamada na linha 8.
1 #Importa a função mean do statistics
2 from statistics import mean
3

4 #Amostra
5 amostra =[2, 3, 9, 1, 4, 8, 6, 7, 0, 5]
6

7 #Cálcula a média com a função mean


8 media=mean(amostra)
9

10 #Por último mostra -se a média


11 print('A média da amostra é ', media)

Código em Python 1.17: Função mean do statistics - versão 1

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

7 #Cálcula a média com a função mean


8 media=statistics.mean(amostra)
9

10 #Por último mostra -se a média


11 print('A média da amostra é ', media)

Código em Python 1.18: Função mean do statistics - versão 2

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

7 #Cálcula a média com a função mean


8 media=est.mean(amostra)
9

10 #Por último mostra -se a média

38
CAPÍTULO 1. ANÁLISE EXPLORATÓRIA

11 print('A média da amostra é ', media)

Código em Python 1.19: Função mean do statistics - versão 3

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

7 #Cálcula a média com a função mean


8 media=np.mean(amostra)
9

10 #Por último mostra -se a média


11 print('A média da amostra é ', media)

Código em Python 1.20: Função mean do NumPy

1 #Importa scipy com abreviação


2 import scipy as sp
3

4 #Amostra
5 amostra =[2, 3, 9, 1, 4, 8, 6, 7, 0, 5]
6

7 #Cálcula a média com a função mean


8 media=sp.mean(amostra)
9

10 #Por último mostra -se a média


11 print('A média da amostra é ', media)

Código em Python 1.21: Função mean do SciPy

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

21 #Dados para cálculo do coeficiente de correlação


22 alt =[1.6 , 1.9, 1.7, 1.5, 1.4, 2.0, 1.8]
23 peso =[75, 95, 80, 70, 68, 98, 85]
24 #Cálcula coeficiente de correlação
25 coef_correlacao =np.corrcoef(alt , peso)
26 print('\nO coeficiente de correlação é ', coef_correlacao [0][1] )
27

28

29 #Cálculos distribuição de propabilidade


30

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

46 #Parâmetro da normal padronizada


47 z=0.52
48 #Cálculo da probabilidade normal acumulada
49 p_normal=sp.norm.cdf(z) # Z<=z
50 print('Normal: probabilidade para z<=',z,'é',p_normal)
51 #Cálculo da probabilidade no intervalo [z1 ,z2]
52 z1 =0.6
53 z2 =0.8
54 prob1=sp.norm.cdf(z1)
55 prob2=sp.norm.cdf(z2)
56 p_intervalo=prob2 -prob1
57 print('Normal: probabilidade no intervalo [',z1 ,',', z2 ,'] é',p_intervalo)

Código em Python 1.22: Usando NumPy para estatísticas e probabilidades

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

Saiba mais 1.8. Módulos e bibliotecas estatísticas


O Código 1.22 demonstrou como obter média, mediana, coeficiente de correlação, distribuições
de probabilidades etc com o uso de módulos e bibliotecas estatísticas. Para saber mais sobre essas
funções consulte a documentação:

• 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.

2.1 Estimação pontual e intervalar

Na estimação pontual, estima-se um único valor/parâmetro de interesse. Na estimação intervalar obtém-


se um intervalo, com um grau de confiança, para o valor/parâmetro.
As observações coletadas na amostra são consideradas variáveis aleatórias, isto é, tem-se X1 , X2 , ...,
X𝑚 . Assim sendo, as funções aplicadas nessas variáveis aleatórias também são variáveis aleatórias, por
exemplo a média amostral (𝑥)̄ e a variância (𝑠2 ) amostral também são variáveis aleatórias. Por exemplo para
uma primeira amostra com 𝑛 = 10 obtém-se uma média 𝑥1̄ , mas se uma nova amostra (segunda) for cole-
tada, também com 𝑛 = 10, obtem-se outra média 𝑥2̄ e assim sucessivamente. Desta forma, essas variáveis
aleatórias tem distribuições de probabilidades, sendo que essas são denominadas distribuições amostrais
(MEYER, 2011).
No entanto, o objetivo é relacionar essas médias com a média da população representada por (μ) e/ou
com a variância populacional (σ2 ). O parâmetro de interesse é comumente denotado como θ, sendo que
pode representar a média (μ), a variância (σ2 ) ou qualquer parâmetro (MONTGOMERY; RUNGER, 2024).
Sendo X uma variável aleatória com distribuição de probabilidades 𝑓(𝑥), com X1 , X2 , …, X𝑛 uma amostra
aleatória de tamanho 𝑛 de X tem-se que θ̂ = ℎ(X , X , …, X ) é um estimador pontual de θ. ℎ(X , X , …, X )
1 2 𝑛 1 2 𝑛
é denominada estatística1 - uma função de valores reais da amostra. Ou seja, θ̂ é uma estimativa pontual de
θ (MONTGOMERY; RUNGER, 2024).
1 Exemplos de estatísticas: média amostral, variância amostral etc
Paulo Ribeiro UFMA

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:

Equação 2.1. Média e variância da distribuição amostral da média


Média da amostra:
X + X2 + ...X𝑛
X̄ = 1
𝑛
Segue distribuição normal com média das médias amostrais:

μ + μ + ...μ
μX̄ = =μ
𝑛

Distribuição normal com variância das médias amostrais:

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.

Equação 2.2. Teorema central do limite


2
Para X1 , X2 , …, X𝑛 de tamanho 𝑛 com média (μ) e variância ( σ𝑛 ), sendo X̄ a média da amostra,
tem-se:

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:

P(X̄ < 48) = P(Z < −2, 53) = 0, 0057

44
CAPÍTULO 2. INFERÊNCIA ESTATÍSTICA

Portanto, se a potência média de uma lâmpada é 50 w, desvio padrão é 5, logo, a probabilidade de


encontrar uma lâmpada com potência menor que 48 w é baixa (< 0, 58%).
O Código 2.1 faz os cálculos acima. A linha 12 calcula o desvio padrão de X̄ (erro-padrão da média
amostral). A linha 21 calcula a probabilidade, conforme capítulo anterior. Destaca-se que o valor da linha 21
também pode ser consultado em uma tabela de distribuição normal padrão 2 .
1 from scipy.stats import norm
2 from math import sqrt
3

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

11 #Erro -padrão da média amostral


12 des_pad=des_pad_amos/sqrt(n)# desvio padrao de X_barra
13

14 #Valor de X
15 X=48
16

17 #Cálculo da variável padronizada Z


18 z=(X - med_amos)/des_pad
19

20 #Cálculo da probabilidade
21 probabilidade=norm.cdf(z)
22

23 #Mostra o valor padronizado


24 print('A probabilidade para Z=',z, ' e ', probabilidade)

Código em Python 2.1: Propabilidade para estimação pontual

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

7 60.3, 60.2, 60.7, 59.2, 60.6, 59.6,


8 60.2, 61.0, 59.4, 61.2, 59.7, 60.2,
9 60.5, 58.7, 59.9, 59.8, 60.8, 60.1,
10 60.7, 59.9, 60.1, 60.7, 60.1, 61.1]
11

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

19 #Erro -padrão da média amostral


20 des_pad=des_pad_amos/sqrt(n)# desvio padrao de X_barra
21

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 , ']')

Código em Python 2.2: Intervalo com dois erros-padrão

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).

Equação 2.3. Intervalo de confiança de μ para σ2 conhecida


Deseja-se obter P(𝑙𝑖 ≤ Z ≤ 𝑙𝑠 ) = 1 − α. Para 𝑙𝑖 = −𝑧 e 𝑙𝑖 = 𝑧, tem-se:

P(−𝑧 ≤ Z ≤ 𝑧) = 1 − α

46
CAPÍTULO 2. INFERÊNCIA ESTATÍSTICA

̄
X−μ
Sabendo que Z = √σ ,tem-se:
𝑛

X̄ − μ
P(−𝑧 ≤ ≤ 𝑧) = 1 − α
√σ
𝑛

Reorganizando os termos e isolando μ, obtém-se:

σ σ
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

60, 026 ≤ μ ≤ 60, 418

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

20 #Erro -padrão da média amostral


21 des_pad=des_pad_conhecido /sqrt(n)# desvio padrao de X_barra
22

23 #Intervalo de confianca
24 alpha =0.05 # Intervalo de confianca 95%
25

26 # Obter o 'z' associado a probabilidade (1-alpha /2)


27 z=norm.ppf(1-alpha /2) #Inverso da norm.cdf
28

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 , ']')

Código em Python 2.3: Obtenção de intervalo de confiança

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

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

20 #Erro -padrão da média amostral


21 des_pad=des_pad_conhecido /sqrt(n)# desvio padrao de X_barra
22

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))

Código em Python 2.4: Obtenção de intervalo com a SciPy

Saiba mais 2.1. Tamanho da amostra 𝑛


Destaca-se que além do nível de confiança (α), outro fator importante para um intervalo mais
curto (mais preciso) é o tamanho da amostra. Pela equação do intervalo (𝑥̄ − 𝑧 √σ𝑛 , 𝑥̄ + 𝑧 √σ𝑛 ) percebe-
se que quanto maior o 𝑛, mais curto o intervalo. Assim sendo, para um intervalo curto verifica-se a
importância de uma amostra com tamanho razoável. Para mais informações sobre como determinar
o tamanho da amostra 𝑛 para obter um determinado intervalo consulte item 8.1.2 Escolha do Tamanho
da Amostra (MONTGOMERY; RUNGER, 2024).

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 (𝑠):

Equação 2.4. Intervalo de confiança de μ (média e variância desconhecidas)


Sabendo que o intervalo para um σ conhecido é:

σ σ
𝑥̄ − 𝑧 α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

21 #Erro -padrão da média amostral


22 des_pad=des_pad_amostral /sqrt(n)# desvio padrao de X_barra
23

24 #Intervalo de confianca
25 alpha =0.05 # Intervalo de confianca 95%
26

27 # Obter o 'z' associado a probabilidade (1-alpha /2)


28 z=norm.ppf(1-alpha /2) #Inverso da norm.cdf
29

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 , ']')

Código em Python 2.5: Intervalo de confiança para variância populacional desconhecida

Saiba mais 2.2. Aproximação de σ com 𝑠


Pelo teorema central do limite 𝑛 ≥ 30 seria suficiente, entretanto, recomenda-se um valor maior
para 𝑛. 𝑛 ≥ 40, pois 𝑠 é uma estimativa, ou seja possui, uma variabilidade (MONTGOMERY; RUNGER,
2024). Por isso criou-se uma linha com mais 6 dados na amostra, mudando o valor de 𝑛 de 𝑛 = 36
para 𝑛 = 42 no exemplo acima.

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.

Figura 2.1: Distribuição t de student para 𝑘 = 5, 𝑘 = 10 e 𝑘 = 50

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 α.

Saiba mais 2.3. Distribuição t de Student


Para mais informações sobre a distribuição t de Student consulte item 14.8 Distribuição t de Stu-
dent (MEYER, 2011) ou item 8.2.1 Distribuição t (MONTGOMERY; RUNGER, 2024).

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

59, 954 ≤ μ ≤ 60, 51

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

22 #Erro -padrão da média amostral


23 des_pad=des_pad_amostral /sqrt(n)# desvio padrao de X_barra
24

25 #Intervalo de confianca
26 alpha =0.05 # Intervalo de confianca 95%
27

28 # Obter o 't' associado a probabilidade (1-alpha /2)


29 t=t.ppf(1-alpha/2, k)
30

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 , ']')

Código em Python 2.6: Intervalo de confiança para variância populacional desconhecida

52
CAPÍTULO 2. INFERÊNCIA ESTATÍSTICA

Tabela 2.1: Valores da distribuição t de student para 𝑡α,𝑘

𝑛/α 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

Fonte: Adaptada de <https://www.mghassany.com/blog/generating-statistical-tables/>

2.2 Teste de hipótese

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;

2. Testes não Paramétricos: Não restringe a uma determinada distribuição de probabilidade;

Os testes paramétricos e não paramétricos serão apresentados em detalhes nas subseções seguintes.

2.2.1 Testes paramétricos


Os testes paramétricos podem ser utilizados para: i) uma amostra da população com variância conhe-
cida; ii) duas amostras da população com variância conhecida; iii) uma amostra da população com variância
desconhecida; iv) duas amostras da população com variância desconhecida; v) três ou mais amostras da po-
pulação com variância desconhecida. Cada um desses casos é apresentado em detalhes a seguir.

Teste Z para uma amostra

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:

Equação 2.5. Teste de hipótese

H0 ∶ μ = μ 0

H1 ∶ μ < μ 0

Pode-se cometer dois tipos de erro (MEYER, 2011):

• Erro tipo 1: Rejeitar H0 quando H0 for verdadeira;

• Erro tipo 2: Aceitar H0 quando H0 for falsa;

Equação 2.6. Tipo de erro e nível de significância (α) do teste (MONTGOMERY, 2012)

α = P(erro tipo 1) = P(Rejeitar H0 | H0 é verdadeira)

54
CAPÍTULO 2. INFERÊNCIA ESTATÍSTICA

β = P(erro tipo 2) = P(Aceitar H0 | H0 é falsa)

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

23 #Erro -padrão da média amostral


24 des_pad=des_pad_populacao /sqrt(n)# desvio padrao de X_barra
25

26 #Nível de significância
27 alpha =0.05
28

55
Paulo Ribeiro UFMA

29 # Obtém o z crítico para o nível de significância


30 z_critico=norm.ppf(1-alpha)
31

32 #Cálculo da variável padronizada Z


33 zo=( med_amos - med_populacao)/des_pad
34

35 #Mostra z crítico e z
36 print('Valor de z crítico:', z_critico , ' e zo calculado ', zo)
37

38 #Compara z com o z crítico


39 if(zo <-z_critico):
40 print("Rejeita -se hipótese nula. Hipótese alternativa aceita")
41 else:
42 print("Não se pode rejeitar a hipótese nula")

Código em Python 2.7: Teste de hipótese (z-score)

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 .

Figura 2.2: Teste de hipótese

Rejeita H0 Não 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

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

23 #Erro -padrão da média amostral


24 des_pad=des_pad_populacao /sqrt(n)# desvio padrao de X_barra
25

26 #Nível de significância
27 alpha =0.05
28

29 #Cálculo da variável padronizada Z


30 zo=( med_amos - med_populacao)/des_pad
31

32 #Cálculo do valor 'p'


33 p=norm.cdf(zo)
34

35 #Compara p com alpha


36 if(p<alpha):
37 print("Rejeita -se hipótese nula. Hipótese alternativa aceita com valor p=", p)
38 else:
39 print("Não se pode rejeitar a hipótese nula , pois p=", p)

Código em Python 2.8: Teste de hipótese (z-score - valor 𝑝)

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 .

Figura 2.3: Teste de hipótese bilateral

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

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

23 #Erro -padrão da média amostral


24 des_pad=des_pad_populacao /sqrt(n)# desvio padrao de X_barra
25

26 #Nível de significância
27 alpha =0.05
28

29 # Obtém o z crítico para o nível de significância


30 z_critico=norm.ppf(1-alpha /2)
31

32 #Cálculo da variável padronizada Z


33 zo=( med_amos - med_populacao)/des_pad
34

35 #Mostra z crítico e z
36 print('Valor de z crítico:', z_critico , ' e zo calculado ', zo)
37

38 #Compara z com o z crítico


39 if(abs(zo)>z_critico):
40 print("Rejeita -se hipótese nula. Hipótese alternativa aceita")
41 else:
42 print("Não se pode rejeitar a hipótese nula")
43

44 #Caso queria comparar com p ao invés do z crítico


45 #Cálculo do valor 'p'
46 p=2-2* norm.cdf(abs(zo))
47

48 #Compara p com alpha


49 if(p<alpha):
50 print("\nRejeita -se hipótese nula. Hipótese alternativa aceita com valor p=", p)
51 else:
52 print("\nNão se pode rejeitar a hipótese nula , pois p=", p)

Código em Python 2.9: Teste de hipótese (bilateral)

Teste Z de duas amostras

Similarmente, para um problema de comparação de duas médias populacionais adota-se o teste Z de


duas amostras (two-sample Z-test). Por exemplo, a altura (em metros) da população de uma cidade 𝑐𝑎 é
normalmente distribuída com σ𝑎 conhecida, assim como a altura de uma cidade 𝑐𝑏 (com σ𝑏 ), e pretende-se
descobrir se existe diferença de altura para as populações dessas cidades. Pode-se escrever as hipóteses
como:

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 é:

Equação 2.7. Cálculo 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 é:

• Teste bilateral: aceita H1 μ𝑎 − μ𝑏 ≠ 0 para |Z𝑜 | > Z α2

• Teste unilateral a esquerda: aceita H1 μ𝑎 − μ𝑏 < 0 para Z𝑜 < −Zα

• Teste unilateral a direita: aceita H1 μ𝑎 − μ𝑏 > 0 para Z𝑜 > Zα

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

13 amos_cid_b =[1.82 , 1.95, 1.76, 1.83, 1.79, 1.68,


14 1.91, 1.95, 1.72, 1.92, 1.83, 1.81,
15 1.72, 1.85, 1.78, 1.84, 1.75, 1.77,
16 1.69, 1.82, 1.81, 1.92, 1.89, 1.85,
17 1.81, 1.75, 1.92, 1.95, 1.92, 1.92,
18 1.94, 1.83, 1.87, 1.79, 1.72, 1.89]
19

20 #Tamanho das amostras

60
CAPÍTULO 2. INFERÊNCIA ESTATÍSTICA

21 na=len(amos_cid_a)
22 nb=len(amos_cid_a)
23

24 #Dados das amostras


25 med_amos_a=np.mean(amos_cid_a) #media amostral
26 med_amos_b=np.mean(amos_cid_b) #media amostral
27

28 #Desvios padrões conhecidos


29 des_pad_a =0.08
30 des_pad_b =0.06
31

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

38 # Obtém o z crítico para o nível de significância


39 z_critico=norm.ppf(1-alpha /2)
40

41 #Cálculo da variável padronizada Z


42 zo=( med_amos_a - med_amos_b)/des_pad
43

44 #Mostra z crítico e z
45 print('Valor de z crítico:', z_critico , ' e zo calculado ', zo)
46

47 #Compara z com o z crítico


48 if(abs(zo)>z_critico):
49 print("Rejeita -se hipótese nula. Hipótese alternativa aceita")
50 else:
51 print("Não se pode rejeitar a hipótese nula")
52

53 #Caso queria comparar com p ao invés do z crítico


54 #Cálculo do valor 'p'
55 p=2-2* norm.cdf(abs(zo))
56

57 #Compara p com alpha


58 if(p<alpha):
59 print("\nRejeita -se hipótese nula. Hipótese alternativa aceita com valor p=", p)
60 else:
61 print("\nNão se pode rejeitar a hipótese nula , pois p=", p)

Código em Python 2.10: Teste Z de duas amostras (bilateral)

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) é:

• Teste bilateral: aceita H1 μ ≠ μ0 para |T𝑜 | > 𝑡 α2 , 𝑘

• Teste unilateral a esquerda: aceita μ < μ0 para T𝑜 < −𝑡α , 𝑘

• Teste unilateral a direita: aceita μ > μ0 para T𝑜 > 𝑡α , 𝑘

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 :

• Teste bilateral: aceita H1 μ1 − μ2 ≠ 0 para |T𝑜 | > 𝑡 α2 , 𝑘

• Teste unilateral a esquerda: aceita H1 μ1 − μ2 < 0 para T𝑜 < −𝑡α , 𝑘

• Teste unilateral a direita: aceita H1 μ1 − μ2 > 0 para T𝑜 > 𝑡α , 𝑘

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 é:

Equação 2.8. Cálculo de T𝑜 para o teste t de duas amostras (MONTGOMERY, 2012)

𝑥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:

(𝑛1 − 1)S21 + (𝑛2 − 1)S22


S2𝑝 =
𝑛1 + 𝑛2 − 2
Adicionalmente, o valor de 𝑘 para duas amostras, é diferente para uma amostra (𝑘 = 𝑛 − 1), pois
𝑘 depende de 𝑛1 e 𝑛2 , isto é, 𝑘 = 𝑛1 + 𝑛2 − 2.

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

8 1.71, 1.65, 1.92, 1.82, 1.69, 1.83]


9

10 amos2 =[1.92 , 1.95, 1.76, 1.83, 1.81, 1.68,


11 1.87, 1.85, 1.78, 1.84, 1.78, 1.77,
12 1.69, 1.87, 1.81, 1.92, 1.89, 1.85]
13

14

15 #Tamanho das amostras


16 n1=len(amos1)
17 n2=len(amos2)
18

19 #Dados das amostras


20 med_amos1=np.mean(amos1) #media amostral
21 med_amos2=np.mean(amos2) #media amostral
22

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

39 # Obtém o t crítico para o nível de significância


40 t_critico=t.ppf(1-alpha/2, k)
41

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

48 #Compara t com o t crítico


49 if(abs(to)>t_critico):
50 print("Rejeita -se hipótese nula. Hipótese alternativa aceita")
51 else:
52 print("Não se pode rejeitar a hipótese nula")
53

54 #Caso queria comparar com p ao invés do z crítico


55 #Cálculo do valor 'p'
56 p=2-2*t.cdf(abs(to), k)
57

58 #Compara p com alpha


59 if(p<alpha):
60 print("\nRejeita -se hipótese nula. Hipótese alternativa aceita com valor p=", p)
61 else:
62 print("\nNão se pode rejeitar a hipótese nula , pois p=", p)

Código em Python 2.11: Teste t de duas amostras (bilateral)

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

8 amos2 =[1.92 , 1.95, 1.76, 1.83, 1.81, 1.68,


9 1.87, 1.85, 1.78, 1.84, 1.78, 1.77,
10 1.69, 1.87, 1.81, 1.92, 1.89, 1.85]
11

12 #Função ttest_ind (test t para duas amostras)


13 to , p = ttest_ind(amos1 , amos2)
14

15 #Mostra to e p
16 print('Valor de to=', to , ' e de p=', p)

Código em Python 2.12: Teste t de duas amostras (bilateral) com a Scipy

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

Equação 2.9. Teste t pareado para duas amostras (MONTGOMERY, 2012)


Inicia-se com as diferenças entre as amostras dos grupos pré e pós:

𝑑𝑗 = 𝑥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

Ou seja, tem-se um test t:

𝑑̄
𝑡𝑜 =
S
√𝑑
𝑛
𝑑 ̄ é a média amostral das diferenças das médias:

1 𝑛
𝑑 ̄= ∑𝑑
𝑛 𝑗=1 𝑗

S𝑑 é o desvio padrão amostral das diferenças das médias:


1
𝑛 2
̄2
⎡ ∑ (𝑑𝑗 − 𝑑) ⎤
𝑗=1
S𝑑 = ⎢ ⎥
⎢ 𝑛−1 ⎥
⎣ ⎦
Logo:

• Teste bilateral: aceita H1 μ𝑑 ≠ 0 para |𝑡𝑜 | > 𝑡 α2 , 𝑘

• Teste unilateral a esquerda: aceita H1 μ1 − μ2 < 0 para 𝑡𝑜 < −𝑡α , 𝑘

• Teste unilateral a direita: aceita H1 μ1 − μ2 > 0 para 𝑡𝑜 > 𝑡α , 𝑘

Considerando que os 𝑛 participantes estão nos dois grupos, 𝑘 = 𝑛 − 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

6 pos =[37.5 , 37.1, 36.4, 38.2, 36.1,


7 36.3, 38.1, 37.6, 36.2, 37.9]
8

9 #Função ttest_rel (test t pareado para duas amostras)


10 to , p = ttest_rel(pre , pos)
11

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);

• Para mais de dois grupos pareados utiliza-se a ANOVA de medidas repetidas.

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.

Para mais informação sobre ANOVA consulte: Montgomery (2012).

2.2.2 Testes não paramétricos

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

Figura 2.4: Testes paramétricos e seus equivalentes não paramétricos

Número de grupos Pareado Versão paramétrica Versão não paramétrica

2 Não Teste t não pareado Teste de Mann-Whitney

2 Sim Teste t pareado Teste de Wilcoxon

≥3 Não ANOVA Teste de Kruskal-Wallis

≥3 Sim ANOVA de medidas repetidas Teste de Friedman

Saiba mais 2.5. Teste de hipótese não paramétrico


Os testes de hipótese não paramétricos são mais avançados e não são comumente encontrados
em livros básicos de estatística e probabilidade. Assim sendo, opta-se por mostrar neste livro apenas
um destes testes não paramétricos, nomeadamente o teste de Wilcoxon.

Para mais informações sobre testes não paramétricos consulte:

• FÁVERO, L. P, BELFIORE, P. Manual de análise de dados: Estatística e Modelagem Multivariada com


Excel, SPSS e Stata: LTC, 2017.

• TRIOLA, M. F. Introdução à Estatística. 12a edição: LTC, 2023.

• WASSERMAN, L. All of Nonparametric Statistics. Springer Texts in Statistics: Springer, 2006

• KLOKE, J., MCKEAN, J. W. Nonparametric statistical methods using R. 2a edição: Chapman e


Hall/CRC, 2024.

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

Equação 2.10. Teste de Wilcoxon


Sequência de passos para o teste de Wilcoxon:

1. Calcula-se a diferença D𝑖 , 𝑖 = 1, 2, ...𝑛

D𝑖 = Y𝑖 − X𝑖

2. Determina-se a quantidade N de elementos D𝑖 ≠ 0, N = 0, 1, 2, ...𝑛

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

6. Soma-se os elementos da coluna Postos +: 𝑠𝑜𝑚𝑎_𝑝𝑜𝑠𝑡𝑜𝑠_+

7. Soma-se os elementos da coluna Postos -: 𝑠𝑜𝑚𝑎_𝑝𝑜𝑠𝑡𝑜𝑠_−

8. T é o menor valor entre 𝑠𝑜𝑚𝑎_𝑝𝑜𝑠𝑡𝑜𝑠_+ e 𝑠𝑜𝑚𝑎_𝑝𝑜𝑠𝑡𝑜𝑠_−, isto é:

T = 𝑚𝑖𝑛(𝑠𝑜𝑚𝑎_𝑝𝑜𝑠𝑡𝑜𝑠_ + , 𝑠𝑜𝑚𝑎_𝑝𝑜𝑠𝑡𝑜𝑠_−)

9. Para N ≤ 30 (TRIOLA, 2023): rejeita-se H0 se T ≤ T𝑡𝑎𝑏𝑒𝑙𝑎 b

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):

1. Calcula-se todos os D𝑖 (terceira coluna Dif);

2. Para essas amostras não existiu D𝑖 = 0, logo N = 𝑛;

3. A quarta coluna (Dif Abs) mostra os dados ordenados por |D𝑖 |:

(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)

4. Na sétima coluna Posto+ armazena-se os postos para D𝑖 > 0

5. Na oitava coluna Posto- armazena-se os postos para D𝑖 < 0

6. A soma dos elementos da coluna Posto+ é 3, 0

7. A soma dos elementos da coluna Posto- é 52, 0

8. T = 𝑚𝑖𝑛(3, 52) = 3

9. N = 10(N ≤ 30 T(10, 0, 05) = 8 , 3 < 8, logo rejeita-se H0 .

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

16 #Teste de normalidade Shapiro Wilk


17 est , p_pre=shapiro(pre)
18 est , p_pos=shapiro(pos)
19

20 #Mostra p (teste de normalidade)


21 # Menor que alpha: distribuição não normal
22 if(p_pre < alpha and p_pos < alpha):
23 print('Não normal: p para pre e pos', p_pre , p_pos)
24

25 #Cria dataframe com com colunas Pre e Pos


26 dados = pd.DataFrame ({'Pre':pre , 'Pos':pos})
27

28 # Cálculo das diferenças Di


29 dados['Dif']= dados['Pos']-dados['Pre']
30

31 #Remove os diferença nula


32 dados=dados[dados['Dif']!=0]
33

34 #Calcula N (total das diferenças)


35 N = len(dados)
36

37 # Cálculo das diferenças Di


38 dados['Dif Abs']=abs(dados['Dif'])
39

40 # Ordena dos dados por diferença crescente

70
CAPÍTULO 2. INFERÊNCIA ESTATÍSTICA

41 dados.sort_values(by = 'Dif Abs', inplace=True)


42

43 # Cálculo o posto (ranque): 1, 2, ... N


44 dados['Posto ']=np.arange (1, N+1, 1)
45

46 #Verifica elemento repetido em Dif Abs:


47 #Caso tenha posto repetido: posto passa a ser média dos postos
48 dados_empate=dados [['Dif Abs', 'Posto ']]. groupby (['Dif Abs']).mean ()
49

50 #dados_empate tem 'Dif Abs ', 'Posto sem sinal '


51 #Mas 'Dif Abs' está como índice
52 #Retoma como coluna 'Dif Abs'
53 dados_empate.reset_index(inplace=True)
54

55 #Renomeia coluna 'Posto ' para 'Posto ant' (posto antigo)


56 dados=dados.rename(columns ={"Posto": "Posto ant"})
57

58 #Junta as tabelas 'dados ' e 'dados_empate ' usando 'Dif Abs'


59 dados = dados.merge(dados_empate , left_on = 'Dif Abs', right_on = 'Dif Abs', how = 'left ')
60

61 # Postos com sinal +


62 dados['Posto +']= dados['Posto '][ dados['Dif']>0]
63

64 # Postos com sinal -


65 dados['Posto -']= dados['Posto '][ dados['Dif']<0]
66

67 # Soma todos os postos de sinal +


68 soma_postos_mais=dados['Posto +'].sum()
69

70 # Soma todos os postos de sinal -


71 soma_postos_menos =dados['Posto -'].sum()
72

73 #Obtém T (menor soma dos postos de mesmo sinal)


74 if(soma_postos_mais <soma_postos_menos ):
75 T=soma_postos_mais
76 else:
77 T=soma_postos_menos
78

79 #Depende do tamanho da amostra


80 if(N <=25):
81 print('N=', N, '(N <=25) ')
82 #T é tabelado e depende de N
83 T_tabelado =8 # Para N=10 T_tab =8 (bilateral)
84 print("T=", T,' e T_tab=', T_tabelado)
85 #Teste
86 if(T<= T_tabelado): #Caso menor rejeita H0
87 print("Rejeita -se hipótese nula. Hipótese alternativa aceita")
88 else: #Caso maior não rejeita H0
89 print("Não se pode rejeitar a hipótese nula")
90 else:
91 print('N=', N, '(N >25) ')
92 #Cálculo média
93 media_T = (N*(N+1))/4
94 #Cálculo do desvio padrão
95 sigma_T = sqrt( (N*(N+1) *(2*N+1))/24)
96 #Cálculo da variável zo
97 zo=(T - media_T)/sigma_T
98 # Obtém o z crítico para o nível de significância
99 z_critico=norm.ppf(1-alpha /2) #Bilateral

71
Paulo Ribeiro UFMA

100 #Mostra z crítico e z


101 print('Valor de z crítico:', z_critico , ' e zo calculado ', zo)
102 #Compara z com o z crítico
103 if(abs(zo)>z_critico):
104 print("Rejeita -se hipótese nula. Hipótese alternativa aceita")
105 else:
106 print("Não se pode rejeitar a hipótese nula")
107 #Caso queria comparar com p ao invés do z crítico
108 #Cálculo do valor 'p'
109 p=2-2* norm.cdf(abs(zo))
110 #Compara p com alpha
111 if(p<alpha):
112 print("\nRejeita -se hipótese nula. Hipótese alternativa aceita com valor p=", p)
113 else:
114 print("\nNão se pode rejeitar a hipótese nula , pois p=", p)
115

116 print('\nUsando a Scipy ')


117 from scipy import stats
118 T_sci , p_sci = stats.wilcoxon(pre , pos)
119 print('Função wilcoxon do Scipy: T=', T_sci , ' e p=', p_sci)

Código em Python 2.14: Teste de Wilcoxon

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.

Saiba mais 2.6. Teste de Mann-Whitney com a Scipy


Caso precise usar o teste de Mann-Whitney pode-se usar a função mannwhitneyu da Scipy, mais
informações em: <https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.mannwhitneyu.
html>

2.3 Análise de regressão


Na seção 1.5 analisou-se a relação entre uma amostra da altura (em metros 𝑚) de pessoas e uma amos-
tra do peso (em quilogramas 𝑘𝑔) dessas pessoas. Verificou-se que para esses dados, quanto maior a al-
tura, maior o peso. Para cada valor de altura (1, 6 , 1, 9 , 1, 7 , 1, 5 , 1, 4 , 2, 0 , 1, 8) tem-se um valor de peso
(75, 95, 80, 70, 68, 98, 85) associado. Mas pelos dados não se sabe qual é o peso para uma pessoa com altura
1, 65 m. Para resolver esse problema tem-se a regressão.
Para o caso de uma variável independente usa-se uma regressão linear simples enquanto que para duas
ou mais variáveis independentes tem-se a regressão linear múltipla.

2.3.1 Regressão Linear Simples


Inicialmente, considerando a relação linear visual (Figura 1.6) entre as variáveis peso e altura, assim
como pela verificação numérica dessa relação pelo coeficiente de correlação linear de Pearson 𝑟𝑥𝑦 = 0, 99,
pode-se encontrar uma equação para essa relação. Dada que a sugestão é linear, a equação será a de uma
reta. A reta que melhor se ajusta aos dados é denominada reta de regressão, e sua equação é chamada de
equação de regressão (TRIOLA, 2023).
Com a equação de regressão pode-se predizer o valor de uma variável dado o valor da outra, no presente
exemplo pode-se calcular o peso para uma pessoa com altura 1, 65 m. Assumindo X (variável regressora)
como altura enquanto a saída Y (variável resposta) é o peso, objetiva-se achar Y para cada X dado.

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.

Equação 2.11. Regressão Linear Simples


Recordando que a equação de uma reta é:

Y = 𝑚𝑥 + 𝑛

sendo 𝑚 o coeficiente angular (inclinação) e 𝑛 o coeficiente linear (interseção).

Reescrevendo essa equação para X (variável preditora ou independente) e Y (variável resposta


ou variável dependente), trocando 𝑚 e 𝑛 por coeficientes de regressão(β𝑖 ) e adicionando um termo de
erro aleatório (ϵ), obtém-se o modelo de regressão linear simples (apenas uma variável dependente
e uma independente):

Y = β 0 + β1 𝑥 + ϵ

ϵ ∼ 𝒩(0, σ2 ), sendo que σ2 determina a variabilidade em Y.

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 𝑥𝑖

O desvio (erro/resíduo) para cada amostra é:

ϵ𝑖 = 𝑦𝑖 − 𝑦𝑖̂

Logo, a soma dos quadrados dos desvios, denotada por L, é:

𝑛
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

Saiba mais 2.7. Estimativa de β0 e β1


As equações para β ̂ e β ̂ não foram deduzidas, pois não é o foco do livro, mas pode-se verificar
0 1
sua dedução em livros de estatística, por exemplo em Montgomery e Runger (2024).

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

11 #Calcula desvios padrões


12 dp_x=Mod_Est. FuncaoDesvioPadrao (a)
13 dp_y=Mod_Est. FuncaoDesvioPadrao (p)
14

15 #Calcula coeficiente de correlação


16 r_x_y=Mod_Est.CorrelacaoPearson (a, p)
17

18 #Estimativa para beta1


19 beta_1=r_x_y *( dp_y/dp_x)
20

21 #Estimativa para beta0


22 beta_0=media_y - beta_1*media_x
23

24 #Mostra modelo de regressão


25 print('Y=', beta_0 , '+', beta_1 , 'x')
26

27 #Mostra peso para uma altura


28 x=1.65 # altura m
29 peso_est=beta_0 + beta_1*x # peso kg
30 print('Peso = ', peso_est , 'para altura=', x)

Código em Python 2.15: Regressão Linear Simples

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

7 #Define a função variância - FuncaoVariancia


8 def FuncaoVariancia(dados_amostra):
9 n=len(dados_amostra) # Obtém -se o tamanho da amostra
10 i=0
11 soma =0
12 media=FuncaoMedia(dados_amostra) #Obtém média

74
CAPÍTULO 2. INFERÊNCIA ESTATÍSTICA

13 #Laço para somar todos os desvios: somatório


14 while(i<n):
15 soma += (dados_amostra[i]-media)**2
16 i+=1
17 valor_variancia=soma /(n-1) #Divide por n-1
18 return valor_variancia
19

20 #Função para calcular correlação de Pearson


21 def CorrelacaoPearson (x, y):
22 n=len(x) # Obtém -se o tamanho da amostra
23 i=0
24 soma_num =0 # Soma numerador
25 soma_den_x =0 # Soma numerador
26 soma_den_y =0 # Soma numerador
27 media_x=FuncaoMedia(x) #Obtém média de x
28 media_y=FuncaoMedia(y) #Obtém média de y
29 #Laço para somar os elementos
30 while(i<n):
31 soma_num += (x[i]-media_x)*(y[i]-media_y) #Numerador
32 soma_den_x += (x[i]-media_x)**2 #Denominador x
33 soma_den_y += (y[i]-media_y)**2 #Denominador y
34 i+=1
35 #Após os somatórios
36 soma_den_x=soma_den_x **0.5 # Raiz quadrada denominado x
37 soma_den_y=soma_den_y **0.5 # Raiz quadrada denominado y
38 soma_denominador=soma_den_x*soma_den_y #Denominador
39 #Coeficiente: divisão da soma do numerador com a do denominador
40 coeficiente = soma_num/soma_denominador
41 return coeficiente
42

43 #Função para calcular a média


44 def FuncaoMedia(dados_amostra):
45 n=len(dados_amostra) # Obtém -se o tamanho da amostra
46 i=0
47 soma =0
48 #Laço para somar todos os elementos: somatório
49 while(i<n):
50 soma += dados_amostra[i] #Igual a soma=soma+dados_amostra[i]
51 i+=1
52 valor_media=soma/n
53 return valor_media

Código em Python 2.16: Módulo com estatísticas

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

7 p=[75, 95, 80, 70, 68, 98, 85] #Y - Peso kg


8

9 #Converte lista para array


10 a=np.array(a).reshape (-1, 1)
11 p=np.array(p).reshape (-1, 1)
12

13 #Cria modelo
14 modelo = LinearRegression ()
15 modelo.fit(a, p) # Encontra coeficientes
16

17 #Mostra modelo de regressão


18 print('Y=', modelo.intercept_ , '+', modelo.coef_ , 'x')
19

20 #Mostra peso para uma altura


21 x=1.65 # altura m
22 x=np.array(x).reshape (-1, 1)
23 peso_est=modelo.predict(x) # peso kg
24 print('Peso = ', peso_est , 'para altura=', x)
25

26 #Gera várias alturas no intervalo (1,4 a 2,0 m)


27 #1,4 / 1,5 / 1,6 / ... /2,0
28 interv_alturas=np.arange (1.4, 2.0, 0.1)
29 interv_alturas=interv_alturas.reshape (-1, 1)
30

31 #Estima peso para as alturas no intervalo


32 inert_peso_est=modelo.predict(interv_alturas)
33

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

Código em Python 2.17: Regressão Linear Simples com Scikit-learn

Saiba mais 2.8. Biblioteca Scikit-learn


A biblioteca Scikit-learn é muito utilizada na área de dados, pois possui vários algoritmos de clas-
sificação, regressão etc. Para mais informações consulte sua documentação: <https://scikit-learn.o
rg/stable/user_guide.html>

2.3.2 Regressão Linear Múltipla


A Regressão Linear Simples é útil desde que o problema contenha apenas uma variável dependente
e uma independente. No entanto, problemas mais complexos podem exigir mais variáveis, por exemplo a
variável dependente ter relação com duas ou mais variáveis independentes, ou seja, uma regressão linear
múltipla. A regressão linear múltipla é uma técnica da regressão multivariada, isto é, mais de uma variável
independente.
Pode-se imaginar que, na verdade, o peso de uma pessoa depende não somente da sua altura mas
também da sua idade. Assim sendo, a equação é reescrita como:

76
CAPÍTULO 2. INFERÊNCIA ESTATÍSTICA

Figura 2.6: Amostra (Peso x altura) em azul e sua regressão em vermelho

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).

Figura 2.7: Dataframe para dados regressão linear múltipla

77
Paulo Ribeiro UFMA

1 from mpl_toolkits.mplot3d import Axes3D


2 from sklearn.linear_model import LinearRegression
3 import numpy as np
4 import pandas as pd
5 import matplotlib.pyplot as plt
6

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

12 #Cria dataframe com com colunas Altura , Idade , Peso


13 dados = pd.DataFrame ({'Altura ':a, 'Idade ':i, 'Peso ':p})
14

15 #Obtém matrix X: colunas Altura e Idade


16 X=dados [['Altura ','Idade ']]
17

18 #Obtém y: coluna Peso


19 y=dados['Peso ']
20

21 #Cria modelo
22 modelo = LinearRegression ()
23 modelo.fit(X, y) # Encontra coeficientes
24

25 #Mostra modelo de regressão


26 print('Y=', modelo.intercept_ , '+', modelo.coef_ [0], 'x1', '+', modelo.coef_ [1], 'x2')
27

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

35 #Plota as amostras como ponto


36 ax.scatter(X['Altura '], X['Idade '], y, s=200)
37 #Label para os eixos x, y e z
38 plt.xlabel('Altura (m)')
39 plt.ylabel('Idade (anos)')
40 ax.set_zlabel('Peso (kg)')
41 plt.show () # Para visualizar o gráfico
42

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

Código em Python 2.18: Regressão Linear Múltipla com Scikit-learn

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

(a) Pontos (𝑥1 , 𝑥2 , 𝑦) (b) Plano de regressão

Figura 2.8: Regressão linear múltipla

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.

Importante 2.1. Regressão x Causalidade


Assim como explicado em correlação, uma boa regressão não implica causalidade. Não se deve
interpretar um modelo de regressão como evidência de causalidade entre as variáveis.

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.

SILVA, A. L. C. Introdução à Análise de Dados. 2. ed. [S.l.]: Editora E-papers, 2011.


TAVARES, M. Estatística aplicada à administração. 3. ed. [S.l.]: Departamento de Ciências da Administração
/ UFSC; [Brasília]: CAPES: UAB, 2021.
TRIOLA, M. F. Introdução à Estatística. 12. ed. [S.l.]: LTC, 2023.

Você também pode gostar