Sistema de Recomendação de Cervejas Artesanais — as Intempéries do Desenvolvimento de um Projeto de Data Science

Bruno Nehemy
10 min readMar 9, 2021

Há pouco mais de dois meses, publicamos aqui a ideia original de nosso projeto de Data Science no Bootcamp de Ciência de Dados e Machine Learning da Tera. Nosso grupo, composto pelos alunos Vinicius Barbosa, Rogério Chinen, Vitor Faria, Bruno Nehemy e Luciano Siqueira, escolheu como tema central o vasto universo das cervejas artesanais.

Em poucas palavras, nosso projeto havia sido definido da seguinte forma:

I) Público-alvo:

  • Aqueles que não tiveram boas experiências com as cervejas que lhes foram apresentadas e, portanto, acreditam não gostar de cerveja alguma;
  • Aqueles que já são consumidores, majoritariamente, das cervejas tradicionais e pouco conhecem das artesanais.

II) Problema:

  • Ajudar na escolha de uma cerveja artesanal que agrade a estes públicos.

III) Solução:

  • Desenvolvimento de um sistema de recomendação de cervejas artesanais brasileiras através de uma filtragem colaborativa;
  • Criação de base de dados de avaliações de cervejas artesanais brasileiras através de API ou Web-Scraping do site de avaliações de cervejas RateBeer.

Para informações mais detalhadas, acesse a publicação “Você realmente não gosta de cerveja artesanal ou apenas não encontrou a sua?”:

DA TEORIA À PRÁTICA…

1. Solicitação malsucedida de acesso à API RateBeer

Considerando nosso curto prazo para desenvolvimento e entrega da nossa solução, a primeira ação que tomamos foi requisitar o acesso a API da RateBeer, de onde coletaríamos dados de avaliações de cervejas brasileiras para usar em recomendações por Filtragem Colaborativa. Todos os integrantes da equipe fizeram a solicitação, mas fomos completamente ignorados após reiteradas tentativas. Eis nosso primeiro choque de realidade… E uma devastadora verdade se descortinou a nossa frente: o desafio seria hercúleo!

Nós partimos para nossa opção alternativa, que seria Web Scraping através da biblioteca Python Beautiful Soup 4 para extrair dados diretamente de várias páginas HTML do RateBeer.

Após uma reflexão sobre a complexidade do processo, envolvendo codificação, análise e limpeza dos dados capturados, nós nos questionamos: não temos uma solução mais simples para resolver nosso problema?

Sim. Uma alternativa para reduzir a complexidade da recomendação de itens específicos seria recomendar estilos de cerveja, ao invés de recomendar rótulos propriamente ditos. E, para cada estilo, podemos fazer uma pesquisa manual diretamente no site da RateBeer e do Untappd, para descobrir quais são, por exemplo, as 3 cervejas brasileiras mais bem avaliadas para cada estilo e com uma quantidade razoável de avaliações. Caso um estilo seja recomendado a um usuário, em sua lista de recomendação constarão os 3 melhores rótulos brasileiros desse estilo.

A mudança de caminho para recomendação de estilos também está relacionada à pesquisa descrita nos próximos tópicos, que felizmente trouxe uma quantidade de dados razoável para que as recomendações fossem feitas.

Esta foi nossa primeira grande lição: busque a simplicidade. É realmente necessário desenvolver uma solução complexa para determinado problema, só por que ela é mais moderna, robusta? A melhor solução é aquela que resolve o problema da forma mais simples!

2. Elaboração da pesquisa

Durante a fase de elaboração do projeto, fomos questionados por nossos mentores se a relação entre paladar e preferências por cerveja tinha embasamento em algum estudo. E que, na sua ausência, uma alternativa seria a elaboração de uma pesquisa com questionário.

Após pesquisas na internet, não encontramos nenhum artigo que confirmasse nossas suposições. Desta forma, partimos para a elaboração do questionário, que foi realizada quase concomitantemente à solicitação de acesso a API da Rate Beer. Utilizamos o Google Forms para criação deste questionário.

O intuito do questionário foi a criação de um banco de dados para tentar correlacionar o paladar (através do gosto da pessoa por diversos tipos de alimentos) e a preferência por tipos de cerveja.

Com este objetivo elaboramos o seguinte questionário:

#1 Qual a sua opinião sobre os alimentos abaixo?

Os alimentos foram escolhidos para identificar cinco paladares:

  • Salgado: marguerita, rufles/salgadinho, bacon/lombo defumado, tomate.
  • Doce : mel, chocolate ao leite, oreo/cookies, banana.
  • Azedo: limonada/caipirinha, suco de laranja, suco de maracujá, mexerica/tangerina.
  • Amargo: beringela, chocolate amargo, folhas escuras, café.
  • Especiarias: pimentas/especiarias, cravo, gengibre, canela.

As pessoas responderam a esta pergunta com gosto, não gosto, indiferente ou desconheço.

#2 Você gosta de cerveja?

O intuito desta questão era avaliar a quantidade de pessoas que gostam de cerveja e direcionar o respondedor para diferentes perguntas na sequência do questionário.

#3 Por que você não gosta de cerveja? (direcionada apenas para quem respondeu que não gosta de cerveja)

Nesta pergunta procuramos identificar o motivo do porquê ela respondeu que não gosta de cerveja.

#4 Qual a sua opinião sobre os seguintes estilos de cerveja? (direcionada apenas para quem respondeu que gosta de cerveja)

Como na pergunta dos alimentos, nós procuramos identificar o perfil de consumo de tipos de cervejas artesanais daqueles que consomem cerveja.

Os seguintes tipos de cerveja foram incluídos no questionário: 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.

Novamente, as pessoas responderam a esta pergunta com gosto, não gosto, indiferente ou desconheço.

#5 Você tem vontade de experimentar novos estilos de cerveja além dos que já conhece?

#6 Você experimentaria um novo estilo de cerveja que lhe fosse recomendado com base no seu paladar?

As perguntas 5 e 6 tinham como objetivo mapear o interesse dos respondentes pela nossa solução.

Este questionário foi distribuído por grupos de WhatsApp e e-mail na rede de contatos dos participantes do projeto.

3. Analisando o questionário (EDA)

Ao desenvolvermos o questionário, torcíamos, mas não acreditávamos, que o resultado seria tão positivo. Até então, foram obtidas 892 respostas ao questionário em pouco mais de um mês de pesquisa — das quais mais de 800 responderam a pergunta #4!

Para a análise do dataset, nós sincronizamos os dados do Google Forms com o Google Colab. A partir de então, nós organizamos e limpamos os dados, renomeando colunas, transformando strings em números, removendo colunas indesejadas e transformando variáveis vazias em variáveis NaN.

Após organizar o dataset, conseguimos observar que a ampla maioria é apreciadora de cerveja — 806 pessoas, que correspondem a 90,4%. 78 responderam que não gostam de cerveja (8,7%) e 8 pessoas não sabiam definir se gostam ou não (0,9%).

As pessoas que responderam que não gostam de cerveja apontaram dois principais motivos:

  • Já provei cervejas de diferentes estilos/sabores e nenhuma me agradou — 47 das 78 pessoas (60,26%), e
  • Provei apenas cervejas tradicionais e o sabor não me agradou — 23 das 78 pessoas (29,49%).

Com essa pergunta, conseguimos perceber que a maioria das pessoas que não gosta de cerveja já experimentou cervejas premium e não gostou. No entanto, um percentual significativo somente experimentou cervejas tradicionais.

Nosso algoritmo poderia ajudar tanto pessoas que não gostam como pessoas que gostam de cerveja a escolher o próximo estilo para experimentar. Porém, o foco deste projeto é gerar recomendações para quem já gosta de cerveja.

Um grande aprendizado nesta etapa do processo do projeto foi a importância de se pensar bem nas informações que você precisará ter na sua base de dados para o desenvolvimento da aplicação. Será que os dados obtidos com o questionário me darão as informações necessárias para o desenvolvimento da solução? A partir deste momento, separamos um sub-dataset apenas com as pessoas que gostam de cerveja para encontrar possíveis correlações entre alimentos e estilos 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

Após a transformação, construímos a seguinte matriz de correlação:

Para diminuir a quantidade de variáveis analisadas e reduzir o efeito de valores nulos (NaN — resposta “Desconheço”), 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 dessa forma:

Ao analisar essa matriz, concluímos que existem diversas correlações interessantes entre paladar e preferências de cerveja, como: Paladar Especiarias e Cervejas NEIPA e Session IPA; Paladar Amargo e Cerveja Lambic; Paladar Salgado e Cerveja APA. Entretanto, a correlação é geralmente mais forte ao cruzar certos estilos de cerveja com outros estilos.

Para investigar ainda mais a fundo a relação entre paladar e preferências de estilo, tentamos encontrar possíveis clusters de paladar — sob a hipótese que existiriam no dataset grupos mais abertos e que “gostam de tudo” e grupos mais restritivos, com certa aversão a alimentos amargos, por exemplo. Para essa tarefa, foi utilizado o algoritmo KMeans da biblioteca Scikit Learn.

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

Dado que a inclinação da curva de inércia por cluster diminui de forma mais branda a partir de k = 4 clusters, e que o valor de silhueta é praticamente o mesmo para k entre 3 e 7 clusters, optamos pela utilização de 4 clusters para a análise.

Os clusters tiveram os seguintes centroides:

Ao observar os centroides, é possível interpretar os clusters da seguinte forma:

  • Cluster 0 = gosta menos de alimentos doces e salgados que os demais grupos;
  • Cluster 1 = não gosta de alimentos amargos;
  • Cluster 2 = não gosta de especiarias e gosta menos de alimentos amargos que os clusters 0 e 3;
  • Cluster 3 = gosta de praticamente tudo, com as maiores médias nos 5 paladares.

Definidos e interpretados os clusters, partimos para avaliar como as preferências de cerveja diferem para cada cluster:

Como esperado, o cluster 3 (que gosta de tudo) apresentou o mesmo comportamento para cervejas, com as maiores médias para todos os estilos. Já o cluster 2, que não gosta de especiarias, mostrou-se mais difícil de agradar e apresentou médias menores que os demais clusters para estilos como Sour, Lambic, IPA e Blonde.

Essas discrepâncias entre clusters contribuem para a tese de que há relação entre paladar e preferências de cerveja, e que o paladar pode ser usado no motor de recomendações para fazê-las de maneira mais precisa.

4. Desenvolvendo a solução de recomendações

A estratégia de recomendação pode ser resumida conforme o seguinte esquema:

O algoritmo escolhido para construir o modelo de recomendação foi o ItemSimilarityRecommender da biblioteca Turicreate, que recebe uma tabela com usuários (no nosso caso, IDs de respostas do formulário), itens (paladares e estilos de cerveja) e avaliações (nota entre -1 e +1, que correspondem a Não Gosto e Gosto, respectivamente) e torna possível a geração de listas de recomendação usando o comando recommend() — similar ao comando predict da maioria dos algoritmos do Scikit Learn. As recomendações são geradas utilizando, por padrão, a correlação de Jaccard, mas também podem ser usados os métodos de similaridade por cosseno, ou por similaridade de Pearson.

Um ponto importante na nossa abordagem é que paladares e estilos de cerveja serão utilizados como se fossem itens no treinamento do modelo, porém as recomendações geradas se restringirão a estilos de cerveja. Dessa forma, o modelo é capaz de identificar usuários com paladares e preferências de estilo parecidos com os do alvo da recomendação e gerar uma lista personalizada que leva todas essas informações e comportamentos em consideração.

Para conseguir visualizar quais estilos estariam sendo recomendados para os usuários, pegamos uma amostra de cada cluster:

5. Idealizando a interface da solução

Para a interface final da solução, idealizamos uma plataforma web na qual o usuário, primeiramente, cadastra seus dados e uma senha. Logo após a conclusão do cadastro, o usuário é levado ao questionário adaptado (apenas as questões de alimentos e dos tipos de cerveja).

Os dados fornecidos pelo usuário passam pelo algoritmo por nós desenvolvido e recomenda três estilos de cerveja mais recomendados de acordo com o que ela respondeu no seu questionário.

E, por fim, são recomendados três rótulos de cervejas artesanais brasileiras dentro desses tipos de cervejas. Após uma semana, é solicitado um feedback sobre a recomendação para retroalimentar o sistema de recomendação.

CONCLUINDO…

Até o momento, deparamo-nos com os desafios da vida real de desenvolver uma solução em data science. Skin in the game…

Como tudo na vida, desafios inesperados são colocados à nossa frente e o sucesso depende da nossa capacidade de adaptação e resiliência, habilidades essenciais para qualquer cientista de dados. Ainda mais nos dias de hoje, um mundo VUCA, volátil, incerto, complexo e ambíguo.

Apesar dos percalços, estamos firmes, fortes e confiantes que cruzaremos a linha de chegada com nossa solução.

E em breve você poderá descobrir qual cerveja artesanal brasileira escolher — utilizando nossa solução, é claro! E quem sabe para comemorar o fim da pandemia do COVID-19!

--

--