A amostra foi coletada no site ( https://www.reclameaqui.com.br/), uma página que serve para usuários enviarem reclamações/sugestões a órgãos do Governo Federal [São órgãos específicos] . Ao submeter uma mensagem, uma queixa é aberta, sendo fechada apenas quando a própria empresa entra em contato com o usuário que a enviou. Os dados coletados são os textos de cada uma das reclamações do [ano/mês - alguma data], além do nome da empresa para qual essa mensagem foi enviada.
Foi realizado um experimento voluntário com os alunos da Universidade Federal de Campina Grande que estavam cursando a disciplina Metodologia Científica do semestre 2018.2 usando informações do ReclameAqui. A amostra foi dividida em grupos de 5, cada voluntário recebeu um conjunto que deveria analisar (podendo um conjunto ser avaliado por mais de uma pessoa), atribuindo, baseada numa escala de 1 a 5, o nível de insatisfação dos usuários, onde 5 é o nível máximo de insatisfação.
Carreganda as bibliotecas necessárias e nossos datasets
library(tidyverse)
avaliacoes <- read_csv("../data/3-avaliacao-humana/avaliacoes-20180610.csv")
reclamacoes <-  read_csv("../data/1-reclamacoes-selecionadas/reclamacoes-avaliadas.csv")
sentimentos = read_csv("../data/4-estimativa-automatica/sentimento.csv")
Adicionando colunas com o tamanho das reclamações, quantidade de exclamações e interrogações e a quantidade de letras em caixa alta.
reclamacoes <- reclamacoes %>% mutate(reclamacao.length = str_length(reclamacao))
reclamacoes$numero.de.capslock <- str_count(reclamacoes$reclamacao, "\\b[A-Z]{2,}\\b")
reclamacoes$numero.pontuacao <- str_count(reclamacoes$reclamacao, "\\!") + str_count(reclamacoes$reclamacao, "\\?")

1. Explorando as reclamações

1.1 Tamanho das reclamações

Uma das características que achamos interessante nas reclamações foi seu tamanho. Desta forma, resolvemos visualizar como se distribuem as reclamações de acordo com o seu tamanho. Para tornar mais informativo, separamos as distribuições por órgão. Segue o gráfico:
reclamacoes %>% 
  filter(complete.cases(.)) %>% 
  ggplot(aes(fill = orgao, x = reclamacao.length), na.rm = TRUE) + 
  geom_histogram(binwidth = 50, na.rm = TRUE) + 
  facet_grid(orgao ~ .) + labs(title = "Distribuição do tamanho das reclamações separadas por orgão" , x = "Tamanho das Reclamações", y = "Quantidade de Reclamações")

Podemos que apenas a ANAC(Agência Nacional de Aviação Civil) recebeu reclamações com mais de dois mil caracteres, embora a concentração em ambas as distribuições seja entra 0 e 1000 caracteres.

1.2 Quantidade de carácteres em caixa alta

Outra coisa que nos chamou atenção foi o uso de caracteres em caixa alta presentes nas reclamações. Assim, no gráfico abaixo podemos observar a distribuição das reclamações de acordo com o número de caracteres em caixa alta.
reclamacoes %>% 
  ggplot(aes(x = numero.de.capslock), na.rm = TRUE) + 
  geom_histogram() + labs(title="Distribuição de reclamações de acordo com o número de caracteres em caixa alta", x = "Número de caracteres em caixa alta", y = "Número de Reclamações")

Aqui, podemos notar que a quantidade de reclamações contendo entre 0 - 10 cracteres em caixa alta é a mais expressiva.

1.3 Quantidade de carácteres em caixa alta por orgão

Também queríamos ver como se comportava essa distribuição quando as separamos por órgão:
reclamacoes %>% 
  ggplot(aes(fill = orgao, x = numero.de.capslock), na.rm = TRUE) + 
  geom_histogram() + facet_grid(orgao ~ .) + labs(title = "Distribuição de reclamações de acordo com o número de caracteres \n em caixa alta separadas por órgão" , x = "Tamanho das Reclamações", y = "Quantidade de Reclamações")

Ambas as distribuições mostram maior concentração entre 0 e 10 caracteres em caixa alta, mas, ainda assim, a ANAC aparenta possuir reclamações com maior número de caracteres em caixa alta.

1.4 Uso de pontuação (! e ?) #####Nos pareceu pertinente destacar o uso dos caracteres que indicam exclamação e interrogação

reclamacoes %>% 
  ggplot(aes(x = numero.pontuacao), na.rm = TRUE) + 
  geom_histogram() + labs(title = "Distribuição de reclamações de acordo com o número de caracteres \n de pontuação (! e ?)" , x = "Quantidade de pontos (exclamação e interrogação)", y = "Quantidade de Reclamações")

#####Da nossa amostra, podemos ver que boa parte das reclamações não possuem nenhum dos dois pontos. Mesmo assim, existe uma quantidade considerável que usou um ou dois pontos. Para as reclamações que possuem uma quantidade maior de pontos, seria interessante ver de que forma essa quantidade influencia na nota de insatisfação, mas, como não desejamos nos aprofundar nisso agora, deixaremos para um próximo momento. ###2. Explorando as avaliações

avaliacoes <- avaliacoes %>% 
              select(avaliador = `Matricula`, 
                      id = `ID da reclamação`, 
                       insatisfacao = `Grau de insatisfação`)
Para garantir que não existem valores não permitidos na avaliação, iremos filtrar qualquer avaliação que não esteja entre 1 e 5 de grau de insatisfação
avaliacoes %>% 
  filter((id %in% 1:5 ))
## # A tibble: 27 x 3
##    avaliador    id insatisfacao
##        <int> <int>        <int>
##  1 113110007     2            4
##  2 113111448     2            4
##  3 113210425     5            3
##  4 114110439     3            2
##  5 114110485     3            2
##  6 114111357     2            5
##  7 114111370     1            5
##  8 114111371     5            5
##  9 114210164     2            5
## 10 114210300     3            2
## # ... with 17 more rows

2.1 - Quantidade de avaliadores de uma mesma reclamação

Primeiro, vamos extrair dos nosso dados algumas medidas que podem ser interessantes. Como queremos saber a quantidade de avaliadores cada reclamação teve, podemos ter uma noção extraindo sua média e mediana.
avaliacoes %>% 
  group_by(id) %>% 
  count() %>%
  ungroup() %>% 
  summarise(media = mean(n), 
            mediana = median(n))
## # A tibble: 1 x 2
##   media mediana
##   <dbl>   <dbl>
## 1  5.32       5
Sabendo que a mediana é de 5 avaliadores e a média é consideravelmente próxima da mediana, podemos concluir que as reclamações tiveram uma quantidade semelhante de avaliadores.
Para ver isso melhor, podemos plotar um gráfico que nos mostra a distribuição das reclamações de acordo com a quantidade de avaliações recebidas.
avaliacoes %>% 
  group_by(id) %>% 
  count() %>% 
  ggplot(aes("Reclamacoes", n)) + 
  geom_jitter(width = .05, alpha = .7)

Então podemos ver que as reclamações que receberam 5 ou 7 avaliadores são mais numerosas que as reclamações que receberam 3 avaliações.

2.2 - Avaliaçoes de um mesmo individuo

Agora que sabemos como se deu as avaliações das reclamações, queremos saber se podemos confiar nas avaliações dos indivíduos. Embora não possamos saber com certeza se a avaliação foi feita da forma correta, podemos ver se um mesmo indivíduo atribuiu a mesma notas às reclamações extraindo a variância das suas avaliações.
avaliacoes %>% 
  group_by(avaliador) %>% 
  summarise(variancia = var(insatisfacao)) %>% 
  ggplot(aes(x=avaliador, y=variancia, colour = avaliador)) + geom_point() +
  geom_jitter(height = 0.05, alpha = .4) 

Considerando nossa amostra, os indivíduos mostraram uma variância aceitável na atribuição das notas. Isso pode indicar que as avaliações foram feitas de forma correta.

2.3 - Range das avaliaçoes

Para garantir a confiabilidade das avaliações, podemos ver se existem muitas reclamações com avaliações extremas, ou seja, por exemplo, se uma mesma reclamação recebeu grau 1 de insatisfação de um avaliador e grau 5 de outro avaliador, isso pode indicar que a avaliação não foi bem feita. Para isso, devemos observar o range (diferença entre a maior avaliação e a menor) das avaliações de cada reclamação.
avaliacoes %>% group_by(id) %>% 
  summarise(range = max(insatisfacao) - min(insatisfacao),
            mediana = median(insatisfacao)) %>% 
  ggplot(aes(x=id, y=range, colour = id)) + geom_point() +
  geom_jitter(height = 0.05, alpha = .4)

Embora ainda apresente um número considerável de reclamações com o range de suas avaliações 3, a maior parte figura com 1 ou 2 de range. Novamente, considerando nossa amostra, isso nos dá um pouco mais de confiança quanto às avaliações humanas.

3 - Correlação das variáveis

Apenas para completar nossa análise exploratória, podemos ver se existem relações fortes entre elas.
library(GGally)
## 
## Attaching package: 'GGally'
## The following object is masked from 'package:dplyr':
## 
##     nasa
rec <- reclamacoes %>% select(reclamacao.length, numero.de.capslock, mediana, numero.pontuacao)
corr = rec[, 0:4] %>%  cor() %>%  round(2)
corr %>%  ggcorr(label_size = 3, label = TRUE, label_color = "black", hjust = 0.925, size = 3.5, angle = -45)

As únicas variáveis que apresentam uma forte correlação são relativas ao tamanho das reclamações e seus caracteres, dessa forma não podemos concluir muito sobre a influência das variáveis entre si.

3. Explorando os léxicos

3.1 léxicos vs avaliação humana

Neste ponto iremos iniciar a utilização dos léxicos em comparação com a avaliação humana,por isto iremos dar um join das nossas avalições já criadas e inserir as colunas “lexico” e “polaridade”.
reclamacoes = reclamacoes %>% 
    left_join(sentimentos, by = "id")
reclamacoes_l = reclamacoes %>%  
    select(-palavras_op30, -palavras_sent) %>% 
    gather(key = "lexico", 
           value = "polaridade", 
           sentimento_op30, sentimento_sent)
reclamacoes_l %>% View()
Precisamos normalizar nossa polaridade para uma escola de 0-5 permitando, assim, que possamos utiliza-lá posteriormente.
 reclamacoes_l = reclamacoes_l %>% 
     group_by(lexico) %>% 
     mutate(polaridade_normalizada = round(((4 * (polaridade - max(polaridade))) / (min(polaridade) - max(polaridade))) + 1))
Atribuindo ao nosso erro o volar proveniente do calculo realizado entre a mediana e a polarizada normalizada criada anteriormente.
reclamacoes_l = reclamacoes_l %>% 
    mutate(erro = (mediana - polaridade_normalizada)**2)
Agora queremos ver a difença contida entre as avaliações realizadas a partir do experimento humano e as realizadas utlizando os léxicos
reclamacoes_l %>% 
  ggplot(aes(x = mediana), na.rm = TRUE) + 
  geom_histogram() + labs(title = "Avaliação partindo do experimento humano" , x = "Grau de Insatisfação", y = "Quantidade de Reclamações")

reclamacoes_l %>% 
  ggplot(aes(x = polaridade_normalizada), na.rm = TRUE) + 
  geom_histogram() + labs(title = "Avaliação a partir dos léxicos" , x = "Grau de Insatisfação", y = "Quantidade de Reclamações")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Com isto, podemos observar que as avaliações realizadas a partir dos lexicos possuem uma maior concentração de avaliações com grau de insatisfação 4,quando comparadas as realizadas a partir do experimento humano, que se mantém bem mais distruibuidas.

3.2 avaliações por agência

Agora estamos interessados em saber como cada reclamação das agências (ANAC,INSS) ficaram classificadas utilizando os léxicos e, assim, poder compara-lás.
reclamacoes_l %>%
  group_by(polaridade_normalizada) %>%
  filter(orgao == "anac-agencia-nacional-de-aviacao-civil") %>% 
  #filter(tipoDocumento == 2) %>% 
  summarise(usos = n()) %>%
  arrange(usos) %>%
  #slice(1:27) %>%
  ggplot(aes(x = polaridade_normalizada, y = usos,fill = polaridade_normalizada))  + guides(fill=FALSE) +
  geom_col() + labs(title = "Avaliações da agência ANAC" , x = "Grau de insatisfação", y = "Quantidade de Reclamações")

reclamacoes_l %>%
  group_by(polaridade_normalizada) %>%
  filter(orgao == "inss-ministerio-da-previdencia-social") %>% 
  #filter(tipoDocumento == 2) %>% 
  summarise(usos = n()) %>%
  arrange(usos) %>%
  #slice(1:27) %>%
  ggplot(aes(x = polaridade_normalizada, y = usos,fill = polaridade_normalizada))  + guides(fill=FALSE) +
  geom_col() + labs(title = "Avaliações da agência INSS" , x = "Grau de insatisfação", y = "Quantidade de Reclamações")

Como podemos ver, ambas tiveram concentração de reclamações com grau de insatisfação 4. Também pudemos notar uma semelhança muito grande entre o grau de insatisfação, tendo apenas algumas exeções na agência INSS que possui criticas com grau 1 e 2, e a ANAC não.