O que é decisão com perdas?
Decisão com perdas é um arcabouço onde cada ação possível tem um custo associado ao erro. A função de perda L(θ, a) quantifica o prejuízo de tomar ação a quando o estado verdadeiro é θ. Diferentemente da classificação padrão (perda 0-1), as perdas podem ser assimétricas. Por exemplo, um falso negativo pode custar muito mais que um falso positivo. A decisão ótima minimiza a perda esperada (risco) sob a distribuição de incerteza. Essa abordagem é central em diagnósticos, controle de qualidade e finanças. Ela também é usada em aprendizado de máquina com custos desiguais. A perda pode ser quadrática, absoluta, logarítmica ou personalizada.
Características fundamentais da decisão com perdas
A decisão com perdas possui três características principais que a definem. Primeiro, a perda é uma função que mapeia (estado, ação) para um número real. Segundo, a perda esperada é calculada como E[L(θ, a) | dados]. Terceiro, a ação escolhida é a que minimiza essa expectativa. Perdas quadráticas levam a estimadores de média (mínimo erro quadrático). Perdas absolutas levam à mediana (mínimo erro absoluto). Perdas 0-1 levam à moda (classificação MAP). Perdas assimétricas podem ser representadas por matrizes de custo.
Vantagens e aplicações típicas
A principal vantagem é alinhar a decisão com as consequências reais. Ela é usada em diagnósticos médicos para evitar mortes por falso negativo. Também em sistemas de detecção de intrusão (custo de alarme falso vs. ataque real). Contudo, a especificação correta da perda requer conhecimento do domínio.
A decisão com perdas generaliza a teoria da decisão bayesiana. A perda pode ser dependente de parâmetros desconhecidos e de dados. Em problemas de estimação, a perda quadrática produz o estimador de Bayes. Esse estimador minimiza o erro quadrático médio condicional. Para perda absoluta, o estimador é a mediana a posteriori. A perda 0-1 é usada em classificação e produz a regra MAP. Perdas personalizadas são comuns em problemas de precificação e alocação. Por exemplo, em estoques, o custo de falta pode ser maior que o de excesso. A decisão com perdas também é usada em testes de hipóteses (perdas de Neyman-Pearson). Ela permite construir regiões de decisão com riscos controlados. Em aprendizado por reforço, a perda é o custo de uma ação em um estado. A política ótima minimiza a perda acumulada ao longo do tempo. A função de perda pode ser aprendida a partir de dados (aprendizado de preferências). Assim, a decisão com perdas é um conceito unificador em otimização e estatística.
Um exemplo clássico é o problema do vendedor de jornais (newsvendor). Ele deve decidir quantos jornais comprar para revender no dia. Custo de compra: c, preço de venda: p, valor de reciclagem: s. Perda por falta: (p – c) por unidade não vendida (oportunidade perdida). Perda por excesso: (c – s) por unidade não vendida (prejuízo). A decisão ótima balanceia esses dois custos.
Enunciado do exemplo clássico
Implemente a decisão com perdas para o problema do vendedor de jornais. Demanda D segue uma normal com média 100 e desvio 20 (unidades). Custo de compra c=2, preço de venda p=5, valor residual s=1. Calcule a perda esperada para cada quantidade q (de 50 a 150). Encontre a quantidade ótima que minimiza a perda esperada. Plote a perda esperada em função de q e destaque o ponto ótimo.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
import numpy as np import matplotlib.pyplot as plt from scipy.stats import norm # Parâmetros c = 2.0 # custo por unidade p = 5.0 # preço de venda s = 1.0 # valor residual mu_demanda = 100.0 sigma_demanda = 20.0 # Função de perda para uma quantidade q e demanda d def perda(q, d): # Se demanda >= q, vendemos tudo if d >= q: return - (p - c) * q # lucro (perda negativa) else: # Vendemos d unidades a p, reciclamos (q-d) a s, pagamos c*q lucro = p * d + s * (q - d) - c * q return -lucro # perda = -lucro # Calcular perda esperada para cada q via integração numérica q_range = np.arange(50, 151, 1) perda_esperada = [] for q in q_range: # Integral sobre d: E[perda(q, D)] # Usamos quadratura gaussiana com 100 pontos d_vals = np.linspace(mu_demanda - 4*sigma_demanda, mu_demanda + 4*sigma_demanda, 200) pesos = norm.pdf(d_vals, mu_demanda, sigma_demanda) perdas = np.array([perda(q, d) for d in d_vals]) # Aproximar integral (trapézio) integral = np.trapz(perdas * pesos, d_vals) perda_esperada.append(integral) # Encontrar q ótimo idx_otimo = np.argmin(perda_esperada) q_otimo = q_range[idx_otimo] perda_min = perda_esperada[idx_otimo] print(f"Quantidade ótima: {q_otimo} unidades") print(f"Perda esperada mínima: {perda_min:.2f}") # Calcular o ponto crítico via fórmula de fractil # Para demanda normal, q* = F^{-1}( (p-c) / (p-s) ) fractil = (p - c) / (p - s) q_critico = norm.ppf(fractil, mu_demanda, sigma_demanda) print(f"Ponto crítico teórico (fractil): {q_critico:.1f}") # Gráficos plt.figure(figsize=(12, 5)) plt.subplot(1, 2, 1) plt.plot(q_range, perda_esperada, 'b-', linewidth=2) plt.axvline(q_otimo, color='red', linestyle='--', label=f'Ótimo = {q_otimo}') plt.axhline(perda_min, color='green', linestyle=':', label=f'Mínimo = {perda_min:.2f}') plt.xlabel('Quantidade comprada (q)') plt.ylabel('Perda esperada') plt.title('Perda Esperada vs. Quantidade - Newsvendor') plt.legend() plt.grid(True) plt.subplot(1, 2, 2) # Mostrar distribuição da demanda e indicar o ponto ótimo x = np.linspace(mu_demanda - 4*sigma_demanda, mu_demanda + 4*sigma_demanda, 200) pdf = norm.pdf(x, mu_demanda, sigma_demanda) plt.plot(x, pdf, 'b-', linewidth=2, label='Distribuição da demanda') plt.axvline(q_otimo, color='red', linestyle='--', label=f'q* = {q_otimo}') # Preencher área de demanda < q* x_fill = np.linspace(mu_demanda - 4*sigma_demanda, q_otimo, 100) plt.fill_between(x_fill, 0, norm.pdf(x_fill, mu_demanda, sigma_demanda), color='red', alpha=0.3, label='Excesso (sobra)') x_fill2 = np.linspace(q_otimo, mu_demanda + 4*sigma_demanda, 100) plt.fill_between(x_fill2, 0, norm.pdf(x_fill2, mu_demanda, sigma_demanda), color='green', alpha=0.3, label='Falta (venda perdida)') plt.xlabel('Demanda (d)') plt.ylabel('Densidade de probabilidade') plt.title('Distribuição da Demanda e Ponto Ótimo') plt.legend() plt.grid(True) plt.tight_layout() plt.show() # Análise de sensibilidade: perda esperada para diferentes preços precos = np.linspace(3, 8, 6) q_otimos = [] for p_aux in precos: # Recalcular o fractil para cada preço fractil_aux = (p_aux - c) / (p_aux - s) q_aux = norm.ppf(min(fractil_aux, 0.999), mu_demanda, sigma_demanda) q_otimos.append(q_aux) print("\nSensibilidade ao preço de venda:") for p_aux, q_aux in zip(precos, q_otimos): print(f" p = {p_aux:.1f} -> q* = {q_aux:.1f}") |
Este código implementa a decisão com perdas para o problema do vendedor. A perda esperada é calculada numericamente integrando sobre a distribuição da demanda. A quantidade ótima minimiza a perda, equilibrando excesso e falta. O ponto crítico teórico coincide com o mínimo numérico. As áreas coloridas mostram as regiões de excesso (sobra) e falta (oportunidade perdida). Para iniciantes, este exemplo mostra como perdas assimétricas guiam decisões práticas. Decisão com perdas é, portanto, uma ferramenta essencial para gestão de risco.