Leonardo Karpinski

Leonardo Karpinski

Mestre do Power BI, criador do Curso Express de Power BI e Curso Completo de Power BI. Formou mais de 16 mil alunos nos últimos anos e participou de projetos em grandes empresas nacionais e multinacionais.

Análise de Sentimento Pref. João Doria com Power BI e Microsoft Cognitive Services

Há algum tempo venho acompanhando a página do Facebook do prefeito de São Paulo, João Doria Jr, e é admirável o trabalho que ele está fazendo na cidade, assim como também é admirável o Marketing bem feito que ele faz em seus 3 posts diários.

Lendo os comentários em suas publicações, a população em geral parece estar aprovando, e muito, o trabalho do prefeito. Porém é fato que os comentários mais positivos e mais curtidos são os que aparecem no topo da lista, e isto influencia positivamente a imagem de João Doria.

Então para ter uma avaliação mais justa e realista do que está sendo comentado em seus posts, resolvi fazer uma análise de sentimento dos comentários, conectando a API do Facebook com o Power BI, e utilizando a API de Análise de Texto que a Microsoft Cognitive Services oferece.

No final do post darei detalhes de como fazer estas integrações com o Power BI.

Resultados obtidos

Realizei a análise dos últimos 70 posts, que foram entre os dias 22/02/2017 e 16/03/2017, e os resultados estão ilustrados no Relatório abaixo.

Clicando na imagem acima, ou aqui, você tem acesso ao relatório publicado, que é interativo. Escolhendo um valor no gráfico de rosca, os demais dados são filtrados, e , pela tabela, você tem acesso ao link do post, podendo ordená-la pelas suas colunas.

Os 70 posts analisados resultaram nos seguintes resultados:

  • Um score médio de 62%, sendo 100% totalmente positivo e 0% totalmente negativo;
  • Total de 283 mil comentários, sendo 109 mil positivos, 35 mil negativos e 138 mil neutros. O critério escolhido para definir um comentário positivo é Score acima de 70%, e negativo abaixo de 30%;
  • Total de 851 mil compartilhamentos. É muita coisa;
  • Score máximo de 76% no dia 08/03 neste post aqui, na homenagem ao dia da mulher;
  • Score mínimo de 46% no dia 05/03 neste post aqui, quando o assunto foram as pichações;
  • 81 mil compartilhamentos no dia 07/03 neste post aqui, quando ele anuncia a doação de seu salário;
  • Entre outros que deixo para quem quiser analisar.

Claro, o algoritmo não é livre de erros. Palavras negativas e positivas na mesma frase geralmente resultam em um Score intermediário, mesmo que a nossa leitura desta frase indique um sentido claro como positivo ou negativo. Outro ponto complicado e que acaba prejudicando um pouco o resultado é a presença de frases irônicas, bastante comum em comentários políticos e que são de difícil interpretação pelo algoritmo.

De qualquer forma, é nítida a aceitação do atual prefeito de São Paulo, e esta análise pode comprovar isto, pelo menos para os 70 posts analisados.

Quer saber como gerar análise de sentimento do Facebook no Power BI?

O processo é relativamente simples, não é preciso ser um expert em Data Science para isso. Esse papel científico ficou com a Microsoft, que disponibiliza os Serviços Cognitivos.

Para ter acesso à API você precisar criar uma conta no site e ativar os 5000 requests por mês grátis que eles oferecem. O serviço irá fornecer uma Key, conforme imagem abaixo, que você precisa copiar depois para utilizar no Power BI.

Com isto em mãos, vamos para a parte que envolve a conexão do Facebook com o Power BI, e depois voltamos para a análise do texto. No Power BI o primeiro passo então é obter uma consulta em branco e digitar o seguinte código no Power Query:

= Facebook.Graph("https://graph.facebook.com/v2.2/[facebook-id]/posts?limit=100&fields=message,created_time,shares,comments")

Você deve substituir o [facebook-id] pelo ID da página que deseja puxar. No caso de João Doria o ID é jdoriajr.

Com isto o Power BI vai buscar uma enorme massa de dados, que precisa agora passar pelo processo de ETL para ser transformada e organizada. No meu caso a primeira coisa que fiz foi limitar a quantidade de linhas em 70, pois a API do Facebook é relativamente lenta, e o prefeito possui muitos dados!

Para fazer esta organização dos dados eu criei três referências da Query de base e separei os dados em quatro tabelas: Posts, Compartilhamentos, Comentários e Comentários Sentimentos. Além disso tenho uma tabela extra para deixar todas minhas medidas organizadas. A relação entre elas ficou como abaixo:

Feito isso vamos então para a obtenção do Score. Aqui entra um processo um pouco mais complicado e que não conseguirei entrar em todos os detalhes, mas basicamente o que devemos fazer é criar uma nova consulta em branco, dar o nome de GetSentimentResults e digitar o seguinte código no Power Query:

= (Source as table) as any =>
let
    JsonRecords = Text.FromBinary(Json.FromValue(Source)),
    JsonRequest = "{""documents"": " & JsonRecords & "}",
    JsonContent = Text.ToBinary(JsonRequest, TextEncoding.Ascii),
    Response =
        Web.Contents("https://westus.api.cognitive.microsoft.com/text/analytics/v2.0/sentiment?",
            [
                Headers = [#"Ocp-Apim-Subscription-Key"= "[API Key]",
                           #"Content-Type"="application/json", Accept="application/json"],
                Content=JsonContent 
            ]),
    JsonResponse = Json.Document(Response,1252)
in
    JsonResponse

Lembra da sua Key que você obteve no site da Microsoft? Você deve colocar no lugar de [API Key] no código acima. Ainda no Power Query, na tabela Comentários Sentimentos o próximo passo é agrupar as colunas ComentáriosID e Comentário em uma tabela que deve se chamar data. Agora basta então invocar a função personalizada GetSentimentResults para esta tabela data.

Está pronto! Parece trivial, mas tem alguns detalhes no meio do caminho que não cobri aqui, mas a ideia em geral é esta. Se houver alguém interessado em saber com mais detalhes eu posso ilustrar em vídeo e incluo neste post.

Espero que tenham gostado, e boas análises!

Abraços,
Leonardo

COMPARTILHE ESSE POST

Compartilhar no facebook
Compartilhar no linkedin
Compartilhar no twitter
Compartilhar no pinterest