Otimização Linear – Problema da Mistura

Em busca da mistura com menos custo, ou seja, minimizar o preço.

Notação matemática:

A variável de decisão xj é a quantidade do ingrediente j.xamp;=(x1,x2,,xn)T\begin{aligned} \text{A variável de decisão } x_j \text{ é a quantidade do ingrediente } j. \\ x &= (x_1, x_2, \dots, x_n)^T \end{aligned}
O ingrediente j tem custo Cj.camp;=(C1,C2,,Cn)T\begin{aligned} \text{O ingrediente } j \text{ tem custo } C_j. \\ c &= (C_1, C_2, \dots, C_n)^T \end{aligned}
Cada ingrediente j possui proporção Aij do componente i.Aamp;=(A11amp;A12amp;amp;A1nA21amp;A22amp;amp;A2namp;amp;amp;Am1amp;Am2amp;amp;Amn)\begin{aligned} \text{Cada ingrediente } j \text{ possui proporção } A_{ij} \text{ do componente } i. \\ A &= \begin{pmatrix} A_{11} & A_{12} & \dots & A_{1n} \\ A_{21} & A_{22} & \dots & A_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ A_{m1} & A_{m2} & \dots & A_{mn} \end{pmatrix} \end{aligned}
Cada componente i possui limite mínimo Ri e máximo Si.Ramp;=(R1,R2,,Rm)TSamp;=(S1,S2,,Sm)T\begin{aligned} \text{Cada componente } i \text{ possui limite mínimo } R_i \text{ e máximo } S_i. \\ R &= (R_1, R_2, \dots, R_m)^T \\ S &= (S_1, S_2, \dots, S_m)^T \end{aligned}
  • objetivo é achar as proporções dos ingredientes que respeitem os limites e chegue ao menor custo.
Objetivo: encontrar as proporções x que minimizam o custominamp;cTxsujeito aamp;RAxSamp;x0\begin{aligned} \text{Objetivo: encontrar as proporções } x \text{ que minimizam o custo} \\ \min \quad & c^T x \\ \text{sujeito a} \quad & R \leq A x \leq S \\ & x \geq 0 \end{aligned}

Modelo:

minamp;c1x1+c2x2++cnxns.a:amp;x1+x2++xn=1amp;a1,1x1+a1,2x2++a1,nxnr1amp;a2,1x1+a2,2x2++a2,nxnr2amp;amp;am,1x1+am,2x2++am,nxnrmamp;a1,1x1+a1,2x2++a1,nxns1amp;a2,1x1+a2,2x2++a2,nxns2amp;amp;am,1x1+am,2x2++am,nxnsmamp;x1,x2,,xn0\begin{aligned} \min \quad & c_1 x_1 + c_2 x_2 + \dots + c_n x_n \\[6pt] \text{s.a:} \quad & x_1 + x_2 + \dots + x_n = 1 \\[6pt] & a_{1,1}x_1 + a_{1,2}x_2 + \dots + a_{1,n}x_n \ge r_1 \\ & a_{2,1}x_1 + a_{2,2}x_2 + \dots + a_{2,n}x_n \ge r_2 \\ & \vdots \\ & a_{m,1}x_1 + a_{m,2}x_2 + \dots + a_{m,n}x_n \ge r_m \\[6pt] & a_{1,1}x_1 + a_{1,2}x_2 + \dots + a_{1,n}x_n \le s_1 \\ & a_{2,1}x_1 + a_{2,2}x_2 + \dots + a_{2,n}x_n \le s_2 \\ & \vdots \\ & a_{m,1}x_1 + a_{m,2}x_2 + \dots + a_{m,n}x_n \le s_m \\[6pt] & x_1, x_2, \dots, x_n \ge 0 \end{aligned}

Exemplos de aplicações:

Exemplo 1)

Modelo: Alocação de Entregas com Capacidade

Contexto

Uma organização precisa distribuir entregas para centros regionais.
Cada centro deve ser atendido por exatamente um veículo.
Cada veículo tem um limite máximo de atendimentos.

O objetivo é minimizar a distância total percorrida.

from pulp import LpProblem, LpMinimize, LpVariable, lpSum, LpStatus, value, PULP_CBC_CMD
# Criar problema
modelo = LpProblem("Delivery_Allocation_Model", LpMinimize)
veiculos = ['V1', 'V2', 'V3']
locais = ['Norte', 'Sul', 'Leste', 'Oeste', 'Centro']
# Variável binária: y[v,l] = 1 se veículo v atende local l
y = LpVariable.dicts(
"assign",
[(v, l) for v in veiculos for l in locais],
cat="Binary"
)
# Matriz de custos (distâncias)
custo = {
('V1', 'Norte'): 15, ('V1', 'Sul'): 20,
('V1', 'Leste'): 10, ('V1', 'Oeste'): 25,
('V1', 'Centro'): 5,
('V2', 'Norte'): 18, ('V2', 'Sul'): 15,
('V2', 'Leste'): 12, ('V2', 'Oeste'): 22,
('V2', 'Centro'): 8,
('V3', 'Norte'): 20, ('V3', 'Sul'): 25,
('V3', 'Leste'): 15, ('V3', 'Oeste'): 18,
('V3', 'Centro'): 10,
}
# -------------------------
# Função Objetivo
# -------------------------
modelo += lpSum(custo[(v, l)] * y[(v, l)] for v in veiculos for l in locais)
# -------------------------
# Restrição 1:
# Cada local deve ser atendido exatamente uma vez
# -------------------------
for l in locais:
modelo += lpSum(y[(v, l)] for v in veiculos) == 1
# -------------------------
# Restrição 2:
# Capacidade máxima de atendimentos por veículo
# -------------------------
limite_atendimentos = {'V1': 3, 'V2': 2, 'V3': 3}
for v in veiculos:
modelo += lpSum(y[(v, l)] for l in locais) <= limite_atendimentos[v]
# Resolver
modelo.solve(PULP_CBC_CMD(msg=False))
# Resultados
print("Status:", LpStatus[modelo.status])
print("Distância total mínima:", value(modelo.objective))
for v in veiculos:
atendimentos = [l for l in locais if value(y[(v, l)]) > 0.5]
print(f"{v} atende: {', '.join(atendimentos) if atendimentos else 'Nenhum'}")
Status: Optimal
Distância total mínima: 63.0
V1 atende: Norte, Leste, Centro
V2 atende: Sul
V3 atende: Oeste

Exemplo 2)

custo mínimo para 1Kg de ração com as restrições abaixo de quantidade mínima de proteína e sódio.

Modelo com valores respectivos para Frango/Osso/Trigo, com:

  • mistura total = 1 kg
  • proteína mínima
  • sódio máximo
  • x1,x2,x30x_1, x_2, x_3 \ge 0x1​,x2​,x3​≥0

Atenção: os coeficientes como exemplo na tabela (proteína: 0.6/0.2/0.1 e sódio: 0.1/0.05/0.02; limites proteína ≥ 0.4 e sódio ≤ 0.08).

import numpy as np
from scipy.optimize import linprog
# -------------------------
# Variáveis de decisão
# x1 = kg Frango, x2 = kg Osso, x3 = kg Trigo
# -------------------------
# Função objetivo: minimizar custo
# min 5x1 + 4x2 + 6x3
c = np.array([5, 4, 6], dtype=float)
# Restrições do tipo A_ub @ x <= b_ub
# 1) Proteína mínima: 0.6x1 + 0.2x2 + 0.1x3 >= 0.4
# Convertemos para <= multiplicando por -1:
# -0.6x1 -0.2x2 -0.1x3 <= -0.4
# 2) Sódio máximo: 0.1x1 + 0.05x2 + 0.02x3 <= 0.08
A_ub = np.array([
[-0.6, -0.2, -0.1], # proteína (convertida)
[ 0.1, 0.05, 0.02], # sódio
], dtype=float)
b_ub = np.array([
-0.4, # proteína mínima
0.08, # sódio máximo
], dtype=float)
# Restrição de igualdade: x1 + x2 + x3 = 1 (mistura total)
A_eq = np.array([[1, 1, 1]], dtype=float)
b_eq = np.array([1], dtype=float)
# Limites (não negatividade): x1, x2, x3 >= 0
bounds = [(0, None), (0, None), (0, None)]
# Resolver
res = linprog(
c=c,
A_ub=A_ub, b_ub=b_ub,
A_eq=A_eq, b_eq=b_eq,
bounds=bounds,
method="highs"
)
# Resultados
if res.success:
x1, x2, x3 = res.x
print("✅ Solução ótima encontrada (custo mínimo)")
print(f"x1 (Frango) = {x1:.4f} kg")
print(f"x2 (Osso) = {x2:.4f} kg")
print(f"x3 (Trigo) = {x3:.4f} kg")
print(f"Custo mínimo = R$ {res.fun:.4f}")
# Checagem das restrições (opcional)
proteina = 0.6*x1 + 0.2*x2 + 0.1*x3
sodio = 0.1*x1 + 0.05*x2 + 0.02*x3
print("\n🔎 Checagem:")
print(f"Total = {x1 + x2 + x3:.4f} (deve ser 1)")
print(f"Proteína = {proteina:.4f} (>= 0.4)")
print(f"Sódio = {sodio:.4f} (<= 0.08)")
else:
print("❌ Não foi possível encontrar solução.")
print("Motivo:", res.message)
✅ Solução ótima encontrada (custo mínimo)
x1 (Frango) = 0.5000 kg
x2 (Osso) = 0.5000 kg
x3 (Trigo) = 0.0000 kg
Custo mínimo = R$ 4.5000
🔎 Checagem:
Total = 1.0000 (deve ser 1)
Proteína = 0.4000 (>= 0.4)
Sódio = 0.0750 (<= 0.08)

Otimização Linear – Problema da Ração

Um dos primeiros problemas utilizando Otimização Linear e métodos de pesquisa operacional.

Problema da Ração é um exemplo típico utilizado como exemplo para Otimização Linear.

Imagina que uma fabrica de ração tenha que produzir a ração animal com 3 ingredientes, como o frango, osso e trigo.

Onde abaixo teríamos um custo, apenas como exemplo, dos 3 ingredientes por Kg:

Preço R$/Kg: Frango = 5 , Osso = 4, Trigo = 6

Sendo assim as variáveis decisão serão a quantidade para cada ingrediente:

Quantidade Kg: Frango = x1, Osso = x2, Trigo = x3

  1. Função Objetivo: Queremos reduzir o custo total de cada ingrediente da ração. Portanto o custo será:

Min 𝑐𝑇𝑥′ =5×1​+4×2​+6×3​

Curiosidade: O resultado da expressão cTxc to the cap T-th power x prime é um escalar obtido pela combinação linear das derivadas das componentes do vetor

xx, resultando em: cTx=i=1ncixibold c raised to the bold cap T power bold x prime equals sum from bold i equals 1 to bold n of bold c sub bold i bold x sub bold i prime

e

2) Restrições:

Quantidade de cada ingrediente não pode ser negativa e que a produção de pelo menos 1Kg de ração.

x1 + x2+ x3 = 1 (Kg)

x1 > =0

x2 > =0

x3 > =0

NutrienteFrango (x₁)Osso (x₂)Trigo (x₃)Restrição
Proteína0.60.20.1≥ 0.4
Sódio0.10.050.02≤ 0.08
Preço Kg546= 1 kg

ou seja, restrições são:

Quantidade total:x1+x2+x3=1x_1 + x_2 + x_3 = 1

Proteína mínima:0.6x1+0.2x2+0.1x30.40.6x_1 + 0.2x_2 + 0.1x_3 \ge 0.4

Sódio máximo:0.1x1+0.05x2+0.02x30.080.1x_1 + 0.05x_2 + 0.02x_3 \le 0.08

Não negatividade:x1,x2,x30x_1, x_2, x_3 \ge 0

Abaixo está a solução em Python com linprog, Otimização para custo mínimo a cada 1Kg de ração.

import numpy as np
from scipy.optimize import linprog
# -------------------------
# Variáveis de decisão
# x1 = kg Frango, x2 = kg Osso, x3 = kg Trigo
# -------------------------
# Função objetivo: minimizar custo
# min 5x1 + 4x2 + 6x3
c = np.array([5, 4, 6], dtype=float)
# Restrições do tipo A_ub @ x <= b_ub
# 1) Proteína mínima: 0.6x1 + 0.2x2 + 0.1x3 >= 0.4
# Convertemos para <= multiplicando por -1:
# -0.6x1 -0.2x2 -0.1x3 <= -0.4
# 2) Sódio máximo: 0.1x1 + 0.05x2 + 0.02x3 <= 0.08
A_ub = np.array([
[-0.6, -0.2, -0.1], # proteína (convertida)
[ 0.1, 0.05, 0.02], # sódio
], dtype=float)
b_ub = np.array([
-0.4, # proteína mínima
0.08, # sódio máximo
], dtype=float)
# Restrição de igualdade: x1 + x2 + x3 = 1 (mistura total)
A_eq = np.array([[1, 1, 1]], dtype=float)
b_eq = np.array([1], dtype=float)
# Limites (não negatividade): x1, x2, x3 >= 0
bounds = [(0, None), (0, None), (0, None)]
# Resolver
res = linprog(
c=c,
A_ub=A_ub, b_ub=b_ub,
A_eq=A_eq, b_eq=b_eq,
bounds=bounds,
method="highs"
)
# Resultados
if res.success:
x1, x2, x3 = res.x
print("✅ Solução ótima encontrada (custo mínimo)")
print(f"x1 (Frango) = {x1:.4f} kg")
print(f"x2 (Osso) = {x2:.4f} kg")
print(f"x3 (Trigo) = {x3:.4f} kg")
print(f"Custo mínimo = R$ {res.fun:.4f}")
# Checagem das restrições (opcional)
proteina = 0.6*x1 + 0.2*x2 + 0.1*x3
sodio = 0.1*x1 + 0.05*x2 + 0.02*x3
print("\n🔎 Checagem:")
print(f"Total = {x1 + x2 + x3:.4f} (deve ser 1)")
print(f"Proteína = {proteina:.4f} (>= 0.4)")
print(f"Sódio = {sodio:.4f} (<= 0.08)")
else:
print("❌ Não foi possível encontrar solução.")
print("Motivo:", res.message)
✅ Solução ótima encontrada (custo mínimo)
x1 (Frango) = 0.5000 kg
x2 (Osso)   = 0.5000 kg
x3 (Trigo)  = 0.0000 kg
Custo mínimo = R$ 4.5000

🔎 Checagem:
Total       = 1.0000 (deve ser 1)
Proteína    = 0.4000 (>= 0.4)
Sódio       = 0.0750 (<= 0.08)

Testes de Hipótese – 2

Será que nos dados da população as variáveis são relevantes para o modelo ou são mero fruto do acaso?

Parâmetros da população e Estatisticas da amostra.

site: https://www.questionpro.com/blog/pt-br/populacao-e-amostra/, acesso 26 setembro de 2025.

A variância influencia fortemente a significância.

1. Conceito de significância estatística

  • A significância vem de testes de hipótese.
  • Ela mede se um efeito observado (ex.: diferença entre médias, coeficiente de regressão, correlação) é provável de ter ocorrido por acaso ou se é um efeito consistente.
  • É expressa por meio do valor-p: quanto menor o valor-p, maior a evidência contra a hipótese nula (de “não efeito”).

2. Papel da variância

  • A variância dos dados afeta o erro padrão (desvio padrão da média ou do estimador).
  • Quanto maior a variância, maior a dispersão dos dados → maior o erro padrão → o teste estatístico perde poder → é mais difícil encontrar significância.
  • Quanto menor a variância, os dados ficam mais concentrados → menor o erro padrão → aumenta a chance de detectar um efeito como significativo (se ele existir).

Em fórmulas simplificadas, um teste t é:

E o erro padrão depende da variância:

Ou seja: se a variância (σ²) é alta, o erro é grande → t cai → p-valor aumenta → menor chance de significância.

O que são dados paramétricos?

São dados que seguem uma distribuição conhecida, geralmente a distribuição Normal (Gaussiana), ou que podem ser transformados para se aproximar dela (por exemplo, usando Box-Cox).

Quando dizemos que uma análise é paramétrica, significa que:

  • Faz suposições sobre os parâmetros da população (média, variância, etc.);
  • Assume que os dados vêm de uma distribuição específica (na maioria das vezes, normal);
  • Usa fórmulas matemáticas que dependem dessas premissas.

🔹 Exemplos de testes paramétricos

  • Teste t de Student (médias)
  • ANOVA (comparação de médias entre grupos)
  • Correlação de Pearson
  • Regressão linear

🔹 Características dos dados paramétricos

  1. Normalidade – os dados seguem (ou aproximadamente seguem) distribuição normal.
  2. Homocedasticidade – variâncias dos grupos comparados são iguais ou semelhantes.
  3. Independência – as observações não podem estar correlacionadas indevidamente.
  4. Escala intervalar ou de razão – precisam ser dados numéricos contínuos (ex.: altura, tempo, tamanho de banco de dados em GB).

🔹 Comparação com dados não paramétricos

  • Paramétricos: mais poderosos, mas exigem que os pressupostos sejam atendidos.
  • Não paramétricos: usados quando os dados não seguem normalidade ou não têm variâncias iguais (ex.: teste de Mann-Whitney, teste de Kruskal-Wallis).

Testes de Hipótese para dados Paramétricos (pressupõem normalidade dos dados):

OBS: para utilizar testes paramétricos , antes deve realizar teste de normalidade !!! (Ex. Shapiro-wilk-amostras pequenas < 30)

  • Teste para a média (com variância conhecida)
  • Teste para a média (com variância desconhecida)
  • Teste para a variância
  • Teste t pareado (comparação de médias em duas amostras dependentes)
  • Teste t independente (comparação de médias em duas amostras independentes)
  • ANOVA (comparação de médias em três ou mais grupos independentes)
  • Teste para comparação de variâncias

No quadro de decisão em testes de hipótese em formato de imagem, com destaque visual:

  • Erro Tipo I (α) em vermelho claro → rejeitar H₀ quando ela é verdadeira.
  • Erro Tipo II (β) em amarelo claro → não rejeitar H₀ quando ela é falsa.
  • As demais situações mostram as decisões corretas.

🚀 Passos para Realizar um Teste de Hipóteses

  1. Definir a variável em estudo
    • Identificar qual parâmetro será avaliado (média, variância, proporção etc.).
  2. Definir as hipóteses
    • Hipótese nula (H₀): não há efeito/diferença (hipótese padrão).
    • Hipótese alternativa (H₁): existe efeito/diferença.
  3. Escolher o nível de significância (α)
    • Probabilidade de cometer Erro Tipo I.
    • Valor comum: α = 0,05 (5%).
  4. Selecionar o teste estatístico
    • Depende do tipo de dado e do problema:
      • Teste z → variância conhecida e amostra grande.
      • Teste t → variância desconhecida ou amostra pequena.
      • ANOVA, Qui-quadrado, F de Snedecor, etc.
  5. Calcular a estatística de teste
    • Usar a fórmula do teste escolhido.
    • Comparar com valores críticos ou p-valor.

🧪 Testes de Hipótese para a Média Populacional:

Distribuição usada:

  • Se σ (variância populacional) é desconhecidateste t de Student (mais comum).
  • Se σ é conhecida → pode-se usar o teste Z.

Para verificar se a média populacional μ é igual a um valor específico μ0​:


🔹 Teste bicaudal (duas caudas)

  • H₀: μ=μ0
  • H₁: μ≠μ0
    👉 Usado quando queremos detectar qualquer diferença (maior ou menor).

🔹 Teste unicaudal superior (uma cauda à direita)

  • H₀: μ=μ0
  • H₁: μ>μ0
    👉 Usado quando queremos verificar se a média é maior que μ0​.

🔹 Teste unicaudal inferior (uma cauda à esquerda)

  • H₀: μ=μ0
  • H₁: μ<μ0
    👉 Usado quando queremos verificar se a média é menor que μ0.

🧪 Teste para a Variância Populacional (qui-quadrado):

Ele é a versão análoga ao que vimos para a média, mas aqui usamos como estatística de teste a qui-quadrado .

Distribuição usada:

  • Porem assumimos que a média é conhecida e a variância que é desconhecida.

Seguem os gráficos das regiões críticas para o teste de variância usando a distribuição qui-quadrado:

Teste unicaudal inferior → rejeita H0 se χ2 cair na cauda esquerda.

Teste bicaudal → rejeita H0 se χ2 cair nas extremidades (caudas vermelhas).

Teste unicaudal superior → rejeita H0 se χ2 cair na cauda direita.

Resumo:

Teorema do Limite Central

“O Teorema Central do Limite nos diz que conforme o tamanho da amostra aumenta, a distribuição amostral da média aproxima-se cada vez mais de uma distribuição normal. Portando a ideia é retirar várias amostras de uma mesma população, tomando a média de cada uma delas. A distribuição dessas médias é que tenderá a uma distribuição normal.” site: https://cursos.alura.com.br/forum/topico-teorema-do-limite-central-explicacao-148382, acesso 16 de setembro de 2025.

Principais Conceitos

  • Distribuição Amostral da Média: É a distribuição de todas as possíveis médias amostrais que podem ser obtidas ao tirar amostras de uma população. 
  • Independência e Distribuição Idêntica: As variáveis aleatórias devem ser independentes umas das outras e terem a mesma distribuição. 
  • Distribuição Normal: Uma distribuição de probabilidade simétrica em forma de sino, caracterizada por sua média e desvio padrão. 

Condições do Teorema 

  • O tamanho da amostra deve ser suficientemente grande. Geralmente, uma amostra com 30 ou mais observações é considerada adequada.
  • A população da qual as amostras são tiradas deve ter uma média e um desvio padrão bem definidos.

site: https://pt.wikipedia.org/wiki/Teorema_central_do_limite, acesso 17 setembro 2025.

Variáveis aleatórias bidimensionais

Variável aleatória conjunta de duas variáveis 𝑋1 e 𝑋2?
Queremos observar conjunto de par de variáveis (𝑋1,𝑋2)

número de “caras” na primeira e na segunda jogadas de uma moeda.

site: https://www.ime.usp.br/~yambar/MAE0219/Aula%209%20Modelos%20Bidimensionais%20I/Aula%209%20Bidimensionais%20I.pdf, acesso 17 setembro 2025.

Modelos probabilidade

Discretos

Bernoulli – 1 ou 0 (Ex. sim ou não ou sucesso ou não sucesso):

A probabilidade de X assumir um determinado valor x (0 ou 1) é dada por P(X = x) = px(1-p)1-x

Exemplo:

Um inspetor de qualidade extrai uma amostra aleatória de 10
tubos armazenados num depósito onde, de acordo com os padrões
de produção, se espera um total de 20% de tubos defeituosos.
Qual é a probabilidade de que não mais do que 2 tubos extraídos
sejam defeituosos?
Se X denotar a variável “número de tubos defeituosos em 10
extrações independentes e aleatórias”, qual o seu valor esperado?
Qual a variância?

Note que a variável aleatória X = número de tubos defeituosos em
10 extrações tem distribuição binomial, com parâmetros n = 10 e
p = 0,2. Portanto, “não mais do que dois tubos defeituosos” é o
evento {X ≤ 2}. Sabemos que, para X ∼ b(10 , 0,2)

Se X ∼ b(n, p), então
E(X) = np Var(X) = np(1 − p)
Basta então aplicar os valores fornecidos para vermos que o
n´umero esperado de tubos defeituosos num experimento com 10
extrações é de 2, e que a variância é de 1,6.

Binomial:

A distribuição binomial é usada para calcular a probabilidade de obter um certo número de “sucessos” em um número fixo de “tentativas” (ensaios de Bernoulli), onde cada tentativa tem apenas dois resultados possíveis e os resultados são independentes.

Fórmula:

  • n: O número total de tentativas.
  • k: O número de sucessos desejados.
  • p: A probabilidade de sucesso em uma única tentativa.
  • q (ou 1-p): A probabilidade de fracasso em uma única tentativa.

Como usar a fórmula:

A fórmula geral da distribuição binomial é: P(X=k) = C(n, k) * p^k * q^(n-k) 

Onde: 

  • P(X=k): A probabilidade de obter exatamente k sucessos.
  • C(n, k): O coeficiente binomial, que representa o número de combinações de escolher k sucessos em n tentativas.
  • p^k: A probabilidade de k sucessos.
  • q^(n-k): A probabilidade de (n-k) fracassos.

Poisson:

média e variância valores iguais.

Resumo:

A Distribuição de Bernoulli descreve o resultado de um único ensaio com dois resultados possíveis (sucesso ou fracasso); 

A Distribuição Binomial modela a soma de vários ensaios de Bernoulli independentes, contando o número de sucessos; 

A Distribuição de Poisson lida com a probabilidade de um certo número de eventos ocorrerem num intervalo fixo de tempo ou espaço, sendo útil para eventos raros.

Continuos

Uniforme: é um modelo de probabilidade onde cada resultado possível dentro de um determinado intervalo tem a mesma probabilidade de ocorrer.

Distribuição normal: uma distribuição contínua e simétrica ao redor da média, a maioria dos valores tende a se agrupar ao redor da média e valores que se afastam da média (para mais ou para menos) tendem a ser menos frequentes.

site: https://www.blog.psicometriaonline.com.br/distribuicao-normal/, acesso 16 setembro 2025.

Normal padrão:uma distribuição normal teórica especial, cuja média é 0 e o desvio-padrão é 1.

Exponencial:

É uma distribuição de probabilidade contínua que modela o tempo até a ocorrência de um evento em um processo de Poisson, ou seja, eventos que acontecem de forma independente e a uma taxa constante. Ela descreve a probabilidade de um evento ter uma duração ou ocorrer dentro de um certo tempo, sendo muito usada em áreas como análise de confiabilidade (tempo de vida de componentes) e tempos de espera. 

Exemplo: você quer saber a probabilidade de um aparelho eletrônico continuar funcionando após 3 anos, sabendo que, em média, ele dura 2 anos. A probabilidade de ele continuar funcionando diminui com o passar do tempo, o que é uma característica da distribuição exponencial. 

site: https://www.youtube.com/watch?v=87dvB9v1pRI, acesso 16 de setembro de 2025.

t-student

Parecida com a normal , mas com a cauda mais “pesada”, indicando uma maior probabilidade de ocorrerem valores extremos, mas aproxima-se da distribuição normal à medida que o número de graus de liberdade aumenta.

É uma distribuição de probabilidade em forma de sino, semelhante à distribuição normal, mas utilizada quando se trabalha com amostras pequenas ou com a variância populacional desconhecida.

  • Amostras pequenas: É a escolha ideal quando o tamanho da amostra é pequeno (geralmente inferior a 30 observações). 
  • Variância populacional desconhecida: Utiliza-se quando não se sabe o desvio padrão ou a variância da população. 

Qui-quadrado

é uma distribuição de probabilidade contínua usada em inferência estatística para testes de hipóteses, especialmente para avaliar se os dados observados se ajustam a uma distribuição esperada (teste de aderência) ou para testar a independência entre variáveis categóricas. Caracteriza-se por ser assimétrica à direita e definida por um parâmetro chamado graus de liberdade (k). 

F de Fisher-Snedecor

é uma distribuição de probabilidade de variáveis contínuas, definida como a razão de duas variáveis aleatórias independentes com distribuição qui-quadrado, divididas pelos seus respetivos graus de liberdade. É usada principalmente para inferência sobre a razão entre duas variâncias e em técnicas estatísticas como a Análise de Variância (ANOVA), onde compara a variabilidade entre grupos com a variabilidade dentro dos grupos. 

  • Assimetria: É uma distribuição assimétrica à direita, com valores que assumem apenas valores positivos. 
  • Graus de Liberdade: É caracterizada por dois parâmetros: os graus de liberdade do numerador e do denominador, que influenciam a forma da distribuição. 

pipeline()

Função pipeline()

Funcionamento:

Biblioteca função pipeline(), conecta os passos do seu modelo, exemplo abaixo:

Esse modelo utiliza um modelo pré-treinado e ajustado(fine-tuned) e analisa sentimentos dos textos em ingles.

Na função pipeline() exitem outras funcionalidades, como:

  • feature-extraction (pega a representação vetorial do texto)
  • fill-mask (preenchimento de máscara)
  • ner (reconhecimento de entidades nomeadas)
  • question-answering (responder perguntas)
  • sentiment-analysis (análise de sentimentos)
  • summarization (sumarização)
  • text-generation (geração de texto)
  • translation (tradução)
  • zero-shot-classification (classificação “zero-shot”)

Exemplo da função pipeline com zero-shot. Essa pipeline zero-shot você especifica quais rotulos deseja utilizar, escolhendo especificamento nos modelo já treinados, sem precisar fazer ajuste fino do modelo nos seus dados e já retorna os scores na lista de rótulos que você escolheu.

Text-generation (geração de texto):

Nesse pipeline text-generation você passa um trecho de um texto e o modelo irá completar o restante.

Pode adicionar tambem os argumentos num_return_sequences (a quantidade de diferentes sequências são geradas) e o argumento max_length (tamanho máximo da saida-output).

Escolha de modelo no HuggingFace: https://huggingface.co/models

filtrar modelos por tarefas especificas:

Tarefas especificas e em outro idioma ou multi-lingual:

Fill-mask (preenchimento de máscara)

O pipeline mask-filling preenche algum espaço em branco por um texto:

OBS: a variavel <mask>, pode variar o modo como é chamada, exemplo no modelo bert é [MASK], verifique no modelo API antes https://huggingface.co/models?pipeline_tag=fill-mask&sort=trending

Exemplo em portugues:

NER (Reconhecimento de Entidades Nomeadas)

Reconhece as entidades, como nome, cidade, local trabalho.

no ner a função “grouped_entities=True” diz para agrupar em uma unica palavra uma entidade em uma, exemplo: “Data Science”

PER:Pessoa/Nome

LOC: Local

question-answering (extrai a resposta da pergunta)

summarization (sumarização)

Reduz o texto para um texto menor, o resumo escolhe partes importantes do texto

Tradução (translation)

Todos os códigos estão no github: https://github.com/samantaleke/LLM/blob/main/pipeline.py

Text Mining

Extrair informações importantes de textos, em .csv, banco de dados e de informação de grandes volumes textuais, análise de sentimentos, classificação de texto, detecção de fraudes e spam..

A maior parte são dados não estruturados, muita informação, com o Text Mining consegue-se extrair informações relevantes sobre todo esse volume de dados.

Onde pode ser utilizado?

Saúde e pesquisa.

Atendimento ao cliente.

Gestão de Riscos.

Pesquisa acadêmica.

Análise de sentimento.

Filtragem de Spam.

Pré-processamento

Tokenização: Transforma cada palavra ou frase em token

Stopwords: Utiliza somente as palavras importantes. Ex: “e”,”de,”um,”as”, …(português)

Lemmatization: Palavras importantes, aposto do stemming, precisão semantica, deixa a palavra no formato correto: ctz –> para –> certeza

lowercasing – minusculas

remover pontuação – se acaso não tiver valor semantico, se tiver valor semantico não remover.

stemming – reduz a palavra a sua raiz. Ex. fez, fazem, fazer –> para –> fazer.

Dica: iastudio.google.com – mostra quantos token com a pergunta e com a resposta (deixa mais barato a quantidade de token em um modelo generativo):

Exemplo de Libs:

NLTK – toolkit de NLP (https://www.nltk.org/)

wordcloud – https://www.wordclouds.com/

spacy – o que é verbo, o que é artigo… https://spacy.io/

Analise de sentimento:

Separar aspectos positivos e aspectos negativos.

Aspectos positivos: Ex: bom, sabor

Aspectos negativos: Ex: demora, ruim

Aspectos Neutros.

Desafios em NLP

Ambiguidade

A ambiguidade pode ser um desafio em NLP, palavras com mais de 1 sentido. Exemplo: Sonha, sonho dormindo e sonho de doce.

Sarcasmo e Ironia

“Seria ótimo se não fosse tão ruim”

NLP – Análise de Sentimento

TextBlob()

Polaridade:

-1 negativo, 0 neutro, 1 positivo, ou seja, quanto mais perto o valor da polaridade for de -1 mais tende ao negativo, o inverso tambem.

Subjetividade:

0 indica uma informação mais objetiva, baseada em fato.

1 baseada em opinião, subjetividade, não baseada em fato.

Outras bibliotecas mais detalhadas:

VANDER SentmentIntensityAnalyser()

  • pos:o quão positiva é a frase ou documento;
  • neu:o quão neutra é a frase ou documento;
  • neg:o quão é negativa;
  • compound:pontuação geral.

TF-IDC (frequencia do texto):

Avaliar a importância de 1 palavara, combinando a frequencia do termo.

Exemplo: a palavra “xxx” aparece 3 vezes no documento de 100 palavras: TF(xxx) = 3/100 = 0,03

IDF ():

O Quão rara é a palavra

Bag of Words (bow)

Palavras em números, converte palavras em numeros, a unica maneira de utilizar estatisticas, probabilidade no qual os modelos vai compreender.

Vai transformar cada frase em uma linha:

NLP, Text Mining, Sentiment Analysis

Processamento da Linguagem Natural:

Área da linguistica e aprendizado de maquina (ML) relacionado ao entendido de linguagem humana.

Objetivo do NLP

Classificação de sentimento, identificar spam, se tem verbo, substativo, preencher lacunas de textos, extrair respostats baseadas em uma pergunta passada, traduzir o texto para outro idioma.

Tambem engloba outros desafios, como visão computacional, geração da transcrição de áudio e descrição de imagem.