{"id":8262,"date":"2018-12-18T13:44:39","date_gmt":"2018-12-18T15:44:39","guid":{"rendered":"http:\/\/blog.plataformatec.com.br\/?p=8262"},"modified":"2019-10-28T11:38:44","modified_gmt":"2019-10-28T14:38:44","slug":"monte-carlo-na-pratica-encontrando-o-valor-de-iteracoes-ideal","status":"publish","type":"post","link":"https:\/\/blog.plataformatec.com.br\/2018\/12\/monte-carlo-na-pratica-encontrando-o-valor-de-iteracoes-ideal\/","title":{"rendered":"Monte Carlo na Pr\u00e1tica: Encontrando o valor de itera\u00e7\u00f5es ideal"},"content":{"rendered":"
Um dos maiores motivos pelo qual qualquer metodologia de gerenciamento de projetos existe, \u00e9 trazer redu\u00e7\u00e3o de custos.<\/p>\n
O atraso de uma semana em um projeto, gera dois custos diferentes:<\/p>\n
Como esses custos podem ser altos, \u00e9 preciso utilizar ferramentas que possam dar visibilidade para as datas de entrega. Uma das formas encontradas para dar visibilidade a estes potenciais problemas, foi atrav\u00e9s da ado\u00e7\u00e3o do Diagrama de Gantt, para gerenciamento de projetos, nele \u00e9 poss\u00edvel identificar os pontos mais delicados do projeto (os caminhos cr\u00edticos) em que deve-se dar maior esfor\u00e7o para que n\u00e3o atrasem, visto que ao atrasar nesses pontos o projeto inteiro tamb\u00e9m ir\u00e1 atrasar.<\/p>\n
Embora essa ferramenta seja \u00f3tima para alguns tipos de projetos (normalmente onde existe um grau de incerteza baixo), ela n\u00e3o \u00e9 a ideal para projetos com previsibilidade baixa devido a vari\u00e2ncia<\/a>\u00a0de entregas, como ocorre em projetos que lidam com o campo do conhecimento (redigir um livro ou desenvolver software, como exemplos).<\/p>\n Aqui na Plataformatec temos sempre feito o m\u00e1ximo para que todas as nossas previs\u00f5es de entregas sejam embasadas em dados e sigam m\u00e9todos cient\u00edficos comprovados. Os dois m\u00e9todos que mais utilizamos s\u00e3o:<\/p>\n Na progress\u00e3o linear, fazemos uma an\u00e1lise dos dados de itens de trabalho entregues durante algum per\u00edodo (normalmente trabalhamos com periodicidade semanal) e atrav\u00e9s de uma an\u00e1lise destes valores elegemos quais s\u00e3o os melhores valores a serem alocados na progress\u00e3o. Por exemplo: supondo que tenhamos os valores de hist\u00f3rico de itens de trabalho entregues por semana (throughput), conforme o gr\u00e1fico abaixo:<\/p>\n <\/p>\n Um valor que faz sentido para a progress\u00e3o pessimista<\/strong> ser\u00e1 de que a cada semana iremos entregar 1<\/strong> item de trabalho por semana, visto que tivemos 5 casos em que a entrega foi de 1<\/strong> ou 0<\/strong>, para a estimativa otimista<\/strong> podemos utilizar o valor 3<\/strong> ou 4<\/strong> ou at\u00e9 mesmo 3,5<\/strong> visto que tivemos 4 casos em que o valor foi 3 ou mais, por fim para a progress\u00e3o prov\u00e1vel<\/strong> o melhor valor seria o de 2<\/strong> visto que \u00e9 o valor da mediana do dataset<\/em> e \u00e9 o valor que mais aparece (a moda).<\/p>\n O maior problema da progress\u00e3o linear \u00e9 de que estamos informando os valores a serem utilizados para cada cen\u00e1rio, algo que pode ser perigoso caso a pessoa que est\u00e1 fazendo a progress\u00e3o n\u00e3o tenha um bom dom\u00ednio de an\u00e1lise de dados. Al\u00e9m disso, a progress\u00e3o linear tamb\u00e9m ignora a vari\u00e2ncia. Desta forma, em sistemas com uma vari\u00e2ncia de entrega muito elevada, a progress\u00e3o linear pode n\u00e3o fazer tanto sentido.<\/p>\n Outra t\u00e9cnica que utilizamos chama-se Monte Carlo<\/strong>, para entender melhor como o m\u00e9todo funciona, bem como ter uma infer\u00eancia do que ele faz, recomendo esse blogpost que \u00e9 bem completo<\/a>.<\/p>\n Tenho utilizado o m\u00e9todo desde que entrei na Plataformatec com grande sucesso, por\u00e9m uma coisa sempre ficava na minha mente era: “Quantas itera\u00e7\u00f5es s\u00e3o necess\u00e1rias para que eu possa ter um bom grau de confiabilidade no m\u00e9todo?”. Para responder essa pergunta eu fiz muitas pesquisas em livros estat\u00edsticos e pela internet e n\u00e3o consegui encontrar nenhum tipo de informa\u00e7\u00e3o que me auxiliasse.<\/p>\n Dessa forma resolvi fazer um estudo desse assunto. O objetivo do Monte Carlo \u00e9 de inferir a probabilidade de algum evento, “for\u00e7ando” que o evento ocorra tantas vezes que o resultado me d\u00ea a probabilidade da ocorr\u00eancia do evento. Por exemplo, ao lan\u00e7ar uma moeda mil vezes se eu contar quantas vezes a moeda cai em “cara” e dividir esse valor pelas mil vezes que a moeda foi lan\u00e7ada, obterei uma infer\u00eancia da probabilidade da moeda cair em “cara”.<\/p>\n Para conseguir saber a qualidade do m\u00e9todo eu realizei testes nos quais eu j\u00e1 sabia o resultado esperado, e fui fazendo com que o problema fosse cada vez mais complexo, de forma a ver se existe alguma rela\u00e7\u00e3o entre a dificuldade do problema e a quantidade de itera\u00e7\u00f5es necess\u00e1rias para que o valor inferido pelo m\u00e9todo seja o mais pr\u00f3ximo poss\u00edvel do valor calculado.<\/p>\n O objetivo \u00e9 verificar quantas itera\u00e7\u00f5es s\u00e3o necess\u00e1rias para que o erro entre o valor inferido pelo m\u00e9todo e o valor calculado seja m\u00ednimo (para previs\u00f5es de probabilidade de entrega um erro a partir da segunda ou terceira casa decimal \u00e9 bem aceit\u00e1vel). Gostaria de ressaltar que esse blogpost<\/em> n\u00e3o \u00e9 um estudo cient\u00edfico acerca do assunto, e seu objetivo \u00e9 entender atrav\u00e9s de infer\u00eancia qual \u00e9 um valor de itera\u00e7\u00f5es bom para ser utilizado em predi\u00e7\u00f5es para projetos.<\/p>\n Os testes foram todos realizado utilizando a linguagem de programa\u00e7\u00e3o R<\/strong>, que pode ser baixado neste link<\/a>. Caso prefira utilizar um IDE, recomendo o RStudio<\/a>.<\/p>\n Em todos os testes eu rodei o sistema por 100 vezes utilizando as seguintes quantidades de itera\u00e7\u00f5es: 100<\/strong> (cem), 1000<\/strong> (mil), 10000<\/strong> (dez mil), 100000<\/strong> (cem mil), 1000000<\/strong> (um milh\u00e3o), 10000000<\/strong> (dez milh\u00f5es), 100000000<\/strong> (cem milh\u00f5es) e 200000000<\/strong> (duzentos milh\u00f5es). Os resultados s\u00e3o os consolidados dessas 100 “rodadas”, em cada itera\u00e7\u00e3o.<\/p>\n O primeiro teste que fiz foi em cima de um lan\u00e7amento de moeda. Uma moeda tem 50%<\/strong> de chance de cair em qualquer um de seus lados e este \u00e9 o valor que queremos que seja inferido pelo Monte Carlo. Para isso utilizei o seguinte c\u00f3digo em R:<\/p>\n Alterando os valores da vari\u00e1vel itera\u00e7\u00f5es<\/em> e compilando os resultados obtive a seguinte tabela:<\/p>\n\n\n
PROGRESS\u00c3O LINEAR<\/h2>\n
MONTE CARLO<\/h2>\n
OS TESTES<\/h2>\n
A MOEDA<\/h3>\n
LancaMoeda <- function(iteracoes)\n{\n# Cria o vetor com os valores poss\u00edveis para a moeda 1 = Cara e 0 = Coroa\nmoeda = c(0,1)\nresultado = 0\n\n# Soma todos os resultados em que a moeda foi \"Cara\"\nresultado = sum(sample(moeda, iteracoes, replace=T))\n\n# Divide o valor pela quantidade de itera\u00e7\u00f5es e transforma em percentual\nresultado = (resultado\/iteracoes) * 100\n\nreturn(resultado)\n}\n\n# Inicializa vari\u00e1veis\nvetor_resultado = 0\nvetor_tempo = 0\ncontrole = 0\n\n# Informa a quantidade de itera\u00e7\u00f5es a ser\u00e3o executadas\nrodadas = 100\n\n# Aloca os resultados percentuais em um vetor de 100 itens e aloca os tempos de execu\u00e7\u00e3o em outro\nwhile (controle != 100)\n{\ntempo_inicial = Sys.time()\nvetor_resultado = append(vetor_resultado, LancaMoeda(rodadas))\ntempo_final = Sys.time()\n\ntempo = tempo_final - tempo_inicial\nvetor_tempo = append(vetor_tempo, tempo)\n\ncontrole = controle + 1\n}\n\n# Mostra os percentuais\nvetor_resultado\n\n# Mostra os tempos de execu\u00e7\u00e3o\nvetor_tempo\n<\/code><\/pre>\n