{"id":39546,"date":"2019-10-31T22:35:27","date_gmt":"2019-10-31T19:35:27","guid":{"rendered":"https:\/\/prohoster.info\/blog\/kak-my-ispolzuem-tsepi-markova-v-otsenke-reshenij-i-poiske-bagov-so-skriptom-na-python\/"},"modified":"2019-10-31T22:35:27","modified_gmt":"2019-10-31T19:35:27","slug":"kak-my-ispolzuem-tsepi-markova-v-otsenke-reshenij-i-poiske-bagov-so-skriptom-na-python","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pt\/blog\/news\/kak-my-ispolzuem-tsepi-markova-v-otsenke-reshenij-i-poiske-bagov-so-skriptom-na-python","title":{"rendered":"Como usamos cadeias de Markov na avalia\u00e7\u00e3o de decis\u00f5es e na busca de bugs. Com um script em Python","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>\u00c9 importante para n\u00f3s entender o que acontece com nossos estudantes durante o aprendizado e como esses eventos influenciam os resultados. Por isso, estamos construindo o Customer Journey Map \u2014 um mapa da experi\u00eancia do cliente. O processo de aprendizado n\u00e3o \u00e9 algo cont\u00ednuo e coeso; \u00e9 uma sequ\u00eancia de eventos e a\u00e7\u00f5es interconectadas do estudante, e essas a\u00e7\u00f5es podem variar significativamente entre diferentes alunos. Ele completou uma aula: o que ele far\u00e1 a seguir? Far\u00e1 a li\u00e7\u00e3o de casa? Usar\u00e1 o aplicativo m\u00f3vel? Mudar\u00e1 de curso, pedir\u00e1 para trocar de professor? Entrar\u00e1 imediatamente na pr\u00f3xima aula? Ou simplesmente sair\u00e1 decepcionado? Podemos, ao analisar este mapa, identificar padr\u00f5es que levam a uma conclus\u00e3o bem-sucedida do curso ou, ao contr\u00e1rio, \u00e0 desist\u00eancia do estudante?<\/p>\n<p><img decoding=\"async\" alt=\"Como usamos cadeias de Markov na avalia\u00e7\u00e3o de decis\u00f5es e na busca de bugs. Com um script em Python\" src=\"\/wp-content\/uploads\/2019\/10\/3eaee2e858273669b4490f6ceb65d281.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNormalmente, para construir o CJM, utilizam-se ferramentas especializadas, bastante caras, com c\u00f3digo fechado. Mas quer\u00edamos inventar algo simples, que exigisse o m\u00ednimo de esfor\u00e7o e, se poss\u00edvel, fosse de c\u00f3digo aberto. Assim surgiu a ideia de usar cadeias de Markov \u2014 e conseguimos. Constru\u00edmos o mapa e interpretamos os dados de comportamento dos estudantes na forma de um grafo, encontrando respostas absolutamente n\u00e3o \u00f3bvias para quest\u00f5es globais do neg\u00f3cio e at\u00e9 mesmo descobrindo bugs profundamente escondidos. Tudo isso fizemos com solu\u00e7\u00f5es de c\u00f3digo aberto do script Python. Neste artigo, contarei sobre dois casos com esses resultados n\u00e3o \u00f3bvios e compartilharei o script com todos os interessados.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nAssim, as cadeias de Markov mostram a probabilidade de transi\u00e7\u00f5es entre eventos. Aqui est\u00e1 um exemplo prim\u00e1rio da Wikip\u00e9dia:<\/p>\n<p><img decoding=\"async\" alt=\"Como usamos cadeias de Markov na avalia\u00e7\u00e3o de decis\u00f5es e na busca de bugs. Com um script em Python\" src=\"\/wp-content\/uploads\/2019\/10\/978e18169ba4c7b2b71787536e4bb219.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAqui, \"E\" e \"A\" s\u00e3o eventos, as setas s\u00e3o as transi\u00e7\u00f5es entre eles (incluindo a transi\u00e7\u00e3o de um evento para ele mesmo), e os pesos das setas representam a probabilidade de transi\u00e7\u00e3o (\"grafo orientado ponderado\").<\/p>\n<h2>O que foi utilizado<\/h2>\n<p>\nA cadeia foi treinada com a funcionalidade padr\u00e3o do Python, que processou os logs de atividade dos estudantes. O grafo na matriz obtida foi constru\u00eddo com a biblioteca NetworkX.<\/p>\n<p>O log se parece com isso:<\/p>\n<p><img decoding=\"async\" alt=\"Como usamos cadeias de Markov na avalia\u00e7\u00e3o de decis\u00f5es e na busca de bugs. Com um script em Python\" src=\"\/wp-content\/uploads\/2019\/10\/bc75077802cd7eeb00ebe4a56bc61050.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEste \u00e9 um arquivo csv, contendo uma tabela com tr\u00eas colunas: id do estudante, nome do evento, e o tempo em que ocorreu. Esses tr\u00eas campos s\u00e3o suficientes para rastrear o movimento do cliente, construir o mapa e, por fim, obter a cadeia de Markov.<\/p>\n<p>A biblioteca retorna grafos constru\u00eddos nos formatos .dot ou .gexf. Para visualizar os primeiros, pode-se usar o pacote gratuito Graphviz (ferramenta gvedit). Trabalhamos com .gexf e com o Gephi, que tamb\u00e9m \u00e9 gratuito.<\/p>\n<p>Em seguida, quero apresentar dois exemplos de uso das cadeias de Markov, que nos permitiram olhar de forma diferente para nossos objetivos, processos de aprendizado e o pr\u00f3prio ecossistema da Skyeng. E tamb\u00e9m corrigir alguns bugs.<\/p>\n<h2>Primeiro caso: aplicativo m\u00f3vel<\/h2>\n<p>\nPara come\u00e7ar, estudamos o caminho do estudante em nosso produto mais popular \u2014 o curso General. Naquele momento, eu trabalhava no departamento infantil da Skyeng e quer\u00edamos ver qu\u00e3o eficaz era o aplicativo m\u00f3vel com nosso p\u00fablico infantil.<\/p>\n<p>Pegando os logs e passando-os por um script, obtive algo assim:<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habrastorage.org\/webt\/ws\/ru\/de\/wsrudeufw3pzwrrxtxtn1pjeqvu.png\"><img decoding=\"async\" alt=\"Como usamos cadeias de Markov na avalia\u00e7\u00e3o de decis\u00f5es e na busca de bugs. Com um script em Python\" src=\"\/wp-content\/uploads\/2019\/10\/f2533ddfae7d5f85d0e86902b9b7005f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><\/p>\n<p>O n\u00f3 inicial \u2014 Start General, e na parte inferior tr\u00eas n\u00f3s finais: o aluno 'dormiu', mudou de curso, terminou o curso.<\/p>\n<ul>\n<li>Fell asleep, 'Dormiu' \u2014 significa que ele n\u00e3o est\u00e1 mais participando das aulas, provavelmente se afastou. Chamamos otimisticamente esse estado de 'dormiu', pois, em teoria, ele ainda pode retomar os estudos. \u00c9 o pior resultado para n\u00f3s.<\/li>\n<li>Dropped general, Mudou de curso \u2014 mudou de General para algo diferente e se perdeu na nossa cadeia de Markov.<\/li>\n<li>Finished course, Terminou o curso \u2014 \u00e9 o estado ideal, a pessoa completou 80% das aulas (nem todas as aulas s\u00e3o obrigat\u00f3rias).<\/li>\n<\/ul>\n<p>\nChegar ao n\u00f3 successful class significa que a aula foi conclu\u00edda com sucesso em nossa plataforma junto com o professor. Isso registra o progresso no curso e a aproxima\u00e7\u00e3o do resultado desejado \u2014 'Terminou o curso'. \u00c9 importante para n\u00f3s que os estudantes frequente-o o m\u00e1ximo poss\u00edvel.<\/p>\n<p>Para obter conclus\u00f5es quantitativas mais precisas sobre o aplicativo m\u00f3vel (n\u00f3 app session), constru\u00edmos cadeias separadas para cada um dos n\u00f3s finais e depois comparamos os pesos das arestas em pares:<\/p>\n<ul>\n<li>de app session de volta para ela mesma;<\/li>\n<li>de app session para successful class;<\/li>\n<li>de successful class para app session.<\/li>\n<\/ul>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/habrastorage.org\/webt\/iw\/mz\/yq\/iwmzyqmlmbkgzmjqa7qhxwd7shq.png\"><img decoding=\"async\" alt=\"Como usamos cadeias de Markov na avalia\u00e7\u00e3o de decis\u00f5es e na busca de bugs. Com um script em Python\" src=\"\/wp-content\/uploads\/2019\/10\/fc68ca73b379f57a38b53f0c31e75cb1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><br \/>\n<i>\u00c0 esquerda \u2014 estudantes que conclu\u00edram o curso, \u00e0 direita \u2014 'dormindo'<\/i><\/p>\n<p>Essas tr\u00eas arestas mostram a rela\u00e7\u00e3o entre o sucesso do aluno e o uso do aplicativo m\u00f3vel. Esper\u00e1vamos ver que os alunos que conclu\u00edram o curso teriam uma conex\u00e3o mais forte com o aplicativo do que os 'dormindo'. No entanto, na pr\u00e1tica, obtivemos exatamente os resultados opostos:<\/p>\n<ul>\n<li>nos certificamos de que diferentes grupos de usu\u00e1rios interagem de maneira diferente com o aplicativo m\u00f3vel;<\/li>\n<li>estudantes bem-sucedidos usam o aplicativo m\u00f3vel de forma menos intensa;<\/li>\n<li>estudantes adormecendo usam o aplicativo m\u00f3vel com mais frequ\u00eancia.<\/li>\n<\/ul>\n<p>\nIsso significa que os estudantes \"adormecendo\" come\u00e7am a passar cada vez mais tempo no aplicativo m\u00f3vel e, eventualmente, nele permanecem para sempre.<\/p>\n<p><img decoding=\"async\" alt=\"Como usamos cadeias de Markov na avalia\u00e7\u00e3o de decis\u00f5es e na busca de bugs. Com um script em Python\" src=\"\/wp-content\/uploads\/2019\/10\/45c17a908e2178edd99e340f34657cad.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNo in\u00edcio, ficamos surpresos, mas, ao pensar sobre isso, percebemos que \u00e9 um efeito bastante natural. Na minha \u00e9poca, estudei franc\u00eas sozinho, usando duas ferramentas: um aplicativo m\u00f3vel e aulas de gram\u00e1tica no YouTube. No come\u00e7o, eu dividia meu tempo entre eles na propor\u00e7\u00e3o de 50 a 50. Mas o aplicativo \u00e9 mais divertido, tem gamifica\u00e7\u00e3o, tudo \u00e9 simples, r\u00e1pido e claro, enquanto nas aulas \u00e9 necess\u00e1rio se aprofundar, anotar algo, praticar no caderno. Gradualmente, comecei a passar mais tempo no smartphone, at\u00e9 que sua propor\u00e7\u00e3o atingiu 100%: se passar tr\u00eas horas nele, cria-se uma falsa sensa\u00e7\u00e3o de trabalho conclu\u00eddo, a qual me impede de ir ouvir alguma coisa.<\/p>\n<p>Mas como assim? Afinal, criamos o aplicativo m\u00f3vel especialmente para isso, <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/skyeng\/blog\/312126\/\">incorporamos a curva de Ebbinghaus,<\/a><\/noindex>, gamificamos, tornamos atraente, para que as pessoas passassem tempo nele, e parece que ele s\u00f3 as distrai? Na verdade, a raz\u00e3o \u00e9 que a equipe do aplicativo m\u00f3vel fez um trabalho t\u00e3o bom que ele se tornou um produto autossuficiente incr\u00edvel e come\u00e7ou a se descolar do nosso ecossistema.<\/p>\n<p>Como resultado da pesquisa, chegamos \u00e0 conclus\u00e3o de que o aplicativo m\u00f3vel precisa de alguma mudan\u00e7a, para que ele n\u00e3o desvie tanto do curso principal de aprendizado. Isso se aplica tanto a crian\u00e7as quanto a adultos. Este trabalho est\u00e1 em andamento agora.<\/p>\n<h2>Segundo caso: bugs na integra\u00e7\u00e3o<\/h2>\n<p>\nO onboarding \u00e9 um procedimento adicional opcional durante o registro de um novo aluno, que elimina potenciais problemas t\u00e9cnicos no futuro. O cen\u00e1rio b\u00e1sico pressup\u00f5e que a pessoa se registrou na landing page, obteve acesso ao painel pessoal, \u00e9 contatada e participa de uma aula introdut\u00f3ria. Nesse processo, observamos uma alta porcentagem de dificuldades t\u00e9cnicas durante a aula introdut\u00f3ria: vers\u00e3o errada do navegador, o microfone ou som n\u00e3o funcionando, o professor n\u00e3o consegue apontar uma solu\u00e7\u00e3o imediatamente, e tudo isso \u00e9 especialmente complicado quando se trata de crian\u00e7as. Portanto, desenvolvemos um aplicativo adicional no painel pessoal, onde \u00e9 poss\u00edvel realizar quatro passos simples: verificar o navegador, c\u00e2mera, microfone e confirmar que os pais estar\u00e3o por perto durante a aula introdut\u00f3ria (pois s\u00e3o eles que pagam pela educa\u00e7\u00e3o das crian\u00e7as).<\/p>\n<p>Estas algumas p\u00e1ginas de onboarding demonstraram o seguinte funil:<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habrastorage.org\/webt\/l5\/pt\/aj\/l5ptajlgx6msydvswctke1w505w.jpeg\"><img decoding=\"async\" alt=\"Como usamos cadeias de Markov na avalia\u00e7\u00e3o de decis\u00f5es e na busca de bugs. Com um script em Python\" src=\"\/wp-content\/uploads\/2019\/10\/5e949640d4d4f8a70dc4fd677e3c93a7.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><br \/>\n<i>1: bloco inicial com tr\u00eas formul\u00e1rios de login-senha ligeiramente diferentes (dependendo do cliente).<br \/>\n2: checkbox de aceita\u00e7\u00e3o do procedimento adicional de onboarding.<br \/>\n2.1-2.3: verifica\u00e7\u00e3o da presen\u00e7a do pai, vers\u00e3o do Chrome e som.<br \/>\n3: bloco final.<\/i><\/p>\n<p>Ele parece muito natural: nos dois primeiros passos, a maioria dos visitantes desiste, percebendo que precisa preencher algo, verificar, mas n\u00e3o tem tempo. Se o cliente chega at\u00e9 o terceiro passo, \u00e9 quase certo que ele chegar\u00e1 ao final. No funil, n\u00e3o h\u00e1 nenhuma raz\u00e3o para suspeitar de algo.<\/p>\n<p>Decidimos analisar nosso onboarding n\u00e3o em um funil unidimensional cl\u00e1ssico, mas usando uma cadeia de Markov. Inclu\u00edmos um pouco mais de eventos, rodamos um script e obtivemos o seguinte:<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habrastorage.org\/webt\/pi\/e6\/9p\/pie69p-4rmwaqdqqunigm3oz8am.png\"><img decoding=\"async\" alt=\"Como usamos cadeias de Markov na avalia\u00e7\u00e3o de decis\u00f5es e na busca de bugs. Com um script em Python\" src=\"\/wp-content\/uploads\/2019\/10\/44c094cb0be013beac00c0af5a3801be.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><\/p>\n<p>\u00c9 poss\u00edvel entender uma coisa neste caos: algo deu errado. O processo de onboarding \u00e9 linear, isso \u00e9 como foi projetado, e n\u00e3o deveria haver uma teia de conex\u00f5es. Aqui, \u00e9 evidente que o usu\u00e1rio est\u00e1 sendo jogado entre passos, entre os quais n\u00e3o deveria haver transi\u00e7\u00f5es.<\/p>\n<p><img decoding=\"async\" alt=\"Como usamos cadeias de Markov na avalia\u00e7\u00e3o de decis\u00f5es e na busca de bugs. Com um script em Python\" src=\"\/wp-content\/uploads\/2019\/10\/f43fcabaa7b773c17741b4eaa927b600.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAs causas dessa imagem estranha podem ser duas:<\/p>\n<ul>\n<li>falhas no banco de logs;<\/li>\n<li>falhas est\u00e3o presentes no pr\u00f3prio produto \u2014 no onboarding.<\/li>\n<\/ul>\n<p>\nA primeira raz\u00e3o, provavelmente, est\u00e1 presente, mas verific\u00e1-la \u00e9 bastante trabalhoso, e corrigir os logs n\u00e3o ajudar\u00e1 em nada na melhoria da experi\u00eancia do usu\u00e1rio. J\u00e1 em rela\u00e7\u00e3o \u00e0 segunda, se houver, era necess\u00e1rio agir rapidamente. Ent\u00e3o, fomos explorar os n\u00f3s, identificar as arestas que n\u00e3o deveriam estar l\u00e1, e buscar as causas de seu surgimento. Percebemos que alguns usu\u00e1rios estavam presos em um ciclo, outros sa\u00edam do meio para o in\u00edcio, e alguns simplesmente n\u00e3o conseguiam sair das duas primeiras etapas. Enviamos os dados para QA \u2014 e sim, descobrimos que havia muitos bugs no onboarding: \u00e9 um produto meio improvisado, que n\u00e3o foi testado profundamente, pois n\u00e3o esper\u00e1vamos problemas. Agora, todo o processo de registro foi alterado.<\/p>\n<p>Essa hist\u00f3ria nos mostrou uma aplica\u00e7\u00e3o inesperada das cadeias de Markov na \u00e1rea de QA.<\/p>\n<h3>Experimente voc\u00ea mesmo!<\/h3>\n<p>\nEu disponibilizei meu <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/BartolomeuD\/markov-chain\">script em Python para o aprendizado de cadeias de Markov<\/a><\/noindex> de forma aberta \u2014 sintam-se \u00e0 vontade. A documenta\u00e7\u00e3o est\u00e1 no GitHub, e d\u00favidas podem ser enviadas aqui, farei o poss\u00edvel para responder a todas.<\/p>\n<p>Al\u00e9m disso, links \u00fateis: <noindex><a rel=\"nofollow\" href=\"https:\/\/networkx.github.io\/\">a biblioteca NetworkX<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"http:\/\/www.graphviz.org\/\">o visualizador Graphviz<\/a><\/noindex>. E aqui <noindex><a rel=\"nofollow\" href=\"http:\/\/habr.com\/ru\/post\/455762\">no Habr, h\u00e1 um artigo<\/a><\/noindex> sobre cadeias de Markov. Os gr\u00e1ficos no artigo foram feitos com <noindex><a rel=\"nofollow\" href=\"https:\/\/gephi.org\/\">Gephi<\/a><\/noindex>.<br \/>\n<br \/>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/skyeng\/blog\/473124\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041d\u0430\u043c \u0432\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441 \u043d\u0430\u0448\u0438\u043c\u0438 \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u0430\u043c\u0438 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f, \u0438 \u043a\u0430\u043a \u044d\u0442\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0432\u043b\u0438\u044f\u044e\u0442 \u043d\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0432\u044b\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c Customer Journey Map \u2014 \u043a\u0430\u0440\u0442\u0443 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0433\u043e \u043e\u043f\u044b\u0442\u0430. \u0412\u0435\u0434\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u2014 \u043d\u0435 \u043d\u0435\u0447\u0442\u043e \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0435 \u0438 \u0446\u0435\u043b\u044c\u043d\u043e\u0435, \u044d\u0442\u043e \u0446\u0435\u043f\u043e\u0447\u043a\u0430 \u0432\u0437\u0430\u0438\u043c\u043e\u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u0430, \u043f\u0440\u0438\u0447\u0435\u043c \u044d\u0442\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043c\u043e\u0433\u0443\u0442 \u0441\u0438\u043b\u044c\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f \u0443 \u0440\u0430\u0437\u043d\u044b\u0445 \u0443\u0447\u0435\u043d\u0438\u043a\u043e\u0432. \u0412\u043e\u0442 \u043e\u043d [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":39547,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[702],"tags":[],"class_list":["post-39546","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-news"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041d\u0430\u043c \u0432\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441 \u043d\u0430\u0448\u0438\u043c\u0438 \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u0430\u043c\u0438 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f, \u0438 \u043a\u0430\u043a \u044d\u0442\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0432\u043b\u0438\u044f\u044e\u0442 \u043d\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0432\u044b\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c Customer Journey Map \u2014 \u043a\u0430\u0440\u0442\u0443 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0433\u043e \u043e\u043f\u044b\u0442\u0430.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pt\/blog\/news\/kak-my-ispolzuem-tsepi-markova-v-otsenke-reshenij-i-poiske-bagov-so-skriptom-na-python\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"pt_PT\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041a\u0430\u043a \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0446\u0435\u043f\u0438 \u041c\u0430\u0440\u043a\u043e\u0432\u0430 \u0432 \u043e\u0446\u0435\u043d\u043a\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0438 \u043f\u043e\u0438\u0441\u043a\u0435 \u0431\u0430\u0433\u043e\u0432. \u0421\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u043c \u043d\u0430 Python | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041d\u0430\u043c \u0432\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441 \u043d\u0430\u0448\u0438\u043c\u0438 \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u0430\u043c\u0438 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f, \u0438 \u043a\u0430\u043a \u044d\u0442\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0432\u043b\u0438\u044f\u044e\u0442 \u043d\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0432\u044b\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c Customer Journey Map \u2014 \u043a\u0430\u0440\u0442\u0443 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0433\u043e \u043e\u043f\u044b\u0442\u0430.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pt\/blog\/news\/kak-my-ispolzuem-tsepi-markova-v-otsenke-reshenij-i-poiske-bagov-so-skriptom-na-python\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:35:27+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:35:27+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Como utilizamos cadeias de Markov na avalia\u00e7\u00e3o de decis\u00f5es e na busca por bugs. Com um script em Python | ProHoster","description":"\u00c9 importante para n\u00f3s entender o que acontece com nossos alunos durante o aprendizado e como esses eventos influenciam os resultados, por isso estamos construindo o Customer Journey Map \u2014 o mapa da experi\u00eancia do cliente.","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/news\/kak-my-ispolzuem-tsepi-markova-v-otsenke-reshenij-i-poiske-bagov-so-skriptom-na-python","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pt_PT","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041a\u0430\u043a \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0446\u0435\u043f\u0438 \u041c\u0430\u0440\u043a\u043e\u0432\u0430 \u0432 \u043e\u0446\u0435\u043d\u043a\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0438 \u043f\u043e\u0438\u0441\u043a\u0435 \u0431\u0430\u0433\u043e\u0432. \u0421\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u043c \u043d\u0430 Python | ProHoster","og:description":"\u041d\u0430\u043c \u0432\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441 \u043d\u0430\u0448\u0438\u043c\u0438 \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u0430\u043c\u0438 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f, \u0438 \u043a\u0430\u043a \u044d\u0442\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0432\u043b\u0438\u044f\u044e\u0442 \u043d\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0432\u044b\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c Customer Journey Map \u2014 \u043a\u0430\u0440\u0442\u0443 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0433\u043e \u043e\u043f\u044b\u0442\u0430.","og:url":"https:\/\/prohoster.info\/pt\/blog\/news\/kak-my-ispolzuem-tsepi-markova-v-otsenke-reshenij-i-poiske-bagov-so-skriptom-na-python","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:35:27+00:00","article:modified_time":"2019-10-31T19:35:27+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"39546","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-24 02:13:24","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 17:16:25","updated":"2026-01-24 02:13:24","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/39546","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=39546"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/39546\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media\/39547"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=39546"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=39546"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=39546"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}