Simulação de Monte Carlo#

Uma prática eficaz no gerenciamento de riscos é o uso da Simulação de Monte Carlo para estimativas de custo, cronograma e desempenho do projeto. Essa técnica permite que os gerentes de projeto considerem múltiplos cenários e compreendam melhor as variações e probabilidades associadas aos riscos identificados. Com base em entradas como distribuições de probabilidade para custos ou durações, a simulação gera milhares de possíveis resultados, oferecendo:

  • Análise de Cenários: Visualizar o impacto de diferentes riscos nos resultados do projeto.

  • Tomada de Decisão Baseada em Dados: Identificar as melhores estratégias para mitigar riscos.

  • Planejamento Robustecido: Estimar reservas de contingência de forma fundamentada.

A Simulação de Monte Carlo é especialmente útil na fase de planejamento, quando as incertezas são mais significativas e as decisões podem ter impactos duradouros no sucesso do projeto.

Portanto, a simulação de Monte Carlo pode ser utilizada em diversos cenários na engenharia civil, como a estimativa de custos e prazos de um projeto. Vamos descrever um exemplo usando Python para simular os custos totais de um projeto de construção.

1. O que é uma simulação de Monte Carlo?#

A simulação de Monte Carlo é uma técnica estatística usada para modelar incertezas. Ela funciona ao realizar múltiplas iterações (ou simulações) com valores aleatórios gerados para variáveis incertas, a fim de prever um intervalo de possíveis resultados.

No caso de engenharia civil, ela pode ser aplicada, por exemplo, para estimar custos de projetos, duração de atividades ou riscos de atrasos, considerando incertezas inerentes a essas variáveis.


2. Definição do Problema#

No exemplo fornecido:

  • Estamos simulando o custo total de um projeto de construção.

  • Consideramos três componentes principais de custo:

    1. Materiais: custo dos materiais com uma distribuição normal (com média e desvio padrão).

    2. Mão de obra: custo da mão de obra com uma distribuição triangular (com valores mínimo, máximo e mais provável).

    3. Equipamentos: custo dos equipamentos com uma distribuição uniforme (entre um intervalo fixo).

O objetivo é realizar várias iterações para calcular o custo total do projeto, levando em conta a aleatoriedade das variáveis.


3. Descrição do Código#

1. Bibliotecas Importadas#

import numpy as np
import matplotlib.pyplot as plt
  • numpy: usado para gerar valores aleatórios com diferentes distribuições (normal, uniforme e triangular).

  • matplotlib: usado para visualizar os resultados da simulação.


2. Parâmetros das Distribuições#

# Parâmetros para os custos de materiais
mean_materials = 50000
std_dev_materials = 5000
  • Materiais: o custo médio é de 50.000 com um desvio padrão de 5.000, o que reflete incertezas (valores que podem variar para mais ou para menos).

# Parâmetros para os custos de mão de obra
min_labor = 30000
most_likely_labor = 40000
max_labor = 60000
  • Mão de obra: usamos uma distribuição triangular, onde os custos têm:

    • Mínimo: 30.000

    • Mais provável: 40.000

    • Máximo: 60.000

# Parâmetros para os custos de equipamentos
min_equip = 20000
max_equip = 30000
  • Equipamentos: utilizamos uma distribuição uniforme para representar incertezas igualmente prováveis entre 20.000 e 30.000.


3. Execução da Simulação#

num_simulations = 10000
total_costs = []
  • num_simulations: realizamos 10.000 simulações para capturar uma variedade de cenários.

  • total_costs: lista para armazenar o custo total em cada simulação.

for _ in range(num_simulations):
    materials = np.random.normal(mean_materials, std_dev_materials)
    labor = np.random.triangular(min_labor, most_likely_labor, max_labor)
    equipment = np.random.uniform(min_equip, max_equip)
    total_cost = materials + labor + equipment
    total_costs.append(total_cost)
  • Para cada iteração:

    • Materiais: valores aleatórios são gerados com uma distribuição normal.

    • Mão de obra: valores aleatórios são gerados com uma distribuição triangular.

    • Equipamentos: valores aleatórios são gerados com uma distribuição uniforme.

    • O custo total é calculado somando as três componentes e armazenado.


4. Análise dos Resultados#

mean_cost = np.mean(total_costs)
percentile_5 = np.percentile(total_costs, 5)
percentile_95 = np.percentile(total_costs, 95)
  • Média (mean_cost): o valor médio do custo total ao longo de todas as simulações.

  • Percentil 5% (percentile_5) e 95% (percentile_95): fornecem um intervalo provável em que o custo se encontra com 90% de confiança (entre os 5% inferiores e superiores).

plt.hist(total_costs, bins=50, color='blue', alpha=0.7)
  • Histograma: mostra a distribuição dos custos totais, destacando a variação e os cenários mais prováveis.


4. Aplicação Prática na Engenharia Civil#

  • Este exemplo simula incertezas no custo de materiais, mão de obra e equipamentos.

  • O intervalo de confiança (percentis) é útil para planejar orçamentos considerando incertezas, permitindo:

    • Planejamento de contingências: reservar fundos para cenários mais caros.

    • Mitigação de riscos financeiros: identificar os maiores fatores de impacto no custo e planejar respostas.

Com a simulação de Monte Carlo, engenheiros e gestores podem tomar decisões mais informadas, minimizando surpresas financeiras durante a execução do projeto.

Exemplo (Resumo): Estimativa de custos de construção#

  1. Entradas principais:

    • Custos de materiais (com variação aleatória).

    • Custos de mão de obra (com variação aleatória).

    • Custos indiretos (fixos).

  2. Saída esperada:

    • Estimativa do custo total, considerando as incertezas.

Explicação#

  1. Distribuição Normal:

    • Os custos de materiais e mão de obra são modelados como distribuições normais, com médias e desvios padrão estimados.

  2. Simulação:

    • O custo total é a soma dos custos simulados para materiais, mão de obra e custos fixos.

  3. Análise Estatística:

    • Cálculo de estatísticas como média, desvio padrão, e intervalos de confiança (5% e 95%).

  4. Visualização:

    • Um histograma apresenta a distribuição dos custos simulados.

Este exemplo pode ser facilmente adaptado para incluir outros custos ou diferentes distribuições de probabilidade, dependendo da complexidade do projeto.

import numpy as np
import matplotlib.pyplot as plt

# Parâmetros de entrada
n_simulations = 10000  # Número de simulações
material_cost_mean = 500000  # Custo médio dos materiais (R$)
material_cost_std = 50000    # Desvio padrão do custo dos materiais (R$)
labor_cost_mean = 300000     # Custo médio da mão de obra (R$)
labor_cost_std = 30000       # Desvio padrão do custo da mão de obra (R$)
indirect_cost = 100000       # Custos indiretos fixos (R$)

# Simulação de Monte Carlo
material_costs = np.random.normal(material_cost_mean, material_cost_std, n_simulations)
labor_costs = np.random.normal(labor_cost_mean, labor_cost_std, n_simulations)
total_costs = material_costs + labor_costs + indirect_cost

# Estatísticas dos resultados
mean_cost = np.mean(total_costs)
std_cost = np.std(total_costs)
percentile_5 = np.percentile(total_costs, 5)
percentile_95 = np.percentile(total_costs, 95)

# Exibição dos resultados
print(f"Estimativa do custo total (Monte Carlo):")
print(f"Custo médio: R$ {mean_cost:,.2f}")
print(f"Desvio padrão: R$ {std_cost:,.2f}")
print(f"Percentil 5%: R$ {percentile_5:,.2f}")
print(f"Percentil 95%: R$ {percentile_95:,.2f}")

# Visualização dos resultados
plt.hist(total_costs, bins=50, color='skyblue', edgecolor='black')
plt.axvline(mean_cost, color='red', linestyle='dashed', linewidth=1, label=f'Média: R$ {mean_cost:,.2f}')
plt.axvline(percentile_5, color='orange', linestyle='dashed', linewidth=1, label=f'5%: R$ {percentile_5:,.2f}')
plt.axvline(percentile_95, color='green', linestyle='dashed', linewidth=1, label=f'95%: R$ {percentile_95:,.2f}')
plt.title("Distribuição dos Custos Totais do Projeto")
plt.xlabel("Custo Total (R$)")
plt.ylabel("Frequência")
plt.legend()
plt.show()
Estimativa do custo total (Monte Carlo):
Custo médio: R$ 900,363.30
Desvio padrão: R$ 57,247.81
Percentil 5%: R$ 807,864.92
Percentil 95%: R$ 995,173.78
../../../_images/3e8d80e22f0c568349fc8b34fe178a77146465c8c423d2ff198146d5d91169e2.png