Python SciPy statsmodels na prática: o código e os comandos que realmente importam
Python SciPy statsmodels : o essencial em um artigo — código real, diagramas e etapas concretas, trechos de um curso de 37 lições.
Sem teoria interminável aqui: abra o terminal e pratique. Aqui está o essencial de Python SciPy statsmodels, extraído diretamente de um curso completo de 37 lições — com código real que você pode copiar e colar agora.
- Introdução e Instalação
- Revisão NumPy para SciPy
- Descobrindo SciPy
- Estatísticas descritivas com scipy.stats
- Testes estatísticos com SciPy
Prevendo o futuro com ARIMA
O que vamos ver nesta lição
O que é ARIMA, em termos simples?
ARIMA é um algoritmo de previsão. Ele observa os valores do passado e tenta deduzir o que vai acontecer no futuro.
O nome completo é Auto-Regressive Integrated Moving Average. É um nome complicado, mas o conceito é simples: o modelo se baseia nos valores passados e nos erros de previsão passados para estimar o próximo valor.
Os 3 parâmetros do ARIMA: p, d, q
Escrevemos ARIMA(p, d, q). Cada letra tem um papel preciso.
| Parâmetro | Significado | Exemplo simples |
|---|---|---|
| p | Quantos valores passados usamos para prever | p=2 : observamos os 2 últimos meses |
| d | Quantas vezes transformamos a série para estabilizá-la | d=1 : na maioria das vezes, d=1 é suficiente |
| q | Quantos erros passados usamos para corrigir a previsão | q=1 : levamos em conta o último erro |
Construindo o modelo ARIMA passo a passo
Retomamos nossa série de vendas mensais de 4 anos. Vamos usar os 38 primeiros meses para treinar o modelo e os 10 últimos meses para verificar se as previsões estão boas.
import pandas as pd
import numpy as np
from statsmodels.tsa.arima.model import ARIMA
# --- Recriar a série de vendas mensais ---
np.random.seed(42)
dates = pd.date_range(start="2020-01", periods=48, freq="ME")
tendance = np.arange(48) * 1.0
mois = dates.month
saisonnalite = 10 * np.sin(2 * np.pi * (mois - 3) / 12)
bruit = np.random.normal(0, 3, 48)
ventes = 100 + tendance + saisonnalite + bruit
serie = pd.Series(ventes, index=dates, name="Ventes")
# --- Dividir: 38 meses para aprender, 10 meses para testar ---
train = serie.iloc[:38] # dados de treinamento
test = serie.iloc[38:] # dados de teste (o futuro conhecido)
print(f"Treinamento : {len(train)} meses")
print(f"Teste : {len(test)} meses")# --- Criar e ajustar o modelo ---
# order=(p, d, q) = (1, 1, 1) : configuração básica
modele = ARIMA(train, order=(1, 1, 1))
resultat = modele.fit()
# Exibir um resumo curto
print(f"AIC do modelo : {resultat.aic:.2f}")
print("Modelo ajustado com sucesso!")Gerar uma previsão
Agora que treinamos o modelo, pedimos que preveja os próximos 10 meses.
# Gerar uma previsão para 10 meses
prevision = resultat.forecast(steps=10)
# Comparar previsão vs valores reais
comparaison = pd.DataFrame({
"Real" : test.values.round(1),
"Previsao" : prevision.values.round(1),
"Erro" : (test.values - prevision.values).round(1)
}, index=test.index)
print(comparaison)- Real : as vendas reais desses meses (o que escondemos do modelo durante o treinamento)
- Previsao : o que o modelo ARIMA previu
- Erro : a diferença. Um erro próximo de 0 é bom. Um erro grande significa que a previsão foi ruim.
Medir a qualidade da previsão
Para saber se nosso modelo prevê bem, calculamos o erro médio absoluto (MAE). É simplesmente a média dos erros, sem considerar o sinal (positivo ou negativo).
mae = np.abs(test.values - prevision.values).mean()
print(f"Erro médio absoluto (MAE) : {mae:.1f} unidades")
print(f"Média das vendas reais : {test.mean():.1f} unidades")
print(f"Erro relativo : {mae / test.mean() * 100:.1f}%")Prever o futuro além dos dados disponíveis
Na vida real, você não tem dados de teste para comparar. Quer apenas prever os próximos meses.
Primeiro script SciPy
Objetivos pedagógicos
A estrutura de um script de análise típico
Todo script de análise de dados em Python segue um esquema semelhante. Aprender esse esquema agora vai ajudar em todos os capítulos seguintes.
Esquema geral
Cenário: analisar as notas de um curso
Você é professor. Tem as notas de 20 alunos em 100. Quer entender:
Etapa 1: os imports
A primeira coisa a fazer em todo script é importar as bibliotecas. Veja por que as importamos com aliases:
import numpy as np # np é mais curto de escrever que numpy from scipy import stats # importamos apenas o módulo stats do SciPy import matplotlib.pyplot as plt # plt é o alias padrão para plotar gráficos
from scipy import stats e não import scipy? — O SciPy é dividido em submódulos. Importar apenas stats é mais eficiente porque carregamos apenas o que precisamos. Depois escrevemos stats.mean() em vez de scipy.stats.mean().Etapa 2: criar os dados
notes = np.array([
72, 85, 91, 63, 78, 55, 88, 94, 70, 82,
66, 79, 87, 61, 90, 75, 83, 68, 77, 95
])
print("Número de alunos :", len(notes))
print("Notas :", notes)Etapa 3: calcular as estatísticas com scipy.stats
moyenne = np.mean(notes)
mediane = np.median(notes)
ecart_type = np.std(notes)
minimum = np.min(notes)
maximum = np.max(notes)
print(f"Média : {moyenne:.2f}")
print(f"Mediana : {mediane:.2f}")
print(f"Desvio-padrão : {ecart_type:.2f}")
print(f"Mínimo : {minimum}")
print(f"Máximo : {maximum}")Etapa 4: usar scipy.stats para ir mais longe
O NumPy calcula as estatísticas básicas. O SciPy vai além adicionando medidas como a assimetria (skewness) e o achatamento (kurtosis), que indicam a forma da distribuição.
asymetrie = stats.skew(notes)
aplatissement = stats.kurtosis(notes)
description = stats.describe(notes)
print(f"Assimetria (skewness) : {asymetrie:.4f}")
print(f"Achatamento (kurt) : {aplatissement:.4f}")
print()
print("Descrição completa por scipy.stats.describe() :")
print(description)Etapa 5: interpretar os resultados
| Estatística | Valor | O que significa |
|---|---|---|
| Média | 77.95 | Em média, os alunos têm quase 78/100 |
| Mediana | 78.50 | Metade dos alunos tem menos de 78,5 e a outra metade mais |
| Desvio-padrão | 11.32 | As notas variam cerca de 11 pontos em torno da média |
| Assimetria (-0.25) | Leve | A distribuição é quase simétrica (leve concentração nas notas altas) |
| Achatamento (-0.88) | Negativo | Distribuição um pouco mais plana que a normal (platykúrtica) |
Etapa 6: visualizar (bônus)
plt.figure(figsize=(8, 4))
plt.hist(notes, bins=8, color='steelblue', edgecolor='white', alpha=0.8)
plt.axvline(moyenne, color='red', linestyle='--', label=f'Média ({moyenne:.1f})')
plt.axvline(mediane, color='orange', linestyle='-', label=f'Mediana ({mediane:.1f})')
plt.xlabel("Nota sobre 100")
plt.ylabel("Número de alunos")
plt.title("Distribuição das notas da turma")
plt.legend()
plt.tight_layout()
plt.show()O que podemos fazer com um array NumPy
O que vamos ver nesta lição
Ler um valor preciso em um array
Imagine que seu array é uma fileira de caixas numeradas. A primeira caixa é numerada 0, não 1. Essa é a convenção em Python. A segunda caixa é 1, a terceira é 2, e assim por diante.
Também podemos contar a partir do fim com números negativos. -1 dá o último elemento, -2 o penúltimo, etc.
import numpy as np # Um array de 7 temperaturas da semana temperatures = np.array([18.5, 22.1, 19.8, 25.3, 21.0, 17.2, 23.4]) # [0] [1] [2] [3] [4] [5] [6] print( temperatures[0] ) # 18.5 -> segunda (1º valor) print( temperatures[2] ) # 19.8 -> quarta (3º valor) print( temperatures[-1] ) # 23.4 -> domingo (último valor) print( temperatures[-2] ) # 17.2 -> sábado (penúltimo)
Selecionar vários valores seguidos
Se quiser pegar um pedaço do array, use a notação início:fim. Atenção: o valor de fim é excluído. Se escrever [1:4], obtém as caixas 1, 2 e 3, mas não a caixa 4.
temperatures = np.array([18.5, 22.1, 19.8, 25.3, 21.0, 17.2, 23.4]) # Os 3 primeiros dias (segunda, terça, quarta) print( temperatures[:3] ) # início omitido = desde o início # Da terça à sexta (índice 1 a 4, 4 excluído) print( temperatures[1:4] ) # Os 2 últimos dias print( temperatures[-2:] ) # fim omitido = até o fim # Um dia sim, outro não (segunda, quarta, sexta, domingo) print( temperatures[::2] )
Manter apenas os valores que satisfazem uma condição
Essa é uma das coisas mais poderosas do NumPy. Você pode dizer « me dê apenas as temperaturas superiores a 21 graus » e o NumPy faz a seleção automaticamente.
Veja como funciona em 2 etapas:
temperatures = np.array([18.5, 22.1, 19.8, 25.3, 21.0, 17.2, 23.4])
# Etapa 1: qual dia está acima de 21 graus?
masque = temperatures > 21
print("Máscara :", masque)
# True onde for superior a 21, False caso contrário
# Etapa 2: manter apenas esses valores
print("Dias > 21 graus :", temperatures[masque])
# Também podemos fazer as duas etapas em uma única linha:
print("Dias < 20 graus :", temperatures[temperatures < 20])Fazer cálculos matemáticos em todo o array
O NumPy oferece funções matemáticas que se aplicam a cada elemento ao mesmo tempo. Não precisa de loop. Você escreve uma única linha e o NumPy faz o cálculo em todos os valores.
data = np.array([4.0, 9.0, 16.0, 25.0])
# np.sqrt = raiz quadrada de cada valor
print("Raiz quadrada :", np.sqrt(data))
# np.log = logaritmo natural de cada valor
print("Logaritmo :", np.round(np.log(data), 2))
# np.abs = valor absoluto (remove o sinal negativo)
nombres = np.array([-3, 5, -7, 2])
print("Valor absoluto:", np.abs(nombres))Calcular estatísticas em todo o array
Essas funções resumem um array em um único número:
ventes = np.array([1200, 850, 1500, 970, 1100, 1350, 780])
print("Total da semana :", np.sum(ventes))
print("Média diária :", np.mean(ventes).round(1))
print("Dia mais alto :", np.max(ventes))
print("Dia mais baixo :", np.min(ventes))
# cumsum : total cumulativo dia a dia
print("Acumulado dia a dia :", np.cumsum(ventes))Aplicar um cálculo em todas as valores ao mesmo tempo
Em Python normal, se quiser adicionar 10% a cada preço de uma lista, você escreve um loop. Com NumPy, não precisa. Escreve a operação uma única vez e ela se aplica a todos os valores. Isso se chama broadcasting.
Este artigo cobre os trechos mais úteis — o curso completo Python SciPy statsmodels (11 capítulos, 37 lições, exercícios corrigidos e projeto final) leva você até o fim.
./acceder-au-cours-complet curso gratuito : Dominando o Claude CodeFAQ
Quanto tempo para aprender Python SciPy statsmodels?
É preciso ter pré-requisitos?
Por onde começar concretamente?
📬 Quer receber este tipo de guia toda semana? Inscreva-se gratuitamente — código real, zero enrolação.