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