Análise exploratória dos dados de uma plataforma de perguntas e respostas, focando em entender a relação entre os dados fornecidos de cada pergunta e a quantidade de upvotes que essa pergunta receberá.

Todos os dados foram fornecidos pela competição “Predict Number of Upvotes” do site: datahack.analyticsvidhya.com

path <- "C:/Users/Gabriel/Desktop/Data Science/R/Predict Number of Upvotes"
setwd(path)
train <- read.csv("train_NIR5Yl1.csv")
test <- read.csv("test_8i3B3FC.csv")

Verificar como está organizado o nosso dataset

head(train, 10)

 

Significado das colunas:

  • ID -> Identificador da pergunta

  • Tag -> Tags anônimas representando a categoria da pergunta

  • Reputation -> Valor de Reputação do autor da pergunta

  • Answers -> Número de vezes que a pergunta foi respondida

  • Username -> Identificador anônimo do autor da pergunta

  • Views -> Número de vezes que a pergunta foi visualizada

  • Upvotes -> Número de upvotes da questão

dim(train)
## [1] 330045      7
dim(test)
## [1] 141448      6
head(test, 10)

Vamos verificar se existem missing values no nosso dataset

sum(is.na(train))
## [1] 0

Não existem missing values no nosso dataset.

Importar a biblioteca ggplot2 que será utilizada para construir as visualizações gráficas

library(ggplot2)

Verificar a relação entre número de respostas da pergunta e o número de upvotes:

ggplot(train, aes(x= Answers, y = Upvotes)) + geom_point(size = 1, color="navy") + xlab("Respostas") + ylab("Upvotes") + ggtitle("Quantidade de respostas X Número de upvotes")

Podemos ver que embora a grande maioria das perguntas terem menos de 30~40 respostas, essas perguntas concentram geralmente um número pequeno de upvotes. O gráfico mostra que se uma pergunta tem várias respostas é provável que ela consiga mais upvotes que uma pergunta com poucas respostas.

Verificar a relação entre número de visualizações da pergunta e o número de upvotes:

ggplot(train, aes(x= Views, y = Upvotes)) + geom_point(size = 1, color="navy") + xlab("Visualizações") + ylab("Upvotes") + ggtitle("Número de visualizações X Número de upvotes")

Podemos perceber que a relação entre Visualizações e Upvotes é consideravelmente maior do que a relação “Respostas x Upvotes”, pois quando a pergunta recebe muitas visualizações é muito difícil o número de upvotes ficar próximo de 0, o que não acontece quando a pergunta recebe poucas visualizações(embora existam alguns outliers).

Verificar a relação entre as tags das perguntas e o número de upvotes:

ggplot(train, aes(x= Tag, y = Upvotes)) + geom_point(size = 1, color="darkmagenta") + xlab("Tags") + ylab("Upvotes") + ggtitle("Tags X Número de upvotes")

Para visualizar melhor, vamos tentar ver a mediana do número de upvotes que cada tag recebe: Vamos usar a mediana em vez da média para nosso resultado final ser menos influenciado por possíveis outliers

Importar a biblioteca dplyr, que nos ajudará a manipular os dados

library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
by_tags <- group_by(train, Tag)
tag_upvotes <- summarise(by_tags, median_tag_upvote = median(Upvotes))
ggplot(data = tag_upvotes) +
  geom_bar(mapping = aes(x = Tag, y = median_tag_upvote), stat = "identity") + xlab("Tags") + ylab("Upvotes") + ggtitle("Tags X Número de upvotes")

Vemos que a mediana do número de upvotes de cada tag difere bastante, sendo por exemplo a mediana de upvotes da tag “j” quase 4 vezes maior do que a da tag “r”, por causa disso, a Tag mostra-se ser uma feature importante para o nosso modelo.

Agora vamos ver se pode existir alguma relação com o username do autor da pergunta e o número de upvotes:

ggplot(train, aes(x= Username, y = Upvotes)) + geom_point(size = 1, color="brown1") + xlab("Username") + ylab("Upvotes") + ggtitle("Username X Número de upvotes")

Como era de se esperar, o gráfico mostra que não há evidência nenhuma de que o username do autor afeta a quantidade de upvotes que a pergunta receberá. Portanto, é uma boa ideia retirar essa coluna de dados das features usadas durante a modelagem.

Vamos ver se o mesmo acontece com o ID:

ggplot(train, aes(x= ID, y = Upvotes)) + geom_point(size = 1, color="brown1") + xlab("ID") + ylab("Upvotes") + ggtitle("ID X Número de upvotes")

Como era esperado, o que concluímos para o Username também se aplica ao ID.

ggplot(train, aes(x= Reputation, y = Upvotes)) + geom_point(size = 1, color="navy") + xlab("Reputação") + ylab("Upvotes") + ggtitle("Reputação X Número de upvotes")

A reputação do autor da pergunta também parece ter alguma influência na quantidade de upvotes, pelos mesmos motivos que os gráficos anteriores de “Respostas X Upvotes” e “Visualizações X Upvotes” nos mostraram.

Portanto, para construir um modelo preditivo do número de upvotes de uma pergunta, seria interessante usar as duas features que se mostraram mais relacionadas com a quantidade de upvotes: Tags e Views junto com as variáveis Answers e Reputation, que também mostraram-se relacionadas com a variável que queremos prever.