TeraBeer : construindo um sistema de recomendação de cervejas artesanais brasileiras

Bruno Nehemy
Somos Tera
Published in
12 min readApr 5, 2021

--

Como iniciou nossa jornada de Data Science na criação de um sistema de recomendação de cervejas artesanais brasileiras

Contextualizando

Começamos nossa jornada muito empolgados e confiantes, no bootcamp de Data Science e Machine Learning da Tera em Novembro de 2020, mal imaginando os desafios que teríamos que atravessar. Nosso grupo é composto pelos alunos Vinicius Barbosa, Rogério Chinen, Vitor Faria, Bruno Nehemy e Luciano Siqueira e este é o terceiro e último artigo do projeto de conclusão do curso.

Aceitamos o desafio de criar um projeto de ciência de dados desde a definição do problema, passando pela ideação até o deploy da solução no Heroku. Escolhemos como tema central o vasto mundo das cervejas artesanais brasileiras e, como problema, a dificuldade da escolha da próxima cerveja a ser experimentada dado que existem tantas opções disponíveis.

Um começo suave

Dos infindáveis temas que poderíamos ter escolhido, escolhemos um pelo qual muitos dos integrantes de nosso grupo já possuíam uma relação de paixão: a cerveja artesanal.

Uma vez escolhido o tema, partimos para uma análise de mercado (para avaliar a relevância do problema), das personas (e como elas são afetadas por este problema), passando também pelos stakeholders envolvidos (mercado cervejeiro). Finalmente, chegamos à definição do problema.

Esses primeiros passos foram descritos na nossa primeira entrega do projeto — que você pode acessar neste link. Aqui, descrevemos de forma resumida:

1. Mercado

O mercado de cervejas artesanais no Brasil é um mercado crescente. Até 2019, ele representava 1,6 % do PIB nacional e gerou 2,7 milhões de empregos, conforme Associação Brasileira da Indústria da Cerveja.

https://content.paodeacucar.com/prazer-de-comer-e-beber/harmonizacao-de-cervejas

Segundo o Anuário da Cerveja de 2019, publicado pelo Ministério da Agricultura, haviam 1.209 cervejarias no Brasil, com projeção de chegar a mais de 3.400 em 2025. Em termos de registros válidos, no ano de 2017, 5.000 novos rótulos de cerveja foram registrados. Já no ano de 2019, foram 9.950, superando a marca de 27.000 ao total. Note como, ano após ano, tanto o número de cervejarias como de registros vem aumentando.

2. Personas

Nós identificamos três personas do ponto de vista de consumo de cerveja.

A primeira persona corresponde às pessoas que não tiveram boas experiências com as cervejas que lhes foram apresentadas e, portanto, acreditam não gostar de cerveja alguma.

A segunda persona é representada pelos consumidores das cervejas tradicionais (Pilsen/Lager) de marcas comumente encontradas nos supermercados e bares, e estão pouco dispostos a se aventurar pelas artesanais.

E, por fim, existem aqueles que já conhecem e consomem cervejas artesanais, mas se perdem na escolha do próximo estilo diante de tantas opções disponíveis, sendo esta a terceira persona.

3. Stakeholders

Constatamos que, além das personas, também existem partes interessadas que se beneficiam financeiramente com o crescimento do mercado de cervejas artesanais (que possuem ticket médio mais elevado), como estabelecimentos de pequeno e médio porte: cervejarias, lojas de e-commerce, bares e redes de supermercado.

4. Problema

Todos nós gostamos de ter opções de escolha. Em teoria, quantos mais escolhas tivermos, é melhor, correto?

Errado.

Na verdade, quanto mais opções nós temos, mais difícil se torna a escolha. Esse é o paradoxo da escolha, termo cunhado por Barry Schwartz, no seu livro The Paradox of Choice, publicado em 2004.

Nosso problema se resume neste paradoxo. Pelo lado do consumidor, existe a dificuldade na escolha de uma cerveja artesanal que agrade a cada uma dessas personas, diante da abundância de opções. Para o stakeholder, se impõe a dificuldade na escolha de rótulos para compor seu estoque que agrade ao consumidor. Isto implica em perda de vendas devido à indecisão do consumidor e desconhecimento dos perfis de consumo dos seus clientes.

5. Solução

Para ajudar a resolver o paradoxo da escolha, decidimos desenvolver um sistema de recomendação de cervejas artesanais brasileiras baseado em filtragem colaborativa.

A ideia inicial era a criação de uma base de dados de avaliações de cervejas artesanais brasileiras através de API ou web-scraping de sites de avaliações de cervejas como RateBeer e Untappd.

Os desafios aparecem

Como ocorre em toda jornada, obstáculos são impostos àqueles que aceitaram os desafios propostos e somente os mais resilientes continuarão na jornada em busca do seu objetivo.

Muitas de nossas ideias iniciais não se provaram viáveis.

Na nossa segunda entrega, detalhamos as intempéries do desenvolvimento de um projeto de data science.

De uma forma resumida, foi necessário buscar novos caminhos para chegar à nossa solução:

  • não conseguimos acesso às API do RateBeer e Untappd para coletar avaliações de cervejas artesanais brasileiras;
  • tivemos que validar a hipótese de que existe relação entre paladar e preferências de cerveja. A solução encontrada foi a realização de uma pesquisa via Google Forms; e
  • trabalhamos os dados coletados via pesquisa, que felizmente atingiu um número considerável de respostas (+900), através das quais encontramos insights que deram suporte à nossa hipótese e à nossa ideia de solução.

Com muita adaptação e resiliência, conseguimos transpor os obstáculos e conseguimos desenvolver nossa solução.

Esboçando a solução

Através do questionário descrito no artigo anterior, nós validamos a correlação entre as preferências alimentares e de estilo de cerveja dos respondentes, que primeiramente informam suas preferências a respeito de 20 alimentos característicos de 5 paladares:

  • Salgado: margarita, batata chips, bacon, tomate.
  • Doce : mel, chocolate ao leite, cookies & cream, banana.
  • Azedo: limão, laranja, maracujá, mexerica/tangerina.
  • Amargo: beringela, chocolate amargo, folhas escuras, café.
  • Especiarias: pimentas, cravo, gengibre, canela.

Esses alimentos foram agrupados da mesma forma na análise exploratória das respostas do questionário.

Em seguida, informam seu conhecimento e preferências quanto aos seguintes estilos de cerveja: Pilsen/Lager, Golden Ale/ Blonde Ale, Trigo (Weiss), American Pale Ale (APA), India Pale Ale (IPA), New England IPA/Juicy IPA, Porter/Stout, Dunkel/Malzbier, Witbier, Fruit Beer/Sour, Russian Imperial Stout/Pastry Stout e Lambic.

Em ambos os casos, os respondentes assinalam dentre as opções “gosto”, “não gosto”, “indiferente” e “desconheço” para cada alimento e estilo de cerveja.

Para viabilizar a análise de correlações, as respostas foram transformadas de acordo com o seguinte DE/PARA:

  • Gosto = +1
  • Indiferente = 0
  • Não gosto = -1
  • Indiferente = NaN (nulo)

Após a transformação, construímos a seguinte matriz de correlação de Pearson: os alimentos foram agrupados pela média conforme seu grupo de paladar (doce, salgado, amargo, azedo e especiarias). Assim, cada usuário teria uma nota entre -1 e +1 para cada grupo de paladar. Feita essa transformação, a matriz de correlação ficou desta forma:

Além da análise de correlação, foi feita uma análise de clustering dos paladares utilizando o método KMeans. O objetivo era identificar se existem clusters com paladares comuns e, se sim, verificar se esses clusters possuem preferências distintas para estilos de cerveja.

Para definir o número de clusters, utilizamos o método do cotovelo e a análise de silhueta:

À esquerda: método do cotovelo (gráfico da inércia por cluster); à direita: análise de silhueta (valor de silhueta por cluster)

Dado que a inclinação da curva de inércia (distância intracluster) diminui de forma mais branda a partir de k = 4 clusters, esse seria um número razoável para a análise. Para garantir isso, analisamos o valor de silhueta e identificamos que ele é praticamente o mesmo para k entre 3 e 7 clusters, o que indica que para todos esses valores de k os agrupamentos estão igualmente bem definidos, portanto k = 4 é uma boa escolha.

Com 4 clusters, foi possível encontrar seus significados quanto ao paladar e perceber que cada cluster possuía certas preferências de cerveja diferentes — a análise completa está descrita no artigo anterior. Isso contribui para a nossa tese de que há relação entre paladar e preferências de cerveja e, ainda, de que o paladar pode ser usado no motor de recomendações para fazê-las de maneira mais precisa.

Partindo para a solução oficial: o sistema de recomendação

Validada a nossa hipótese, partimos para o desenvolvimento do sistema de recomendação.

O algoritmo escolhido foi o ItemSimilarityRecommender da biblioteca TuriCreate, desenvolvida pela Apple e disponibilizada de forma open-source no Github/PyPI. Essa biblioteca possui diversos algoritmos de Machine Learning bastante performáticos, bem documentados e de deploy simplificado, que utilizam TensorFlow como base. As escolhas dessa biblioteca e desse algoritmo foram motivadas por este artigo — no qual o algoritmo é usado para construir sistemas de recomendação de e-commerces — , e por esse vídeo — em que ele é usado para construir um aplicativo iOS de recomendação de filmes.

A Filtragem Colaborativa utilizada por esse algoritmo parte conceitualmente de uma matriz usuário-item, em que as linhas são diferentes usuários, as colunas são diferentes itens (no nosso caso, alimentos e estilos de cerveja do formulário inicial) e os cruzamentos de linhas e colunas correspondem à avaliação que um usuário fez de um item (geralmente uma nota de 1 a 5, mas no nosso caso corresponde à resposta Gosto/Indiferente/Não Gosto dada no formulário). Com essa matriz, torna-se possível estimar a similaridade entre usuários e itens usando operações matriciais, como o cosseno entre dois vetores. Essa similaridade, quando em uma escala entre 0 e 1, pode ser vista de maneira forçada como a probabilidade de um usuário X gostar de um item Y que ele não necessariamente conheça, como na animação a seguir.

Exemplo de uma matriz usuário-item e uso de filtragem colaborativa para estimar uma avaliação desconhecida.

Aplicando os conceitos na prática:

1. Construção da Matriz Usuário-Item a partir dos resultados do formulário:

Exemplo de algumas linhas (respostas) e colunas (alimentos e estilos de cerveja) da matriz usuário-item.

2. Transformação das respostas em avaliações:

Aplicação do DE/PARA: Gosto = 1; Indiferente = 0,5; Não gosto = 0; Indiferente = NaN/nulo.

3. “Derretimento” da matriz usuário item em uma tabela com as colunas de usuário, item e avaliação:

Nesta transformação, id da resposta (usuário) vira ‘index’, nome da coluna (alimentos e estilos) vira ‘product’ e a valor (avaliação) vira ‘rating’.

4. Criação do sistema de recomendação ItemSimilarityRecommender utilizando similaridade de cosseno:

Criação da variável recommending_system com o sistema de recomendação criado.

Dessa forma, o modelo de recomendação é criado e salvo em uma variável, que pode ser acessada posteriormente para gerar recomendações. A biblioteca TuriCreate não trabalha especificamente com dataframes do Pandas, mas sim com SFrames (scaled dataframe — um dataframe mais escalável para cálculos).

As recomendações são geradas utilizando, por padrão, a correlação de Jaccard, porém ela ignora as avaliações feitas pelos usuários. Por esse motivo, optamos por utilizar a similaridade por cosseno, que premia avaliações positivas e pune avaliações negativas ao gerar recomendações.

5. Usar o modelo criado para fazer recomendações personalizadas de estilos para diferentes usuários:

Exemplos de recomendações geradas para 3 usuários diferentes (8, 10 e 13), em que score é a similaridade e rank é a ordem de relevância do item sugerido.

Com isso, é obtida a mágica lista de estilos recomendados para um usuário em ordem de relevância. O parâmetro items foi utilizado para restringir os itens recomendáveis à lista de estilos de cerveja presentes no formulário, para que somente cervejas fossem sugeridas e não alimentos. O comportamento padrão do método recommend() é listar apenas itens que o usuário não tenha feito avaliação, mas esse comportamento pode ser modificado alterando o parâmetro exclude_known para False.

Reta final da jornada

Com a solução em mãos, falta a reta final da jornada: o deploy da solução.

O desespero bate. Uma corrida contra o tempo…

Tic… Toc… Back-endFront-end

Pesadelos…

Nesse momento, entendemos que não existe solução perfeita e que, por melhor que ela seja, sempre é possível melhorar. Decidimos, portanto, construir uma aplicação com um escopo satisfatório e deixar possíveis melhorias como próximos passos. Utilizamos a biblioteca Streamlit para construir uma aplicação com interface amigável, na qual o usuário insere os dados necessários e o resultado do modelo é calculado e apresentado. Ainda dentro desse escopo, o usuário pode enviar a lista de cervejas recomendadas para o seu e-mail pessoal e ter suas respostas salvas em um banco de dados, de forma que possamos estabelecer um canal de comunicação com os usuários pós-uso.

O código da solução encontra-se disponível de maneira pública no GitHub e o deploy foi feito no Heroku, disponível para toda a web pelo link https://terabeer-recomendacoes.herokuapp.com/. O fluxo de uso da aplicação — e o que acontece por trás— está resumido nos seguintes passos:

1. Criação do modelo (localmente)

Execução de um script Python que puxa informações de um banco de dados PostgreSQL para construir a matriz usuário-item e executar todos os passos descritos anteriormente para criar o modelo e salvá-lo em uma pasta.

2. Deploy na nuvem

Sincronização do repositório no GitHub com o Heroku utilizando os arquivos setup.sh, Procfile e requirements.txt, que dispensa a necessidade de configuração manual de Dockerfile e Docker Image para implantação. Nessa etapa, todos os arquivos do repositório — inclusive os arquivos do modelo — sobem para produção e a aplicação torna-se disponível para consumo de toda web.

3. Usuário responde pesquisa de paladar e preferências de cerveja

4. Lista de estilos recomendados é gerada

Ao clicar em Gerar Recomendações, o modelo salvo é acessado para produzir a lista de estilos recomendados para o usuário, e o usuário precisa mudar de aba para visualizar as recomendações.

5. Rótulos de cada estilo são exibidos

Informações das cervejas de cada estilo recomendado são obtidas a partir de uma consulta ao banco de dados PostgreSQL e são renderizados em um formato padrão. O usuário tem a opção de filtrar os estados de origem e o número de rótulos por estilo a ser exibido.

6. Usuário envia lista para seu e-mail pessoal

Caso queira enviar a lista de cervejas para o seu e-mail pessoal e aceite que suas respostas sejam salvas, elas serão armazenadas no banco de dados da aplicação, possibilitando comunicações futuras e o uso das novas respostas para retreino do modelo.

7. Pesquisa de feedback a respeito das sugestões recebidas

Quando se trabalha com recomendações, nenhuma métrica de avaliação do modelo é tão fiel quanto o feedback explícito do usuário que a recebe, dizendo se gostou ou não. Por esse motivo, incluímos um link para outro formulário no Google Forms no template do e-mail enviado. Dessa forma é possível monitorar o quão bem aceita está a aplicação e vincular respostas ao formulário com as recomendações que um usuário recebeu.

E… Vitória!

Agora é sua vez de testar nosso sistema de recomendação e descobrir qual vai ser a próxima cerveja artesanal que você vai experimentar. Aqui está o link:

TERABEER RECOMENDAÇÕES

Fim da jornada?

Nós ficamos tão empolgados com a jornada percorrida que, mesmo com o objetivo inicial atingido, percebemos que há ainda inúmeras possibilidades e lacunas a serem preenchidas:

  • adicionar novos alimentos e estilos;
  • aprimorar o algoritmo de recomendação;
  • utilizar outros sistemas de recomendação e realizar Teste A/B;
  • implementar melhorias de interface com base em UX;
  • buscar parcerias com stakeholders.

A nossa jornada no curso da Tera chegou ao fim!

Os aprendizados foram imensos, mas estamos cientes de que apenas “colocamos o pé” no mundo vasto e empolgante da ciência de dados.

A base foi criada. Uma base forte e sólida que vai sustentar as infindáveis possibilidades de um produto de dados, seja em quaisquer campo de atuação que resolvermos escolher.

O que o destino nos reserva? Ainda não sabemos. Mas assim como no começo, estamos empolgados e confiantes para os próximos desafios.

E neste meio tempo, vamos comemorar com uma deliciosa cerveja — recomendada pelo nosso sistema de recomendação, é claro!

Tim-Tim… Cheers!

Agradecimentos

O nosso projeto contou com o auxílio de todos os facilitadores e experts da Tera. Gostaríamos aqui de agradecer especialmente a

, , , , , Ana Paula Moraes e , que estavam sempre dispostos a nos ajudar. Não poderíamos deixar de agradecer também aos nossos colegas de turma e às mais de 900 pessoas que responderam a nossa pesquisa. Obrigado!

--

--